]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-bfd.c
Fix the pointer tests in the non-ndoified TTEST2() macro as well.
[tcpdump] / print-bfd.c
index 03aae7d74faa1364c8d1bf17c315c1ed42e869cd..f157684f075e76f590d92ac56eddf36794e4585e 100644 (file)
@@ -15,7 +15,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-bfd.c,v 1.6 2005-04-27 23:00:53 hannes Exp $";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-bfd.c,v 1.10 2006-02-02 06:35:52 hannes Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -146,7 +146,7 @@ static const struct tok bfd_v0_flag_values[] = {
     { 0, NULL }
 };
 
-#define BFD_FLAG_AUTH 0x40
+#define BFD_FLAG_AUTH 0x04
 
 static const struct tok bfd_v1_flag_values[] = {
     { 0x20, "Poll" },
@@ -171,13 +171,17 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port)
 {
         const struct bfd_header_t *bfd_header;
         const struct bfd_auth_header_t *bfd_auth_header;
-        u_int8_t version;
+        u_int8_t version = 0;
 
         bfd_header = (const struct bfd_header_t *)pptr;
-        TCHECK(*bfd_header);
-        version = BFD_EXTRACT_VERSION(bfd_header->version_diag);
-
-        switch (port << 8 | version) {
+        if (port == BFD_CONTROL_PORT) {
+            TCHECK(*bfd_header);
+            version = BFD_EXTRACT_VERSION(bfd_header->version_diag);
+        } else if (port == BFD_ECHO_PORT) {
+            /* Echo is BFD v1 only */
+            version = 1;
+        }
+        switch ((port << 8) | version) {
 
             /* BFDv0 */
         case (BFD_CONTROL_PORT << 8):
@@ -219,8 +223,8 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port)
                 printf("BFDv%u, %s, State %s, Flags: [%s], length: %u",
                        version,
                        tok2str(bfd_port_values, "unknown (%u)", port),
-                       tok2str(bfd_v1_state_values, "unknown (%u)", bfd_header->flags & 0xc0),
-                       bittok2str(bfd_v1_flag_values, "none", bfd_header->flags),
+                       tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6),
+                       bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f),
                        len);
                 return;
             }
@@ -229,8 +233,8 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port)
                    version,
                    len,
                    tok2str(bfd_port_values, "unknown (%u)", port),
-                   tok2str(bfd_v1_state_values, "unknown (%u)", bfd_header->flags & 0xc0),
-                   bittok2str(bfd_v1_flag_values, "none", bfd_header->flags),
+                   tok2str(bfd_v1_state_values, "unknown (%u)", (bfd_header->flags & 0xc0) >> 6),
+                   bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f),
                    tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)),
                    BFD_EXTRACT_DIAG(bfd_header->version_diag));
             
@@ -247,7 +251,9 @@ bfd_print(register const u_char *pptr, register u_int len, register u_int port)
             printf("\n\t  Required min Echo Interval: %4u ms", EXTRACT_32BITS(bfd_header->required_min_echo_interval)/1000);
 
             if (bfd_header->flags & BFD_FLAG_AUTH) {
-                bfd_auth_header = (const struct bfd_auth_header_t *)(pptr + sizeof (const struct bfd_header_t));
+                pptr += sizeof (const struct bfd_header_t);
+                bfd_auth_header = (const struct bfd_auth_header_t *)pptr;
+                TCHECK2(*bfd_auth_header, sizeof(const struct bfd_auth_header_t));
                 printf("\n\t%s (%u) Authentication, length %u present",
                        tok2str(bfd_v1_authentication_values,"Unknown",bfd_auth_header->auth_type),
                        bfd_auth_header->auth_type,