Annotation of embedaddon/libnet/src/libnet_link_pf.c, revision 1.1.1.2
1.1 misho 1: /*
2: * $Id: libnet_link_pf.c,v 1.3 2004/01/03 20:31:02 mike Exp $
3: *
4: * libnet
5: * libnet_pf.c - pf routines
6: *
7: * Copyright (c) 1998 - 2004 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: * packet filter subroutines for tcpdump
30: * Extraction/creation by Jeffrey Mogul, DECWRL
31: */
32:
33: #if (HAVE_CONFIG_H)
34: #include "../include/config.h"
35: #endif
36: #include "../include/low_libnet.h"
37:
38: #include "../include/gnuc.h"
39: #ifdef HAVE_OS_PROTO_H
40: #include "../include/os-proto.h"
41: #endif
42:
43: struct libnet_link_int *
44: libnet_open_link_interface(int8_t *device, int8_t *ebuf)
45: {
46: register struct libnet_link_int *l;
47: int16_t enmode;
48: int backlog = -1; /* request the most */
49: struct enfilter Filter;
50: struct endevp devparams;
51:
52: l = (struct libnet_link_int *)malloc(sizeof(*l));
53: if (l == NULL)
54: {
55: sprintf(ebuf, "libnet_open_link_int: %s", strerror(errno));
56: return (0);
57: }
58: memset(l, 0, sizeof(*l));
59: l->fd = pfopen(device, O_RDWR);
60: if (l->fd < 0)
61: {
62: sprintf(ebuf, "pf open: %s: %s\n\your system may not be properly configured; see \"man packetfilter(4)\"\n",
63: device, strerror(errno));
64: goto bad;
65: }
66:
67: enmode = ENTSTAMP|ENBATCH|ENNONEXCL;
68: if (ioctl(l->fd, EIOCMBIS, (caddr_t)&enmode) < 0)
69: {
70: sprintf(ebuf, "EIOCMBIS: %s", strerror(errno));
71: goto bad;
72: }
73: #ifdef ENCOPYALL
74: /* Try to set COPYALL mode so that we see packets to ourself */
75: enmode = ENCOPYALL;
76: ioctl(l->fd, EIOCMBIS, (caddr_t)&enmode); /* OK if this fails */
77: #endif
78: /* set the backlog */
79: if (ioctl(l->fd, EIOCSETW, (caddr_t)&backlog) < 0)
80: {
81: sprintf(ebuf, "EIOCSETW: %s", strerror(errno));
82: goto bad;
83: }
84: /*
85: * discover interface type
86: */
87: if (ioctl(l->fd, EIOCDEVP, (caddr_t)&devparams) < 0)
88: {
89: sprintf(ebuf, "EIOCDEVP: %s", strerror(errno));
90: goto bad;
91: }
92:
93: /* HACK: to compile prior to Ultrix 4.2 */
94: #ifndef ENDT_FDDI
95: #define ENDT_FDDI 4
96: #endif
97: switch (devparams.end_dev_type)
98: {
99: case ENDT_10MB:
100: l->linktype = DLT_EN10MB;
101: break;
102: case ENDT_FDDI:
103: l->linktype = DLT_FDDI;
104: break;
105: default:
106: /*
107: * XXX
108: * Currently, the Ultrix packet filter supports only
109: * Ethernet and FDDI. Eventually, support for SLIP and PPP
110: * (and possibly others: T1?) should be added.
111: */
112: l->linktype = DLT_EN10MB;
113: break;
114: }
115: /*
116: * acceptag all packets
117: */
118: bzero((int8_t *)&Filter, sizeof(Filter));
119: Filter.enf_Priority = 37; /* anything > 2 */
120: Filter.enf_FilterLen = 0; /* means "always true" */
121: if (ioctl(l->fd, EIOCSETF, (caddr_t)&Filter) < 0)
122: {
123: sprintf(ebuf, "EIOCSETF: %s", strerror(errno));
124: goto bad;
125: }
126:
127: return (l);
128: bad:
129: free(l);
130: return (NULL);
131: }
132:
133:
134: int
135: libnet_close_link_interface(struct libnet_link_int *l)
136: {
137: if (close(l->fd) == 0)
138: {
139: free(l);
140: return (1);
141: }
142: else
143: {
144: free(l);
145: return (-1);
146: }
147: }
148:
149:
150: int
151: libnet_write_link_layer(struct libnet_link_int *l, const int8_t *device,
1.1.1.2 ! misho 152: const uint8_t *buf, int len)
1.1 misho 153: {
154: int c;
155:
156: c = write(l->fd, buf, len);
157: if (c != len)
158: {
159: snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
160: "libnet_write_link: %d bytes written (%s)\n", c,
161: strerror(errno));
162: }
163: return (c);
164: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>