Coverage Report

Created: 2024-06-09 08:57

/src/libpcap/pcap/sll.h
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
0
#define LINUX_SLL_P_802_2 0x0004  /* 802.2 frames (not D/I/X Ethernet) */
146
0
#define LINUX_SLL_P_CAN   0x000C  /* CAN frames, with SocketCAN pseudo-headers */
147
0
#define LINUX_SLL_P_CANFD 0x000D  /* CAN FD frames, with SocketCAN pseudo-headers */
148
149
#endif