tests: Use errno value rather than a specific int
[vpp.git] / test / test_bier.py
index b719f0c..4a4f35e 100644 (file)
@@ -1,39 +1,60 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 import unittest
-import socket
 
-from framework import VppTestCase, VppTestRunner, running_extended_tests
+from config import config
+from framework import VppTestCase
+from asfframework import VppTestRunner
 from vpp_ip import DpoProto
-from vpp_ip_route import VppIpRoute, VppRoutePath, VppMplsRoute, \
-    VppMplsTable, VppIpMRoute, VppMRoutePath, VppIpTable, \
-    MRouteEntryFlags, MRouteItfFlags, MPLS_LABEL_INVALID, \
-    VppMplsLabel
-from vpp_bier import *
-from vpp_udp_encap import *
-
+from vpp_ip_route import (
+    VppIpRoute,
+    VppRoutePath,
+    VppMplsTable,
+    VppIpMRoute,
+    VppMRoutePath,
+    VppIpTable,
+    MPLS_LABEL_INVALID,
+    VppMplsLabel,
+    FibPathProto,
+    FibPathType,
+)
+from vpp_bier import (
+    BIER_HDR_PAYLOAD,
+    VppBierImp,
+    VppBierDispEntry,
+    VppBierDispTable,
+    VppBierTable,
+    VppBierTableID,
+    VppBierRoute,
+)
+from vpp_udp_encap import VppUdpEncap
+from vpp_papi import VppEnum
+
+import scapy.compat
 from scapy.packet import Raw
 from scapy.layers.l2 import Ether
-from scapy.layers.inet import IP, UDP, ICMP
+from scapy.layers.inet import IP, UDP
 from scapy.layers.inet6 import IPv6
 from scapy.contrib.mpls import MPLS
-from scapy.contrib.bier import *
+from scapy.contrib.bier import BIER, BIERLength, BIFT
+
+NUM_PKTS = 67
 
 
 class TestBFIB(VppTestCase):
-    """ BIER FIB Test Case """
+    """BIER FIB Test Case"""
 
     def test_bfib(self):
-        """ BFIB Unit Tests """
+        """BFIB Unit Tests"""
         error = self.vapi.cli("test bier")
 
         if error:
             self.logger.critical(error)
-        self.assertEqual(error.find("Failed"), -1)
+        self.assertNotIn("Failed", error)
 
 
 class TestBier(VppTestCase):
-    """ BIER Test Case """
+    """BIER Test Case"""
 
     def setUp(self):
         super(TestBier, self).setUp()
@@ -81,16 +102,17 @@ class TestBier(VppTestCase):
         #
         # A packet with no bits set gets dropped
         #
-        p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
-             MPLS(label=77, ttl=255) /
-             BIER(length=hdr_len_id) /
-             IPv6(src=self.pg0.remote_ip6, dst=self.pg0.remote_ip6) /
-             UDP(sport=1234, dport=1234) /
-             Raw())
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / MPLS(label=77, ttl=255)
+            / BIER(length=hdr_len_id)
+            / IPv6(src=self.pg0.remote_ip6, dst=self.pg0.remote_ip6)
+            / UDP(sport=1234, dport=1234)
+            / Raw()
+        )
         pkts = [p]
 
-        self.send_and_assert_no_replies(self.pg0, pkts,
-                                        "Empty Bit-String")
+        self.send_and_assert_no_replies(self.pg0, pkts, "Empty Bit-String")
 
         #
         # Add a BIER route for each bit-position in the table via a different
@@ -99,19 +121,32 @@ class TestBier(VppTestCase):
         #
         nh_routes = []
         bier_routes = []
-        for i in range(1, max_bp+1):
+        for i in range(1, max_bp + 1):
             nh = "10.0.%d.%d" % (i / 255, i % 255)
             nh_routes.append(
-                VppIpRoute(self, nh, 32,
-                           [VppRoutePath(self.pg1.remote_ip4,
-                                         self.pg1.sw_if_index,
-                                         labels=[VppMplsLabel(2000+i)])]))
+                VppIpRoute(
+                    self,
+                    nh,
+                    32,
+                    [
+                        VppRoutePath(
+                            self.pg1.remote_ip4,
+                            self.pg1.sw_if_index,
+                            labels=[VppMplsLabel(2000 + i)],
+                        )
+                    ],
+                )
+            )
             nh_routes[-1].add_vpp_config()
 
             bier_routes.append(
-                VppBierRoute(self, bti, i,
-                             [VppRoutePath(nh, 0xffffffff,
-                                           labels=[VppMplsLabel(100+i)])]))
+                VppBierRoute(
+                    self,
+                    bti,
+                    i,
+                    [VppRoutePath(nh, 0xFFFFFFFF, labels=[VppMplsLabel(100 + i)])],
+                )
+            )
             bier_routes[-1].add_vpp_config()
 
         #
@@ -120,12 +155,14 @@ class TestBier(VppTestCase):
         pkt_sizes = [64, 1400]
 
         for pkt_size in pkt_sizes:
-            p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
-                 MPLS(label=77, ttl=255) /
-                 BIER(length=hdr_len_id, BitString=chr(255)*n_bytes) /
-                 IPv6(src=self.pg0.remote_ip6, dst=self.pg0.remote_ip6) /
-                 UDP(sport=1234, dport=1234) /
-                 Raw(chr(5) * pkt_size))
+            p = (
+                Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+                / MPLS(label=77, ttl=255)
+                / BIER(length=hdr_len_id, BitString=scapy.compat.chb(255) * n_bytes)
+                / IPv6(src=self.pg0.remote_ip6, dst=self.pg0.remote_ip6)
+                / UDP(sport=1234, dport=1234)
+                / Raw(scapy.compat.chb(5) * pkt_size)
+            )
             pkts = p
 
             self.pg0.add_stream(pkts)
@@ -144,7 +181,7 @@ class TestBier(VppTestCase):
                 bp = olabel.label - 2000
 
                 blabel = olabel[MPLS].payload
-                self.assertEqual(blabel.label, 100+bp)
+                self.assertEqual(blabel.label, 100 + bp)
                 self.assertEqual(blabel.ttl, 254)
 
                 bier_hdr = blabel[MPLS].payload
@@ -159,18 +196,18 @@ class TestBier(VppTestCase):
                 self.assertEqual(bier_hdr.Proto, 5)
 
                 # The bit-string should consist only of the BP given by i.
-                byte_array = ['\0'] * (n_bytes)
-                byte_val = chr(1 << (bp - 1) % 8)
-                byte_pos = n_bytes - (((bp - 1) / 8) + 1)
+                byte_array = [b"\0"] * (n_bytes)
+                byte_val = scapy.compat.chb(1 << (bp - 1) % 8)
+                byte_pos = n_bytes - (((bp - 1) // 8) + 1)
                 byte_array[byte_pos] = byte_val
-                bitstring = ''.join(byte_array)
+                bitstring = b"".join(byte_array)
 
                 self.assertEqual(len(bitstring), len(bier_hdr.BitString))
                 self.assertEqual(bitstring, bier_hdr.BitString)
 
         #
         # cleanup. not strictly necessary, but it's much quicker this way
-        # becuase the bier_fib_dump and ip_fib_dump will be empty when the
+        # because the bier_fib_dump and ip_fib_dump will be empty when the
         # auto-cleanup kicks in
         #
         for br in bier_routes:
@@ -178,22 +215,22 @@ class TestBier(VppTestCase):
         for nhr in nh_routes:
             nhr.remove_vpp_config()
 
-    @unittest.skipUnless(running_extended_tests(), "part of extended tests")
+    @unittest.skipUnless(config.extended, "part of extended tests")
     def test_bier_midpoint_1024(self):
         """BIER midpoint BSL:1024"""
         self.bier_midpoint(BIERLength.BIER_LEN_1024, 128, 1024)
 
-    @unittest.skipUnless(running_extended_tests(), "part of extended tests")
+    @unittest.skipUnless(config.extended, "part of extended tests")
     def test_bier_midpoint_512(self):
         """BIER midpoint BSL:512"""
         self.bier_midpoint(BIERLength.BIER_LEN_512, 64, 512)
 
-    @unittest.skipUnless(running_extended_tests(), "part of extended tests")
+    @unittest.skipUnless(config.extended, "part of extended tests")
     def test_bier_midpoint_256(self):
         """BIER midpoint BSL:256"""
         self.bier_midpoint(BIERLength.BIER_LEN_256, 32, 256)
 
-    @unittest.skipUnless(running_extended_tests(), "part of extended tests")
+    @unittest.skipUnless(config.extended, "part of extended tests")
     def test_bier_midpoint_128(self):
         """BIER midpoint BSL:128"""
         self.bier_midpoint(BIERLength.BIER_LEN_128, 16, 128)
@@ -217,39 +254,55 @@ class TestBier(VppTestCase):
         #
         pkts = []
         for ii in range(257):
-            pkts.append((Ether(dst=self.pg0.local_mac,
-                               src=self.pg0.remote_mac) /
-                         MPLS(label=77, ttl=255) /
-                         BIER(length=BIERLength.BIER_LEN_64,
-                              entropy=ii,
-                              BitString=chr(255)*16) /
-                         IPv6(src=self.pg0.remote_ip6,
-                              dst=self.pg0.remote_ip6) /
-                         UDP(sport=1234, dport=1234) /
-                         Raw()))
+            pkts.append(
+                (
+                    Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+                    / MPLS(label=77, ttl=255)
+                    / BIER(
+                        length=BIERLength.BIER_LEN_64,
+                        entropy=ii,
+                        BitString=scapy.compat.chb(255) * 16,
+                    )
+                    / IPv6(src=self.pg0.remote_ip6, dst=self.pg0.remote_ip6)
+                    / UDP(sport=1234, dport=1234)
+                    / Raw()
+                )
+            )
 
         #
         # 4 next hops
         #
-        nhs = [{'ip': "10.0.0.1", 'label': 201},
-               {'ip': "10.0.0.2", 'label': 202},
-               {'ip': "10.0.0.3", 'label': 203},
-               {'ip': "10.0.0.4", 'label': 204}]
+        nhs = [
+            {"ip": "10.0.0.1", "label": 201},
+            {"ip": "10.0.0.2", "label": 202},
+            {"ip": "10.0.0.3", "label": 203},
+            {"ip": "10.0.0.4", "label": 204},
+        ]
 
         for nh in nhs:
             ipr = VppIpRoute(
-                self, nh['ip'], 32,
-                [VppRoutePath(self.pg1.remote_ip4,
-                              self.pg1.sw_if_index,
-                              labels=[VppMplsLabel(nh['label'])])])
+                self,
+                nh["ip"],
+                32,
+                [
+                    VppRoutePath(
+                        self.pg1.remote_ip4,
+                        self.pg1.sw_if_index,
+                        labels=[VppMplsLabel(nh["label"])],
+                    )
+                ],
+            )
             ipr.add_vpp_config()
 
         bier_route = VppBierRoute(
-            self, bti, 1,
-            [VppRoutePath(nhs[0]['ip'], 0xffffffff,
-                          labels=[VppMplsLabel(101)]),
-             VppRoutePath(nhs[1]['ip'], 0xffffffff,
-                          labels=[VppMplsLabel(101)])])
+            self,
+            bti,
+            1,
+            [
+                VppRoutePath(nhs[0]["ip"], 0xFFFFFFFF, labels=[VppMplsLabel(101)]),
+                VppRoutePath(nhs[1]["ip"], 0xFFFFFFFF, labels=[VppMplsLabel(101)]),
+            ],
+        )
         bier_route.add_vpp_config()
 
         rx = self.send_and_expect(self.pg0, pkts, self.pg1)
@@ -258,36 +311,38 @@ class TestBier(VppTestCase):
         # we should have recieved a packet from each neighbor
         #
         for nh in nhs[:2]:
-            self.assertTrue(sum(p[MPLS].label == nh['label'] for p in rx))
+            self.assertTrue(sum(p[MPLS].label == nh["label"] for p in rx))
 
         #
         # add the other paths
         #
         bier_route.update_paths(
-            [VppRoutePath(nhs[0]['ip'], 0xffffffff,
-                          labels=[VppMplsLabel(101)]),
-             VppRoutePath(nhs[1]['ip'], 0xffffffff,
-                          labels=[VppMplsLabel(101)]),
-             VppRoutePath(nhs[2]['ip'], 0xffffffff,
-                          labels=[VppMplsLabel(101)]),
-             VppRoutePath(nhs[3]['ip'], 0xffffffff,
-                          labels=[VppMplsLabel(101)])])
+            [
+                VppRoutePath(nhs[0]["ip"], 0xFFFFFFFF, labels=[VppMplsLabel(101)]),
+                VppRoutePath(nhs[1]["ip"], 0xFFFFFFFF, labels=[VppMplsLabel(101)]),
+                VppRoutePath(nhs[2]["ip"], 0xFFFFFFFF, labels=[VppMplsLabel(101)]),
+                VppRoutePath(nhs[3]["ip"], 0xFFFFFFFF, labels=[VppMplsLabel(101)]),
+            ]
+        )
 
         rx = self.send_and_expect(self.pg0, pkts, self.pg1)
+
         for nh in nhs:
-            self.assertTrue(sum(p[MPLS].label == nh['label'] for p in rx))
+            self.assertTrue(sum(p[MPLS].label == nh["label"] for p in rx))
 
         #
         # remove first two paths
         #
-        bier_route.remove_path(VppRoutePath(nhs[0]['ip'], 0xffffffff,
-                                            labels=[VppMplsLabel(101)]))
-        bier_route.remove_path(VppRoutePath(nhs[1]['ip'], 0xffffffff,
-                                            labels=[VppMplsLabel(101)]))
+        bier_route.remove_path(
+            VppRoutePath(nhs[0]["ip"], 0xFFFFFFFF, labels=[VppMplsLabel(101)])
+        )
+        bier_route.remove_path(
+            VppRoutePath(nhs[1]["ip"], 0xFFFFFFFF, labels=[VppMplsLabel(101)])
+        )
 
         rx = self.send_and_expect(self.pg0, pkts, self.pg1)
         for nh in nhs[2:]:
-            self.assertTrue(sum(p[MPLS].label == nh['label'] for p in rx))
+            self.assertTrue(sum(p[MPLS].label == nh["label"] for p in rx))
 
         #
         # remove the last of the paths, deleteing the entry
@@ -299,6 +354,9 @@ class TestBier(VppTestCase):
     def test_bier_head(self):
         """BIER head"""
 
+        MRouteItfFlags = VppEnum.vl_api_mfib_itf_flags_t
+        MRouteEntryFlags = VppEnum.vl_api_mfib_entry_flags_t
+
         #
         # Add a BIER table for sub-domain 0, set 0, and BSL 256
         #
@@ -311,30 +369,46 @@ class TestBier(VppTestCase):
         #
         nh1 = "10.0.0.1"
         nh2 = "10.0.0.2"
-        ip_route_1 = VppIpRoute(self, nh1, 32,
-                                [VppRoutePath(self.pg1.remote_ip4,
-                                              self.pg1.sw_if_index,
-                                              labels=[VppMplsLabel(2001)])])
-        ip_route_2 = VppIpRoute(self, nh2, 32,
-                                [VppRoutePath(self.pg1.remote_ip4,
-                                              self.pg1.sw_if_index,
-                                              labels=[VppMplsLabel(2002)])])
+        ip_route_1 = VppIpRoute(
+            self,
+            nh1,
+            32,
+            [
+                VppRoutePath(
+                    self.pg1.remote_ip4,
+                    self.pg1.sw_if_index,
+                    labels=[VppMplsLabel(2001)],
+                )
+            ],
+        )
+        ip_route_2 = VppIpRoute(
+            self,
+            nh2,
+            32,
+            [
+                VppRoutePath(
+                    self.pg1.remote_ip4,
+                    self.pg1.sw_if_index,
+                    labels=[VppMplsLabel(2002)],
+                )
+            ],
+        )
         ip_route_1.add_vpp_config()
         ip_route_2.add_vpp_config()
 
-        bier_route_1 = VppBierRoute(self, bti, 1,
-                                    [VppRoutePath(nh1, 0xffffffff,
-                                                  labels=[VppMplsLabel(101)])])
-        bier_route_2 = VppBierRoute(self, bti, 2,
-                                    [VppRoutePath(nh2, 0xffffffff,
-                                                  labels=[VppMplsLabel(102)])])
+        bier_route_1 = VppBierRoute(
+            self, bti, 1, [VppRoutePath(nh1, 0xFFFFFFFF, labels=[VppMplsLabel(101)])]
+        )
+        bier_route_2 = VppBierRoute(
+            self, bti, 2, [VppRoutePath(nh2, 0xFFFFFFFF, labels=[VppMplsLabel(102)])]
+        )
         bier_route_1.add_vpp_config()
         bier_route_2.add_vpp_config()
 
         #
         # An imposition object with both bit-positions set
         #
-        bi = VppBierImp(self, bti, 333, chr(0x3) * 32)
+        bi = VppBierImp(self, bti, 333, scapy.compat.chb(0x3) * 32)
         bi.add_vpp_config()
 
         #
@@ -343,24 +417,33 @@ class TestBier(VppTestCase):
         route_ing_232_1_1_1 = VppIpMRoute(
             self,
             "0.0.0.0",
-            "232.1.1.1", 32,
-            MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
-            paths=[VppMRoutePath(self.pg0.sw_if_index,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_ACCEPT),
-                   VppMRoutePath(0xffffffff,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_FORWARD,
-                                 proto=DpoProto.DPO_PROTO_BIER,
-                                 bier_imp=bi.bi_index)])
+            "232.1.1.1",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
+            paths=[
+                VppMRoutePath(
+                    self.pg0.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_ACCEPT
+                ),
+                VppMRoutePath(
+                    0xFFFFFFFF,
+                    MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD,
+                    proto=FibPathProto.FIB_PATH_NH_PROTO_BIER,
+                    type=FibPathType.FIB_PATH_TYPE_BIER_IMP,
+                    bier_imp=bi.bi_index,
+                ),
+            ],
+        )
         route_ing_232_1_1_1.add_vpp_config()
 
         #
         # inject an IP packet. We expect it to be BIER encapped and
         # replicated.
         #
-        p = (Ether(dst=self.pg0.local_mac,
-                   src=self.pg0.remote_mac) /
-             IP(src="1.1.1.1", dst="232.1.1.1") /
-             UDP(sport=1234, dport=1234))
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / IP(src="1.1.1.1", dst="232.1.1.1")
+            / UDP(sport=1234, dport=1234)
+        )
 
         self.pg0.add_stream([p])
         self.pg_enable_capture(self.pg_interfaces)
@@ -394,6 +477,9 @@ class TestBier(VppTestCase):
     def test_bier_tail(self):
         """BIER Tail"""
 
+        MRouteItfFlags = VppEnum.vl_api_mfib_itf_flags_t
+        MRouteEntryFlags = VppEnum.vl_api_mfib_entry_flags_t
+
         #
         # Add a BIER table for sub-domain 0, set 0, and BSL 256
         #
@@ -411,20 +497,33 @@ class TestBier(VppTestCase):
         # BIER route in table that's for-us
         #
         bier_route_1 = VppBierRoute(
-            self, bti, 1,
-            [VppRoutePath("0.0.0.0",
-                          0xffffffff,
-                          proto=DpoProto.DPO_PROTO_BIER,
-                          nh_table_id=8)])
+            self,
+            bti,
+            1,
+            [
+                VppRoutePath(
+                    "0.0.0.0",
+                    0xFFFFFFFF,
+                    proto=FibPathProto.FIB_PATH_NH_PROTO_BIER,
+                    nh_table_id=8,
+                )
+            ],
+        )
         bier_route_1.add_vpp_config()
 
         #
         # An entry in the disposition table
         #
-        bier_de_1 = VppBierDispEntry(self, bdt.id, 99,
-                                     BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
-                                     DpoProto.DPO_PROTO_BIER,
-                                     "0.0.0.0", 0, rpf_id=8192)
+        bier_de_1 = VppBierDispEntry(
+            self,
+            bdt.id,
+            99,
+            BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
+            FibPathProto.FIB_PATH_NH_PROTO_BIER,
+            "0.0.0.0",
+            0,
+            rpf_id=8192,
+        )
         bier_de_1.add_vpp_config()
 
         #
@@ -433,48 +532,68 @@ class TestBier(VppTestCase):
         route_eg_232_1_1_1 = VppIpMRoute(
             self,
             "0.0.0.0",
-            "232.1.1.1", 32,
-            MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
-            paths=[VppMRoutePath(self.pg1.sw_if_index,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_FORWARD)])
+            "232.1.1.1",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
+            paths=[
+                VppMRoutePath(
+                    self.pg1.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD
+                )
+            ],
+        )
         route_eg_232_1_1_1.add_vpp_config()
         route_eg_232_1_1_1.update_rpf_id(8192)
 
         #
         # A packet with all bits set gets spat out to BP:1
         #
-        p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
-             MPLS(label=77, ttl=255) /
-             BIER(length=BIERLength.BIER_LEN_256,
-                  BitString=chr(255)*32,
-                  BFRID=99) /
-             IP(src="1.1.1.1", dst="232.1.1.1") /
-             UDP(sport=1234, dport=1234) /
-             Raw())
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / MPLS(label=77, ttl=255)
+            / BIER(
+                length=BIERLength.BIER_LEN_256,
+                BitString=scapy.compat.chb(255) * 32,
+                BFRID=99,
+            )
+            / IP(src="1.1.1.1", dst="232.1.1.1")
+            / UDP(sport=1234, dport=1234)
+            / Raw()
+        )
 
         self.send_and_expect(self.pg0, [p], self.pg1)
 
         #
         # A packet that does not match the Disposition entry gets dropped
         #
-        p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
-             MPLS(label=77, ttl=255) /
-             BIER(length=BIERLength.BIER_LEN_256,
-                  BitString=chr(255)*32,
-                  BFRID=77) /
-             IP(src="1.1.1.1", dst="232.1.1.1") /
-             UDP(sport=1234, dport=1234) /
-             Raw())
-        self.send_and_assert_no_replies(self.pg0, p*2,
-                                        "no matching disposition entry")
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / MPLS(label=77, ttl=255)
+            / BIER(
+                length=BIERLength.BIER_LEN_256,
+                BitString=scapy.compat.chb(255) * 32,
+                BFRID=77,
+            )
+            / IP(src="1.1.1.1", dst="232.1.1.1")
+            / UDP(sport=1234, dport=1234)
+            / Raw()
+        )
+        self.send_and_assert_no_replies(
+            self.pg0, p * 2, "no matching disposition entry"
+        )
 
         #
         # Add the default route to the disposition table
         #
-        bier_de_2 = VppBierDispEntry(self, bdt.id, 0,
-                                     BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
-                                     DpoProto.DPO_PROTO_BIER,
-                                     "0.0.0.0", 0, rpf_id=8192)
+        bier_de_2 = VppBierDispEntry(
+            self,
+            bdt.id,
+            0,
+            BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
+            FibPathProto.FIB_PATH_NH_PROTO_BIER,
+            "0.0.0.0",
+            0,
+            rpf_id=8192,
+        )
         bier_de_2.add_vpp_config()
 
         #
@@ -482,8 +601,54 @@ class TestBier(VppTestCase):
         #
         self.send_and_expect(self.pg0, [p], self.pg1)
 
+        #
+        # A multicast route to forward post BIER disposition that needs
+        # a check against sending back into the BIER core
+        #
+        bi = VppBierImp(self, bti, 333, scapy.compat.chb(0x3) * 32)
+        bi.add_vpp_config()
+
+        route_eg_232_1_1_2 = VppIpMRoute(
+            self,
+            "0.0.0.0",
+            "232.1.1.2",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
+            paths=[
+                VppMRoutePath(
+                    0xFFFFFFFF,
+                    MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD,
+                    proto=DpoProto.DPO_PROTO_BIER,
+                    type=FibPathType.FIB_PATH_TYPE_BIER_IMP,
+                    bier_imp=bi.bi_index,
+                ),
+                VppMRoutePath(
+                    self.pg1.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD
+                ),
+            ],
+        )
+        route_eg_232_1_1_2.add_vpp_config()
+        route_eg_232_1_1_2.update_rpf_id(8192)
+
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / MPLS(label=77, ttl=255)
+            / BIER(
+                length=BIERLength.BIER_LEN_256,
+                BitString=scapy.compat.chb(255) * 32,
+                BFRID=77,
+            )
+            / IP(src="1.1.1.1", dst="232.1.1.2")
+            / UDP(sport=1234, dport=1234)
+            / Raw()
+        )
+        self.send_and_expect(self.pg0, [p], self.pg1)
+
     def bier_e2e(self, hdr_len_id, n_bytes, max_bp):
-        """ BIER end-to-end"""
+        """BIER end-to-end"""
+
+        MRouteItfFlags = VppEnum.vl_api_mfib_itf_flags_t
+        MRouteEntryFlags = VppEnum.vl_api_mfib_entry_flags_t
 
         #
         # Add a BIER table for sub-domain 0, set 0, and BSL 256
@@ -492,10 +657,10 @@ class TestBier(VppTestCase):
         bt = VppBierTable(self, bti, 77)
         bt.add_vpp_config()
 
-        lowest = ['\0'] * (n_bytes)
-        lowest[-1] = chr(1)
-        highest = ['\0'] * (n_bytes)
-        highest[0] = chr(128)
+        lowest = [b"\0"] * (n_bytes)
+        lowest[-1] = scapy.compat.chb(1)
+        highest = [b"\0"] * (n_bytes)
+        highest[0] = scapy.compat.chb(128)
 
         #
         # Impostion Sets bit strings
@@ -511,26 +676,42 @@ class TestBier(VppTestCase):
         route_ing_232_1_1_1 = VppIpMRoute(
             self,
             "0.0.0.0",
-            "232.1.1.1", 32,
-            MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
-            paths=[VppMRoutePath(self.pg0.sw_if_index,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_ACCEPT),
-                   VppMRoutePath(0xffffffff,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_FORWARD,
-                                 proto=DpoProto.DPO_PROTO_BIER,
-                                 bier_imp=bi_low.bi_index)])
+            "232.1.1.1",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
+            paths=[
+                VppMRoutePath(
+                    self.pg0.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_ACCEPT
+                ),
+                VppMRoutePath(
+                    0xFFFFFFFF,
+                    MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD,
+                    proto=FibPathProto.FIB_PATH_NH_PROTO_BIER,
+                    type=FibPathType.FIB_PATH_TYPE_BIER_IMP,
+                    bier_imp=bi_low.bi_index,
+                ),
+            ],
+        )
         route_ing_232_1_1_1.add_vpp_config()
         route_ing_232_1_1_2 = VppIpMRoute(
             self,
             "0.0.0.0",
-            "232.1.1.2", 32,
-            MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
-            paths=[VppMRoutePath(self.pg0.sw_if_index,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_ACCEPT),
-                   VppMRoutePath(0xffffffff,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_FORWARD,
-                                 proto=DpoProto.DPO_PROTO_BIER,
-                                 bier_imp=bi_high.bi_index)])
+            "232.1.1.2",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
+            paths=[
+                VppMRoutePath(
+                    self.pg0.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_ACCEPT
+                ),
+                VppMRoutePath(
+                    0xFFFFFFFF,
+                    MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD,
+                    proto=FibPathProto.FIB_PATH_NH_PROTO_BIER,
+                    type=FibPathType.FIB_PATH_TYPE_BIER_IMP,
+                    bier_imp=bi_high.bi_index,
+                ),
+            ],
+        )
         route_ing_232_1_1_2.add_vpp_config()
 
         #
@@ -544,31 +725,59 @@ class TestBier(VppTestCase):
         # disp table 8.
         #
         bier_route_1 = VppBierRoute(
-            self, bti, 1,
-            [VppRoutePath("0.0.0.0",
-                          0xffffffff,
-                          proto=DpoProto.DPO_PROTO_BIER,
-                          nh_table_id=8)])
+            self,
+            bti,
+            1,
+            [
+                VppRoutePath(
+                    "0.0.0.0",
+                    0xFFFFFFFF,
+                    proto=FibPathProto.FIB_PATH_NH_PROTO_BIER,
+                    nh_table_id=8,
+                )
+            ],
+        )
         bier_route_1.add_vpp_config()
-        bier_route_max = VppBierRoute(self, bti, max_bp,
-                                      [VppRoutePath("0.0.0.0",
-                                                    0xffffffff,
-                                                    nh_table_id=8)])
+        bier_route_max = VppBierRoute(
+            self,
+            bti,
+            max_bp,
+            [
+                VppRoutePath(
+                    "0.0.0.0",
+                    0xFFFFFFFF,
+                    proto=FibPathProto.FIB_PATH_NH_PROTO_BIER,
+                    nh_table_id=8,
+                )
+            ],
+        )
         bier_route_max.add_vpp_config()
 
         #
         # An entry in the disposition table for sender 333
         #  lookup in VRF 10
         #
-        bier_de_1 = VppBierDispEntry(self, bdt.id, 333,
-                                     BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
-                                     DpoProto.DPO_PROTO_BIER,
-                                     "0.0.0.0", 10, rpf_id=8192)
+        bier_de_1 = VppBierDispEntry(
+            self,
+            bdt.id,
+            333,
+            BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
+            FibPathProto.FIB_PATH_NH_PROTO_BIER,
+            "0.0.0.0",
+            10,
+            rpf_id=8192,
+        )
         bier_de_1.add_vpp_config()
-        bier_de_1 = VppBierDispEntry(self, bdt.id, 334,
-                                     BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
-                                     DpoProto.DPO_PROTO_BIER,
-                                     "0.0.0.0", 10, rpf_id=8193)
+        bier_de_1 = VppBierDispEntry(
+            self,
+            bdt.id,
+            334,
+            BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
+            FibPathProto.FIB_PATH_NH_PROTO_BIER,
+            "0.0.0.0",
+            10,
+            rpf_id=8193,
+        )
         bier_de_1.add_vpp_config()
 
         #
@@ -578,21 +787,31 @@ class TestBier(VppTestCase):
         route_eg_232_1_1_1 = VppIpMRoute(
             self,
             "0.0.0.0",
-            "232.1.1.1", 32,
-            MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
+            "232.1.1.1",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
             table_id=10,
-            paths=[VppMRoutePath(self.pg1.sw_if_index,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_FORWARD)])
+            paths=[
+                VppMRoutePath(
+                    self.pg1.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD
+                )
+            ],
+        )
         route_eg_232_1_1_1.add_vpp_config()
         route_eg_232_1_1_1.update_rpf_id(8192)
         route_eg_232_1_1_2 = VppIpMRoute(
             self,
             "0.0.0.0",
-            "232.1.1.2", 32,
-            MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
+            "232.1.1.2",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
             table_id=10,
-            paths=[VppMRoutePath(self.pg1.sw_if_index,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_FORWARD)])
+            paths=[
+                VppMRoutePath(
+                    self.pg1.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD
+                )
+            ],
+        )
         route_eg_232_1_1_2.add_vpp_config()
         route_eg_232_1_1_2.update_rpf_id(8193)
 
@@ -601,54 +820,59 @@ class TestBier(VppTestCase):
         # replicated, then hit the disposition and be forwarded
         # out of VRF 10, i.e. on pg1
         #
-        p = (Ether(dst=self.pg0.local_mac,
-                   src=self.pg0.remote_mac) /
-             IP(src="1.1.1.1", dst="232.1.1.1") /
-             UDP(sport=1234, dport=1234) /
-             Raw(chr(5) * 32))
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / IP(src="1.1.1.1", dst="232.1.1.1")
+            / UDP(sport=1234, dport=1234)
+            / Raw(scapy.compat.chb(5) * 32)
+        )
 
-        rx = self.send_and_expect(self.pg0, p*65, self.pg1)
+        rx = self.send_and_expect(self.pg0, p * NUM_PKTS, self.pg1)
 
         self.assertEqual(rx[0][IP].src, "1.1.1.1")
         self.assertEqual(rx[0][IP].dst, "232.1.1.1")
 
-        p = (Ether(dst=self.pg0.local_mac,
-                   src=self.pg0.remote_mac) /
-             IP(src="1.1.1.1", dst="232.1.1.2") /
-             UDP(sport=1234, dport=1234) /
-             Raw(chr(5) * 512))
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / IP(src="1.1.1.1", dst="232.1.1.2")
+            / UDP(sport=1234, dport=1234)
+            / Raw(scapy.compat.chb(5) * 512)
+        )
 
-        rx = self.send_and_expect(self.pg0, p*65, self.pg1)
+        rx = self.send_and_expect(self.pg0, p * NUM_PKTS, self.pg1)
         self.assertEqual(rx[0][IP].src, "1.1.1.1")
         self.assertEqual(rx[0][IP].dst, "232.1.1.2")
 
-    @unittest.skipUnless(running_extended_tests(), "part of extended tests")
+    @unittest.skipUnless(config.extended, "part of extended tests")
     def test_bier_e2e_1024(self):
-        """ BIER end-to-end BSL:1024"""
+        """BIER end-to-end BSL:1024"""
         self.bier_e2e(BIERLength.BIER_LEN_1024, 128, 1024)
 
-    @unittest.skipUnless(running_extended_tests(), "part of extended tests")
+    @unittest.skipUnless(config.extended, "part of extended tests")
     def test_bier_e2e_512(self):
-        """ BIER end-to-end BSL:512"""
+        """BIER end-to-end BSL:512"""
         self.bier_e2e(BIERLength.BIER_LEN_512, 64, 512)
 
-    @unittest.skipUnless(running_extended_tests(), "part of extended tests")
+    @unittest.skipUnless(config.extended, "part of extended tests")
     def test_bier_e2e_256(self):
-        """ BIER end-to-end BSL:256"""
+        """BIER end-to-end BSL:256"""
         self.bier_e2e(BIERLength.BIER_LEN_256, 32, 256)
 
-    @unittest.skipUnless(running_extended_tests(), "part of extended tests")
+    @unittest.skipUnless(config.extended, "part of extended tests")
     def test_bier_e2e_128(self):
-        """ BIER end-to-end BSL:128"""
+        """BIER end-to-end BSL:128"""
         self.bier_e2e(BIERLength.BIER_LEN_128, 16, 128)
 
     def test_bier_e2e_64(self):
-        """ BIER end-to-end BSL:64"""
+        """BIER end-to-end BSL:64"""
         self.bier_e2e(BIERLength.BIER_LEN_64, 8, 64)
 
     def test_bier_head_o_udp(self):
         """BIER head over UDP"""
 
+        MRouteItfFlags = VppEnum.vl_api_mfib_itf_flags_t
+        MRouteEntryFlags = VppEnum.vl_api_mfib_entry_flags_t
+
         #
         # Add a BIER table for sub-domain 1, set 0, and BSL 256
         #
@@ -660,24 +884,36 @@ class TestBier(VppTestCase):
         # 1 bit positions via 1 next hops
         #
         nh1 = "10.0.0.1"
-        ip_route = VppIpRoute(self, nh1, 32,
-                              [VppRoutePath(self.pg1.remote_ip4,
-                                            self.pg1.sw_if_index,
-                                            labels=[VppMplsLabel(2001)])])
+        ip_route = VppIpRoute(
+            self,
+            nh1,
+            32,
+            [
+                VppRoutePath(
+                    self.pg1.remote_ip4,
+                    self.pg1.sw_if_index,
+                    labels=[VppMplsLabel(2001)],
+                )
+            ],
+        )
         ip_route.add_vpp_config()
 
-        udp_encap = VppUdpEncap(self,
-                                self.pg0.local_ip4,
-                                nh1,
-                                330, 8138)
+        udp_encap = VppUdpEncap(self, self.pg0.local_ip4, nh1, 330, 8138)
         udp_encap.add_vpp_config()
 
         bier_route = VppBierRoute(
-            self, bti, 1,
-            [VppRoutePath("0.0.0.0",
-                          0xFFFFFFFF,
-                          is_udp_encap=1,
-                          next_hop_id=udp_encap.id)])
+            self,
+            bti,
+            1,
+            [
+                VppRoutePath(
+                    "0.0.0.0",
+                    0xFFFFFFFF,
+                    type=FibPathType.FIB_PATH_TYPE_UDP_ENCAP,
+                    next_hop_id=udp_encap.id,
+                )
+            ],
+        )
         bier_route.add_vpp_config()
 
         #
@@ -685,9 +921,9 @@ class TestBier(VppTestCase):
         # only use the second, but creating 2 tests with a non-zero
         # value index in the route add
         #
-        bi = VppBierImp(self, bti, 333, chr(0xff) * 32)
+        bi = VppBierImp(self, bti, 333, scapy.compat.chb(0xFF) * 32)
         bi.add_vpp_config()
-        bi2 = VppBierImp(self, bti, 334, chr(0xff) * 32)
+        bi2 = VppBierImp(self, bti, 334, scapy.compat.chb(0xFF) * 32)
         bi2.add_vpp_config()
 
         #
@@ -696,23 +932,32 @@ class TestBier(VppTestCase):
         route_ing_232_1_1_1 = VppIpMRoute(
             self,
             "0.0.0.0",
-            "232.1.1.1", 32,
-            MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
-            paths=[VppMRoutePath(self.pg0.sw_if_index,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_ACCEPT),
-                   VppMRoutePath(0xffffffff,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_FORWARD,
-                                 proto=DpoProto.DPO_PROTO_BIER,
-                                 bier_imp=bi2.bi_index)])
+            "232.1.1.1",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
+            paths=[
+                VppMRoutePath(
+                    self.pg0.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_ACCEPT
+                ),
+                VppMRoutePath(
+                    0xFFFFFFFF,
+                    MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD,
+                    proto=FibPathProto.FIB_PATH_NH_PROTO_BIER,
+                    type=FibPathType.FIB_PATH_TYPE_BIER_IMP,
+                    bier_imp=bi2.bi_index,
+                ),
+            ],
+        )
         route_ing_232_1_1_1.add_vpp_config()
 
         #
         # inject a packet an IP. We expect it to be BIER and UDP encapped,
         #
-        p = (Ether(dst=self.pg0.local_mac,
-                   src=self.pg0.remote_mac) /
-             IP(src="1.1.1.1", dst="232.1.1.1") /
-             UDP(sport=1234, dport=1234))
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / IP(src="1.1.1.1", dst="232.1.1.1")
+            / UDP(sport=1234, dport=1234)
+        )
 
         self.pg0.add_stream([p])
         self.pg_enable_capture(self.pg_interfaces)
@@ -736,6 +981,9 @@ class TestBier(VppTestCase):
     def test_bier_tail_o_udp(self):
         """BIER Tail over UDP"""
 
+        MRouteItfFlags = VppEnum.vl_api_mfib_itf_flags_t
+        MRouteEntryFlags = VppEnum.vl_api_mfib_entry_flags_t
+
         #
         # Add a BIER table for sub-domain 0, set 0, and BSL 256
         #
@@ -753,20 +1001,33 @@ class TestBier(VppTestCase):
         # BIER route in table that's for-us
         #
         bier_route_1 = VppBierRoute(
-            self, bti, 1,
-            [VppRoutePath("0.0.0.0",
-                          0xffffffff,
-                          proto=DpoProto.DPO_PROTO_BIER,
-                          nh_table_id=8)])
+            self,
+            bti,
+            1,
+            [
+                VppRoutePath(
+                    "0.0.0.0",
+                    0xFFFFFFFF,
+                    proto=FibPathProto.FIB_PATH_NH_PROTO_BIER,
+                    nh_table_id=8,
+                )
+            ],
+        )
         bier_route_1.add_vpp_config()
 
         #
         # An entry in the disposition table
         #
-        bier_de_1 = VppBierDispEntry(self, bdt.id, 99,
-                                     BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
-                                     DpoProto.DPO_PROTO_BIER,
-                                     "0.0.0.0", 0, rpf_id=8192)
+        bier_de_1 = VppBierDispEntry(
+            self,
+            bdt.id,
+            99,
+            BIER_HDR_PAYLOAD.BIER_HDR_PROTO_IPV4,
+            FibPathProto.FIB_PATH_NH_PROTO_BIER,
+            "0.0.0.0",
+            0,
+            rpf_id=8192,
+        )
         bier_de_1.add_vpp_config()
 
         #
@@ -775,29 +1036,38 @@ class TestBier(VppTestCase):
         route_eg_232_1_1_1 = VppIpMRoute(
             self,
             "0.0.0.0",
-            "232.1.1.1", 32,
-            MRouteEntryFlags.MFIB_ENTRY_FLAG_NONE,
-            paths=[VppMRoutePath(self.pg1.sw_if_index,
-                                 MRouteItfFlags.MFIB_ITF_FLAG_FORWARD)])
+            "232.1.1.1",
+            32,
+            MRouteEntryFlags.MFIB_API_ENTRY_FLAG_NONE,
+            paths=[
+                VppMRoutePath(
+                    self.pg1.sw_if_index, MRouteItfFlags.MFIB_API_ITF_FLAG_FORWARD
+                )
+            ],
+        )
         route_eg_232_1_1_1.add_vpp_config()
         route_eg_232_1_1_1.update_rpf_id(8192)
 
         #
         # A packet with all bits set gets spat out to BP:1
         #
-        p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
-             IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4) /
-             UDP(sport=333, dport=8138) /
-             BIFT(sd=1, set=0, bsl=2, ttl=255) /
-             BIER(length=BIERLength.BIER_LEN_256,
-                  BitString=chr(255)*32,
-                  BFRID=99) /
-             IP(src="1.1.1.1", dst="232.1.1.1") /
-             UDP(sport=1234, dport=1234) /
-             Raw())
+        p = (
+            Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
+            / IP(src=self.pg0.remote_ip4, dst=self.pg0.local_ip4)
+            / UDP(sport=333, dport=8138)
+            / BIFT(sd=1, set=0, bsl=2, ttl=255)
+            / BIER(
+                length=BIERLength.BIER_LEN_256,
+                BitString=scapy.compat.chb(255) * 32,
+                BFRID=99,
+            )
+            / IP(src="1.1.1.1", dst="232.1.1.1")
+            / UDP(sport=1234, dport=1234)
+            / Raw()
+        )
 
         rx = self.send_and_expect(self.pg0, [p], self.pg1)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main(testRunner=VppTestRunner)