1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek * Copyright (c) 1998-2007 The TCPDUMP project
3*b636d99dSDavid van Moolenbroek *
4*b636d99dSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
5*b636d99dSDavid van Moolenbroek * modification, are permitted provided that: (1) source code
6*b636d99dSDavid van Moolenbroek * distributions retain the above copyright notice and this paragraph
7*b636d99dSDavid van Moolenbroek * in its entirety, and (2) distributions including binary code include
8*b636d99dSDavid van Moolenbroek * the above copyright notice and this paragraph in its entirety in
9*b636d99dSDavid van Moolenbroek * the documentation or other materials provided with the distribution.
10*b636d99dSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
11*b636d99dSDavid van Moolenbroek * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
12*b636d99dSDavid van Moolenbroek * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
13*b636d99dSDavid van Moolenbroek * FOR A PARTICULAR PURPOSE.
14*b636d99dSDavid van Moolenbroek *
15*b636d99dSDavid van Moolenbroek * Dynamic Trunk Protocol (DTP)
16*b636d99dSDavid van Moolenbroek *
17*b636d99dSDavid van Moolenbroek * Original code by Carles Kishimoto <carles.kishimoto@gmail.com>
18*b636d99dSDavid van Moolenbroek */
19*b636d99dSDavid van Moolenbroek
20*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
21*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
22*b636d99dSDavid van Moolenbroek #include "config.h"
23*b636d99dSDavid van Moolenbroek #endif
24*b636d99dSDavid van Moolenbroek
25*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
26*b636d99dSDavid van Moolenbroek
27*b636d99dSDavid van Moolenbroek #include "interface.h"
28*b636d99dSDavid van Moolenbroek #include "addrtoname.h"
29*b636d99dSDavid van Moolenbroek #include "extract.h"
30*b636d99dSDavid van Moolenbroek
31*b636d99dSDavid van Moolenbroek #define DTP_HEADER_LEN 1
32*b636d99dSDavid van Moolenbroek #define DTP_DOMAIN_TLV 0x0001
33*b636d99dSDavid van Moolenbroek #define DTP_STATUS_TLV 0x0002
34*b636d99dSDavid van Moolenbroek #define DTP_DTP_TYPE_TLV 0x0003
35*b636d99dSDavid van Moolenbroek #define DTP_NEIGHBOR_TLV 0x0004
36*b636d99dSDavid van Moolenbroek
37*b636d99dSDavid van Moolenbroek static const struct tok dtp_tlv_values[] = {
38*b636d99dSDavid van Moolenbroek { DTP_DOMAIN_TLV, "Domain TLV"},
39*b636d99dSDavid van Moolenbroek { DTP_STATUS_TLV, "Status TLV"},
40*b636d99dSDavid van Moolenbroek { DTP_DTP_TYPE_TLV, "DTP type TLV"},
41*b636d99dSDavid van Moolenbroek { DTP_NEIGHBOR_TLV, "Neighbor TLV"},
42*b636d99dSDavid van Moolenbroek { 0, NULL}
43*b636d99dSDavid van Moolenbroek };
44*b636d99dSDavid van Moolenbroek
45*b636d99dSDavid van Moolenbroek void
dtp_print(netdissect_options * ndo,const u_char * pptr,u_int length)46*b636d99dSDavid van Moolenbroek dtp_print (netdissect_options *ndo, const u_char *pptr, u_int length)
47*b636d99dSDavid van Moolenbroek {
48*b636d99dSDavid van Moolenbroek int type, len;
49*b636d99dSDavid van Moolenbroek const u_char *tptr;
50*b636d99dSDavid van Moolenbroek
51*b636d99dSDavid van Moolenbroek if (length < DTP_HEADER_LEN)
52*b636d99dSDavid van Moolenbroek goto trunc;
53*b636d99dSDavid van Moolenbroek
54*b636d99dSDavid van Moolenbroek tptr = pptr;
55*b636d99dSDavid van Moolenbroek
56*b636d99dSDavid van Moolenbroek ND_TCHECK2(*tptr, DTP_HEADER_LEN);
57*b636d99dSDavid van Moolenbroek
58*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "DTPv%u, length %u",
59*b636d99dSDavid van Moolenbroek (*tptr),
60*b636d99dSDavid van Moolenbroek length));
61*b636d99dSDavid van Moolenbroek
62*b636d99dSDavid van Moolenbroek /*
63*b636d99dSDavid van Moolenbroek * In non-verbose mode, just print version.
64*b636d99dSDavid van Moolenbroek */
65*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag < 1) {
66*b636d99dSDavid van Moolenbroek return;
67*b636d99dSDavid van Moolenbroek }
68*b636d99dSDavid van Moolenbroek
69*b636d99dSDavid van Moolenbroek tptr += DTP_HEADER_LEN;
70*b636d99dSDavid van Moolenbroek
71*b636d99dSDavid van Moolenbroek while (tptr < (pptr+length)) {
72*b636d99dSDavid van Moolenbroek
73*b636d99dSDavid van Moolenbroek ND_TCHECK2(*tptr, 4);
74*b636d99dSDavid van Moolenbroek
75*b636d99dSDavid van Moolenbroek type = EXTRACT_16BITS(tptr);
76*b636d99dSDavid van Moolenbroek len = EXTRACT_16BITS(tptr+2);
77*b636d99dSDavid van Moolenbroek
78*b636d99dSDavid van Moolenbroek /* infinite loop check */
79*b636d99dSDavid van Moolenbroek if (type == 0 || len == 0) {
80*b636d99dSDavid van Moolenbroek return;
81*b636d99dSDavid van Moolenbroek }
82*b636d99dSDavid van Moolenbroek
83*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t%s (0x%04x) TLV, length %u",
84*b636d99dSDavid van Moolenbroek tok2str(dtp_tlv_values, "Unknown", type),
85*b636d99dSDavid van Moolenbroek type, len));
86*b636d99dSDavid van Moolenbroek
87*b636d99dSDavid van Moolenbroek switch (type) {
88*b636d99dSDavid van Moolenbroek case DTP_DOMAIN_TLV:
89*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", %s", tptr+4));
90*b636d99dSDavid van Moolenbroek break;
91*b636d99dSDavid van Moolenbroek
92*b636d99dSDavid van Moolenbroek case DTP_STATUS_TLV:
93*b636d99dSDavid van Moolenbroek case DTP_DTP_TYPE_TLV:
94*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", 0x%x", *(tptr+4)));
95*b636d99dSDavid van Moolenbroek break;
96*b636d99dSDavid van Moolenbroek
97*b636d99dSDavid van Moolenbroek case DTP_NEIGHBOR_TLV:
98*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", %s", etheraddr_string(ndo, tptr+4)));
99*b636d99dSDavid van Moolenbroek break;
100*b636d99dSDavid van Moolenbroek
101*b636d99dSDavid van Moolenbroek default:
102*b636d99dSDavid van Moolenbroek break;
103*b636d99dSDavid van Moolenbroek }
104*b636d99dSDavid van Moolenbroek tptr += len;
105*b636d99dSDavid van Moolenbroek }
106*b636d99dSDavid van Moolenbroek
107*b636d99dSDavid van Moolenbroek return;
108*b636d99dSDavid van Moolenbroek
109*b636d99dSDavid van Moolenbroek trunc:
110*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "[|dtp]"));
111*b636d99dSDavid van Moolenbroek }
112*b636d99dSDavid van Moolenbroek
113*b636d99dSDavid van Moolenbroek /*
114*b636d99dSDavid van Moolenbroek * Local Variables:
115*b636d99dSDavid van Moolenbroek * c-style: whitesmith
116*b636d99dSDavid van Moolenbroek * c-basic-offset: 4
117*b636d99dSDavid van Moolenbroek * End:
118*b636d99dSDavid van Moolenbroek */
119