From: Francesco Fondelli Date: Mon, 25 Feb 2013 16:56:44 +0000 (+0100) Subject: Add support for VXLAN (draft-mahalingam-dutt-dcops-vxlan-03) X-Git-Tag: tcpdump-4.4.0^2~2^2~2 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/769d730e80f9f6c0cac9e4948e5f8225b079d27b Add support for VXLAN (draft-mahalingam-dutt-dcops-vxlan-03) --- diff --git a/Makefile.in b/Makefile.in index 06ff410d..89597574 100644 --- a/Makefile.in +++ b/Makefile.in @@ -93,7 +93,7 @@ CSRC = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c print-symantec.c print-syslog.c print-tcp.c print-telnet.c print-tftp.c \ print-timed.c print-tipc.c print-token.c print-udld.c print-udp.c \ print-usb.c print-vjc.c print-vqp.c print-vrrp.c print-vtp.c \ - print-wb.c print-zephyr.c print-zeromq.c signature.c setsignal.c tcpdump.c util.c + print-wb.c print-zephyr.c print-zeromq.c print-vxlan.c signature.c setsignal.c tcpdump.c util.c LIBNETDISSECT_SRC=print-isakmp.c LIBNETDISSECT_OBJ=$(LIBNETDISSECT_SRC:.c=.o) diff --git a/print-udp.c b/print-udp.c index e321f218..00f73f79 100644 --- a/print-udp.c +++ b/print-udp.c @@ -663,6 +663,8 @@ udp_print(register const u_char *bp, u_int length, sip_print((const u_char *)(up + 1), length); else if (ISPORT(SYSLOG_PORT)) syslog_print((const u_char *)(up + 1), length); + else if (ISPORT(VXLAN_PORT)) + vxlan_print((const u_char *)(up + 1), length); else (void)printf("UDP, length %u", (u_int32_t)(ulen - sizeof(*up))); diff --git a/print-vxlan.c b/print-vxlan.c new file mode 100644 index 00000000..2e5433e3 --- /dev/null +++ b/print-vxlan.c @@ -0,0 +1,75 @@ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that: (1) source code + * distributions retain the above copyright notice and this paragraph + * in its entirety, and (2) distributions including binary code include + * the above copyright notice and this paragraph in its entirety in + * the documentation or other materials provided with the distribution. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND + * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT + * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE. + * + * Original code by Francesco Fondelli (francesco dot fondelli, gmail dot com) + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#include +#include + +#include "interface.h" +#include "extract.h" +#include "addrtoname.h" + +#include "udp.h" + +/* + * VXLAN header, draft-mahalingam-dutt-dcops-vxlan-03 + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |R|R|R|R|I|R|R|R| Reserved | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | VXLAN Network Identifier (VNI) | Reserved | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + +void +vxlan_print(const u_char *bp, u_int len, u_int port) +{ + u_int8_t flags; + u_int32_t vni; + + if (len < 8) { + printf("[|VXLAN]"); + return; + } + + flags = *bp; + bp += 4; + + vni = EXTRACT_24BITS(bp); + bp += 4; + + printf("VXLAN, "); + + fputs("flags [", stdout); + if (flags & 0x08) + fputs("I", stdout); + else + fputs(".", stdout); + fputs("] ", stdout); + + printf("(0x%02x), ", flags); + printf("vni %u\n", vni); + + ether_print(gndo, bp, len - 8, len - 8, NULL, NULL); + return; +} diff --git a/udp.h b/udp.h index ad1d8506..f9f67ee8 100644 --- a/udp.h +++ b/udp.h @@ -85,6 +85,7 @@ struct udphdr { #define SFLOW_PORT 6343 /* http://www.sflow.org/developers/specifications.php */ #define LWAPP_DATA_PORT 12222 /* draft-ohara-capwap-lwapp-04.txt */ #define LWAPP_CONTROL_PORT 12223 /* draft-ohara-capwap-lwapp-04.txt */ +#define VXLAN_PORT 8472 /* draft-mahalingam-dutt-dcops-vxlan-03 */ #ifdef INET6 #define RIPNG_PORT 521 /*XXX*/