46 #define VALID_GENEVE_VERSIONS \
50 #define GENEVE_VERSION(hdr_ptr) (hdr_ptr->ver_plus_len >> 6)
51 #define GENEVE_RESERVED_FLAGS(hdr_ptr) (hdr_ptr->flags & 0x3F)
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))
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))
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"
67 static bool g_geneve_enabled =
true;
68 static int g_geneve_ports_idx = 0;
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]);
95 if (g_geneve_enabled) {
96 for (
int i = 0; i < g_geneve_ports_idx; i++) {
100 const int port = g_geneve_ports[i];
101 if (port == (
const int)sp || port == (
const int)dp)
108 static void DecodeGeneveConfigPorts(
const char *pstr)
115 g_geneve_ports_idx = 0;
121 g_geneve_ports[g_geneve_ports_idx++] = (int)
p->port;
130 if (
SCConfGetBool(
"decoder.geneve.enabled", &enabled) == 1) {
132 g_geneve_enabled =
true;
134 g_geneve_enabled =
false;
138 if (g_geneve_enabled) {
140 if (node && node->
val) {
141 DecodeGeneveConfigPorts(node->
val);
148 static inline bool IsValidGeneveVersion(
const GeneveHeader *geneve_hdr)
151 const int num_versions =
sizeof(valid_versions) /
sizeof(
int);
154 for (
int i = 0; i < num_versions; i++) {
155 if (valid_versions[i] == cur_version)
164 static inline bool IsHeaderLengthConsistentWithOptions(
const GeneveHeader *geneve_hdr)
166 uint8_t *geneve_opt_ptr = (uint8_t *)geneve_hdr->
options;
169 while (remaining_hdr_len > 0) {
173 geneve_opt_ptr += cur_option_len;
178 return (remaining_hdr_len == 0);
199 if (!PacketIncreaseCheckLayers(
p)) {
205 if (
len < geneve_hdr_len)
208 if (!IsValidGeneveVersion(geneve_hdr))
214 if (!IsHeaderLengthConsistentWithOptions(geneve_hdr))
219 uint32_t vni = (geneve_hdr->
vni[0] << 16) + (geneve_hdr->
vni[1] << 8) + (geneve_hdr->
vni[2]);
248 "Geneve found unsupported Ethertype - expected IPv4, IPv6, ARP, or Ethernet");
255 tv,
dtv,
p, pkt + geneve_hdr_len,
len - geneve_hdr_len, decode_tunnel_proto);
272 static int DecodeGeneveTest01(
void)
274 uint8_t raw_geneve[] = { 0x32, 0x10, 0x17, 0xc1, 0x00, 0xc1, 0x87, 0x51,
275 0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00,
276 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
277 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
278 0x33, 0x33, 0x00, 0x01, 0x00, 0x02,
279 0x08, 0x00, 0x27, 0xfe, 0x8f, 0x95,
281 0x60, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x11, 0x01,
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,
285 0x03, 0x49, 0x17, 0x4e, 0x00, 0x01, 0x00, 0x0e,
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,
324 static int DecodeGeneveTest02(
void)
326 uint8_t raw_geneve[] = {
327 0x32, 0x10, 0x17, 0xc1, 0x00, 0x3c, 0x87, 0x51,
328 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25, 0x00,
329 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
330 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
331 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
332 0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
367 static int DecodeGeneveTest03(
void)
369 uint8_t raw_geneve[] = {
370 0x32, 0x10, 0x17, 0xc1, 0x00, 0x4e, 0x87, 0x51,
371 0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00,
372 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
373 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
374 0x33, 0x33, 0x00, 0x01, 0x00, 0x02,
375 0x08, 0x00, 0x27, 0xfe, 0x8f, 0x95,
376 0x81, 0x00, 0x00, 0xad,
378 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
379 0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
412 static int DecodeGeneveTest04(
void)
414 uint8_t raw_geneve[] = {
415 0x32, 0x10, 0x17, 0xc1, 0x00, 0x4a, 0x87, 0x51,
416 0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00,
417 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
418 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
419 0x10, 0x00, 0x00, 0x0c, 0x01, 0x00,
420 0x00, 0x51, 0x52, 0xb3, 0x54, 0xe5,
422 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
423 0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
432 DecodeGeneveConfigPorts(
"1");
452 static int DecodeGeneveTest05(
void)
454 uint8_t raw_geneve[] = {
455 0x32, 0x10, 0x17, 0xc1, 0x00, 0x4a, 0x87, 0x51,
456 0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00,
457 0x01, 0x08, 0x00, 0x04, 0x11, 0x11, 0x11, 0x11,
458 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
459 0x10, 0x00, 0x00, 0x0c, 0x01, 0x00,
460 0x00, 0x51, 0x52, 0xb3, 0x54, 0xe5,
462 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
463 0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
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);