suricata
decode-geneve.c
Go to the documentation of this file.
1 /* Copyright (C) 2020-2021 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 Ali Jad Khalil <jadkhal@amazon.com>
22  *
23  * Geneve tunneling scheme decoder.
24  *
25  * This implementation is based on the following specification doc:
26  * https://tools.ietf.org/html/draft-ietf-nvo3-geneve-16#section-3
27  */
28 
29 #include "suricata-common.h"
30 #include "decode.h"
31 #include "decode-geneve.h"
32 #include "decode-events.h"
33 
34 #include "detect.h"
35 #include "detect-engine-port.h"
36 
37 #include "flow.h"
38 
39 #include "util-validate.h"
40 #include "util-debug.h"
41 
42 #include "pkt-var.h"
43 #include "util-profiling.h"
44 #include "host.h"
45 
46 #define VALID_GENEVE_VERSIONS \
47  { \
48  0 \
49  }
50 #define GENEVE_VERSION(hdr_ptr) (hdr_ptr->ver_plus_len >> 6)
51 #define GENEVE_RESERVED_FLAGS(hdr_ptr) (hdr_ptr->flags & 0x3F)
52 
53 #define GENEVE_MIN_HEADER_LEN sizeof(GeneveHeader)
54 #define GENEVE_TOTAL_OPT_LEN(hdr_ptr) ((uint8_t)((hdr_ptr->ver_plus_len & 0x3F) << 2))
55 #define GENEVE_TOTAL_HEADER_LEN(hdr_ptr) (GENEVE_MIN_HEADER_LEN + GENEVE_TOTAL_OPT_LEN(hdr_ptr))
56 
57 #define GENEVE_MIN_SINGLE_OPT_LEN sizeof(GeneveOption)
58 #define GENEVE_SINGLE_OPT_LEN(option_ptr) ((uint8_t)((option_ptr->flags_plus_len & 0x1F) << 2))
59 #define GENEVE_SINGLE_OPT_TOTAL_LEN(option_ptr) \
60  (GENEVE_MIN_SINGLE_OPT_LEN + GENEVE_SINGLE_OPT_LEN(option_ptr))
61 
62 #define GENEVE_MAX_PORTS 4
63 #define GENEVE_UNSET_PORT -1
64 #define GENEVE_DEFAULT_PORT 6081
65 #define GENEVE_DEFAULT_PORT_S "6081"
66 
67 static bool g_geneve_enabled = true;
68 static int g_geneve_ports_idx = 0;
69 static int g_geneve_ports[GENEVE_MAX_PORTS] = { GENEVE_DEFAULT_PORT, GENEVE_UNSET_PORT,
71 
72 /* Geneve structs based on diagrams from the following specification doc:
73  * https://tools.ietf.org/html/draft-ietf-nvo3-geneve-16#section-3 */
74 typedef struct GeneveOption_ {
75  uint16_t option_class;
76  uint8_t type;
77  uint8_t flags_plus_len;
78  uint8_t option_data[0];
80 
81 typedef struct GeneveHeader_ {
82  uint8_t ver_plus_len;
83  uint8_t flags;
84  uint16_t eth_type;
85  uint8_t vni[3];
86  uint8_t res;
89 
90 bool DecodeGeneveEnabledForPort(const uint16_t sp, const uint16_t dp)
91 {
92  SCLogDebug("ports %u->%u ports %d %d %d %d", sp, dp, g_geneve_ports[0], g_geneve_ports[1],
93  g_geneve_ports[2], g_geneve_ports[3]);
94 
95  if (g_geneve_enabled) {
96  for (int i = 0; i < g_geneve_ports_idx; i++) {
97  if (g_geneve_ports[i] == GENEVE_UNSET_PORT)
98  return false;
99 
100  const int port = g_geneve_ports[i];
101  if (port == (const int)sp || port == (const int)dp)
102  return true;
103  }
104  }
105  return false;
106 }
107 
108 static void DecodeGeneveConfigPorts(const char *pstr)
109 {
110  SCLogDebug("parsing \'%s\'", pstr);
111 
112  DetectPort *head = NULL;
113  DetectPortParse(NULL, &head, pstr);
114 
115  g_geneve_ports_idx = 0;
116  for (DetectPort *p = head; p != NULL; p = p->next) {
117  if (g_geneve_ports_idx >= GENEVE_MAX_PORTS) {
118  SCLogWarning("more than %d Geneve ports defined", GENEVE_MAX_PORTS);
119  break;
120  }
121  g_geneve_ports[g_geneve_ports_idx++] = (int)p->port;
122  }
123 
125 }
126 
128 {
129  int enabled = 0;
130  if (SCConfGetBool("decoder.geneve.enabled", &enabled) == 1) {
131  if (enabled) {
132  g_geneve_enabled = true;
133  } else {
134  g_geneve_enabled = false;
135  }
136  }
137 
138  if (g_geneve_enabled) {
139  SCConfNode *node = SCConfGetNode("decoder.geneve.ports");
140  if (node && node->val) {
141  DecodeGeneveConfigPorts(node->val);
142  } else {
143  DecodeGeneveConfigPorts(GENEVE_DEFAULT_PORT_S);
144  }
145  }
146 }
147 
148 static inline bool IsValidGeneveVersion(const GeneveHeader *geneve_hdr)
149 {
150  const int valid_versions[] = VALID_GENEVE_VERSIONS;
151  const int num_versions = sizeof(valid_versions) / sizeof(int);
152  const uint8_t cur_version = GENEVE_VERSION(geneve_hdr);
153 
154  for (int i = 0; i < num_versions; i++) {
155  if (valid_versions[i] == cur_version)
156  return true;
157  }
158 
159  return false;
160 }
161 
162 /* Performs a check to ensure that option lens add up to total length specified in the fixed header
163  */
164 static inline bool IsHeaderLengthConsistentWithOptions(const GeneveHeader *geneve_hdr)
165 {
166  uint8_t *geneve_opt_ptr = (uint8_t *)geneve_hdr->options;
167  int remaining_hdr_len = GENEVE_TOTAL_OPT_LEN(geneve_hdr);
168 
169  while (remaining_hdr_len > 0) {
170  const GeneveOption *cur_opt = (const GeneveOption *)geneve_opt_ptr;
171  const uint8_t cur_option_len = GENEVE_SINGLE_OPT_TOTAL_LEN(cur_opt);
172 
173  geneve_opt_ptr += cur_option_len;
174  remaining_hdr_len -=
175  cur_option_len; /* cur_option_len will always be between 4-128, inclusive */
176  }
177 
178  return (remaining_hdr_len == 0);
179 }
180 
181 /** \param pkt payload data directly above UDP header
182  * \param len length in bytes of pkt
183  */
184 int DecodeGeneve(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
185 {
186  DEBUG_VALIDATE_BUG_ON(pkt == NULL);
187 
188  const GeneveHeader *geneve_hdr = (const GeneveHeader *)pkt;
189 
190  uint16_t eth_type, geneve_hdr_len;
191  int decode_tunnel_proto = DECODE_TUNNEL_UNSET;
192 
193  /* General Geneve packet validation */
194  if (unlikely(!g_geneve_enabled))
195  return TM_ECODE_FAILED;
196 
198  return TM_ECODE_FAILED;
199  if (!PacketIncreaseCheckLayers(p)) {
200  return TM_ECODE_FAILED;
201  }
202 
203  /* Specific Geneve header field validation */
204  geneve_hdr_len = GENEVE_TOTAL_HEADER_LEN(geneve_hdr);
205  if (len < geneve_hdr_len)
206  return TM_ECODE_FAILED;
207 
208  if (!IsValidGeneveVersion(geneve_hdr))
209  return TM_ECODE_FAILED;
210 
211  if (GENEVE_RESERVED_FLAGS(geneve_hdr) != 0 || geneve_hdr->res != 0)
212  return TM_ECODE_FAILED;
213 
214  if (!IsHeaderLengthConsistentWithOptions(geneve_hdr))
215  return TM_ECODE_FAILED;
216 
217 #if DEBUG
218  /* Print the VNI for debugging purposes */
219  uint32_t vni = (geneve_hdr->vni[0] << 16) + (geneve_hdr->vni[1] << 8) + (geneve_hdr->vni[2]);
220  SCLogDebug("Geneve vni %u", vni);
221 #endif
222 
223  /* Increment stats counter for Geneve packets */
225 
226  /* Determine first protocol encapsulated after Geneve header */
227  eth_type = SCNtohs(geneve_hdr->eth_type);
228  SCLogDebug("Geneve ethertype 0x%04x", eth_type);
229 
230  switch (eth_type) {
231  case ETHERNET_TYPE_IP:
232  SCLogDebug("Geneve found IPv4");
233  decode_tunnel_proto = DECODE_TUNNEL_IPV4;
234  break;
235  case ETHERNET_TYPE_IPV6:
236  SCLogDebug("Geneve found IPv6");
237  decode_tunnel_proto = DECODE_TUNNEL_IPV6;
238  break;
240  SCLogDebug("Geneve found Ethernet");
241  decode_tunnel_proto = DECODE_TUNNEL_ETHERNET;
242  break;
243  case ETHERNET_TYPE_ARP:
244  SCLogDebug("Geneve found ARP");
245  break;
246  default:
247  SCLogDebug(
248  "Geneve found unsupported Ethertype - expected IPv4, IPv6, ARP, or Ethernet");
250  }
251 
252  /* Set-up and process inner packet if it is a supported ethertype */
253  if (decode_tunnel_proto != DECODE_TUNNEL_UNSET) {
255  tv, dtv, p, pkt + geneve_hdr_len, len - geneve_hdr_len, decode_tunnel_proto);
256 
257  if (tp != NULL) {
260  }
261  }
262 
263  return TM_ECODE_OK;
264 }
265 
266 #ifdef UNITTESTS
267 
268 /**
269  * \test DecodeGeneveTest01 tests a good Geneve header with 16-bytes of options.
270  * Contains a Ethernet+IPv6 DHCP request packet.
271  */
272 static int DecodeGeneveTest01(void)
273 {
274  uint8_t raw_geneve[] = { 0x32, 0x10, 0x17, 0xc1, 0x00, 0xc1, 0x87, 0x51, /* UDP header */
275  0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00, /* Geneve fixed header */
276  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
277  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
278  0x33, 0x33, 0x00, 0x01, 0x00, 0x02, /* inner destination MAC */
279  0x08, 0x00, 0x27, 0xfe, 0x8f, 0x95, /* inner source MAC */
280  0x86, 0xdd, /* type is IPv6 0x86dd */
281  0x60, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x11, 0x01, /* IPv6 hdr */
282  0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x27, 0xff, 0xfe, 0xfe, 0x8f,
283  0x95, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
284  0x00, 0x02, 0x02, 0x22, 0x02, 0x23, 0x00, 0x6b, 0x9c, 0xfb, /* UDP src port 546 */
285  0x03, 0x49, 0x17, 0x4e, 0x00, 0x01, 0x00, 0x0e, /* DHCP request payload */
286  0x00, 0x01, 0x00, 0x01, 0x1c, 0x39, 0xcf, 0x88, 0x08, 0x00, 0x27, 0xfe, 0x8f, 0x95, 0x00,
287  0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x1c, 0x38, 0x25, 0xe8, 0x08, 0x00, 0x27, 0xd4,
288  0x10, 0xbb, 0x00, 0x06, 0x00, 0x04, 0x00, 0x17, 0x00, 0x18, 0x00, 0x08, 0x00, 0x02, 0x00,
289  0x00, 0x00, 0x19, 0x00, 0x29, 0x27, 0xfe, 0x8f, 0x95, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00,
290  0x15, 0x18, 0x00, 0x1a, 0x00, 0x19, 0x00, 0x00, 0x1c, 0x20, 0x00, 0x00, 0x1d, 0x4c, 0x40,
291  0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292  0x00 };
293 
295  FAIL_IF_NULL(p);
296  ThreadVars tv;
298 
299  DecodeGeneveConfigPorts(GENEVE_DEFAULT_PORT_S);
300 
301  memset(&tv, 0, sizeof(ThreadVars));
302  memset(&dtv, 0, sizeof(DecodeThreadVars));
303 
305  DecodeUDP(&tv, &dtv, p, raw_geneve, sizeof(raw_geneve));
306 
307  FAIL_IF_NOT(PacketIsUDP(p));
308  FAIL_IF(tv.decode_pq.top == NULL);
309 
311  FAIL_IF_NOT(PacketIsUDP(tp));
312  FAIL_IF_NOT(tp->sp == 546);
313 
314  FlowShutdown();
315  PacketFree(p);
316  PacketFree(tp);
317  PASS;
318 }
319 
320 /**
321  * \test DecodeGeneveTest02 tests a good Geneve header with 16-bytes of options.
322  * Contains a IPv4 DNS request packet.
323  */
324 static int DecodeGeneveTest02(void)
325 {
326  uint8_t raw_geneve[] = {
327  0x32, 0x10, 0x17, 0xc1, 0x00, 0x3c, 0x87, 0x51, /* UDP header */
328  0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25, 0x00, /* Geneve fixed header */
329  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
330  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
331  0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, /* IPv4 hdr */
332  0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
333  0x08, 0x98, 0xe4 /* UDP probe src port 53 */
334  };
335 
337  FAIL_IF_NULL(p);
338  ThreadVars tv;
340 
341  DecodeGeneveConfigPorts(GENEVE_DEFAULT_PORT_S);
342 
343  memset(&tv, 0, sizeof(ThreadVars));
344  memset(&dtv, 0, sizeof(DecodeThreadVars));
345 
347  DecodeUDP(&tv, &dtv, p, raw_geneve, sizeof(raw_geneve));
348 
349  FAIL_IF_NOT(PacketIsUDP(p));
350  FAIL_IF(tv.decode_pq.top == NULL);
351 
353  FAIL_IF_NOT(PacketIsUDP(tp));
354  FAIL_IF_NOT(tp->sp == 53);
355 
356  FlowShutdown();
357  PacketFree(p);
358  PacketFree(tp);
359  PASS;
360 }
361 
362 /**
363  * \test DecodeGeneveTest03 tests a good Geneve header with 16-bytes of options.
364  * Contains a IPv4 DNS request packet with a VLAN tag after the Ethernet frame.
365  * In practice, this probably won't be used but it should be support either way.
366  */
367 static int DecodeGeneveTest03(void)
368 {
369  uint8_t raw_geneve[] = {
370  0x32, 0x10, 0x17, 0xc1, 0x00, 0x4e, 0x87, 0x51, /* UDP header */
371  0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00, /* Geneve fixed header */
372  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
373  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
374  0x33, 0x33, 0x00, 0x01, 0x00, 0x02, /* inner destination MAC */
375  0x08, 0x00, 0x27, 0xfe, 0x8f, 0x95, /* inner source MAC */
376  0x81, 0x00, 0x00, 0xad, /* 802.1Q VLAN tag */
377  0x08, 0x00, /* type is IPv4 0x0800 */
378  0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, /* IPv4 hdr */
379  0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
380  0x08, 0x98, 0xe4 /* UDP probe src port 53 */
381  };
382 
384  FAIL_IF_NULL(p);
385  ThreadVars tv;
387 
388  DecodeGeneveConfigPorts(GENEVE_DEFAULT_PORT_S);
389 
390  memset(&tv, 0, sizeof(ThreadVars));
391  memset(&dtv, 0, sizeof(DecodeThreadVars));
392 
394  DecodeUDP(&tv, &dtv, p, raw_geneve, sizeof(raw_geneve));
395 
396  FAIL_IF_NOT(PacketIsUDP(p));
397  FAIL_IF(tv.decode_pq.top == NULL);
398 
400  FAIL_IF_NOT(PacketIsUDP(tp));
401  FAIL_IF_NOT(tp->sp == 53);
402 
403  FlowShutdown();
404  PacketFree(p);
405  PacketFree(tp);
406  PASS;
407 }
408 
409 /**
410  * \test DecodeGeneveTest04 tests default port disabled by the config.
411  */
412 static int DecodeGeneveTest04(void)
413 {
414  uint8_t raw_geneve[] = {
415  0x32, 0x10, 0x17, 0xc1, 0x00, 0x4a, 0x87, 0x51, /* UDP header */
416  0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00, /* Geneve fixed header */
417  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
418  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
419  0x10, 0x00, 0x00, 0x0c, 0x01, 0x00, /* inner destination MAC */
420  0x00, 0x51, 0x52, 0xb3, 0x54, 0xe5, /* inner source MAC */
421  0x08, 0x00, /* type is IPv4 0x0800 */
422  0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, /* IPv4 hdr */
423  0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
424  0x08, 0x98, 0xe4 /* UDP probe src port 53 */
425  };
426 
428  FAIL_IF_NULL(p);
429  ThreadVars tv;
431 
432  DecodeGeneveConfigPorts("1"); /* Set Suricata to use a non-default port for Geneve*/
433 
434  memset(&tv, 0, sizeof(ThreadVars));
435  memset(&dtv, 0, sizeof(DecodeThreadVars));
436 
438  DecodeUDP(&tv, &dtv, p, raw_geneve, sizeof(raw_geneve));
439 
440  FAIL_IF_NOT(PacketIsUDP(p));
441  FAIL_IF(tv.decode_pq.top != NULL); /* Geneve packet should not have been processed */
442 
443  DecodeGeneveConfigPorts(GENEVE_DEFAULT_PORT_S); /* Reset Geneve port list for future calls */
444  FlowShutdown();
445  PacketFree(p);
446  PASS;
447 }
448 
449 /**
450  * \test DecodeGeneveTest05 tests if Geneve header has inconsistent option len values.
451  */
452 static int DecodeGeneveTest05(void)
453 {
454  uint8_t raw_geneve[] = {
455  0x32, 0x10, 0x17, 0xc1, 0x00, 0x4a, 0x87, 0x51, /* UDP header */
456  0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00, /* Geneve fixed header */
457  0x01, 0x08, 0x00, 0x04, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
458  0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11, /* Geneve variable options */
459  0x10, 0x00, 0x00, 0x0c, 0x01, 0x00, /* inner destination MAC */
460  0x00, 0x51, 0x52, 0xb3, 0x54, 0xe5, /* inner source MAC */
461  0x08, 0x00, /* type is IPv4 0x0800 */
462  0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11, /* IPv4 hdr */
463  0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
464  0x08, 0x98, 0xe4 /* UDP probe src port 53 */
465  };
466 
468  FAIL_IF_NULL(p);
469  ThreadVars tv;
471 
472  DecodeGeneveConfigPorts(GENEVE_DEFAULT_PORT_S);
473 
474  memset(&tv, 0, sizeof(ThreadVars));
475  memset(&dtv, 0, sizeof(DecodeThreadVars));
476 
478  DecodeUDP(&tv, &dtv, p, raw_geneve, sizeof(raw_geneve));
479 
480  FAIL_IF_NOT(PacketIsUDP(p));
481  FAIL_IF(tv.decode_pq.top != NULL); /* Geneve packet should not have been processed */
482 
483  FlowShutdown();
484  PacketFree(p);
485  PASS;
486 }
487 #endif /* UNITTESTS */
488 
490 {
491 #ifdef UNITTESTS
492  UtRegisterTest("DecodeGeneveTest01 -- Ethernet+IPv6 DHCP Request", DecodeGeneveTest01);
493  UtRegisterTest("DecodeGeneveTest02 -- IPv4 DNS Request", DecodeGeneveTest02);
494  UtRegisterTest("DecodeGeneveTest03 -- VLAN+IPv4 DNS Request", DecodeGeneveTest03);
495  UtRegisterTest("DecodeGeneveTest04 -- Non-standard port configuration", DecodeGeneveTest04);
496  UtRegisterTest("DecodeGeneveTest05 -- Inconsistent Geneve hdr option lens", DecodeGeneveTest05);
497 #endif /* UNITTESTS */
498 }
ETHERNET_TYPE_BRIDGE
#define ETHERNET_TYPE_BRIDGE
Definition: decode-ethernet.h:36
host.h
len
uint8_t len
Definition: app-layer-dnp3.h:2
GeneveOption_::flags_plus_len
uint8_t flags_plus_len
Definition: decode-geneve.c:77
DECODE_TUNNEL_IPV6
@ DECODE_TUNNEL_IPV6
Definition: decode.h:1150
FAIL_IF_NULL
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
Definition: util-unittest.h:89
DecodeUDP
int DecodeUDP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint16_t len)
Definition: decode-udp.c:74
unlikely
#define unlikely(expr)
Definition: util-optimize.h:35
UtRegisterTest
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
Definition: util-unittest.c:101
SCLogDebug
#define SCLogDebug(...)
Definition: util-debug.h:282
GENEVE_SINGLE_OPT_TOTAL_LEN
#define GENEVE_SINGLE_OPT_TOTAL_LEN(option_ptr)
Definition: decode-geneve.c:59
ETHERNET_TYPE_IPV6
#define ETHERNET_TYPE_IPV6
Definition: decode-ethernet.h:39
GENEVE_UNKNOWN_PAYLOAD_TYPE
@ GENEVE_UNKNOWN_PAYLOAD_TYPE
Definition: decode-events.h:218
SCConfGetBool
int SCConfGetBool(const char *name, int *val)
Retrieve a configuration value as a boolean.
Definition: conf.c:523
p
Packet * p
Definition: fuzz_dataset.c:30
GENEVE_DEFAULT_PORT
#define GENEVE_DEFAULT_PORT
Definition: decode-geneve.c:64
TM_ECODE_FAILED
@ TM_ECODE_FAILED
Definition: tm-threads-common.h:82
GeneveHeader_::ver_plus_len
uint8_t ver_plus_len
Definition: decode-geneve.c:82
FAIL_IF_NOT
#define FAIL_IF_NOT(expr)
Fail a test if expression evaluates to false.
Definition: util-unittest.h:82
TM_ECODE_OK
@ TM_ECODE_OK
Definition: tm-threads-common.h:81
PKT_SET_SRC
#define PKT_SET_SRC(p, src_val)
Definition: decode.h:1366
FlowInitConfig
void FlowInitConfig(bool quiet)
initialize the configuration
Definition: flow.c:574
DecodeGeneveEnabledForPort
bool DecodeGeneveEnabledForPort(const uint16_t sp, const uint16_t dp)
Definition: decode-geneve.c:90
DetectPortParse
int DetectPortParse(const DetectEngineCtx *de_ctx, DetectPort **head, const char *str)
Function for parsing port strings.
Definition: detect-engine-port.c:1134
GeneveOption_::type
uint8_t type
Definition: decode-geneve.c:76
decode.h
DecodeGeneve
int DecodeGeneve(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, const uint8_t *pkt, uint32_t len)
Definition: decode-geneve.c:184
util-debug.h
VALID_GENEVE_VERSIONS
#define VALID_GENEVE_VERSIONS
Definition: decode-geneve.c:46
PASS
#define PASS
Pass the test.
Definition: util-unittest.h:105
PacketDequeueNoLock
Packet * PacketDequeueNoLock(PacketQueueNoLock *qnl)
Definition: packet-queue.c:208
detect.h
ThreadVars_
Per thread variable structure.
Definition: threadvars.h:57
pkt-var.h
Packet_::sp
Port sp
Definition: decode.h:523
eth_type
uint16_t eth_type
Definition: decode-ethernet.h:2
GeneveHeader_::flags
uint8_t flags
Definition: decode-geneve.c:83
GENEVE_TOTAL_OPT_LEN
#define GENEVE_TOTAL_OPT_LEN(hdr_ptr)
Definition: decode-geneve.c:54
StatsCounterIncr
void StatsCounterIncr(StatsThreadContext *stats, StatsCounterId id)
Increments the local counter.
Definition: counters.c:163
PacketFree
void PacketFree(Packet *p)
Return a malloced packet.
Definition: decode.c:221
detect-engine-port.h
SCLogWarning
#define SCLogWarning(...)
Macro used to log WARNING messages.
Definition: util-debug.h:262
DetectPort_
Port structure for detection engine.
Definition: detect.h:223
util-profiling.h
Packet_
Definition: decode.h:516
DECODE_TUNNEL_IPV4
@ DECODE_TUNNEL_IPV4
Definition: decode.h:1149
GeneveOption_
Definition: decode-geneve.c:74
DecodeThreadVars_::counter_geneve
StatsCounterId counter_geneve
Definition: decode.h:1037
GeneveOption
struct GeneveOption_ GeneveOption
GeneveHeader_::options
GeneveOption options[0]
Definition: decode-geneve.c:87
DECODE_TUNNEL_ETHERNET
@ DECODE_TUNNEL_ETHERNET
Definition: decode.h:1144
decode-events.h
dtv
DecodeThreadVars * dtv
Definition: fuzz_decodepcapfile.c:35
GENEVE_MAX_PORTS
#define GENEVE_MAX_PORTS
Definition: decode-geneve.c:62
PKT_SRC_DECODER_GENEVE
@ PKT_SRC_DECODER_GENEVE
Definition: decode.h:63
GENEVE_UNSET_PORT
#define GENEVE_UNSET_PORT
Definition: decode-geneve.c:63
PacketEnqueueNoLock
void PacketEnqueueNoLock(PacketQueueNoLock *qnl, Packet *p)
Definition: packet-queue.c:168
FAIL_IF
#define FAIL_IF(expr)
Fail a test if expression evaluates to true.
Definition: util-unittest.h:71
GENEVE_DEFAULT_PORT_S
#define GENEVE_DEFAULT_PORT_S
Definition: decode-geneve.c:65
SCNtohs
#define SCNtohs(x)
Definition: suricata-common.h:436
suricata-common.h
PacketQueueNoLock_::top
struct Packet_ * top
Definition: packet-queue.h:35
GENEVE_TOTAL_HEADER_LEN
#define GENEVE_TOTAL_HEADER_LEN(hdr_ptr)
Definition: decode-geneve.c:55
FlowShutdown
void FlowShutdown(void)
shutdown the flow engine
Definition: flow.c:718
GeneveHeader_
Definition: decode-geneve.c:81
GeneveHeader_::eth_type
uint16_t eth_type
Definition: decode-geneve.c:84
GeneveOption_::option_class
uint16_t option_class
Definition: decode-geneve.c:75
decode-geneve.h
tv
ThreadVars * tv
Definition: fuzz_decodepcapfile.c:34
util-validate.h
PacketGetFromAlloc
Packet * PacketGetFromAlloc(void)
Get a malloced packet.
Definition: decode.c:260
Packet_::next
struct Packet_ * next
Definition: decode.h:648
GENEVE_RESERVED_FLAGS
#define GENEVE_RESERVED_FLAGS(hdr_ptr)
Definition: decode-geneve.c:51
GeneveHeader
struct GeneveHeader_ GeneveHeader
SCConfGetNode
SCConfNode * SCConfGetNode(const char *name)
Get a SCConfNode by name.
Definition: conf.c:183
head
Flow * head
Definition: flow-hash.h:1
DecodeThreadVars_
Structure to hold thread specific data for all decode modules.
Definition: decode.h:995
ETHERNET_TYPE_ARP
#define ETHERNET_TYPE_ARP
Definition: decode-ethernet.h:35
ThreadVars_::decode_pq
PacketQueueNoLock decode_pq
Definition: threadvars.h:110
GeneveHeader_::vni
uint8_t vni[3]
Definition: decode-geneve.c:85
ENGINE_SET_INVALID_EVENT
#define ENGINE_SET_INVALID_EVENT(p, e)
Definition: decode.h:1239
FLOW_QUIET
#define FLOW_QUIET
Definition: flow.h:43
DecodeGeneveConfig
void DecodeGeneveConfig(void)
Definition: decode-geneve.c:127
GENEVE_VERSION
#define GENEVE_VERSION(hdr_ptr)
Definition: decode-geneve.c:50
GENEVE_MIN_HEADER_LEN
#define GENEVE_MIN_HEADER_LEN
Definition: decode-geneve.c:53
PacketTunnelPktSetup
Packet * PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *parent, const uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto)
Setup a pseudo packet (tunnel)
Definition: decode.c:402
flow.h
ThreadVars_::stats
StatsThreadContext stats
Definition: threadvars.h:120
DecodeGeneveRegisterTests
void DecodeGeneveRegisterTests(void)
Definition: decode-geneve.c:489
SCConfNode_
Definition: conf.h:37
SCConfNode_::val
char * val
Definition: conf.h:39
ETHERNET_TYPE_IP
#define ETHERNET_TYPE_IP
Definition: decode-ethernet.h:34
DetectPortCleanupList
void DetectPortCleanupList(const DetectEngineCtx *de_ctx, DetectPort *head)
Free a DetectPort list and each of its members.
Definition: detect-engine-port.c:123
DECODE_TUNNEL_UNSET
@ DECODE_TUNNEL_UNSET
Definition: decode.h:1155
DEBUG_VALIDATE_BUG_ON
#define DEBUG_VALIDATE_BUG_ON(exp)
Definition: util-validate.h:109
GeneveHeader_::res
uint8_t res
Definition: decode-geneve.c:86
GeneveOption_::option_data
uint8_t option_data[0]
Definition: decode-geneve.c:78