bgpd already got support for extended shutdown communication messages.
This adds the same support to tcpdump.

OK?
-- 
:wq Claudio

Index: print-bgp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-bgp.c,v
retrieving revision 1.27
diff -u -p -r1.27 print-bgp.c
--- print-bgp.c 28 Dec 2018 11:54:10 -0000      1.27
+++ print-bgp.c 25 Apr 2019 08:20:27 -0000
@@ -241,7 +241,7 @@ static const char *bgpnotify_minor_fsm[]
 /* RFC 8203 */
 #define BGP_NOTIFY_MINOR_CEASE_SHUT                    2
 #define BGP_NOTIFY_MINOR_CEASE_RESET                   4
-#define BGP_NOTIFY_MINOR_CEASE_ADMIN_SHUTDOWN_LEN      128
+#define BGP_NOTIFY_MINOR_CEASE_ADMIN_SHUTDOWN_LEN      255
 static const char *bgpnotify_minor_cease[] = {
        NULL, "Maximum Number of Prefixes Reached", "Administrative Shutdown",
        "Peer De-configured", "Administrative Reset", "Connection Rejected",
@@ -982,14 +982,14 @@ bgp_notification_print(const u_char *dat
        u_int16_t af;
        u_int8_t safi;
        const u_char *p;
-       uint8_t shutdown_comm_length;
+       size_t shutdown_comm_length;
        char shutstring[BGP_NOTIFY_MINOR_CEASE_ADMIN_SHUTDOWN_LEN + 1];
 
        TCHECK2(dat[0], BGP_NOTIFICATION_SIZE);
        memcpy(&bgpn, dat, BGP_NOTIFICATION_SIZE);
 
        /* sanity checking */
-       if (length<BGP_NOTIFICATION_SIZE)
+       if (length < BGP_NOTIFICATION_SIZE)
                return;
 
        printf(": error %s,", bgp_notify_major(bgpn.bgpn_major));
@@ -1027,22 +1027,23 @@ bgp_notification_print(const u_char *dat
                    (length >= BGP_NOTIFICATION_SIZE + 1)) {
                        p = dat + BGP_NOTIFICATION_SIZE;
                        TCHECK2(*p, 1);
-                       shutdown_comm_length = *(p);
+                       shutdown_comm_length = *p;
 
                        /* sanity checking */
                        if (shutdown_comm_length == 0)
                                return;
                        if (shutdown_comm_length >
                            BGP_NOTIFY_MINOR_CEASE_ADMIN_SHUTDOWN_LEN)
-                               return;
-                       if (length < (shutdown_comm_length + 1 + 
BGP_NOTIFICATION_SIZE))
-                               return;
+                               goto trunc;
+                       if (length < (shutdown_comm_length + 1 +
+                           BGP_NOTIFICATION_SIZE))
+                               goto trunc;
                        TCHECK2(*(p+1), shutdown_comm_length);
                        
                        /* a proper shutdown communication */
-                       printf(", Shutdown Communication [len %u]: \"",
+                       printf(", Shutdown Communication [len %zu]: \"",
                            shutdown_comm_length);
-                       memset(shutstring, 0, 
BGP_NOTIFY_MINOR_CEASE_ADMIN_SHUTDOWN_LEN + 1);
+                       memset(shutstring, 0, sizeof(shutstring));
                        memcpy(shutstring, p+1, shutdown_comm_length);
                        safeputs(shutstring);
                        printf("\"");

Reply via email to