1 /* 2 * Redistribution and use in source and binary forms, with or without 3 * modification, are permitted provided that: (1) source code 4 * distributions retain the above copyright notice and this paragraph 5 * in its entirety, and (2) distributions including binary code include 6 * the above copyright notice and this paragraph in its entirety in 7 * the documentation or other materials provided with the distribution. 8 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 9 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 10 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 11 * FOR A PARTICULAR PURPOSE. 12 * 13 * Original code by Francesco Fondelli (francesco dot fondelli, gmail dot com) 14 */ 15 16 /* \summary: Overlay Transport Virtualization (OTV) printer */ 17 18 /* specification: draft-hasmit-otv-04 */ 19 20 #ifdef HAVE_CONFIG_H 21 #include <config.h> 22 #endif 23 24 #include "netdissect-stdinc.h" 25 26 #define ND_LONGJMP_FROM_TCHECK 27 #include "netdissect.h" 28 #include "extract.h" 29 30 #define OTV_HDR_LEN 8 31 32 /* 33 * OTV header, draft-hasmit-otv-04 34 * 35 * 0 1 2 3 36 * 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 37 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 38 * |R|R|R|R|I|R|R|R| Overlay ID | 39 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 40 * | Instance ID | Reserved | 41 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 42 */ 43 44 void 45 otv_print(netdissect_options *ndo, const u_char *bp, u_int len) 46 { 47 uint8_t flags; 48 49 ndo->ndo_protocol = "otv"; 50 ND_PRINT("OTV, "); 51 if (len < OTV_HDR_LEN) { 52 ND_PRINT("[length %u < %u]", len, OTV_HDR_LEN); 53 goto invalid; 54 } 55 56 flags = GET_U_1(bp); 57 ND_PRINT("flags [%s] (0x%02x), ", flags & 0x08 ? "I" : ".", flags); 58 bp += 1; 59 60 ND_PRINT("overlay %u, ", GET_BE_U_3(bp)); 61 bp += 3; 62 63 ND_PRINT("instance %u\n", GET_BE_U_3(bp)); 64 bp += 3; 65 66 /* Reserved */ 67 ND_TCHECK_1(bp); 68 bp += 1; 69 70 ether_print(ndo, bp, len - OTV_HDR_LEN, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL); 71 return; 72 73 invalid: 74 nd_print_invalid(ndo); 75 ND_TCHECK_LEN(bp, len); 76 } 77