xref: /minix3/external/bsd/tcpdump/dist/print-bfd.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
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