OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / lib / Libnet / src / libnet_link_nit.c
1 /*
2  *  $Id: libnet_link_nit.c,v 1.1.1.1 2000/05/25 00:28:49 route Exp $
3  *
4  *  libnet
5  *  libnet_nit.c - network interface tap routines
6  *
7  *  Copyright (c) 1998 - 2001 Mike D. Schiffman <mike@infonexus.com>
8  *  All rights reserved.
9  *
10  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
11  *      The Regents of the University of California.  All rights reserved.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that: (1) source code distributions
15  * retain the above copyright notice and this paragraph in its entirety, (2)
16  * distributions including binary code include the above copyright notice and
17  * this paragraph in its entirety in the documentation or other materials
18  * provided with the distribution, and (3) all advertising materials mentioning
19  * features or use of this software display the following acknowledgement:
20  * ``This product includes software developed by the University of California,
21  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
22  * the University nor the names of its contributors may be used to endorse
23  * or promote products derived from this software without specific prior
24  * written permission.
25  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
26  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
27  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
28  */
29
30 #if (HAVE_CONFIG_H)
31 #include "../include/config.h"
32 #endif
33 #include "../include/libnet.h"
34
35 #include "../include/gnuc.h"
36 #ifdef HAVE_OS_PROTO_H
37 #include "../include/os-proto.h"
38 #endif
39
40 struct libnet_link_int *
41 libnet_open_link_interface(char *device, char *ebuf)
42 {
43     struct sockaddr_nit snit;
44     register struct libnet_link_int *l;
45
46     l = (struct libnet_link_int *)malloc(sizeof(*p));
47     if (l == NULL)
48     {
49         strcpy(ebuf, ll_strerror(errno));
50         return (NULL);
51     }
52
53     memset(l, 0, sizeof(*l));
54
55     l->fd = socket(AF_NIT, SOCK_RAW, NITPROTO_RAW);
56     if (l->fd < 0)
57     {
58         sprintf(ebuf, "socket: %s", ll_strerror(errno));
59         goto bad;
60     }
61     snit.snit_family = AF_NIT;
62     strncpy(snit.snit_ifname, device, NITIFSIZ);
63
64     if (bind(l->fd, (struct sockaddr *)&snit, sizeof(snit)))
65     {
66         sprintf(ebuf, "bind: %s: %s", snit.snit_ifname, ll_strerror(errno));
67         goto bad;
68     }
69
70     /*
71      * NIT supports only ethernets.
72      */
73     l->linktype = DLT_EN10MB;
74
75     return (l);
76
77 bad:
78     if (l->fd >= 0)
79     {
80         close(l->fd);
81     }
82     free(l);
83     return (NULL);
84 }
85
86
87 int
88 libnet_close_link_interface(struct libnet_link_int *l)
89 {
90     if (close(l->fd) == 0)
91     {
92         return (1);
93     }
94     else
95     {
96         return (-1);
97     }
98 }
99
100
101 int
102 write_link_layer(struct libnet_link_int *l, const char *device,
103             u_char *buf, int len)
104 {
105     int c;
106     struct sockaddr sa;
107
108     memset(&sa, 0, sizeof(sa));
109     strncpy(sa.sa_data, device, sizeof(sa.sa_data));
110
111     c = sendto(l->fd, buf, len, 0, &sa, sizeof(sa));
112     if (c != len)
113     {
114 #if (__DEBUG)
115         libnet_error(LN_ERR_WARNING,
116                 "write_link_layer: %d bytes written (%s)\n", c,
117                 strerror(errno));
118 #endif
119     }
120     return (c);
121 }
122