]> The Tcpdump Group git mirrors - tcpdump/commitdiff
bgp: Handle ORF in Route-Refresh messages
authorDonatas Abraitis <[email protected]>
Tue, 30 Aug 2022 15:41:20 +0000 (18:41 +0300)
committerfxlb <[email protected]>
Wed, 7 Sep 2022 20:00:36 +0000 (20:00 +0000)
Signed-off-by: Donatas Abraitis <[email protected]>
print-bgp.c
tests/TESTLIST
tests/bgp-orf.out [new file with mode: 0644]
tests/bgp-orf.pcap [new file with mode: 0644]

index c52fff830211472951a59c902f2e69ddcbb83b66..1292542c3347108962ef6aa687eae2d71f5d4151 100644 (file)
@@ -103,6 +103,12 @@ struct bgp_notification {
 };
 #define BGP_NOTIFICATION_SIZE        21    /* unaligned */
 
+struct bgp_route_refresh_orf {
+  nd_uint8_t  refresh;
+  nd_uint8_t  type;
+  nd_uint16_t len;
+};
+
 struct bgp_route_refresh {
     nd_byte     bgp_marker[16];
     nd_uint16_t len;
@@ -111,7 +117,21 @@ struct bgp_route_refresh {
     nd_uint8_t  subtype;
     nd_uint8_t  safi;
 };
+
+static const struct tok bgp_orf_refresh_type[] = {
+    { 1, "Immediate"},
+    { 2, "Defer"},
+    { 0, NULL }
+};
+
+static const struct tok bgp_orf_type[] = {
+    { 64, "Address Prefix ORF"},
+    { 65, "CP-ORF"},
+    { 0, NULL }
+};
+
 #define BGP_ROUTE_REFRESH_SIZE          23
+#define BGP_ROUTE_REFRESH_SIZE_ORF      BGP_ROUTE_REFRESH_SIZE + 5
 #define BGP_ROUTE_REFRESH_SUBTYPE_NORMAL 0
 #define BGP_ROUTE_REFRESH_SUBTYPE_BORR 1
 #define BGP_ROUTE_REFRESH_SUBTYPE_EORR 2
@@ -3083,8 +3103,6 @@ bgp_route_refresh_print(netdissect_options *ndo,
 {
     const struct bgp_route_refresh *bgp_route_refresh_header;
 
-    ND_TCHECK_LEN(pptr, BGP_ROUTE_REFRESH_SIZE);
-
     /* some little sanity checking */
     if (len<BGP_ROUTE_REFRESH_SIZE)
         return;
@@ -3102,6 +3120,21 @@ bgp_route_refresh_print(netdissect_options *ndo,
                      GET_U_1(bgp_route_refresh_header->subtype)),
              GET_U_1(bgp_route_refresh_header->subtype));
 
+    /* ORF */
+    if (len >= BGP_ROUTE_REFRESH_SIZE_ORF) {
+        const struct bgp_route_refresh_orf *orf_header;
+
+        orf_header =
+          (const struct bgp_route_refresh_orf *)(pptr + BGP_ROUTE_REFRESH_SIZE);
+
+        ND_PRINT("\n\t  ORF refresh %s (%u), ORF type %s (%u), ORF length %u",
+                 tok2str(bgp_orf_refresh_type, "Unknown",
+                         GET_U_1(orf_header->refresh)),
+                 GET_U_1(orf_header->refresh),
+                 tok2str(bgp_orf_type, "Unknown", GET_U_1(orf_header->type)),
+                 GET_U_1(orf_header->type), GET_BE_U_2(orf_header->len));
+    }
+
     if (ndo->ndo_vflag > 1) {
         ND_TCHECK_LEN(pptr, len);
         print_unknown_data(ndo, pptr, "\n\t  ", len);
index da4e56a300aa87739fcab9f49433712ea5bd1695..7ed0b5788bb9928873a74386222b4d7e2d86cabd 100644 (file)
@@ -69,6 +69,7 @@ bgp-extended-optional-parameters-length       bgp-extended-optional-parameters-length.
 bgp-cease-hard-reset           bgp-cease-hard-reset.pcap       bgp-cease-hard-reset.out        -v
 bgp-malformed-hard-reset       bgp-malformed-hard-reset.pcap   bgp-malformed-hard-reset.out    -v
 bgp-bfd-cease                  bgp-bfd-cease.pcap              bgp-bfd-cease.out               -v
+bgp-orf                        bgp-orf.pcap            bgp-orf.out             -v
 
 # Broadcom tag tests
 brcmtag                brcm-tag.pcap           brcm-tag.out
diff --git a/tests/bgp-orf.out b/tests/bgp-orf.out
new file mode 100644 (file)
index 0000000..3b59149
--- /dev/null
@@ -0,0 +1,7 @@
+    1  16:12:16.630159 IP6 (class 0xc0, flowlabel 0x4dfd4, hlim 1, next-header TCP (6) payload length: 111) fe80::a00:27ff:fe5e:d19e.34394 > fe80::ca5d:fd0d:cd8:1bb7.179: Flags [P.], cksum 0xa597 (correct), seq 2096048450:2096048529, ack 1967270673, win 506, options [nop,nop,TS val 2145170888 ecr 3487011352], length 79: BGP
+       Route Refresh Message (5), length: 28
+         AFI IPv4 (1), SAFI Unicast (1), Subtype Normal route refresh request (0)
+         ORF refresh Defer (2), ORF type Address Prefix ORF (64), ORF length 1
+       Route Refresh Message (5), length: 51
+         AFI IPv4 (1), SAFI Unicast (1), Subtype Normal route refresh request (0)
+         ORF refresh Immediate (1), ORF type Address Prefix ORF (64), ORF length 24
diff --git a/tests/bgp-orf.pcap b/tests/bgp-orf.pcap
new file mode 100644 (file)
index 0000000..39b4a7f
Binary files /dev/null and b/tests/bgp-orf.pcap differ