]> The Tcpdump Group git mirrors - tcpdump/commitdiff
add support for optional AFI, SAFI and MAXPREFL values that
authorhannes <hannes>
Tue, 27 May 2003 13:09:02 +0000 (13:09 +0000)
committerhannes <hannes>
Tue, 27 May 2003 13:09:02 +0000 (13:09 +0000)
may be optionally present in the data portion of a BGP
Notification CEASE message as described per
draft-ietf-idr-cease-subcode-02

print-bgp.c

index a1752f5993ca0330e4b466f11389adf611c84ae1..ab1e59bb3e740827821d0dd00ebc8b52a0a8cf0e 100644 (file)
@@ -36,7 +36,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-     "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.62 2003-05-27 12:43:37 hannes Exp $";
+     "@(#) $Header: /tcpdump/master/tcpdump/print-bgp.c,v 1.63 2003-05-27 13:09:02 hannes Exp $";
 #endif
 
 #include <tcpdump-stdinc.h>
@@ -96,7 +96,7 @@ struct bgp_notification {
        u_int8_t bgpn_type;
        u_int8_t bgpn_major;
        u_int8_t bgpn_minor;
-       /* data should follow */
+        u_int8_t bgpn_data[0];          /* data should follow */
 };
 #define BGP_NOTIFICATION_SIZE          21      /* unaligned */
 
@@ -203,8 +203,9 @@ static struct tok bgp_notify_major_values[] = {
 };
 
 /* draft-ietf-idr-cease-subcode-02 */
+#define BGP_NOTIFY_MINOR_CEASE_MAXPRFX  1
 static struct tok bgp_notify_minor_cease_values[] = {
-    { 1,                        "Maximum Number of Prefixes Reached"},
+    { BGP_NOTIFY_MINOR_CEASE_MAXPRFX, "Maximum Number of Prefixes Reached"},
     { 2,                        "Administratively Shutdown"},
     { 3,                        "Peer Unconfigured"},
     { 4,                        "Administratively Reset"},
@@ -1423,16 +1424,35 @@ bgp_notification_print(const u_char *dat, int length)
         switch (bgpn.bgpn_major) {
 
         case BGP_NOTIFY_MAJOR_MSG:
-            printf(" subcode %s", tok2str(bgp_notify_minor_msg_values, "Unknown", bgpn.bgpn_minor));
+            printf(" subcode %s (%u)",
+                  tok2str(bgp_notify_minor_msg_values, "Unknown", bgpn.bgpn_minor),
+                  bgpn.bgpn_minor);
             break;
         case BGP_NOTIFY_MAJOR_OPEN:
-            printf(" subcode %s", tok2str(bgp_notify_minor_open_values, "Unknown", bgpn.bgpn_minor));
+            printf(" subcode %s (%u)",
+                  tok2str(bgp_notify_minor_open_values, "Unknown", bgpn.bgpn_minor),
+                  bgpn.bgpn_minor);
             break;
         case BGP_NOTIFY_MAJOR_UPDATE:
-            printf(" subcode %s", tok2str(bgp_notify_minor_update_values, "Unknown", bgpn.bgpn_minor));
+            printf(" subcode %s (%u)",
+                  tok2str(bgp_notify_minor_update_values, "Unknown", bgpn.bgpn_minor),
+                  bgpn.bgpn_minor);
             break;
         case BGP_NOTIFY_MAJOR_CEASE:
-            printf(" subcode %s", tok2str(bgp_notify_minor_cease_values, "Unknown", bgpn.bgpn_minor));
+            printf(" subcode %s (%u)",
+                  tok2str(bgp_notify_minor_cease_values, "Unknown", bgpn.bgpn_minor),
+                  bgpn.bgpn_minor);
+
+           /* draft-ietf-idr-cease-subcode-02 mentions optionally 7 bytes
+             * for the maxprefix subtype, which may contain AFI, SAFI and MAXPREFIXES
+             */
+           if(bgpn.bgpn_minor == BGP_NOTIFY_MINOR_CEASE_MAXPRFX && length >= BGP_NOTIFICATION_SIZE + 7)
+               printf(", AFI %s (%u), SAFI %s (%u), Max Prefixes: %u",
+                      tok2str(bgp_afi_values, "Unknown", EXTRACT_16BITS(&bgpn.bgpn_data)),
+                      EXTRACT_16BITS(&bgpn.bgpn_data),
+                      tok2str(bgp_safi_values, "Unknown", *(bgpn.bgpn_data+2)),
+                      *(bgpn.bgpn_data+2),
+                      EXTRACT_32BITS(&bgpn.bgpn_data+3));
             break;
         default:
             break;