45 #define VALID_GENEVE_VERSIONS \
49 #define GENEVE_VERSION(hdr_ptr) (hdr_ptr->ver_plus_len >> 6)
50 #define GENEVE_RESERVED_FLAGS(hdr_ptr) (hdr_ptr->flags & 0x3F)
52 #define GENEVE_MIN_HEADER_LEN sizeof(GeneveHeader)
53 #define GENEVE_TOTAL_OPT_LEN(hdr_ptr) ((hdr_ptr->ver_plus_len & 0x3F) << 2)
54 #define GENEVE_TOTAL_HEADER_LEN(hdr_ptr) (GENEVE_MIN_HEADER_LEN + GENEVE_TOTAL_OPT_LEN(hdr_ptr))
56 #define GENEVE_MIN_SINGLE_OPT_LEN sizeof(GeneveOption)
57 #define GENEVE_SINGLE_OPT_LEN(option_ptr) ((option_ptr->flags_plus_len & 0x1F) << 2)
58 #define GENEVE_SINGLE_OPT_TOTAL_LEN(option_ptr) \
59 (GENEVE_MIN_SINGLE_OPT_LEN + GENEVE_SINGLE_OPT_LEN(option_ptr))
61 #define GENEVE_MAX_PORTS 4
62 #define GENEVE_UNSET_PORT -1
63 #define GENEVE_DEFAULT_PORT 6081
64 #define GENEVE_DEFAULT_PORT_S "6081"
66 static bool g_geneve_enabled =
true;
67 static int g_geneve_ports_idx = 0;
91 SCLogDebug(
"ports %u->%u ports %d %d %d %d", sp, dp, g_geneve_ports[0], g_geneve_ports[1],
92 g_geneve_ports[2], g_geneve_ports[3]);
94 if (g_geneve_enabled) {
95 for (
int i = 0; i < g_geneve_ports_idx; i++) {
99 const int port = g_geneve_ports[i];
100 if (port == (
const int)sp || port == (
const int)dp)
107 static void DecodeGeneveConfigPorts(
const char *pstr)
114 g_geneve_ports_idx = 0;
121 g_geneve_ports[g_geneve_ports_idx++] = (int)p->port;
130 if (
ConfGetBool(
"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_verisons) /
sizeof(
int);
154 for (
int i = 0; i < num_versions; i++) {
155 if (valid_verisons[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);
197 if (!PacketIncreaseCheckLayers(p)) {
203 if (
len < geneve_hdr_len)
206 if (!IsValidGeneveVersion(geneve_hdr))
212 if (!IsHeaderLengthConsistentWithOptions(geneve_hdr))
217 uint32_t vni = (geneve_hdr->
vni[0] << 16) + (geneve_hdr->
vni[1] << 8) + (geneve_hdr->
vni[2]);
246 "Geneve found unsupported Ethertype - expected IPv4, IPv6, ARP, or Ethernet");
253 tv,
dtv, p, pkt + geneve_hdr_len,
len - geneve_hdr_len, decode_tunnel_proto);
270 static int DecodeGeneveTest01(
void)
272 uint8_t raw_geneve[] = { 0x32, 0x10, 0x17, 0xc1, 0x00, 0xc1, 0x87, 0x51,
273 0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00,
274 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
275 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
276 0x33, 0x33, 0x00, 0x01, 0x00, 0x02,
277 0x08, 0x00, 0x27, 0xfe, 0x8f, 0x95,
279 0x60, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x11, 0x01,
280 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x27, 0xff, 0xfe, 0xfe, 0x8f,
281 0x95, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
282 0x00, 0x02, 0x02, 0x22, 0x02, 0x23, 0x00, 0x6b, 0x9c, 0xfb,
283 0x03, 0x49, 0x17, 0x4e, 0x00, 0x01, 0x00, 0x0e,
284 0x00, 0x01, 0x00, 0x01, 0x1c, 0x39, 0xcf, 0x88, 0x08, 0x00, 0x27, 0xfe, 0x8f, 0x95, 0x00,
285 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x01, 0x1c, 0x38, 0x25, 0xe8, 0x08, 0x00, 0x27, 0xd4,
286 0x10, 0xbb, 0x00, 0x06, 0x00, 0x04, 0x00, 0x17, 0x00, 0x18, 0x00, 0x08, 0x00, 0x02, 0x00,
287 0x00, 0x00, 0x19, 0x00, 0x29, 0x27, 0xfe, 0x8f, 0x95, 0x00, 0x00, 0x0e, 0x10, 0x00, 0x00,
288 0x15, 0x18, 0x00, 0x1a, 0x00, 0x19, 0x00, 0x00, 0x1c, 0x20, 0x00, 0x00, 0x1d, 0x4c, 0x40,
289 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 static int DecodeGeneveTest02(
void)
325 uint8_t raw_geneve[] = {
326 0x32, 0x10, 0x17, 0xc1, 0x00, 0x3c, 0x87, 0x51,
327 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25, 0x00,
328 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
329 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
330 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
331 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,
413 static int DecodeGeneveTest04(
void)
415 uint8_t raw_geneve[] = {
416 0x32, 0x10, 0x17, 0xc1, 0x00, 0x4a, 0x87, 0x51,
417 0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00,
418 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
419 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
420 0x10, 0x00, 0x00, 0x0c, 0x01, 0x00,
421 0x00, 0x51, 0x52, 0xb3, 0x54, 0xe5,
423 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
424 0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
433 DecodeGeneveConfigPorts(
"1");
454 static int DecodeGeneveTest05(
void)
456 uint8_t raw_geneve[] = {
457 0x32, 0x10, 0x17, 0xc1, 0x00, 0x4a, 0x87, 0x51,
458 0x04, 0x00, 0x65, 0x58, 0x00, 0x00, 0x25, 0x00,
459 0x01, 0x08, 0x00, 0x04, 0x11, 0x11, 0x11, 0x11,
460 0x01, 0x08, 0x00, 0x01, 0x11, 0x11, 0x11, 0x11,
461 0x10, 0x00, 0x00, 0x0c, 0x01, 0x00,
462 0x00, 0x51, 0x52, 0xb3, 0x54, 0xe5,
464 0x45, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
465 0x44, 0x45, 0x0a, 0x60, 0x00, 0x0a, 0xb9, 0x1b, 0x73, 0x06, 0x00, 0x35, 0x30, 0x39, 0x00,
495 UtRegisterTest(
"DecodeGeneveTest01 -- Ethernet+IPv6 DHCP Request", DecodeGeneveTest01);
496 UtRegisterTest(
"DecodeGeneveTest02 -- IPv4 DNS Request", DecodeGeneveTest02);
497 UtRegisterTest(
"DecodeGeneveTest03 -- VLAN+IPv4 DNS Request", DecodeGeneveTest03);
498 UtRegisterTest(
"DecodeGeneveTest04 -- Non-standard port configuration", DecodeGeneveTest04);
499 UtRegisterTest(
"DecodeGeneveTest05 -- Inconsistent Geneve hdr option lens", DecodeGeneveTest05);