1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
3*b636d99dSDavid van Moolenbroek * modification, are permitted provided that: (1) source code
4*b636d99dSDavid van Moolenbroek * distributions retain the above copyright notice and this paragraph
5*b636d99dSDavid van Moolenbroek * in its entirety, and (2) distributions including binary code include
6*b636d99dSDavid van Moolenbroek * the above copyright notice and this paragraph in its entirety in
7*b636d99dSDavid van Moolenbroek * the documentation or other materials provided with the distribution.
8*b636d99dSDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9*b636d99dSDavid van Moolenbroek * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10*b636d99dSDavid van Moolenbroek * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11*b636d99dSDavid van Moolenbroek * FOR A PARTICULAR PURPOSE.
12*b636d99dSDavid van Moolenbroek *
13*b636d99dSDavid van Moolenbroek * Original code by Hannes Gredler (hannes@juniper.net)
14*b636d99dSDavid van Moolenbroek */
15*b636d99dSDavid van Moolenbroek
16*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
17*b636d99dSDavid van Moolenbroek #ifndef lint
18*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-bfd.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
19*b636d99dSDavid van Moolenbroek #endif
20*b636d99dSDavid van Moolenbroek
21*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
22*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
23*b636d99dSDavid van Moolenbroek #include "config.h"
24*b636d99dSDavid van Moolenbroek #endif
25*b636d99dSDavid van Moolenbroek
26*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
27*b636d99dSDavid van Moolenbroek
28*b636d99dSDavid van Moolenbroek #include "interface.h"
29*b636d99dSDavid van Moolenbroek #include "extract.h"
30*b636d99dSDavid van Moolenbroek
31*b636d99dSDavid van Moolenbroek #include "udp.h"
32*b636d99dSDavid van Moolenbroek
33*b636d99dSDavid van Moolenbroek /*
34*b636d99dSDavid van Moolenbroek * Control packet, BFDv0, draft-katz-ward-bfd-01.txt
35*b636d99dSDavid van Moolenbroek *
36*b636d99dSDavid van Moolenbroek * 0 1 2 3
37*b636d99dSDavid van Moolenbroek * 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
38*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39*b636d99dSDavid van Moolenbroek * |Vers | Diag |H|D|P|F| Rsvd | Detect Mult | Length |
40*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41*b636d99dSDavid van Moolenbroek * | My Discriminator |
42*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43*b636d99dSDavid van Moolenbroek * | Your Discriminator |
44*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45*b636d99dSDavid van Moolenbroek * | Desired Min TX Interval |
46*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
47*b636d99dSDavid van Moolenbroek * | Required Min RX Interval |
48*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49*b636d99dSDavid van Moolenbroek * | Required Min Echo RX Interval |
50*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51*b636d99dSDavid van Moolenbroek */
52*b636d99dSDavid van Moolenbroek
53*b636d99dSDavid van Moolenbroek /*
54*b636d99dSDavid van Moolenbroek * Control packet, BFDv1, draft-ietf-bfd-base-02.txt
55*b636d99dSDavid van Moolenbroek *
56*b636d99dSDavid van Moolenbroek * 0 1 2 3
57*b636d99dSDavid van Moolenbroek * 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
58*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59*b636d99dSDavid van Moolenbroek * |Vers | Diag |Sta|P|F|C|A|D|R| Detect Mult | Length |
60*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61*b636d99dSDavid van Moolenbroek * | My Discriminator |
62*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63*b636d99dSDavid van Moolenbroek * | Your Discriminator |
64*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65*b636d99dSDavid van Moolenbroek * | Desired Min TX Interval |
66*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67*b636d99dSDavid van Moolenbroek * | Required Min RX Interval |
68*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69*b636d99dSDavid van Moolenbroek * | Required Min Echo RX Interval |
70*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71*b636d99dSDavid van Moolenbroek */
72*b636d99dSDavid van Moolenbroek
73*b636d99dSDavid van Moolenbroek struct bfd_header_t {
74*b636d99dSDavid van Moolenbroek uint8_t version_diag;
75*b636d99dSDavid van Moolenbroek uint8_t flags;
76*b636d99dSDavid van Moolenbroek uint8_t detect_time_multiplier;
77*b636d99dSDavid van Moolenbroek uint8_t length;
78*b636d99dSDavid van Moolenbroek uint8_t my_discriminator[4];
79*b636d99dSDavid van Moolenbroek uint8_t your_discriminator[4];
80*b636d99dSDavid van Moolenbroek uint8_t desired_min_tx_interval[4];
81*b636d99dSDavid van Moolenbroek uint8_t required_min_rx_interval[4];
82*b636d99dSDavid van Moolenbroek uint8_t required_min_echo_interval[4];
83*b636d99dSDavid van Moolenbroek };
84*b636d99dSDavid van Moolenbroek
85*b636d99dSDavid van Moolenbroek /*
86*b636d99dSDavid van Moolenbroek * An optional Authentication Header may be present
87*b636d99dSDavid van Moolenbroek *
88*b636d99dSDavid van Moolenbroek * 0 1 2 3
89*b636d99dSDavid van Moolenbroek * 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
90*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
91*b636d99dSDavid van Moolenbroek * | Auth Type | Auth Len | Authentication Data... |
92*b636d99dSDavid van Moolenbroek * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
93*b636d99dSDavid van Moolenbroek */
94*b636d99dSDavid van Moolenbroek
95*b636d99dSDavid van Moolenbroek struct bfd_auth_header_t {
96*b636d99dSDavid van Moolenbroek uint8_t auth_type;
97*b636d99dSDavid van Moolenbroek uint8_t auth_len;
98*b636d99dSDavid van Moolenbroek uint8_t auth_data;
99*b636d99dSDavid van Moolenbroek };
100*b636d99dSDavid van Moolenbroek
101*b636d99dSDavid van Moolenbroek static const struct tok bfd_v1_authentication_values[] = {
102*b636d99dSDavid van Moolenbroek { 0, "Reserved" },
103*b636d99dSDavid van Moolenbroek { 1, "Simple Password" },
104*b636d99dSDavid van Moolenbroek { 2, "Keyed MD5" },
105*b636d99dSDavid van Moolenbroek { 3, "Meticulous Keyed MD5" },
106*b636d99dSDavid van Moolenbroek { 4, "Keyed SHA1" },
107*b636d99dSDavid van Moolenbroek { 5, "Meticulous Keyed SHA1" },
108*b636d99dSDavid van Moolenbroek { 0, NULL }
109*b636d99dSDavid van Moolenbroek };
110*b636d99dSDavid van Moolenbroek
111*b636d99dSDavid van Moolenbroek #define BFD_EXTRACT_VERSION(x) (((x)&0xe0)>>5)
112*b636d99dSDavid van Moolenbroek #define BFD_EXTRACT_DIAG(x) ((x)&0x1f)
113*b636d99dSDavid van Moolenbroek
114*b636d99dSDavid van Moolenbroek static const struct tok bfd_port_values[] = {
115*b636d99dSDavid van Moolenbroek { BFD_CONTROL_PORT, "Control" },
116*b636d99dSDavid van Moolenbroek { BFD_ECHO_PORT, "Echo" },
117*b636d99dSDavid van Moolenbroek { 0, NULL }
118*b636d99dSDavid van Moolenbroek };
119*b636d99dSDavid van Moolenbroek
120*b636d99dSDavid van Moolenbroek
121*b636d99dSDavid van Moolenbroek static const struct tok bfd_diag_values[] = {
122*b636d99dSDavid van Moolenbroek { 0, "No Diagnostic" },
123*b636d99dSDavid van Moolenbroek { 1, "Control Detection Time Expired" },
124*b636d99dSDavid van Moolenbroek { 2, "Echo Function Failed" },
125*b636d99dSDavid van Moolenbroek { 3, "Neighbor Signaled Session Down" },
126*b636d99dSDavid van Moolenbroek { 4, "Forwarding Plane Reset" },
127*b636d99dSDavid van Moolenbroek { 5, "Path Down" },
128*b636d99dSDavid van Moolenbroek { 6, "Concatenated Path Down" },
129*b636d99dSDavid van Moolenbroek { 7, "Administratively Down" },
130*b636d99dSDavid van Moolenbroek { 8, "Reverse Concatenated Path Down" },
131*b636d99dSDavid van Moolenbroek { 0, NULL }
132*b636d99dSDavid van Moolenbroek };
133*b636d99dSDavid van Moolenbroek
134*b636d99dSDavid van Moolenbroek static const struct tok bfd_v0_flag_values[] = {
135*b636d99dSDavid van Moolenbroek { 0x80, "I Hear You" },
136*b636d99dSDavid van Moolenbroek { 0x40, "Demand" },
137*b636d99dSDavid van Moolenbroek { 0x20, "Poll" },
138*b636d99dSDavid van Moolenbroek { 0x10, "Final" },
139*b636d99dSDavid van Moolenbroek { 0x08, "Reserved" },
140*b636d99dSDavid van Moolenbroek { 0x04, "Reserved" },
141*b636d99dSDavid van Moolenbroek { 0x02, "Reserved" },
142*b636d99dSDavid van Moolenbroek { 0x01, "Reserved" },
143*b636d99dSDavid van Moolenbroek { 0, NULL }
144*b636d99dSDavid van Moolenbroek };
145*b636d99dSDavid van Moolenbroek
146*b636d99dSDavid van Moolenbroek #define BFD_FLAG_AUTH 0x04
147*b636d99dSDavid van Moolenbroek
148*b636d99dSDavid van Moolenbroek static const struct tok bfd_v1_flag_values[] = {
149*b636d99dSDavid van Moolenbroek { 0x20, "Poll" },
150*b636d99dSDavid van Moolenbroek { 0x10, "Final" },
151*b636d99dSDavid van Moolenbroek { 0x08, "Control Plane Independent" },
152*b636d99dSDavid van Moolenbroek { BFD_FLAG_AUTH, "Authentication Present" },
153*b636d99dSDavid van Moolenbroek { 0x02, "Demand" },
154*b636d99dSDavid van Moolenbroek { 0x01, "Reserved" },
155*b636d99dSDavid van Moolenbroek { 0, NULL }
156*b636d99dSDavid van Moolenbroek };
157*b636d99dSDavid van Moolenbroek
158*b636d99dSDavid van Moolenbroek static const struct tok bfd_v1_state_values[] = {
159*b636d99dSDavid van Moolenbroek { 0, "AdminDown" },
160*b636d99dSDavid van Moolenbroek { 1, "Down" },
161*b636d99dSDavid van Moolenbroek { 2, "Init" },
162*b636d99dSDavid van Moolenbroek { 3, "Up" },
163*b636d99dSDavid van Moolenbroek { 0, NULL }
164*b636d99dSDavid van Moolenbroek };
165*b636d99dSDavid van Moolenbroek
166*b636d99dSDavid van Moolenbroek void
bfd_print(netdissect_options * ndo,register const u_char * pptr,register u_int len,register u_int port)167*b636d99dSDavid van Moolenbroek bfd_print(netdissect_options *ndo, register const u_char *pptr,
168*b636d99dSDavid van Moolenbroek register u_int len, register u_int port)
169*b636d99dSDavid van Moolenbroek {
170*b636d99dSDavid van Moolenbroek const struct bfd_header_t *bfd_header;
171*b636d99dSDavid van Moolenbroek const struct bfd_auth_header_t *bfd_auth_header;
172*b636d99dSDavid van Moolenbroek uint8_t version = 0;
173*b636d99dSDavid van Moolenbroek
174*b636d99dSDavid van Moolenbroek bfd_header = (const struct bfd_header_t *)pptr;
175*b636d99dSDavid van Moolenbroek if (port == BFD_CONTROL_PORT) {
176*b636d99dSDavid van Moolenbroek ND_TCHECK(*bfd_header);
177*b636d99dSDavid van Moolenbroek version = BFD_EXTRACT_VERSION(bfd_header->version_diag);
178*b636d99dSDavid van Moolenbroek } else if (port == BFD_ECHO_PORT) {
179*b636d99dSDavid van Moolenbroek /* Echo is BFD v1 only */
180*b636d99dSDavid van Moolenbroek version = 1;
181*b636d99dSDavid van Moolenbroek }
182*b636d99dSDavid van Moolenbroek switch ((port << 8) | version) {
183*b636d99dSDavid van Moolenbroek
184*b636d99dSDavid van Moolenbroek /* BFDv0 */
185*b636d99dSDavid van Moolenbroek case (BFD_CONTROL_PORT << 8):
186*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag < 1)
187*b636d99dSDavid van Moolenbroek {
188*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "BFDv%u, %s, Flags: [%s], length: %u",
189*b636d99dSDavid van Moolenbroek version,
190*b636d99dSDavid van Moolenbroek tok2str(bfd_port_values, "unknown (%u)", port),
191*b636d99dSDavid van Moolenbroek bittok2str(bfd_v0_flag_values, "none", bfd_header->flags),
192*b636d99dSDavid van Moolenbroek len));
193*b636d99dSDavid van Moolenbroek return;
194*b636d99dSDavid van Moolenbroek }
195*b636d99dSDavid van Moolenbroek
196*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "BFDv%u, length: %u\n\t%s, Flags: [%s], Diagnostic: %s (0x%02x)",
197*b636d99dSDavid van Moolenbroek version,
198*b636d99dSDavid van Moolenbroek len,
199*b636d99dSDavid van Moolenbroek tok2str(bfd_port_values, "unknown (%u)", port),
200*b636d99dSDavid van Moolenbroek bittok2str(bfd_v0_flag_values, "none", bfd_header->flags),
201*b636d99dSDavid van Moolenbroek tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)),
202*b636d99dSDavid van Moolenbroek BFD_EXTRACT_DIAG(bfd_header->version_diag)));
203*b636d99dSDavid van Moolenbroek
204*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u",
205*b636d99dSDavid van Moolenbroek bfd_header->detect_time_multiplier,
206*b636d99dSDavid van Moolenbroek bfd_header->detect_time_multiplier * EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000,
207*b636d99dSDavid van Moolenbroek bfd_header->length));
208*b636d99dSDavid van Moolenbroek
209*b636d99dSDavid van Moolenbroek
210*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->my_discriminator)));
211*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", Your Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->your_discriminator)));
212*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Desired min Tx Interval: %4u ms", EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000));
213*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Required min Rx Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_rx_interval)/1000));
214*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000));
215*b636d99dSDavid van Moolenbroek break;
216*b636d99dSDavid van Moolenbroek
217*b636d99dSDavid van Moolenbroek /* BFDv1 */
218*b636d99dSDavid van Moolenbroek case (BFD_CONTROL_PORT << 8 | 1):
219*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag < 1)
220*b636d99dSDavid van Moolenbroek {
221*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "BFDv%u, %s, State %s, Flags: [%s], length: %u",
222*b636d99dSDavid van Moolenbroek version,
223*b636d99dSDavid van Moolenbroek tok2str(bfd_port_values, "unknown (%u)", port),
224*b636d99dSDavid van Moolenbroek tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6),
225*b636d99dSDavid van Moolenbroek bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f),
226*b636d99dSDavid van Moolenbroek len));
227*b636d99dSDavid van Moolenbroek return;
228*b636d99dSDavid van Moolenbroek }
229*b636d99dSDavid van Moolenbroek
230*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "BFDv%u, length: %u\n\t%s, State %s, Flags: [%s], Diagnostic: %s (0x%02x)",
231*b636d99dSDavid van Moolenbroek version,
232*b636d99dSDavid van Moolenbroek len,
233*b636d99dSDavid van Moolenbroek tok2str(bfd_port_values, "unknown (%u)", port),
234*b636d99dSDavid van Moolenbroek tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6),
235*b636d99dSDavid van Moolenbroek bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f),
236*b636d99dSDavid van Moolenbroek tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)),
237*b636d99dSDavid van Moolenbroek BFD_EXTRACT_DIAG(bfd_header->version_diag)));
238*b636d99dSDavid van Moolenbroek
239*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u",
240*b636d99dSDavid van Moolenbroek bfd_header->detect_time_multiplier,
241*b636d99dSDavid van Moolenbroek bfd_header->detect_time_multiplier * EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000,
242*b636d99dSDavid van Moolenbroek bfd_header->length));
243*b636d99dSDavid van Moolenbroek
244*b636d99dSDavid van Moolenbroek
245*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->my_discriminator)));
246*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, ", Your Discriminator: 0x%08x", EXTRACT_32BITS(bfd_header->your_discriminator)));
247*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Desired min Tx Interval: %4u ms", EXTRACT_32BITS(bfd_header->desired_min_tx_interval)/1000));
248*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Required min Rx Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_rx_interval)/1000));
249*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000));
250*b636d99dSDavid van Moolenbroek
251*b636d99dSDavid van Moolenbroek if (bfd_header->flags & BFD_FLAG_AUTH) {
252*b636d99dSDavid van Moolenbroek pptr += sizeof (const struct bfd_header_t);
253*b636d99dSDavid van Moolenbroek bfd_auth_header = (const struct bfd_auth_header_t *)pptr;
254*b636d99dSDavid van Moolenbroek ND_TCHECK2(*bfd_auth_header, sizeof(const struct bfd_auth_header_t));
255*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "\n\t%s (%u) Authentication, length %u present",
256*b636d99dSDavid van Moolenbroek tok2str(bfd_v1_authentication_values,"Unknown",bfd_auth_header->auth_type),
257*b636d99dSDavid van Moolenbroek bfd_auth_header->auth_type,
258*b636d99dSDavid van Moolenbroek bfd_auth_header->auth_len));
259*b636d99dSDavid van Moolenbroek }
260*b636d99dSDavid van Moolenbroek break;
261*b636d99dSDavid van Moolenbroek
262*b636d99dSDavid van Moolenbroek /* BFDv0 */
263*b636d99dSDavid van Moolenbroek case (BFD_ECHO_PORT << 8): /* not yet supported - fall through */
264*b636d99dSDavid van Moolenbroek /* BFDv1 */
265*b636d99dSDavid van Moolenbroek case (BFD_ECHO_PORT << 8 | 1):
266*b636d99dSDavid van Moolenbroek
267*b636d99dSDavid van Moolenbroek default:
268*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "BFD, %s, length: %u",
269*b636d99dSDavid van Moolenbroek tok2str(bfd_port_values, "unknown (%u)", port),
270*b636d99dSDavid van Moolenbroek len));
271*b636d99dSDavid van Moolenbroek if (ndo->ndo_vflag >= 1) {
272*b636d99dSDavid van Moolenbroek if(!print_unknown_data(ndo, pptr,"\n\t",len))
273*b636d99dSDavid van Moolenbroek return;
274*b636d99dSDavid van Moolenbroek }
275*b636d99dSDavid van Moolenbroek break;
276*b636d99dSDavid van Moolenbroek }
277*b636d99dSDavid van Moolenbroek return;
278*b636d99dSDavid van Moolenbroek
279*b636d99dSDavid van Moolenbroek trunc:
280*b636d99dSDavid van Moolenbroek ND_PRINT((ndo, "[|BFD]"));
281*b636d99dSDavid van Moolenbroek }
282*b636d99dSDavid van Moolenbroek /*
283*b636d99dSDavid van Moolenbroek * Local Variables:
284*b636d99dSDavid van Moolenbroek * c-style: whitesmith
285*b636d99dSDavid van Moolenbroek * c-basic-offset: 8
286*b636d99dSDavid van Moolenbroek * End:
287*b636d99dSDavid van Moolenbroek */
288