suricata
decode-ipv6.h
Go to the documentation of this file.
1 /* Copyright (C) 2007-2022 Open Information Security Foundation
2  *
3  * You can copy, redistribute or modify this Program under the terms of
4  * the GNU General Public License version 2 as published by the Free
5  * Software Foundation.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * version 2 along with this program; if not, write to the Free Software
14  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15  * 02110-1301, USA.
16  */
17 
18 /**
19  * \file
20  *
21  * \author Victor Julien <victor@inliniac.net>
22  */
23 
24 #ifndef SURICATA_DECODE_IPV6_H
25 #define SURICATA_DECODE_IPV6_H
26 
27 #define IPV6_HEADER_LEN 40
28 #define IPV6_MAXPACKET 65535 /* maximum packet size */
29 #define IPV6_MAX_OPT 40
30 
31 typedef struct IPV6Hdr_
32 {
33  union {
34  struct ip6_un1_ {
35  uint32_t ip6_un1_flow; /* 20 bits of flow-ID */
36  uint16_t ip6_un1_plen; /* payload length */
37  uint8_t ip6_un1_nxt; /* next header */
38  uint8_t ip6_un1_hlim; /* hop limit */
40  uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */
42 
43  union {
44  struct {
45  uint32_t ip6_src[4];
46  uint32_t ip6_dst[4];
48  uint16_t ip6_addrs[16];
51 
52 #define s_ip6_src ip6_hdrun2.ip6_un2.ip6_src
53 #define s_ip6_dst ip6_hdrun2.ip6_un2.ip6_dst
54 #define s_ip6_addrs ip6_hdrun2.ip6_addrs
55 
56 #define s_ip6_vfc ip6_hdrun.ip6_un2_vfc
57 #define s_ip6_flow ip6_hdrun.ip6_un1.ip6_un1_flow
58 #define s_ip6_plen ip6_hdrun.ip6_un1.ip6_un1_plen
59 #define s_ip6_nxt ip6_hdrun.ip6_un1.ip6_un1_nxt
60 #define s_ip6_hlim ip6_hdrun.ip6_un1.ip6_un1_hlim
61 
62 #define IPV6_GET_RAW_VER(ip6h) (((ip6h)->s_ip6_vfc & 0xf0) >> 4)
63 #define IPV6_GET_RAW_CLASS(ip6h) ((SCNtohl((ip6h)->s_ip6_flow) & 0x0FF00000) >> 20)
64 #define IPV6_GET_RAW_FLOW(ip6h) (SCNtohl((ip6h)->s_ip6_flow) & 0x000FFFFF)
65 #define IPV6_GET_RAW_NH(ip6h) ((ip6h)->s_ip6_nxt)
66 #define IPV6_GET_RAW_PLEN(ip6h) (SCNtohs((ip6h)->s_ip6_plen))
67 #define IPV6_GET_RAW_HLIM(ip6h) ((ip6h)->s_ip6_hlim)
68 
69 #define IPV6_SET_RAW_VER(ip6h, value) ((ip6h)->s_ip6_vfc = (((ip6h)->s_ip6_vfc & 0x0f) | (value << 4)))
70 #define IPV6_SET_RAW_NH(ip6h, value) ((ip6h)->s_ip6_nxt = (value))
71 
72 #define IPV6_SET_L4PROTO(p, proto) (p)->l3.vars.ip6.v.l4proto = (proto)
73 #define IPV6_SET_EXTHDRS_LEN(p, len) (p)->l3.vars.ip6.v.exthdrs_len = (len)
74 
75 #define IPV6_GET_L4PROTO(p) ((p)->l3.vars.ip6.v.l4proto)
76 #define IPV6_GET_EXTHDRS_LEN(p) ((p)->l3.vars.ip6.v.exthdrs_len)
77 
78 /** \brief get the highest proto/next header field we know */
79 //#define IPV6_GET_UPPER_PROTO(p) (p)->ip6eh.ip6_exthdrs_cnt ?
80 // (p)->ip6eh.ip6_exthdrs[(p)->ip6eh.ip6_exthdrs_cnt - 1].next : IPV6_GET_NH((p))
81 
82 /* helper structure with parsed ipv6 info */
83 typedef struct IPV6Vars_
84 {
85  uint8_t l4proto; /**< the proto after the extension headers
86  * store while decoding so we don't have
87  * to loop through the exthdrs all the time */
88  uint16_t exthdrs_len; /**< length of the exthdrs */
90 
91 /* Fragment header */
92 typedef struct IPV6FragHdr_
93 {
94  uint8_t ip6fh_nxt; /* next header */
95  uint8_t ip6fh_reserved; /* reserved field */
96  uint16_t ip6fh_offlg; /* offset, reserved, and flag */
97  uint32_t ip6fh_ident; /* identification */
98 } __attribute__((__packed__)) IPV6FragHdr;
99 
100 #define IPV6_EXTHDR_GET_FH_NH(p) (p)->l3.vars.ip6.eh.fh_nh
101 #define IPV6_EXTHDR_GET_FH_OFFSET(p) (p)->l3.vars.ip6.eh.fh_offset
102 #define IPV6_EXTHDR_GET_FH_FLAG(p) (p)->l3.vars.ip6.eh.fh_more_frags_set
103 #define IPV6_EXTHDR_GET_FH_ID(p) (p)->l3.vars.ip6.eh.fh_id
104 
105 /* rfc 1826 */
106 typedef struct IPV6AuthHdr_
107 {
108  uint8_t ip6ah_nxt; /* next header */
109  uint8_t ip6ah_len; /* header length in units of 8 bytes, not
110  including first 8 bytes. */
111  uint16_t ip6ah_reserved; /* reserved for future use */
112  uint32_t ip6ah_spi; /* SECURITY PARAMETERS INDEX (SPI) */
113  uint32_t ip6ah_seq; /* sequence number */
114 } __attribute__((__packed__)) IPV6AuthHdr;
115 
116 typedef struct IPV6EspHdr_
117 {
118  uint32_t ip6esph_spi; /* SECURITY PARAMETERS INDEX (SPI) */
119  uint32_t ip6esph_seq; /* sequence number */
120 } __attribute__((__packed__)) IPV6EspHdr;
121 
122 typedef struct IPV6RouteHdr_
123 {
124  uint8_t ip6rh_nxt; /* next header */
125  uint8_t ip6rh_len; /* header length in units of 8 bytes, not
126  including first 8 bytes. */
127  uint8_t ip6rh_type; /* routing type */
128  uint8_t ip6rh_segsleft; /* segments left */
129 } __attribute__((__packed__)) IPV6RouteHdr;
130 
131 
132 /* Hop-by-Hop header and Destination Options header use options that are
133  * defined here. */
134 
135 #define IPV6OPT_PAD1 0x00
136 #define IPV6OPT_PADN 0x01
137 #define IPV6OPT_RA 0x05
138 #define IPV6OPT_JUMBO 0xC2
139 #define IPV6OPT_HAO 0xC9
140 
141 /* Home Address Option */
142 typedef struct IPV6OptHAO_
143 {
144  uint8_t ip6hao_type; /* Option type */
145  uint8_t ip6hao_len; /* Option Data len (excludes type and len) */
146  struct in6_addr ip6hao_hoa; /* Home address. */
148 
149 /* Router Alert Option */
150 typedef struct IPV6OptRA_
151 {
152  uint8_t ip6ra_type; /* Option type */
153  uint8_t ip6ra_len; /* Option Data len (excludes type and len) */
154  uint16_t ip6ra_value; /* Router Alert value */
156 
157 /* Jumbo Option */
158 typedef struct IPV6OptJumbo_
159 {
160  uint8_t ip6j_type; /* Option type */
161  uint8_t ip6j_len; /* Option Data len (excludes type and len) */
162  uint32_t ip6j_payload_len; /* Jumbo Payload Length */
164 
165 typedef struct IPV6HopOptsHdr_
166 {
167  uint8_t ip6hh_nxt; /* next header */
168  uint8_t ip6hh_len; /* header length in units of 8 bytes, not
169  including first 8 bytes. */
170 } __attribute__((__packed__)) IPV6HopOptsHdr;
171 
172 typedef struct IPV6DstOptsHdr_
173 {
174  uint8_t ip6dh_nxt; /* next header */
175  uint8_t ip6dh_len; /* header length in units of 8 bytes, not
176  including first 8 bytes. */
177 } __attribute__((__packed__)) IPV6DstOptsHdr;
178 
179 typedef struct IPV6GenOptHdr_
180 {
181  uint8_t type;
182  uint8_t next;
183  uint8_t len;
184  uint8_t *data;
186 
187 typedef struct IPV6ExtHdrs_
188 {
189  bool rh_set;
190  uint8_t rh_type;
191 
192  bool fh_set;
194  uint8_t fh_nh;
195 
196  uint8_t fh_prev_nh;
198 
200  uint16_t fh_data_offset;
201  uint16_t fh_data_len;
202 
203  /* In fh_offset we store the offset of this extension into the packet past
204  * the ipv6 header. We use it in defrag for creating a defragmented packet
205  * without the frag header */
206  uint16_t fh_offset;
207  uint32_t fh_id;
208 
210 
211 #define IPV6_EXTHDR_SET_FH(p) (p)->l3.vars.ip6.eh.fh_set = true
212 #define IPV6_EXTHDR_ISSET_FH(p) (p)->l3.vars.ip6.eh.fh_set
213 #define IPV6_EXTHDR_SET_RH(p) (p)->l3.vars.ip6.eh.rh_set = true
214 #define IPV6_EXTHDR_ISSET_RH(p) (p)->l3.vars.ip6.eh.rh_set
215 
216 void DecodeIPV6RegisterTests(void);
217 
218 #endif /* SURICATA_DECODE_IPV6_H */
IPV6ExtHdrs_::fh_data_offset
uint16_t fh_data_offset
Definition: decode-ipv6.h:200
IPV6Vars_::l4proto
uint8_t l4proto
Definition: decode-ipv6.h:85
IPV6FragHdr_::ip6fh_offlg
uint16_t ip6fh_offlg
Definition: decode-ipv6.h:96
IPV6RouteHdr_
Definition: decode-ipv6.h:123
IPV6AuthHdr_::ip6ah_nxt
uint8_t ip6ah_nxt
Definition: decode-ipv6.h:108
IPV6GenOptHdr_::len
uint8_t len
Definition: decode-ipv6.h:183
IPV6HopOptsHdr_::ip6hh_len
uint8_t ip6hh_len
Definition: decode-ipv6.h:168
IPV6ExtHdrs_
Definition: decode-ipv6.h:188
IPV6Vars
struct IPV6Vars_ IPV6Vars
get the highest proto/next header field we know
IPV6AuthHdr_::ip6ah_reserved
uint16_t ip6ah_reserved
Definition: decode-ipv6.h:111
IPV6Hdr_::ip6_dst
uint32_t ip6_dst[4]
Definition: decode-ipv6.h:46
IPV6OptRA_::ip6ra_value
uint16_t ip6ra_value
Definition: decode-ipv6.h:154
IPV6OptHAO_::ip6hao_hoa
struct in6_addr ip6hao_hoa
Definition: decode-ipv6.h:146
IPV6AuthHdr_::ip6ah_seq
uint32_t ip6ah_seq
Definition: decode-ipv6.h:113
IPV6EspHdr_::ip6esph_seq
uint32_t ip6esph_seq
Definition: decode-ipv6.h:119
IPV6ExtHdrs_::fh_nh
uint8_t fh_nh
Definition: decode-ipv6.h:194
IPV6GenOptHdr_::type
uint8_t type
Definition: decode-ipv6.h:181
IPV6GenOptHdr_
Definition: decode-ipv6.h:180
IPV6Hdr_::ip6_un1_nxt
uint8_t ip6_un1_nxt
Definition: decode-ipv6.h:37
IPV6ExtHdrs_::fh_prev_nh
uint8_t fh_prev_nh
Definition: decode-ipv6.h:196
IPV6Hdr_::ip6_un1
struct IPV6Hdr_::@27::ip6_un1_ ip6_un1
IPV6FragHdr_::ip6fh_nxt
uint8_t ip6fh_nxt
Definition: decode-ipv6.h:94
IPV6AuthHdr_::ip6ah_spi
uint32_t ip6ah_spi
Definition: decode-ipv6.h:112
IPV6ExtHdrs_::fh_set
bool fh_set
Definition: decode-ipv6.h:192
IPV6DstOptsHdr_::ip6dh_len
uint8_t ip6dh_len
Definition: decode-ipv6.h:175
IPV6ExtHdrs_::fh_id
uint32_t fh_id
Definition: decode-ipv6.h:207
IPV6OptHAO_::ip6hao_len
uint8_t ip6hao_len
Definition: decode-ipv6.h:145
__attribute__
struct IPV6FragHdr_ __attribute__((__packed__)) IPV6FragHdr
DNP3 link header.
Definition: decode-vlan.c:103
IPV6RouteHdr_::ip6rh_type
uint8_t ip6rh_type
Definition: decode-ipv6.h:127
IPV6EspHdr_::ip6esph_spi
uint32_t ip6esph_spi
Definition: decode-ipv6.h:118
IPV6HopOptsHdr_
Definition: decode-ipv6.h:166
IPV6EspHdr_
Definition: decode-ipv6.h:117
IPV6OptHAO
struct IPV6OptHAO_ IPV6OptHAO
IPV6Hdr_::ip6_un1_flow
uint32_t ip6_un1_flow
Definition: decode-ipv6.h:35
IPV6HopOptsHdr_::ip6hh_nxt
uint8_t ip6hh_nxt
Definition: decode-ipv6.h:167
IPV6RouteHdr_::ip6rh_segsleft
uint8_t ip6rh_segsleft
Definition: decode-ipv6.h:128
IPV6ExtHdrs_::fh_more_frags_set
bool fh_more_frags_set
Definition: decode-ipv6.h:193
IPV6ExtHdrs_::rh_set
bool rh_set
Definition: decode-ipv6.h:189
IPV6Vars_::exthdrs_len
uint16_t exthdrs_len
Definition: decode-ipv6.h:88
IPV6Vars_
get the highest proto/next header field we know
Definition: decode-ipv6.h:84
IPV6Hdr_
Definition: decode-ipv6.h:32
IPV6DstOptsHdr_::ip6dh_nxt
uint8_t ip6dh_nxt
Definition: decode-ipv6.h:174
IPV6Hdr_::ip6_un1_plen
uint16_t ip6_un1_plen
Definition: decode-ipv6.h:36
DecodeIPV6RegisterTests
void DecodeIPV6RegisterTests(void)
this function registers unit tests for IPV6 decoder
Definition: decode-ipv6.c:901
IPV6ExtHdrs_::fh_offset
uint16_t fh_offset
Definition: decode-ipv6.h:206
IPV6DstOptsHdr_
Definition: decode-ipv6.h:173
IPV6Hdr_::ip6_un1_hlim
uint8_t ip6_un1_hlim
Definition: decode-ipv6.h:38
IPV6ExtHdrs
struct IPV6ExtHdrs_ IPV6ExtHdrs
IPV6OptRA_
Definition: decode-ipv6.h:151
IPV6ExtHdrs_::fh_data_len
uint16_t fh_data_len
Definition: decode-ipv6.h:201
IPV6OptJumbo_::ip6j_payload_len
uint32_t ip6j_payload_len
Definition: decode-ipv6.h:162
IPV6FragHdr_::ip6fh_ident
uint32_t ip6fh_ident
Definition: decode-ipv6.h:97
IPV6Hdr_::ip6_hdrun2
union IPV6Hdr_::@28 ip6_hdrun2
IPV6OptJumbo
struct IPV6OptJumbo_ IPV6OptJumbo
IPV6Hdr
struct IPV6Hdr_ IPV6Hdr
IPV6Hdr_::ip6_un2_vfc
uint8_t ip6_un2_vfc
Definition: decode-ipv6.h:40
IPV6OptHAO_::ip6hao_type
uint8_t ip6hao_type
Definition: decode-ipv6.h:144
IPV6ExtHdrs_::fh_header_offset
uint16_t fh_header_offset
Definition: decode-ipv6.h:199
IPV6ExtHdrs_::fh_prev_hdr_offset
uint16_t fh_prev_hdr_offset
Definition: decode-ipv6.h:197
IPV6AuthHdr_::ip6ah_len
uint8_t ip6ah_len
Definition: decode-ipv6.h:109
IPV6GenOptHdr_::next
uint8_t next
Definition: decode-ipv6.h:182
IPV6OptRA_::ip6ra_len
uint8_t ip6ra_len
Definition: decode-ipv6.h:153
IPV6RouteHdr_::ip6rh_nxt
uint8_t ip6rh_nxt
Definition: decode-ipv6.h:124
IPV6OptJumbo_
Definition: decode-ipv6.h:159
IPV6OptRA_::ip6ra_type
uint8_t ip6ra_type
Definition: decode-ipv6.h:152
IPV6FragHdr_
Definition: decode-ipv6.h:93
IPV6AuthHdr_
Definition: decode-ipv6.h:107
IPV6Hdr_::ip6_src
uint32_t ip6_src[4]
Definition: decode-ipv6.h:45
IPV6OptJumbo_::ip6j_len
uint8_t ip6j_len
Definition: decode-ipv6.h:161
IPV6OptJumbo_::ip6j_type
uint8_t ip6j_type
Definition: decode-ipv6.h:160
IPV6Hdr_::ip6_un2
struct IPV6Hdr_::@28::@29 ip6_un2
IPV6RouteHdr_::ip6rh_len
uint8_t ip6rh_len
Definition: decode-ipv6.h:125
IPV6Hdr_::ip6_addrs
uint16_t ip6_addrs[16]
Definition: decode-ipv6.h:48
IPV6ExtHdrs_::rh_type
uint8_t rh_type
Definition: decode-ipv6.h:190
IPV6GenOptHdr_::data
uint8_t * data
Definition: decode-ipv6.h:184
IPV6FragHdr_::ip6fh_reserved
uint8_t ip6fh_reserved
Definition: decode-ipv6.h:95
IPV6OptHAO_
Definition: decode-ipv6.h:143
IPV6OptRA
struct IPV6OptRA_ IPV6OptRA
IPV6Hdr_::ip6_hdrun
union IPV6Hdr_::@27 ip6_hdrun
IPV6GenOptHdr
struct IPV6GenOptHdr_ IPV6GenOptHdr