1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2015 Joyent, Inc.  All rights reserved.
14  */
15 
16 /*
17  * Decode VXLAN encapsulated packets.
18  */
19 
20 #include <sys/vxlan.h>
21 #include "snoop.h"
22 
23 extern interpreter_fn_t interpret_ether;
24 
25 int
interpret_vxlan(int flags,char * data,int fraglen)26 interpret_vxlan(int flags, char *data, int fraglen)
27 {
28 	vxlan_hdr_t *vxlan = (vxlan_hdr_t *)data;
29 	uint32_t id, vxf;
30 
31 	if (fraglen < sizeof (vxlan_hdr_t)) {
32 		if (flags & F_SUM)
33 			(void) snprintf(get_sum_line(), MAXLINE,
34 			    "VXLAN RUNT");
35 		if (flags & F_DTAIL)
36 			show_header("VXLAN RUNT:  ", "Short packet", fraglen);
37 
38 		return (fraglen);
39 	}
40 
41 	id = ntohl(vxlan->vxlan_id) >> VXLAN_ID_SHIFT;
42 	vxf = ntohl(vxlan->vxlan_flags);
43 
44 	if (flags & F_SUM) {
45 		(void) snprintf(get_sum_line(), MAXLINE,
46 		    "VXLAN VNI=%d", id);
47 	}
48 
49 	if (flags & F_DTAIL) {
50 		show_header("VXLAN:  ", "VXLAN Header", sizeof (vxlan_hdr_t));
51 		show_space();
52 		(void) snprintf(get_line(0, 0), get_line_remain(),
53 		    "Flags = 0x%08x", vxf);
54 		(void) snprintf(get_line(0, 0), get_line_remain(), "      %s",
55 		    getflag(vxf >> 24, VXLAN_F_VDI >> 24, "vni present",
56 		    "vni missing"));
57 		(void) snprintf(get_line(0, 0), get_line_remain(),
58 		    "VXLAN network id (VNI) = %d", id);
59 		show_space();
60 	}
61 
62 	if (flags & (F_DTAIL | F_ALLSUM)) {
63 		fraglen -= sizeof (vxlan_hdr_t);
64 		data += sizeof (vxlan_hdr_t);
65 
66 		return (interpret_ether(flags, data, fraglen, fraglen));
67 	}
68 
69 	return (0);
70 }
71