]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-pim.c
Use "len", not "payload_len", as we step through the packet; use
[tcpdump] / print-pim.c
index ca0049478480d482db76144d6360281cb6537e59..57d8f9f8f8a51fd80f59841d1cf16bc1f95d2166 100644 (file)
  */
 
 #ifndef lint
-static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.25 2001-04-27 02:18:27 fenner Exp $ (LBL)";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/tcpdump/print-pim.c,v 1.39 2003-11-16 09:36:32 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-
-#include <netinet/in.h>
+#include <tcpdump-stdinc.h>
 
 /*
  * XXX: We consider a case where IPv6 is not ready yet for portability,
@@ -56,7 +52,6 @@ struct pim {
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <unistd.h>
 
 #include "interface.h"
 #include "addrtoname.h"
@@ -96,10 +91,16 @@ pimv1_join_prune_print(register const u_char *bp, register u_int len)
        }
 
        TCHECK2(bp[0], 4);
-       (void)printf("\n Upstream Nbr: %s", ipaddr_string(bp));
+       if (vflag > 1)
+               (void)printf("\n");
+       (void)printf(" Upstream Nbr: %s", ipaddr_string(bp));
        TCHECK2(bp[6], 2);
-       (void)printf("\n Hold time: ");
+       if (vflag > 1)
+               (void)printf("\n");
+       (void)printf(" Hold time: ");
        relts_print(EXTRACT_16BITS(&bp[6]));
+       if (vflag < 2)
+               return;
        bp += 8;
        len -= 8;
 
@@ -121,7 +122,7 @@ pimv1_join_prune_print(register const u_char *bp, register u_int len)
                bp += 12;
                len -= 12;
                for (njp = 0; njp < (njoin + nprune); njp++) {
-                       char *type;
+                       const char *type;
 
                        if (njp < njoin)
                                type = "Join ";
@@ -252,7 +253,9 @@ trunc:
 
 /*
  * auto-RP is a cisco protocol, documented at
- * ftp://ftpeng.cisco.com/ipmulticast/pim-autorp-spec01.txt
+ * ftp://ftpeng.cisco.com/ipmulticast/specs/pim-autorp-spec01.txt
+ *
+ * This implements version 1+, dated Sept 9, 1998.
  */
 void
 cisco_autorp_print(register const u_char *bp, register u_int len)
@@ -321,6 +324,8 @@ cisco_autorp_print(register const u_char *bp, register u_int len)
                case 3: printf(" PIMv1+2");
                        break;
                }
+               if (bp[4] & 0xfc)
+                       (void)printf(" [rsvd=0x%02x]", bp[4] & 0xfc);
                TCHECK(bp[5]);
                nentries = bp[5];
                bp += 6; len -= 6;
@@ -329,6 +334,8 @@ cisco_autorp_print(register const u_char *bp, register u_int len)
                        TCHECK2(bp[0], 6);
                        (void)printf("%c%s%s/%d", s, bp[0] & 1 ? "!" : "",
                            ipaddr_string(&bp[2]), bp[1]);
+                       if (bp[0] & 0xfe)
+                               (void)printf("[rsvd=0x%02x]", bp[0] & 0xfe);
                        s = ',';
                        bp += 6; len -= 6;
                }
@@ -410,11 +417,6 @@ static int pimv2_addr_len;
 enum pimv2_addrtype {
        pimv2_unicast, pimv2_group, pimv2_source
 };
-#if 0
-static char *addrtypestr[] = {
-       "unicast", "group", "source"
-};
-#endif
 
 /*  0                   1                   2                   3
  *  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
@@ -440,7 +442,7 @@ static int
 pimv2_addr_print(const u_char *bp, enum pimv2_addrtype at, int silent)
 {
        int af;
-       char *afstr;
+       const char *afstr;
        int len, hdrlen;
 
        TCHECK(bp[0]);
@@ -577,7 +579,36 @@ pimv2_print(register const u_char *bp, register u_int len)
                                (void)printf(")");
                                break;
 
+                       case 2:         /* LAN Prune Delay */
+                               (void)printf(" (LAN-Prune-Delay: ");
+                               if (olen != 4) {
+                                       (void)printf("!olen=%d!)", olen);
+                               } else {
+                                       char t_bit;
+                                       u_int16_t lan_delay, override_interval;
+                                       lan_delay = EXTRACT_16BITS(&bp[4]);
+                                       override_interval = EXTRACT_16BITS(&bp[6]);
+                                       t_bit = (lan_delay & 0x8000)? 1 : 0;
+                                       lan_delay &= ~0x8000;
+                                       (void)printf("T-bit=%d lan-delay=%dms override-interval=%dms)",
+                                       t_bit, lan_delay, override_interval);
+                               }
+                               break;
+
+                       case 18:        /* Old DR-Priority */
+                               if (olen == 4)
+                                       (void)printf(" (OLD-DR-Priority: %d)",
+                                                       EXTRACT_32BITS(&bp[4]));
+                               else
+                                       goto unknown;
+                               break;
+
+
                        case 19:        /* DR-Priority */
+                               if (olen == 0) {
+                                       (void)printf(" (OLD-bidir-capable)");
+                                       break;
+                               }
                                (void)printf(" (DR-Priority: ");
                                if (olen != 4) {
                                        (void)printf("!olen=%d!)", olen);
@@ -591,9 +622,13 @@ pimv2_print(register const u_char *bp, register u_int len)
                                break;
 
                        case 21:
-                               (void)printf(" (State Refresh Capable");
-                               if (EXTRACT_32BITS(&bp[4]) != 1) {
-                                       (void)printf(" ?0x%x?", EXTRACT_32BITS(&bp[4]));
+                               (void)printf(" (State Refresh Capable; v%d", bp[4]);
+                               if (bp[5] != 0) {
+                                       (void)printf(" interval ");
+                                       relts_print(bp[5]);
+                               }
+                               if (EXTRACT_16BITS(&bp[6]) != 0) {
+                                       (void)printf(" ?0x%04x?", EXTRACT_16BITS(&bp[6]));
                                }
                                (void)printf(")");
                                break;
@@ -602,7 +637,28 @@ pimv2_print(register const u_char *bp, register u_int len)
                                (void)printf(" (bidir-capable)");
                                break;
 
+                       case 24:        /* Address List */
+                       case 65001:     /* Address List (old implementations) */
+                               (void)printf(" (%saddr-list",
+                                            otype == 65001 ? "old" : "");
+                               if (vflag > 1) {
+                                       const u_char *ptr = &bp[4];
+                                       while (ptr < &bp[4 + olen]) {
+                                               int advance;
+
+                                               printf(" ");
+                                               advance = pimv2_addr_print(ptr, pimv2_unicast, 0);
+                                               if (advance < 0) {
+                                                       printf("...");
+                                                       break;
+                                               }
+                                               ptr += advance;
+                                       }
+                               }
+                               (void)printf(")");
+                               break;
                        default:
+                       unknown:
                                if (vflag)
                                        (void)printf(" [Hello option %d]", otype);
                        }