]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-bfd.c
Makefile.in: don't remove configure and config.h.in in make distclean.
[tcpdump] / print-bfd.c
index d3376be0015b53fddc121b58f69f43b9841a3e3b..fbead9dbd274370eac76f81d4698389fbcd80cb5 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "netdissect-stdinc.h"
 
+#define ND_LONGJMP_FROM_TCHECK
 #include "netdissect.h"
 #include "extract.h"
 
@@ -142,6 +143,14 @@ static const struct tok bfd_diag_values[] = {
     { 0, NULL }
 };
 
+static const struct tok bfd_port_values[] = {
+    { BFD_CONTROL_PORT,  "Control" },
+    { BFD_MULTIHOP_PORT, "Multihop" },
+    { BFD_LAG_PORT,      "LAG" },
+    { SBFD_PORT,         "S-BFD" },
+    { 0, NULL }
+};
+
 #define BFD_FLAG_AUTH 0x04
 
 static const struct tok bfd_v0_flag_values[] = {
@@ -174,7 +183,7 @@ static const struct tok bfd_v1_state_values[] = {
     { 0, NULL }
 };
 
-static int
+static void
 auth_print(netdissect_options *ndo, const u_char *pptr)
 {
         const struct bfd_auth_header_t *bfd_auth_header;
@@ -184,13 +193,13 @@ auth_print(netdissect_options *ndo, const u_char *pptr)
         pptr += sizeof (struct bfd_header_t);
         bfd_auth_header = (const struct bfd_auth_header_t *)pptr;
         ND_TCHECK_SIZE(bfd_auth_header);
-        auth_type = EXTRACT_U_1(bfd_auth_header->auth_type);
-        auth_len = EXTRACT_U_1(bfd_auth_header->auth_len);
+        auth_type = GET_U_1(bfd_auth_header->auth_type);
+        auth_len = GET_U_1(bfd_auth_header->auth_len);
         ND_PRINT("\n\tAuthentication: %s (%u), length: %u",
                  tok2str(bfd_v1_authentication_values,"Unknown",auth_type),
                  auth_type, auth_len);
                 pptr += 2;
-                ND_PRINT("\n\t  Auth Key ID: %u", EXTRACT_U_1(pptr));
+                ND_PRINT("\n\t  Auth Key ID: %u", GET_U_1(pptr));
 
         switch(auth_type) {
             case AUTH_PASSWORD:
@@ -214,9 +223,7 @@ auth_print(netdissect_options *ndo, const u_char *pptr)
                 pptr++;
                 ND_PRINT(", Password: ");
                 /* the length is equal to the password length plus three */
-                if (nd_printn(ndo, pptr, auth_len - 3,
-                              ndo->ndo_snapend))
-                    goto trunc;
+                nd_printjn(ndo, pptr, auth_len - 3);
                 break;
             case AUTH_MD5:
             case AUTH_MET_MD5:
@@ -241,13 +248,12 @@ auth_print(netdissect_options *ndo, const u_char *pptr)
                     break;
                 }
                 pptr += 2;
-                ND_TCHECK_4(pptr);
-                ND_PRINT(", Sequence Number: 0x%08x", EXTRACT_BE_U_4(pptr));
+                ND_PRINT(", Sequence Number: 0x%08x", GET_BE_U_4(pptr));
                 pptr += 4;
                 ND_TCHECK_LEN(pptr, AUTH_MD5_HASH_LEN);
                 ND_PRINT("\n\t  Digest: ");
                 for(i = 0; i < AUTH_MD5_HASH_LEN; i++)
-                    ND_PRINT("%02x", EXTRACT_U_1(pptr + i));
+                    ND_PRINT("%02x", GET_U_1(pptr + i));
                 break;
             case AUTH_SHA1:
             case AUTH_MET_SHA1:
@@ -272,19 +278,14 @@ auth_print(netdissect_options *ndo, const u_char *pptr)
                     break;
                 }
                 pptr += 2;
-                ND_TCHECK_4(pptr);
-                ND_PRINT(", Sequence Number: 0x%08x", EXTRACT_BE_U_4(pptr));
+                ND_PRINT(", Sequence Number: 0x%08x", GET_BE_U_4(pptr));
                 pptr += 4;
                 ND_TCHECK_LEN(pptr, AUTH_SHA1_HASH_LEN);
                 ND_PRINT("\n\t  Hash: ");
                 for(i = 0; i < AUTH_SHA1_HASH_LEN; i++)
-                    ND_PRINT("%02x", EXTRACT_U_1(pptr + i));
+                    ND_PRINT("%02x", GET_U_1(pptr + i));
                 break;
         }
-        return 0;
-
-trunc:
-        return 1;
 }
 
 void
@@ -292,7 +293,10 @@ bfd_print(netdissect_options *ndo, const u_char *pptr,
           u_int len, u_int port)
 {
        ndo->ndo_protocol = "bfd";
-        if (port == BFD_CONTROL_PORT) {
+        if (port == BFD_CONTROL_PORT ||
+            port == BFD_MULTIHOP_PORT ||
+            port == BFD_LAG_PORT ||
+            port == SBFD_PORT) {
             /*
              * Control packet.
              */
@@ -303,9 +307,9 @@ bfd_print(netdissect_options *ndo, const u_char *pptr,
 
             bfd_header = (const struct bfd_header_t *)pptr;
             ND_TCHECK_SIZE(bfd_header);
-            version_diag = EXTRACT_U_1(bfd_header->version_diag);
+            version_diag = GET_U_1(bfd_header->version_diag);
             version = BFD_EXTRACT_VERSION(version_diag);
-            flags = EXTRACT_U_1(bfd_header->flags);
+            flags = GET_U_1(bfd_header->flags);
 
             switch (version) {
 
@@ -326,20 +330,24 @@ bfd_print(netdissect_options *ndo, const u_char *pptr,
                        BFD_EXTRACT_DIAG(version_diag));
 
                 ND_PRINT("\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u",
-                       EXTRACT_U_1(bfd_header->detect_time_multiplier),
-                       EXTRACT_U_1(bfd_header->detect_time_multiplier) * EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000,
-                       EXTRACT_U_1(bfd_header->length));
-
-
-                ND_PRINT("\n\tMy Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->my_discriminator));
-                ND_PRINT(", Your Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->your_discriminator));
-                ND_PRINT("\n\t  Desired min Tx Interval:    %4u ms", EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000);
-                ND_PRINT("\n\t  Required min Rx Interval:   %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_rx_interval)/1000);
-                ND_PRINT("\n\t  Required min Echo Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_echo_interval)/1000);
+                       GET_U_1(bfd_header->detect_time_multiplier),
+                       GET_U_1(bfd_header->detect_time_multiplier) * GET_BE_U_4(bfd_header->desired_min_tx_interval)/1000,
+                       GET_U_1(bfd_header->length));
+
+
+                ND_PRINT("\n\tMy Discriminator: 0x%08x",
+                         GET_BE_U_4(bfd_header->my_discriminator));
+                ND_PRINT(", Your Discriminator: 0x%08x",
+                         GET_BE_U_4(bfd_header->your_discriminator));
+                ND_PRINT("\n\t  Desired min Tx Interval:    %4u ms",
+                         GET_BE_U_4(bfd_header->desired_min_tx_interval)/1000);
+                ND_PRINT("\n\t  Required min Rx Interval:   %4u ms",
+                         GET_BE_U_4(bfd_header->required_min_rx_interval)/1000);
+                ND_PRINT("\n\t  Required min Echo Interval: %4u ms",
+                         GET_BE_U_4(bfd_header->required_min_echo_interval)/1000);
 
                 if (flags & BFD_FLAG_AUTH) {
-                    if (auth_print(ndo, pptr))
-                        goto trunc;
+                    auth_print(ndo, pptr);
                 }
                 break;
 
@@ -347,35 +355,41 @@ bfd_print(netdissect_options *ndo, const u_char *pptr,
             case 1:
                 if (ndo->ndo_vflag < 1)
                 {
-                    ND_PRINT("BFDv1, Control, State %s, Flags: [%s], length: %u",
+                    ND_PRINT("BFDv1, %s, State %s, Flags: [%s], length: %u",
+                           tok2str(bfd_port_values, "unknown (%u)", port),
                            tok2str(bfd_v1_state_values, "unknown (%u)", (flags & 0xc0) >> 6),
                            bittok2str(bfd_v1_flag_values, "none", flags & 0x3f),
                            len);
                     return;
                 }
 
-                ND_PRINT("BFDv1, length: %u\n\tControl, State %s, Flags: [%s], Diagnostic: %s (0x%02x)",
+                ND_PRINT("BFDv1, length: %u\n\t%s, State %s, Flags: [%s], Diagnostic: %s (0x%02x)",
                        len,
+                       tok2str(bfd_port_values, "unknown (%u)", port),
                        tok2str(bfd_v1_state_values, "unknown (%u)", (flags & 0xc0) >> 6),
                        bittok2str(bfd_v1_flag_values, "none", flags & 0x3f),
                        tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(version_diag)),
                        BFD_EXTRACT_DIAG(version_diag));
 
                 ND_PRINT("\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u",
-                       EXTRACT_U_1(bfd_header->detect_time_multiplier),
-                       EXTRACT_U_1(bfd_header->detect_time_multiplier) * EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000,
-                       EXTRACT_U_1(bfd_header->length));
-
-
-                ND_PRINT("\n\tMy Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->my_discriminator));
-                ND_PRINT(", Your Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->your_discriminator));
-                ND_PRINT("\n\t  Desired min Tx Interval:    %4u ms", EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000);
-                ND_PRINT("\n\t  Required min Rx Interval:   %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_rx_interval)/1000);
-                ND_PRINT("\n\t  Required min Echo Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_echo_interval)/1000);
+                       GET_U_1(bfd_header->detect_time_multiplier),
+                       GET_U_1(bfd_header->detect_time_multiplier) * GET_BE_U_4(bfd_header->desired_min_tx_interval)/1000,
+                       GET_U_1(bfd_header->length));
+
+
+                ND_PRINT("\n\tMy Discriminator: 0x%08x",
+                         GET_BE_U_4(bfd_header->my_discriminator));
+                ND_PRINT(", Your Discriminator: 0x%08x",
+                         GET_BE_U_4(bfd_header->your_discriminator));
+                ND_PRINT("\n\t  Desired min Tx Interval:    %4u ms",
+                         GET_BE_U_4(bfd_header->desired_min_tx_interval)/1000);
+                ND_PRINT("\n\t  Required min Rx Interval:   %4u ms",
+                         GET_BE_U_4(bfd_header->required_min_rx_interval)/1000);
+                ND_PRINT("\n\t  Required min Echo Interval: %4u ms",
+                         GET_BE_U_4(bfd_header->required_min_echo_interval)/1000);
 
                 if (flags & BFD_FLAG_AUTH) {
-                    if (auth_print(ndo, pptr))
-                        goto trunc;
+                    auth_print(ndo, pptr);
                 }
                 break;
 
@@ -411,8 +425,4 @@ bfd_print(netdissect_options *ndo, const u_char *pptr,
                             return;
             }
         }
-        return;
-
-trunc:
-        nd_print_trunc(ndo);
 }