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