Skip to content

Commit

Permalink
Merge pull request #54 from ffatghub/master
Browse files Browse the repository at this point in the history
Add support for VXLAN (draft-mahalingam-dutt-dcops-vxlan-03)
  • Loading branch information
mcr committed Feb 26, 2013
2 parents 85cf448 + 8eb218c commit 73a8fa9
Show file tree
Hide file tree
Showing 9 changed files with 168 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -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 print-otv.c signature.c setsignal.c tcpdump.c util.c

LIBNETDISSECT_SRC=print-isakmp.c
LIBNETDISSECT_OBJ=$(LIBNETDISSECT_SRC:.c=.o)
Expand Down
1 change: 1 addition & 0 deletions interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ extern char *strsep(char **, const char *);
#define PT_CARP 10 /* Common Address Redundancy Protocol */
#define PT_RADIUS 11 /* RADIUS authentication Protocol */
#define PT_ZMTP1 12 /* ZeroMQ Message Transport Protocol 1.0 */
#define PT_VXLAN 13 /* Virtual eXtensible Local Area Network */

#ifndef min
#define min(a,b) ((a)>(b)?(b):(a))
Expand Down
1 change: 1 addition & 0 deletions netdissect.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ struct netdissect_options {
#define PT_CARP 10 /* Common Address Redundancy Protocol */
#define PT_RADIUS 11 /* RADIUS authentication Protocol */
#define PT_ZMTP1 12 /* ZeroMQ Message Transport Protocol 1.0 */
#define PT_VXLAN 13 /* Virtual eXtensible Local Area Network */

#ifndef min
#define min(a,b) ((a)>(b)?(b):(a))
Expand Down
79 changes: 79 additions & 0 deletions print-otv.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* 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 <tcpdump-stdinc.h>

#include <stdio.h>
#include <stdlib.h>

#include "interface.h"
#include "extract.h"
#include "addrtoname.h"

#include "udp.h"

/*
* OTV header, draft-hasmit-otv-04
*
* 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| Overlay ID |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Instance ID | Reserved |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/

void
otv_print(const u_char *bp, u_int len, u_int port)
{
u_int8_t flags;
u_int32_t overlay_id;
u_int32_t instance_id;

if (len < 8) {
printf("[|OTV]");
return;
}

flags = *bp;
bp += 1;

overlay_id = EXTRACT_24BITS(bp);
bp += 3;

instance_id = EXTRACT_24BITS(bp);
bp += 4;

printf("OTV, ");

fputs("flags [", stdout);
if (flags & 0x08)
fputs("I", stdout);
else
fputs(".", stdout);
fputs("] ", stdout);

printf("(0x%02x), ", flags);
printf("overlay %u, ", overlay_id);
printf("instance %u\n", instance_id);

ether_print(gndo, bp, len - 8, len - 8, NULL, NULL);
return;
}
7 changes: 7 additions & 0 deletions print-udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,11 @@ udp_print(register const u_char *bp, u_int length,
udpipaddr_print(ip, sport, dport);
radius_print(cp, length);
break;

case PT_VXLAN:
udpipaddr_print(ip, sport, dport);
vxlan_print((const u_char *)(up + 1), length);
break;
}
return;
}
Expand Down Expand Up @@ -663,6 +668,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(OTV_PORT))
otv_print((const u_char *)(up + 1), length);
else
(void)printf("UDP, length %u",
(u_int32_t)(ulen - sizeof(*up)));
Expand Down
74 changes: 74 additions & 0 deletions print-vxlan.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* 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 <tcpdump-stdinc.h>

#include <stdio.h>
#include <stdlib.h>

#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;
}
3 changes: 2 additions & 1 deletion tcpdump.1.in
Original file line number Diff line number Diff line change
Expand Up @@ -527,8 +527,9 @@ Currently known types are
\fBtftp\fR (Trivial File Transfer Protocol),
\fBvat\fR (Visual Audio Tool),
\fBwb\fR (distributed White Board),
\fBzmtp1\fR (ZeroMQ Message Transport Protocol 1.0)
and
\fBzmtp1\fR (ZeroMQ Message Transport Protocol 1.0).
\fBvxlan\fR (Virtual eXtensible Local Area Network).
.TP
.B \-t
\fIDon't\fP print a timestamp on each dump line.
Expand Down
2 changes: 2 additions & 0 deletions tcpdump.c
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,8 @@ main(int argc, char **argv)
packettype = PT_RADIUS;
else if (strcasecmp(optarg, "zmtp1") == 0)
packettype = PT_ZMTP1;
else if (strcasecmp(optarg, "vxlan") == 0)
packettype = PT_VXLAN;
else
error("unknown packet type `%s'", optarg);
break;
Expand Down
1 change: 1 addition & 0 deletions udp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 OTV_PORT 8472 /* draft-hasmit-otv-04 */

#ifdef INET6
#define RIPNG_PORT 521 /*XXX*/
Expand Down

0 comments on commit 73a8fa9

Please sign in to comment.