This patch adds support to tcpdump(8) to decode Large BGP
Communities in human readable form.

Example:

        [ snip ] BGP (UPDATE: (Path attributes: (ORIGIN[T] IGP)
                (AS_PATH[T] 65000)
                (NEXT_HOP[T] pxtr-2.meerval.net)
                (COMMUNITIES[OT] 666:666 2914:0)
                (LARGE_COMMUNITIES[OT] 2914:0:666 2914:4294927296:123))
                (NLRI: 9.9.9.10/32)) (DF) (ttl 63, id 2806, len 138)

Kind regards,

Job


Index: src/usr.sbin/tcpdump/print-bgp.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-bgp.c,v
retrieving revision 1.18
diff -u -p -u -r1.18 print-bgp.c
--- src/usr.sbin/tcpdump/print-bgp.c    20 Oct 2015 11:29:07 -0000      1.18
+++ src/usr.sbin/tcpdump/print-bgp.c    12 Oct 2016 16:09:51 -0000
@@ -134,6 +134,7 @@ struct bgp_attr {
 #define BGPTYPE_EXTD_COMMUNITIES       16      /* RFC4360 */
 #define BGPTYPE_AS4_PATH               17      /* RFC4893 */
 #define BGPTYPE_AGGREGATOR4            18      /* RFC4893 */
+#define BGPTYPE_LARGE_COMMUNITIES      30      /* 
draft-ietf-idr-large-community */
 
 #define BGP_AS_SET             1
 #define BGP_AS_SEQUENCE        2
@@ -265,7 +266,8 @@ static const char *bgpattr_type[] = {
        "MULTI_EXIT_DISC", "LOCAL_PREF", "ATOMIC_AGGREGATE", "AGGREGATOR",
        "COMMUNITIES", "ORIGINATOR_ID", "CLUSTER_LIST", "DPA",
        "ADVERTISERS", "RCID_PATH", "MP_REACH_NLRI", "MP_UNREACH_NLRI",
-       "EXTD_COMMUNITIES", "AS4_PATH", "AGGREGATOR4",
+       "EXTD_COMMUNITIES", "AS4_PATH", "AGGREGATOR4", NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "LARGE_COMMUNITIES",
 };
 #define bgp_attr_type(x) \
        num_or_str(bgpattr_type, \
@@ -544,6 +546,21 @@ bgp_attr_print(const struct bgp_attr *at
                        }
                        tlen -= 4;
                        p += 4;
+               }
+               break;
+       case BGPTYPE_LARGE_COMMUNITIES:
+               if (len == 0 || len % 12) {
+                       printf(" invalid len");
+                       break;
+               }
+               while (tlen>0) {
+                       TCHECK2(p[0], 12);
+                       printf(" %u:%u:%u",
+                       EXTRACT_32BITS(p),
+                       EXTRACT_32BITS(p + 4),
+                       EXTRACT_32BITS(p + 8));
+                       tlen -= 12;
+                       p += 12;
                }
                break;
        case BGPTYPE_ORIGINATOR_ID:

Reply via email to