2 * $Id: libnet_link_pf.c,v 1.1.1.1 2000/05/25 00:28:49 route Exp $
5 * libnet_pf.c - pf routines
7 * Copyright (c) 1998 - 2001 Mike D. Schiffman <mike@infonexus.com>
10 * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
11 * The Regents of the University of California. All rights reserved.
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
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.
29 * packet filter subroutines for tcpdump
30 * Extraction/creation by Jeffrey Mogul, DECWRL
34 #include "../include/config.h"
36 #include "../include/low_libnet.h"
38 #include "../include/gnuc.h"
39 #ifdef HAVE_OS_PROTO_H
40 #include "../include/os-proto.h"
43 struct libnet_link_int *
44 libnet_open_link_interface(char *device, char *ebuf)
46 register struct libnet_link_int *l;
48 int backlog = -1; /* request the most */
49 struct enfilter Filter;
50 struct endevp devparams;
52 l = (struct libnet_link_int *)malloc(sizeof(*l));
55 sprintf(ebuf, "libnet_open_link_int: %s", ll_strerror(errno));
58 memset(l, 0, sizeof(*l));
59 l->fd = pfopen(device, O_RDWR);
62 sprintf(ebuf, "pf open: %s: %s\n\your system may not be properly configured; see \"man packetfilter(4)\"\n",
63 device, ll_strerror(errno));
67 enmode = ENTSTAMP|ENBATCH|ENNONEXCL;
68 if (ioctl(l->fd, EIOCMBIS, (caddr_t)&enmode) < 0)
70 sprintf(ebuf, "EIOCMBIS: %s", ll_strerror(errno));
74 /* Try to set COPYALL mode so that we see packets to ourself */
76 ioctl(l->fd, EIOCMBIS, (caddr_t)&enmode); /* OK if this fails */
79 if (ioctl(l->fd, EIOCSETW, (caddr_t)&backlog) < 0)
81 sprintf(ebuf, "EIOCSETW: %s", ll_strerror(errno));
85 * discover interface type
87 if (ioctl(l->fd, EIOCDEVP, (caddr_t)&devparams) < 0)
89 sprintf(ebuf, "EIOCDEVP: %s", ll_strerror(errno));
93 /* HACK: to compile prior to Ultrix 4.2 */
97 switch (devparams.end_dev_type)
100 l->linktype = DLT_EN10MB;
103 l->linktype = DLT_FDDI;
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.
112 l->linktype = DLT_EN10MB;
118 bzero((char *)&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)
123 sprintf(ebuf, "EIOCSETF: %s", ll_strerror(errno));
135 libnet_close_link_interface(struct libnet_link_int *l)
137 if (close(l->fd) == 0)
149 libnet_write_link_layer(struct libnet_link_int *l, const char *device,
150 const u_char *buf, int len)
154 c = write(l->fd, buf, len);
158 fprintf(stderr, "libnet_write_link_layer: %d bytes written (%s)\n", c,