1190203Srpaulo/* 2190203Srpaulo * Copyright (c) 1998-2007 The TCPDUMP project 3190203Srpaulo * 4190203Srpaulo * Redistribution and use in source and binary forms, with or without 5190203Srpaulo * modification, are permitted provided that: (1) source code 6190203Srpaulo * distributions retain the above copyright notice and this paragraph 7190203Srpaulo * in its entirety, and (2) distributions including binary code include 8190203Srpaulo * the above copyright notice and this paragraph in its entirety in 9190203Srpaulo * the documentation or other materials provided with the distribution. 10190203Srpaulo * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 11190203Srpaulo * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 12190203Srpaulo * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 13190203Srpaulo * FOR A PARTICULAR PURPOSE. 14190203Srpaulo * 15190203Srpaulo * Dynamic Trunk Protocol (DTP) 16190203Srpaulo * 17190203Srpaulo * Original code by Carles Kishimoto <carles.kishimoto@gmail.com> 18190203Srpaulo */ 19190203Srpaulo 20190203Srpaulo#ifdef HAVE_CONFIG_H 21190203Srpaulo#include "config.h" 22190203Srpaulo#endif 23190203Srpaulo 24190203Srpaulo#include <tcpdump-stdinc.h> 25190203Srpaulo 26190203Srpaulo#include <stdio.h> 27190203Srpaulo#include <string.h> 28190203Srpaulo 29190203Srpaulo#include "interface.h" 30190203Srpaulo#include "addrtoname.h" 31190203Srpaulo#include "extract.h" 32190203Srpaulo#include "nlpid.h" 33190203Srpaulo 34190203Srpaulo#define DTP_HEADER_LEN 1 35190203Srpaulo#define DTP_DOMAIN_TLV 0x0001 36190203Srpaulo#define DTP_STATUS_TLV 0x0002 37190203Srpaulo#define DTP_DTP_TYPE_TLV 0x0003 38190203Srpaulo#define DTP_NEIGHBOR_TLV 0x0004 39190203Srpaulo 40190203Srpaulostatic struct tok dtp_tlv_values[] = { 41190203Srpaulo { DTP_DOMAIN_TLV, "Domain TLV"}, 42190203Srpaulo { DTP_STATUS_TLV, "Status TLV"}, 43190203Srpaulo { DTP_DTP_TYPE_TLV, "DTP type TLV"}, 44190203Srpaulo { DTP_NEIGHBOR_TLV, "Neighbor TLV"}, 45190203Srpaulo { 0, NULL} 46190203Srpaulo}; 47190203Srpaulo 48190203Srpaulovoid 49190203Srpaulodtp_print (const u_char *pptr, u_int length) 50190203Srpaulo{ 51190203Srpaulo int type, len; 52190203Srpaulo const u_char *tptr; 53190203Srpaulo 54190203Srpaulo if (length < DTP_HEADER_LEN) 55190203Srpaulo goto trunc; 56190203Srpaulo 57190203Srpaulo tptr = pptr; 58190203Srpaulo 59190203Srpaulo if (!TTEST2(*tptr, DTP_HEADER_LEN)) 60190203Srpaulo goto trunc; 61190203Srpaulo 62190203Srpaulo printf("DTPv%u, length %u", 63190203Srpaulo (*tptr), 64190203Srpaulo length); 65190203Srpaulo 66190203Srpaulo /* 67190203Srpaulo * In non-verbose mode, just print version. 68190203Srpaulo */ 69190203Srpaulo if (vflag < 1) { 70190203Srpaulo return; 71190203Srpaulo } 72190203Srpaulo 73190203Srpaulo tptr += DTP_HEADER_LEN; 74190203Srpaulo 75190203Srpaulo while (tptr < (pptr+length)) { 76190203Srpaulo 77190203Srpaulo if (!TTEST2(*tptr, 4)) 78190203Srpaulo goto trunc; 79190203Srpaulo 80190203Srpaulo type = EXTRACT_16BITS(tptr); 81190203Srpaulo len = EXTRACT_16BITS(tptr+2); 82190203Srpaulo 83190203Srpaulo /* infinite loop check */ 84190203Srpaulo if (type == 0 || len == 0) { 85190203Srpaulo return; 86190203Srpaulo } 87190203Srpaulo 88190203Srpaulo printf("\n\t%s (0x%04x) TLV, length %u", 89190203Srpaulo tok2str(dtp_tlv_values, "Unknown", type), 90190203Srpaulo type, len); 91190203Srpaulo 92190203Srpaulo switch (type) { 93190203Srpaulo case DTP_DOMAIN_TLV: 94190203Srpaulo printf(", %s", tptr+4); 95190203Srpaulo break; 96190203Srpaulo 97190203Srpaulo case DTP_STATUS_TLV: 98190203Srpaulo case DTP_DTP_TYPE_TLV: 99190203Srpaulo printf(", 0x%x", *(tptr+4)); 100190203Srpaulo break; 101190203Srpaulo 102190203Srpaulo case DTP_NEIGHBOR_TLV: 103190203Srpaulo printf(", %s", etheraddr_string(tptr+4)); 104190203Srpaulo break; 105190203Srpaulo 106190203Srpaulo default: 107190203Srpaulo break; 108190203Srpaulo } 109190203Srpaulo tptr += len; 110190203Srpaulo } 111190203Srpaulo 112190203Srpaulo return; 113190203Srpaulo 114190203Srpaulo trunc: 115190203Srpaulo printf("[|dtp]"); 116190203Srpaulo} 117190203Srpaulo 118190203Srpaulo/* 119190203Srpaulo * Local Variables: 120190203Srpaulo * c-style: whitesmith 121190203Srpaulo * c-basic-offset: 4 122190203Srpaulo * End: 123190203Srpaulo */ 124