Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | /*-  | 
2  |  |  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997  | 
3  |  |  *  The Regents of the University of California.  All rights reserved.  | 
4  |  |  *  | 
5  |  |  * This code is derived from the Stanford/CMU enet packet filter,  | 
6  |  |  * (net/enet.c) distributed as part of 4.3BSD, and code contributed  | 
7  |  |  * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence  | 
8  |  |  * Berkeley Laboratory.  | 
9  |  |  *  | 
10  |  |  * Redistribution and use in source and binary forms, with or without  | 
11  |  |  * modification, are permitted provided that the following conditions  | 
12  |  |  * are met:  | 
13  |  |  * 1. Redistributions of source code must retain the above copyright  | 
14  |  |  *    notice, this list of conditions and the following disclaimer.  | 
15  |  |  * 2. Redistributions in binary form must reproduce the above copyright  | 
16  |  |  *    notice, this list of conditions and the following disclaimer in the  | 
17  |  |  *    documentation and/or other materials provided with the distribution.  | 
18  |  |  * 3. All advertising materials mentioning features or use of this software  | 
19  |  |  *    must display the following acknowledgement:  | 
20  |  |  *      This product includes software developed by the University of  | 
21  |  |  *      California, Berkeley and its contributors.  | 
22  |  |  * 4. Neither the name of the University nor the names of its contributors  | 
23  |  |  *    may be used to endorse or promote products derived from this software  | 
24  |  |  *    without specific prior written permission.  | 
25  |  |  *  | 
26  |  |  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND  | 
27  |  |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | 
28  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | 
29  |  |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE  | 
30  |  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  | 
31  |  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  | 
32  |  |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | 
33  |  |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  | 
34  |  |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  | 
35  |  |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  | 
36  |  |  * SUCH DAMAGE.  | 
37  |  |  */  | 
38  |  |  | 
39  |  | /*  | 
40  |  |  * For captures on Linux cooked sockets, we construct a fake header  | 
41  |  |  * that includes:  | 
42  |  |  *  | 
43  |  |  *  a 2-byte "packet type" which is one of:  | 
44  |  |  *  | 
45  |  |  *    LINUX_SLL_HOST    packet was sent to us  | 
46  |  |  *    LINUX_SLL_BROADCAST packet was broadcast  | 
47  |  |  *    LINUX_SLL_MULTICAST packet was multicast  | 
48  |  |  *    LINUX_SLL_OTHERHOST packet was sent to somebody else  | 
49  |  |  *    LINUX_SLL_OUTGOING  packet was sent *by* us;  | 
50  |  |  *  | 
51  |  |  *  a 2-byte Ethernet protocol field;  | 
52  |  |  *  | 
53  |  |  *  a 2-byte link-layer type;  | 
54  |  |  *  | 
55  |  |  *  a 2-byte link-layer address length;  | 
56  |  |  *  | 
57  |  |  *  an 8-byte source link-layer address, whose actual length is  | 
58  |  |  *  specified by the previous value.  | 
59  |  |  *  | 
60  |  |  * All fields except for the link-layer address are in network byte order.  | 
61  |  |  *  | 
62  |  |  * DO NOT change the layout of this structure, or change any of the  | 
63  |  |  * LINUX_SLL_ values below.  If you must change the link-layer header  | 
64  |  |  * for a "cooked" Linux capture, introduce a new DLT_ type (ask  | 
65  |  |  * "tcpdump-workers@lists.tcpdump.org" for one, so that you don't give it  | 
66  |  |  * a value that collides with a value already being used), and use the  | 
67  |  |  * new header in captures of that type, so that programs that can  | 
68  |  |  * handle DLT_LINUX_SLL captures will continue to handle them correctly  | 
69  |  |  * without any change, and so that capture files with different headers  | 
70  |  |  * can be told apart and programs that read them can dissect the  | 
71  |  |  * packets in them.  | 
72  |  |  */  | 
73  |  |  | 
74  |  | #ifndef lib_pcap_sll_h  | 
75  |  | #define lib_pcap_sll_h  | 
76  |  |  | 
77  |  | #include <pcap/pcap-inttypes.h>  | 
78  |  |  | 
79  |  | /*  | 
80  |  |  * A DLT_LINUX_SLL fake link-layer header.  | 
81  |  |  */  | 
82  | 0  | #define SLL_HDR_LEN 16    /* total header length */  | 
83  | 0  | #define SLL_ADDRLEN 8    /* length of address field */  | 
84  |  |  | 
85  |  | struct sll_header { | 
86  |  |   uint16_t sll_pkttype;   /* packet type */  | 
87  |  |   uint16_t sll_hatype;    /* link-layer address type */  | 
88  |  |   uint16_t sll_halen;   /* link-layer address length */  | 
89  |  |   uint8_t  sll_addr[SLL_ADDRLEN]; /* link-layer address */  | 
90  |  |   uint16_t sll_protocol;    /* protocol */  | 
91  |  | };  | 
92  |  |  | 
93  |  | /*  | 
94  |  |  * A DLT_LINUX_SLL2 fake link-layer header.  | 
95  |  |  */  | 
96  | 0  | #define SLL2_HDR_LEN  20    /* total header length */  | 
97  |  |  | 
98  |  | struct sll2_header { | 
99  |  |   uint16_t sll2_protocol;     /* protocol */  | 
100  |  |   uint16_t sll2_reserved_mbz;   /* reserved - must be zero */  | 
101  |  |   uint32_t sll2_if_index;     /* 1-based interface index */  | 
102  |  |   uint16_t sll2_hatype;     /* link-layer address type */  | 
103  |  |   uint8_t  sll2_pkttype;      /* packet type */  | 
104  |  |   uint8_t  sll2_halen;      /* link-layer address length */  | 
105  |  |   uint8_t  sll2_addr[SLL_ADDRLEN];  /* link-layer address */  | 
106  |  | };  | 
107  |  |  | 
108  |  | /*  | 
109  |  |  * The LINUX_SLL_ values for "sll_pkttype" and LINUX_SLL2_ values for  | 
110  |  |  * "sll2_pkttype"; these correspond to the PACKET_ values on Linux,  | 
111  |  |  * which are defined by a header under include/uapi in the current  | 
112  |  |  * kernel source, and are thus not going to change on Linux.  We  | 
113  |  |  * define them here so that they're available even on systems other  | 
114  |  |  * than Linux.  | 
115  |  |  */  | 
116  |  | #define LINUX_SLL_HOST    0  | 
117  |  | #define LINUX_SLL_BROADCAST 1  | 
118  |  | #define LINUX_SLL_MULTICAST 2  | 
119  |  | #define LINUX_SLL_OTHERHOST 3  | 
120  | 0  | #define LINUX_SLL_OUTGOING  4  | 
121  |  |  | 
122  |  | /*  | 
123  |  |  * The LINUX_SLL_ values for "sll_protocol" and LINUX_SLL2_ values for  | 
124  |  |  * "sll2_protocol"; these correspond to the ETH_P_ values on Linux, but  | 
125  |  |  * are defined here so that they're available even on systems other than  | 
126  |  |  * Linux.  We assume, for now, that the ETH_P_ values won't change in  | 
127  |  |  * Linux; if they do, then:  | 
128  |  |  *  | 
129  |  |  *  if we don't translate them in "pcap-linux.c", capture files  | 
130  |  |  *  won't necessarily be readable if captured on a system that  | 
131  |  |  *  defines ETH_P_ values that don't match these values;  | 
132  |  |  *  | 
133  |  |  *  if we do translate them in "pcap-linux.c", that makes life  | 
134  |  |  *  unpleasant for the BPF code generator, as the values you test  | 
135  |  |  *  for in the kernel aren't the values that you test for when  | 
136  |  |  *  reading a capture file, so the fixup code run on BPF programs  | 
137  |  |  *  handed to the kernel ends up having to do more work.  | 
138  |  |  *  | 
139  |  |  * Add other values here as necessary, for handling packet types that  | 
140  |  |  * might show up on non-Ethernet, non-802.x networks.  (Not all the ones  | 
141  |  |  * in the Linux "if_ether.h" will, I suspect, actually show up in  | 
142  |  |  * captures.)  | 
143  |  |  */  | 
144  | 0  | #define LINUX_SLL_P_802_3 0x0001  /* Novell 802.3 frames without 802.2 LLC header */  | 
145  | 5  | #define LINUX_SLL_P_802_2 0x0004  /* 802.2 frames (not D/I/X Ethernet) */  | 
146  | 142  | #define LINUX_SLL_P_CAN   0x000C  /* CAN frames, with SocketCAN pseudo-headers */  | 
147  | 70  | #define LINUX_SLL_P_CANFD 0x000D  /* CAN FD frames, with SocketCAN pseudo-headers */  | 
148  |  |  | 
149  |  | #endif  |