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
20276788Sdelphij#define NETDISSECT_REWORKED
21190203Srpaulo#ifdef HAVE_CONFIG_H
22190203Srpaulo#include "config.h"
23190203Srpaulo#endif
24190203Srpaulo
25190203Srpaulo#include <tcpdump-stdinc.h>
26190203Srpaulo
27190203Srpaulo#include "interface.h"
28190203Srpaulo#include "addrtoname.h"
29276788Sdelphij#include "extract.h"
30190203Srpaulo
31190203Srpaulo#define DTP_HEADER_LEN			1
32190203Srpaulo#define DTP_DOMAIN_TLV			0x0001
33190203Srpaulo#define DTP_STATUS_TLV			0x0002
34190203Srpaulo#define DTP_DTP_TYPE_TLV		0x0003
35190203Srpaulo#define DTP_NEIGHBOR_TLV		0x0004
36190203Srpaulo
37276788Sdelphijstatic const struct tok dtp_tlv_values[] = {
38190203Srpaulo    { DTP_DOMAIN_TLV, "Domain TLV"},
39190203Srpaulo    { DTP_STATUS_TLV, "Status TLV"},
40190203Srpaulo    { DTP_DTP_TYPE_TLV, "DTP type TLV"},
41190203Srpaulo    { DTP_NEIGHBOR_TLV, "Neighbor TLV"},
42190203Srpaulo    { 0, NULL}
43190203Srpaulo};
44190203Srpaulo
45190203Srpaulovoid
46276788Sdelphijdtp_print (netdissect_options *ndo, const u_char *pptr, u_int length)
47190203Srpaulo{
48190203Srpaulo    int type, len;
49190203Srpaulo    const u_char *tptr;
50190203Srpaulo
51190203Srpaulo    if (length < DTP_HEADER_LEN)
52190203Srpaulo        goto trunc;
53190203Srpaulo
54276788Sdelphij    tptr = pptr;
55190203Srpaulo
56276788Sdelphij    ND_TCHECK2(*tptr, DTP_HEADER_LEN);
57190203Srpaulo
58276788Sdelphij    ND_PRINT((ndo, "DTPv%u, length %u",
59190203Srpaulo           (*tptr),
60276788Sdelphij           length));
61190203Srpaulo
62190203Srpaulo    /*
63190203Srpaulo     * In non-verbose mode, just print version.
64190203Srpaulo     */
65276788Sdelphij    if (ndo->ndo_vflag < 1) {
66190203Srpaulo	return;
67190203Srpaulo    }
68190203Srpaulo
69190203Srpaulo    tptr += DTP_HEADER_LEN;
70190203Srpaulo
71190203Srpaulo    while (tptr < (pptr+length)) {
72190203Srpaulo
73276788Sdelphij        ND_TCHECK2(*tptr, 4);
74190203Srpaulo
75190203Srpaulo	type = EXTRACT_16BITS(tptr);
76276788Sdelphij        len  = EXTRACT_16BITS(tptr+2);
77190203Srpaulo
78190203Srpaulo        /* infinite loop check */
79190203Srpaulo        if (type == 0 || len == 0) {
80190203Srpaulo            return;
81190203Srpaulo        }
82190203Srpaulo
83276788Sdelphij        ND_PRINT((ndo, "\n\t%s (0x%04x) TLV, length %u",
84190203Srpaulo               tok2str(dtp_tlv_values, "Unknown", type),
85276788Sdelphij               type, len));
86190203Srpaulo
87190203Srpaulo        switch (type) {
88190203Srpaulo	case DTP_DOMAIN_TLV:
89276788Sdelphij		ND_PRINT((ndo, ", %s", tptr+4));
90190203Srpaulo		break;
91190203Srpaulo
92276788Sdelphij	case DTP_STATUS_TLV:
93190203Srpaulo	case DTP_DTP_TYPE_TLV:
94276788Sdelphij                ND_PRINT((ndo, ", 0x%x", *(tptr+4)));
95190203Srpaulo                break;
96190203Srpaulo
97190203Srpaulo	case DTP_NEIGHBOR_TLV:
98276788Sdelphij                ND_PRINT((ndo, ", %s", etheraddr_string(ndo, tptr+4)));
99190203Srpaulo                break;
100190203Srpaulo
101190203Srpaulo        default:
102190203Srpaulo            break;
103276788Sdelphij        }
104190203Srpaulo        tptr += len;
105190203Srpaulo    }
106190203Srpaulo
107190203Srpaulo    return;
108190203Srpaulo
109190203Srpaulo trunc:
110276788Sdelphij    ND_PRINT((ndo, "[|dtp]"));
111190203Srpaulo}
112190203Srpaulo
113190203Srpaulo/*
114190203Srpaulo * Local Variables:
115190203Srpaulo * c-style: whitesmith
116190203Srpaulo * c-basic-offset: 4
117190203Srpaulo * End:
118190203Srpaulo */
119