]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-babel.c
More UNALIGNED_MEM{CPY,CMP} on IP addresses.
[tcpdump] / print-babel.c
index 0b1fd57ee879e228ebde8e107612d2b3e0d8dc80..4f128b32457679d0fb1e5bd4ed59b217e83c7a3f 100644 (file)
@@ -39,6 +39,8 @@
 #include "interface.h"
 #include "extract.h"
 
+static const char tstr[] = "[|babel]";
+
 static void babel_print_v2(const u_char *cp, u_int length);
 
 void
@@ -66,7 +68,7 @@ babel_print(const u_char *cp, u_int length) {
     return;
 
  trunc:
-    printf(" [|babel]");
+    printf(" %s", tstr);
     return;
 }
 
@@ -139,6 +141,23 @@ format_address(const u_char *prefix)
 #endif
 }
 
+static const char *
+format_interval(const u_int16_t i)
+{
+    static char buf[sizeof("0000.0s")];
+
+    if (i == 0)
+        return "0.0s (bogus)";
+    snprintf(buf, sizeof(buf), "%u.%us", i / 10, i % 10);
+    return buf;
+}
+
+static const char *
+format_interval_update(const u_int16_t i)
+{
+    return i == 0xFFFF ? "infinity" : format_interval(i);
+}
+
 /* Return number of octets consumed from the input buffer (not the prefix length
  * in bytes), or -1 for encoding error. */
 static int
@@ -335,7 +354,7 @@ babel_print_v2(const u_char *cp, u_int length) {
                 if(len < 6) goto corrupt;
                 nonce = EXTRACT_16BITS(message + 4);
                 interval = EXTRACT_16BITS(message + 6);
-                printf("%04x %d", nonce, interval);
+                printf("%04x %s", nonce, format_interval(interval));
             }
         }
             break;
@@ -362,7 +381,7 @@ babel_print_v2(const u_char *cp, u_int length) {
                 if(len < 6) goto corrupt;
                 seqno = EXTRACT_16BITS(message + 4);
                 interval = EXTRACT_16BITS(message + 6);
-                printf("seqno %u interval %u", seqno, interval);
+                printf("seqno %u interval %s", seqno, format_interval(interval));
             }
         }
             break;
@@ -379,9 +398,9 @@ babel_print_v2(const u_char *cp, u_int length) {
                 txcost = EXTRACT_16BITS(message + 4);
                 interval = EXTRACT_16BITS(message + 6);
                 rc = network_address(message[2], message + 8, len - 6, address);
-                if(rc < 0) { printf("[|babel]"); break; }
-                printf("%s txcost %u interval %d",
-                       format_address(address), txcost, interval);
+                if(rc < 0) { printf("%s", tstr); break; }
+                printf("%s txcost %u interval %s",
+                       format_address(address), txcost, format_interval(interval));
             }
         }
             break;
@@ -438,12 +457,12 @@ babel_print_v2(const u_char *cp, u_int length) {
                 interval = EXTRACT_16BITS(message + 6);
                 seqno = EXTRACT_16BITS(message + 8);
                 metric = EXTRACT_16BITS(message + 10);
-                printf("%s%s%s %s metric %u seqno %u interval %u",
+                printf("%s%s%s %s metric %u seqno %u interval %s",
                        (message[3] & 0x80) ? "/prefix": "",
                        (message[3] & 0x40) ? "/id" : "",
                        (message[3] & 0x3f) ? "/unknown" : "",
                        format_prefix(prefix, plen),
-                       metric, seqno, interval);
+                       metric, seqno, format_interval_update(interval));
                 if(message[3] & 0x80) {
                     if(message[2] == 1)
                         memcpy(v4_prefix, prefix, 16);
@@ -530,7 +549,7 @@ babel_print_v2(const u_char *cp, u_int length) {
     return;
 
  trunc:
-    printf(" [|babel]");
+    printf(" %s", tstr);
     return;
 
  corrupt: