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("\"");