]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-bfd.c
Add EXTRACT_ calls.
[tcpdump] / print-bfd.c
index b2cfd61b8b379f30787b286481339dee31294cd0..77a8c366ebdbdb41bf79ce05bcd2fad5114269c2 100644 (file)
  */
 
 struct bfd_header_t {
-    uint8_t version_diag;
-    uint8_t flags;
-    uint8_t detect_time_multiplier;
-    uint8_t length;
-    uint8_t my_discriminator[4];
-    uint8_t your_discriminator[4];
-    uint8_t desired_min_tx_interval[4];
-    uint8_t required_min_rx_interval[4];
-    uint8_t required_min_echo_interval[4];
+    nd_uint8_t  version_diag;
+    nd_uint8_t  flags;
+    nd_uint8_t  detect_time_multiplier;
+    nd_uint8_t  length;
+    nd_uint32_t my_discriminator;
+    nd_uint32_t your_discriminator;
+    nd_uint32_t desired_min_tx_interval;
+    nd_uint32_t required_min_rx_interval;
+    nd_uint32_t required_min_echo_interval;
 };
 
 /*
@@ -91,10 +91,10 @@ struct bfd_header_t {
  */
 
 struct bfd_auth_header_t {
-    uint8_t auth_type;
-    uint8_t auth_len;
-    uint8_t auth_data;
-    uint8_t dummy; /* minimun 4 bytes */
+    nd_uint8_t auth_type;
+    nd_uint8_t auth_len;
+    nd_uint8_t auth_data;
+    nd_uint8_t dummy; /* minimum 4 bytes */
 };
 
 enum auth_type {
@@ -178,22 +178,24 @@ static const struct tok bfd_v1_state_values[] = {
 };
 
 static int
-auth_print(netdissect_options *ndo, register const u_char *pptr)
+auth_print(netdissect_options *ndo, const u_char *pptr)
 {
         const struct bfd_auth_header_t *bfd_auth_header;
+        uint8_t auth_type, auth_len;
         int i;
 
         pptr += sizeof (struct bfd_header_t);
         bfd_auth_header = (const struct bfd_auth_header_t *)pptr;
         ND_TCHECK(*bfd_auth_header);
+        auth_type = EXTRACT_U_1(bfd_auth_header->auth_type);
+        auth_len = EXTRACT_U_1(bfd_auth_header->auth_len);
         ND_PRINT((ndo, "\n\tAuthentication: %s (%u), length: %u",
-                 tok2str(bfd_v1_authentication_values,"Unknown",bfd_auth_header->auth_type),
-                 bfd_auth_header->auth_type,
-                 bfd_auth_header->auth_len));
+                 tok2str(bfd_v1_authentication_values,"Unknown",auth_type),
+                 auth_type, auth_len));
                 pptr += 2;
-                ND_PRINT((ndo, "\n\t  Auth Key ID: %d", *pptr));
+                ND_PRINT((ndo, "\n\t  Auth Key ID: %u", EXTRACT_U_1(pptr)));
 
-        switch(bfd_auth_header->auth_type) {
+        switch(auth_type) {
             case AUTH_PASSWORD:
 /*
  *    Simple Password Authentication Section Format
@@ -206,16 +208,16 @@ auth_print(netdissect_options *ndo, register const u_char *pptr)
  *    |                              ...                              |
  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  */
-                if (bfd_auth_header->auth_len < AUTH_PASSWORD_FIELD_MIN_LEN ||
-                    bfd_auth_header->auth_len > AUTH_PASSWORD_FIELD_MAX_LEN) {
-                    ND_PRINT((ndo, "[invalid length %d]",
-                             bfd_auth_header->auth_len));
+                if (auth_len < AUTH_PASSWORD_FIELD_MIN_LEN ||
+                    auth_len > AUTH_PASSWORD_FIELD_MAX_LEN) {
+                    ND_PRINT((ndo, "[invalid length %u]",
+                             auth_len));
                     break;
                 }
                 pptr++;
                 ND_PRINT((ndo, ", Password: "));
                 /* the length is equal to the password length plus three */
-                if (fn_printn(ndo, pptr, bfd_auth_header->auth_len - 3,
+                if (fn_printn(ndo, pptr, auth_len - 3,
                               ndo->ndo_snapend))
                     goto trunc;
                 break;
@@ -236,19 +238,19 @@ auth_print(netdissect_options *ndo, register const u_char *pptr)
  *    |                              ...                              |
  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  */
-                if (bfd_auth_header->auth_len != AUTH_MD5_FIELD_LEN) {
-                    ND_PRINT((ndo, "[invalid length %d]",
-                             bfd_auth_header->auth_len));
+                if (auth_len != AUTH_MD5_FIELD_LEN) {
+                    ND_PRINT((ndo, "[invalid length %u]",
+                             auth_len));
                     break;
                 }
                 pptr += 2;
-                ND_TCHECK2(*pptr, 4);
+                ND_TCHECK_4(pptr);
                 ND_PRINT((ndo, ", Sequence Number: 0x%08x", EXTRACT_BE_U_4(pptr)));
                 pptr += 4;
-                ND_TCHECK2(*pptr, AUTH_MD5_HASH_LEN);
+                ND_TCHECK_LEN(pptr, AUTH_MD5_HASH_LEN);
                 ND_PRINT((ndo, "\n\t  Digest: "));
                 for(i = 0; i < AUTH_MD5_HASH_LEN; i++)
-                    ND_PRINT((ndo, "%02x", pptr[i]));
+                    ND_PRINT((ndo, "%02x", EXTRACT_U_1(pptr + i)));
                 break;
             case AUTH_SHA1:
             case AUTH_MET_SHA1:
@@ -267,19 +269,19 @@ auth_print(netdissect_options *ndo, register const u_char *pptr)
  *    |                              ...                              |
  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  */
-                if (bfd_auth_header->auth_len != AUTH_SHA1_FIELD_LEN) {
-                    ND_PRINT((ndo, "[invalid length %d]",
-                             bfd_auth_header->auth_len));
+                if (auth_len != AUTH_SHA1_FIELD_LEN) {
+                    ND_PRINT((ndo, "[invalid length %u]",
+                             auth_len));
                     break;
                 }
                 pptr += 2;
-                ND_TCHECK2(*pptr, 4);
+                ND_TCHECK_4(pptr);
                 ND_PRINT((ndo, ", Sequence Number: 0x%08x", EXTRACT_BE_U_4(pptr)));
                 pptr += 4;
-                ND_TCHECK2(*pptr, AUTH_SHA1_HASH_LEN);
+                ND_TCHECK_LEN(pptr, AUTH_SHA1_HASH_LEN);
                 ND_PRINT((ndo, "\n\t  Hash: "));
                 for(i = 0; i < AUTH_SHA1_HASH_LEN; i++)
-                    ND_PRINT((ndo, "%02x", pptr[i]));
+                    ND_PRINT((ndo, "%02x", EXTRACT_U_1(pptr + i)));
                 break;
         }
         return 0;
@@ -289,20 +291,24 @@ trunc:
 }
 
 void
-bfd_print(netdissect_options *ndo, register const u_char *pptr,
-          register u_int len, register u_int port)
+bfd_print(netdissect_options *ndo, const u_char *pptr,
+          u_int len, u_int port)
 {
         const struct bfd_header_t *bfd_header;
+        uint8_t version_diag;
         uint8_t version = 0;
+        uint8_t flags;
 
         bfd_header = (const struct bfd_header_t *)pptr;
+        version_diag = EXTRACT_U_1(bfd_header->version_diag);
         if (port == BFD_CONTROL_PORT) {
             ND_TCHECK(*bfd_header);
-            version = BFD_EXTRACT_VERSION(bfd_header->version_diag);
+            version = BFD_EXTRACT_VERSION(version_diag);
         } else if (port == BFD_ECHO_PORT) {
             /* Echo is BFD v1 only */
             version = 1;
         }
+        flags = EXTRACT_U_1(bfd_header->flags);
         switch ((port << 8) | version) {
 
             /* BFDv0 */
@@ -312,7 +318,7 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr,
                 ND_PRINT((ndo, "BFDv%u, %s, Flags: [%s], length: %u",
                        version,
                        tok2str(bfd_port_values, "unknown (%u)", port),
-                       bittok2str(bfd_v0_flag_values, "none", bfd_header->flags),
+                       bittok2str(bfd_v0_flag_values, "none", flags),
                        len));
                 return;
             }
@@ -321,14 +327,14 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr,
                    version,
                    len,
                    tok2str(bfd_port_values, "unknown (%u)", port),
-                   bittok2str(bfd_v0_flag_values, "none", bfd_header->flags),
-                   tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(bfd_header->version_diag)),
-                   BFD_EXTRACT_DIAG(bfd_header->version_diag)));
+                   bittok2str(bfd_v0_flag_values, "none", flags),
+                   tok2str(bfd_diag_values,"unknown",BFD_EXTRACT_DIAG(version_diag)),
+                   BFD_EXTRACT_DIAG(version_diag)));
 
             ND_PRINT((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u",
-                   bfd_header->detect_time_multiplier,
-                   bfd_header->detect_time_multiplier * EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000,
-                   bfd_header->length));
+                   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((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->my_discriminator)));
@@ -345,8 +351,8 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr,
                 ND_PRINT((ndo, "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) >> 6),
-                       bittok2str(bfd_v1_flag_values, "none", bfd_header->flags & 0x3f),
+                       tok2str(bfd_v1_state_values, "unknown (%u)", (flags & 0xc0) >> 6),
+                       bittok2str(bfd_v1_flag_values, "none", flags & 0x3f),
                        len));
                 return;
             }
@@ -355,15 +361,15 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr,
                    version,
                    len,
                    tok2str(bfd_port_values, "unknown (%u)", port),
-                   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)));
+                   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((ndo, "\n\tDetection Timer Multiplier: %u (%u ms Detection time), BFD Length: %u",
-                   bfd_header->detect_time_multiplier,
-                   bfd_header->detect_time_multiplier * EXTRACT_BE_U_4(bfd_header->desired_min_tx_interval)/1000,
-                   bfd_header->length));
+                   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((ndo, "\n\tMy Discriminator: 0x%08x", EXTRACT_BE_U_4(bfd_header->my_discriminator)));
@@ -372,7 +378,7 @@ bfd_print(netdissect_options *ndo, register const u_char *pptr,
             ND_PRINT((ndo, "\n\t  Required min Rx Interval:   %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_rx_interval)/1000));
             ND_PRINT((ndo, "\n\t  Required min Echo Interval: %4u ms", EXTRACT_BE_U_4(bfd_header->required_min_echo_interval)/1000));
 
-            if (bfd_header->flags & BFD_FLAG_AUTH) {
+            if (flags & BFD_FLAG_AUTH) {
                 if (auth_print(ndo, pptr))
                     goto trunc;
             }