api: Cleanup APIs interface.api
[vpp.git] / test / test_nat.py
index e0e50c0..a64b570 100644 (file)
@@ -23,9 +23,11 @@ from util import ip4_range
 from vpp_papi import mac_pton
 from syslog_rfc5424_parser import SyslogMessage, ParseError
 from syslog_rfc5424_parser.constants import SyslogFacility, SyslogSeverity
-from vpp_papi_provider import SYSLOG_SEVERITY
 from io import BytesIO
 from vpp_papi import VppEnum
+from vpp_ip_route import VppIpRoute, VppRoutePath, FibPathType
+from vpp_neighbor import VppNeighbor
+from vpp_ip import VppIpAddress, VppIpPrefix
 from scapy.all import bind_layers, Packet, ByteEnumField, ShortField, \
     IPField, IntField, LongField, XByteField, FlagsField, FieldLenField, \
     PacketListField
@@ -75,34 +77,15 @@ class MethodHolder(VppTestCase):
     def config_flags(self):
         return VppEnum.vl_api_nat_config_flags_t
 
+    @property
+    def SYSLOG_SEVERITY(self):
+        return VppEnum.vl_api_syslog_severity_t
+
     def clear_nat44(self):
         """
         Clear NAT44 configuration.
         """
         if hasattr(self, 'pg7') and hasattr(self, 'pg8'):
-            # I found no elegant way to do this
-            self.vapi.ip_add_del_route(
-                dst_address=self.pg7.remote_ip4n,
-                dst_address_length=32,
-                next_hop_address=self.pg7.remote_ip4n,
-                next_hop_sw_if_index=self.pg7.sw_if_index,
-                is_add=0)
-            self.vapi.ip_add_del_route(
-                dst_address=self.pg8.remote_ip4n,
-                dst_address_length=32,
-                next_hop_address=self.pg8.remote_ip4n,
-                next_hop_sw_if_index=self.pg8.sw_if_index,
-                is_add=0)
-
-            for intf in [self.pg7, self.pg8]:
-                self.vapi.ip_neighbor_add_del(
-                    intf.sw_if_index,
-                    intf.remote_mac,
-                    intf.remote_ip4,
-                    flags=(VppEnum.vl_api_ip_neighbor_flags_t.
-                           IP_API_NEIGHBOR_FLAG_STATIC),
-                    is_add=0)
-
             if self.pg7.has_ip4_config:
                 self.pg7.unconfig_ip4()
 
@@ -121,7 +104,8 @@ class MethodHolder(VppTestCase):
         self.ipfix_src_port = 4739
         self.ipfix_domain_id = 1
 
-        self.vapi.syslog_set_filter(SYSLOG_SEVERITY.EMERG)
+        self.vapi.syslog_set_filter(
+            self.SYSLOG_SEVERITY.SYSLOG_API_SEVERITY_EMERG)
 
         self.vapi.nat_ha_set_listener(ip_address='0.0.0.0', port=0,
                                       path_mtu=512)
@@ -1521,16 +1505,16 @@ class TestNAT44(MethodHolder):
             cls.vapi.ip_table_add_del(is_add=1, table_id=10)
             cls.vapi.ip_table_add_del(is_add=1, table_id=20)
 
-            cls.pg4._local_ip4 = "172.16.255.1"
-            cls.pg4._local_ip4n = socket.inet_pton(socket.AF_INET, i.local_ip4)
+            cls.pg4._local_ip4 = VppIpPrefix("172.16.255.1",
+                                             cls.pg4.local_ip4_prefix.len)
             cls.pg4._remote_hosts[0]._ip4 = "172.16.255.2"
             cls.pg4.set_table_ip4(10)
-            cls.pg5._local_ip4 = "172.17.255.3"
-            cls.pg5._local_ip4n = socket.inet_pton(socket.AF_INET, i.local_ip4)
+            cls.pg5._local_ip4 = VppIpPrefix("172.17.255.3",
+                                             cls.pg5.local_ip4_prefix.len)
             cls.pg5._remote_hosts[0]._ip4 = "172.17.255.4"
             cls.pg5.set_table_ip4(10)
-            cls.pg6._local_ip4 = "172.16.255.1"
-            cls.pg6._local_ip4n = socket.inet_pton(socket.AF_INET, i.local_ip4)
+            cls.pg6._local_ip4 = VppIpPrefix("172.16.255.1",
+                                             cls.pg6.local_ip4_prefix.len)
             cls.pg6._remote_hosts[0]._ip4 = "172.16.255.2"
             cls.pg6.set_table_ip4(20)
             for i in cls.overlapping_interfaces:
@@ -1543,10 +1527,10 @@ class TestNAT44(MethodHolder):
 
             cls.pg9.generate_remote_hosts(2)
             cls.pg9.config_ip4()
-            ip_addr_n = socket.inet_pton(socket.AF_INET, "10.0.0.1")
             cls.vapi.sw_interface_add_del_address(
-                sw_if_index=cls.pg9.sw_if_index, address=ip_addr_n,
-                address_length=24)
+                sw_if_index=cls.pg9.sw_if_index,
+                prefix=VppIpPrefix("10.0.0.1", 24).encode())
+
             cls.pg9.admin_up()
             cls.pg9.resolve_arp()
             cls.pg9._remote_hosts[1]._ip4 = cls.pg9._remote_hosts[0]._ip4
@@ -1573,13 +1557,13 @@ class TestNAT44(MethodHolder):
             is_add=1)
 
         # in2out
-        tcpn = self.statistics.get_counter(
+        tcpn = self.statistics.get_err_counter(
             '/err/nat44-in2out-slowpath/TCP packets')
-        udpn = self.statistics.get_counter(
+        udpn = self.statistics.get_err_counter(
             '/err/nat44-in2out-slowpath/UDP packets')
-        icmpn = self.statistics.get_counter(
+        icmpn = self.statistics.get_err_counter(
             '/err/nat44-in2out-slowpath/ICMP packets')
-        totaln = self.statistics.get_counter(
+        totaln = self.statistics.get_err_counter(
             '/err/nat44-in2out-slowpath/good in2out packets processed')
 
         pkts = self.create_stream_in(self.pg0, self.pg1)
@@ -1589,24 +1573,25 @@ class TestNAT44(MethodHolder):
         capture = self.pg1.get_capture(len(pkts))
         self.verify_capture_out(capture)
 
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-in2out-slowpath/TCP packets')
         self.assertEqual(err - tcpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-in2out-slowpath/UDP packets')
         self.assertEqual(err - udpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-in2out-slowpath/ICMP packets')
         self.assertEqual(err - icmpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-in2out-slowpath/good in2out packets processed')
         self.assertEqual(err - totaln, 3)
 
         # out2in
-        tcpn = self.statistics.get_counter('/err/nat44-out2in/TCP packets')
-        udpn = self.statistics.get_counter('/err/nat44-out2in/UDP packets')
-        icmpn = self.statistics.get_counter('/err/nat44-out2in/ICMP packets')
-        totaln = self.statistics.get_counter(
+        tcpn = self.statistics.get_err_counter('/err/nat44-out2in/TCP packets')
+        udpn = self.statistics.get_err_counter('/err/nat44-out2in/UDP packets')
+        icmpn = self.statistics.get_err_counter(
+            '/err/nat44-out2in/ICMP packets')
+        totaln = self.statistics.get_err_counter(
             '/err/nat44-out2in/good out2in packets processed')
 
         pkts = self.create_stream_out(self.pg1)
@@ -1616,13 +1601,13 @@ class TestNAT44(MethodHolder):
         capture = self.pg0.get_capture(len(pkts))
         self.verify_capture_in(capture, self.pg0)
 
-        err = self.statistics.get_counter('/err/nat44-out2in/TCP packets')
+        err = self.statistics.get_err_counter('/err/nat44-out2in/TCP packets')
         self.assertEqual(err - tcpn, 1)
-        err = self.statistics.get_counter('/err/nat44-out2in/UDP packets')
+        err = self.statistics.get_err_counter('/err/nat44-out2in/UDP packets')
         self.assertEqual(err - udpn, 1)
-        err = self.statistics.get_counter('/err/nat44-out2in/ICMP packets')
+        err = self.statistics.get_err_counter('/err/nat44-out2in/ICMP packets')
         self.assertEqual(err - icmpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-out2in/good out2in packets processed')
         self.assertEqual(err - totaln, 3)
 
@@ -2834,7 +2819,7 @@ class TestNAT44(MethodHolder):
         capture = self.pg1.get_capture(len(pkts))
         self.verify_capture_out(capture)
         self.nat44_add_address(self.nat_addr, is_add=0)
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(9)
         ipfix = IPFIXDecoder()
         # first load template
@@ -2879,7 +2864,7 @@ class TestNAT44(MethodHolder):
         self.pg_start()
         self.pg1.assert_nothing_captured()
         sleep(1)
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(9)
         ipfix = IPFIXDecoder()
         # first load template
@@ -2942,7 +2927,7 @@ class TestNAT44(MethodHolder):
         self.pg_start()
         self.pg1.assert_nothing_captured()
         sleep(1)
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(9)
         ipfix = IPFIXDecoder()
         # first load template
@@ -2964,7 +2949,8 @@ class TestNAT44(MethodHolder):
 
     def test_syslog_apmap(self):
         """ Test syslog address and port mapping creation and deletion """
-        self.vapi.syslog_set_filter(SYSLOG_SEVERITY.INFO)
+        self.vapi.syslog_set_filter(
+            self.SYSLOG_SEVERITY.SYSLOG_API_SEVERITY_INFO)
         self.vapi.syslog_set_sender(self.pg3.local_ip4n, self.pg3.remote_ip4n)
         self.nat44_add_address(self.nat_addr)
         flags = self.config_flags.NAT_IS_INSIDE
@@ -3153,31 +3139,32 @@ class TestNAT44(MethodHolder):
         capture = self.pg2.get_capture(len(pkts))
         self.verify_capture_out(capture, nat_ip1)
 
+    def create_routes_and_neigbors(self):
+        r1 = VppIpRoute(self, self.pg7.remote_ip4, 32,
+                        [VppRoutePath(self.pg7.remote_ip4,
+                                      self.pg7.sw_if_index)])
+        r2 = VppIpRoute(self, self.pg8.remote_ip4, 32,
+                        [VppRoutePath(self.pg8.remote_ip4,
+                                      self.pg8.sw_if_index)])
+        r1.add_vpp_config()
+        r2.add_vpp_config()
+
+        n1 = VppNeighbor(self,
+                         self.pg7.sw_if_index,
+                         self.pg7.remote_mac,
+                         self.pg7.remote_ip4,
+                         is_static=1)
+        n2 = VppNeighbor(self,
+                         self.pg8.sw_if_index,
+                         self.pg8.remote_mac,
+                         self.pg8.remote_ip4,
+                         is_static=1)
+        n1.add_vpp_config()
+        n2.add_vpp_config()
+
     def test_dynamic_ipless_interfaces(self):
         """ NAT44 interfaces without configured IP address """
-
-        self.vapi.ip_neighbor_add_del(
-            self.pg7.sw_if_index,
-            self.pg7.remote_mac,
-            self.pg7.remote_ip4,
-            flags=(VppEnum.vl_api_ip_neighbor_flags_t.
-                   IP_API_NEIGHBOR_FLAG_STATIC))
-        self.vapi.ip_neighbor_add_del(
-            self.pg8.sw_if_index,
-            self.pg8.remote_mac,
-            self.pg8.remote_ip4,
-            flags=(VppEnum.vl_api_ip_neighbor_flags_t.
-                   IP_API_NEIGHBOR_FLAG_STATIC))
-
-        self.vapi.ip_add_del_route(dst_address=self.pg7.remote_ip4n,
-                                   dst_address_length=32,
-                                   next_hop_address=self.pg7.remote_ip4n,
-                                   next_hop_sw_if_index=self.pg7.sw_if_index)
-        self.vapi.ip_add_del_route(dst_address=self.pg8.remote_ip4n,
-                                   dst_address_length=32,
-                                   next_hop_address=self.pg8.remote_ip4n,
-                                   next_hop_sw_if_index=self.pg8.sw_if_index)
-
+        self.create_routes_and_neigbors()
         self.nat44_add_address(self.nat_addr)
         flags = self.config_flags.NAT_IS_INSIDE
         self.vapi.nat44_interface_add_del_feature(
@@ -3206,28 +3193,7 @@ class TestNAT44(MethodHolder):
     def test_static_ipless_interfaces(self):
         """ NAT44 interfaces without configured IP address - 1:1 NAT """
 
-        self.vapi.ip_neighbor_add_del(
-            self.pg7.sw_if_index,
-            self.pg7.remote_mac,
-            self.pg7.remote_ip4,
-            flags=(VppEnum.vl_api_ip_neighbor_flags_t.
-                   IP_API_NEIGHBOR_FLAG_STATIC))
-        self.vapi.ip_neighbor_add_del(
-            self.pg8.sw_if_index,
-            self.pg8.remote_mac,
-            self.pg8.remote_ip4,
-            flags=(VppEnum.vl_api_ip_neighbor_flags_t.
-                   IP_API_NEIGHBOR_FLAG_STATIC))
-
-        self.vapi.ip_add_del_route(dst_address=self.pg7.remote_ip4n,
-                                   dst_address_length=32,
-                                   next_hop_address=self.pg7.remote_ip4n,
-                                   next_hop_sw_if_index=self.pg7.sw_if_index)
-        self.vapi.ip_add_del_route(dst_address=self.pg8.remote_ip4n,
-                                   dst_address_length=32,
-                                   next_hop_address=self.pg8.remote_ip4n,
-                                   next_hop_sw_if_index=self.pg8.sw_if_index)
-
+        self.create_routes_and_neigbors()
         self.nat44_add_static_mapping(self.pg7.remote_ip4, self.nat_addr)
         flags = self.config_flags.NAT_IS_INSIDE
         self.vapi.nat44_interface_add_del_feature(
@@ -3260,28 +3226,7 @@ class TestNAT44(MethodHolder):
         self.udp_port_out = 30607
         self.icmp_id_out = 30608
 
-        self.vapi.ip_neighbor_add_del(
-            self.pg7.sw_if_index,
-            self.pg7.remote_mac,
-            self.pg7.remote_ip4,
-            flags=(VppEnum.vl_api_ip_neighbor_flags_t.
-                   IP_API_NEIGHBOR_FLAG_STATIC))
-        self.vapi.ip_neighbor_add_del(
-            self.pg8.sw_if_index,
-            self.pg8.remote_mac,
-            self.pg8.remote_ip4,
-            flags=(VppEnum.vl_api_ip_neighbor_flags_t.
-                   IP_API_NEIGHBOR_FLAG_STATIC))
-
-        self.vapi.ip_add_del_route(dst_address=self.pg7.remote_ip4n,
-                                   dst_address_length=32,
-                                   next_hop_address=self.pg7.remote_ip4n,
-                                   next_hop_sw_if_index=self.pg7.sw_if_index)
-        self.vapi.ip_add_del_route(dst_address=self.pg8.remote_ip4n,
-                                   dst_address_length=32,
-                                   next_hop_address=self.pg8.remote_ip4n,
-                                   next_hop_sw_if_index=self.pg8.sw_if_index)
-
+        self.create_routes_and_neigbors()
         self.nat44_add_address(self.nat_addr)
         self.nat44_add_static_mapping(self.pg7.remote_ip4, self.nat_addr,
                                       self.tcp_port_in, self.tcp_port_out,
@@ -3470,16 +3415,16 @@ class TestNAT44(MethodHolder):
         nat_ip_vrf10 = "10.0.0.10"
         nat_ip_vrf20 = "10.0.0.20"
 
-        self.vapi.ip_add_del_route(dst_address=self.pg3.remote_ip4n,
-                                   dst_address_length=32,
-                                   next_hop_address=self.pg3.remote_ip4n,
-                                   next_hop_sw_if_index=self.pg3.sw_if_index,
-                                   table_id=10)
-        self.vapi.ip_add_del_route(dst_address=self.pg3.remote_ip4n,
-                                   dst_address_length=32,
-                                   next_hop_address=self.pg3.remote_ip4n,
-                                   next_hop_sw_if_index=self.pg3.sw_if_index,
-                                   table_id=20)
+        r1 = VppIpRoute(self, self.pg3.remote_ip4, 32,
+                        [VppRoutePath(self.pg3.remote_ip4,
+                                      self.pg3.sw_if_index)],
+                        table_id=10)
+        r2 = VppIpRoute(self, self.pg3.remote_ip4, 32,
+                        [VppRoutePath(self.pg3.remote_ip4,
+                                      self.pg3.sw_if_index)],
+                        table_id=20)
+        r1.add_vpp_config()
+        r2.add_vpp_config()
 
         self.nat44_add_address(nat_ip_vrf10, vrf_id=10)
         self.nat44_add_address(nat_ip_vrf20, vrf_id=20)
@@ -3650,9 +3595,11 @@ class TestNAT44(MethodHolder):
             self.logger.error(ppp("Unexpected or invalid packet:", p))
             raise
 
-        err = self.statistics.get_counter('/err/nat44-classify/next in2out')
+        err = self.statistics.get_err_counter(
+            '/err/nat44-classify/next in2out')
         self.assertEqual(err, 1)
-        err = self.statistics.get_counter('/err/nat44-classify/next out2in')
+        err = self.statistics.get_err_counter(
+            '/err/nat44-classify/next out2in')
         self.assertEqual(err, 1)
 
     def test_del_session(self):
@@ -3724,10 +3671,22 @@ class TestNAT44(MethodHolder):
             sw_if_index=self.pg1.sw_if_index,
             is_add=1)
 
+        reas_cfg1 = self.vapi.nat_get_reass()
+        # this test was intermittently failing in some cases
+        # until we temporarily bump the reassembly timeouts
+        self.vapi.nat_set_reass(timeout=20, max_reass=1024, max_frag=5,
+                                drop_frag=0)
+
         self.frag_in_order(proto=IP_PROTOS.tcp)
         self.frag_in_order(proto=IP_PROTOS.udp)
         self.frag_in_order(proto=IP_PROTOS.icmp)
 
+        # restore the reassembly timeouts
+        self.vapi.nat_set_reass(timeout=reas_cfg1.ip4_timeout,
+                                max_reass=reas_cfg1.ip4_max_reass,
+                                max_frag=reas_cfg1.ip4_max_frag,
+                                drop_frag=reas_cfg1.ip4_drop_frag)
+
     def test_frag_forwarding(self):
         """ NAT44 forwarding fragment test """
         self.vapi.nat44_add_del_interface_addr(
@@ -3905,7 +3864,7 @@ class TestNAT44(MethodHolder):
         self.pg_start()
         self.pg1.assert_nothing_captured()
         sleep(1)
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(9)
         ipfix = IPFIXDecoder()
         # first load template
@@ -3990,6 +3949,7 @@ class TestNAT44(MethodHolder):
             self.verify_capture_in(capture, self.pg0)
 
         finally:
+            self.nat44_add_address(self.nat_addr, is_add=0)
             self.pg1.unconfig_ip4()
             self.pg2.unconfig_ip4()
             self.pg1.set_table_ip4(0)
@@ -4343,7 +4303,7 @@ class TestNAT44(MethodHolder):
         stats = self.statistics.get_counter('/nat44/ha/del-event-recv')
         self.assertEqual(stats[0][0], 1)
 
-        stats = self.statistics.get_counter('/err/nat-ha/pkts-processed')
+        stats = self.statistics.get_err_counter('/err/nat-ha/pkts-processed')
         self.assertEqual(stats, 2)
 
         # send HA session refresh event to failover/passive
@@ -4387,7 +4347,7 @@ class TestNAT44(MethodHolder):
         stats = self.statistics.get_counter('/nat44/ha/refresh-event-recv')
         self.assertEqual(stats[0][0], 1)
 
-        stats = self.statistics.get_counter('/err/nat-ha/pkts-processed')
+        stats = self.statistics.get_err_counter('/err/nat-ha/pkts-processed')
         self.assertEqual(stats, 3)
 
         # send packet to test session created by HA
@@ -4469,10 +4429,10 @@ class TestNAT44EndpointDependent(MethodHolder):
 
             cls.pg4.generate_remote_hosts(2)
             cls.pg4.config_ip4()
-            ip_addr_n = socket.inet_pton(socket.AF_INET, "10.0.0.1")
             cls.vapi.sw_interface_add_del_address(
-                sw_if_index=cls.pg4.sw_if_index, address=ip_addr_n,
-                address_length=24)
+                sw_if_index=cls.pg4.sw_if_index,
+                prefix=VppIpPrefix("10.0.0.1", 24).encode())
+
             cls.pg4.admin_up()
             cls.pg4.resolve_arp()
             cls.pg4._remote_hosts[1]._ip4 = cls.pg4._remote_hosts[0]._ip4
@@ -4481,49 +4441,54 @@ class TestNAT44EndpointDependent(MethodHolder):
             zero_ip4n = socket.inet_pton(socket.AF_INET, "0.0.0.0")
             cls.vapi.ip_table_add_del(is_add=1, table_id=1)
 
-            cls.pg5._local_ip4 = "10.1.1.1"
-            cls.pg5._local_ip4n = socket.inet_pton(socket.AF_INET,
-                                                   cls.pg5.local_ip4)
+            cls.pg5._local_ip4 = VppIpPrefix("10.1.1.1",
+                                             cls.pg5.local_ip4_prefix.len)
             cls.pg5._remote_hosts[0]._ip4 = "10.1.1.2"
             cls.pg5._remote_hosts[0]._ip4n = socket.inet_pton(
                 socket.AF_INET, cls.pg5.remote_ip4)
             cls.pg5.set_table_ip4(1)
             cls.pg5.config_ip4()
             cls.pg5.admin_up()
-            cls.vapi.ip_add_del_route(dst_address=cls.pg5.remote_ip4n,
-                                      dst_address_length=32,
-                                      next_hop_address=zero_ip4n,
-                                      next_hop_sw_if_index=cls.pg5.sw_if_index,
-                                      table_id=1)
-
-            cls.pg6._local_ip4 = "10.1.2.1"
-            cls.pg6._local_ip4n = socket.inet_pton(socket.AF_INET,
-                                                   cls.pg6.local_ip4)
+            r1 = VppIpRoute(cls, cls.pg5.remote_ip4, 32,
+                            [VppRoutePath("0.0.0.0",
+                                          cls.pg5.sw_if_index)],
+                            table_id=1,
+                            register=False)
+            r1.add_vpp_config()
+
+            cls.pg6._local_ip4 = VppIpPrefix("10.1.2.1",
+                                             cls.pg6.local_ip4_prefix.len)
             cls.pg6._remote_hosts[0]._ip4 = "10.1.2.2"
             cls.pg6._remote_hosts[0]._ip4n = socket.inet_pton(
                 socket.AF_INET, cls.pg6.remote_ip4)
             cls.pg6.set_table_ip4(1)
             cls.pg6.config_ip4()
             cls.pg6.admin_up()
-            cls.vapi.ip_add_del_route(dst_address=cls.pg6.remote_ip4n,
-                                      dst_address_length=32,
-                                      next_hop_address=zero_ip4n,
-                                      next_hop_sw_if_index=cls.pg6.sw_if_index,
-                                      table_id=1)
-
-            cls.vapi.ip_add_del_route(dst_address=cls.pg6.remote_ip4n,
-                                      dst_address_length=16,
-                                      next_hop_address=zero_ip4n, table_id=0,
-                                      next_hop_table_id=1)
-            cls.vapi.ip_add_del_route(dst_address=zero_ip4n,
-                                      dst_address_length=0,
-                                      next_hop_address=zero_ip4n, table_id=1,
-                                      next_hop_table_id=0)
-            cls.vapi.ip_add_del_route(dst_address=zero_ip4n,
-                                      dst_address_length=0,
-                                      next_hop_address=cls.pg1.local_ip4n,
-                                      next_hop_sw_if_index=cls.pg1.sw_if_index,
-                                      table_id=0)
+
+            r2 = VppIpRoute(cls, cls.pg6.remote_ip4, 32,
+                            [VppRoutePath("0.0.0.0",
+                                          cls.pg6.sw_if_index)],
+                            table_id=1,
+                            register=False)
+            r3 = VppIpRoute(cls, cls.pg6.remote_ip4, 16,
+                            [VppRoutePath("0.0.0.0",
+                                          0xffffffff,
+                                          nh_table_id=1)],
+                            table_id=0,
+                            register=False)
+            r4 = VppIpRoute(cls, "0.0.0.0", 0,
+                            [VppRoutePath("0.0.0.0", 0xffffffff,
+                                          nh_table_id=0)],
+                            table_id=1,
+                            register=False)
+            r5 = VppIpRoute(cls, "0.0.0.0", 0,
+                            [VppRoutePath(cls.pg1.local_ip4,
+                                          cls.pg1.sw_if_index)],
+                            register=False)
+            r2.add_vpp_config()
+            r3.add_vpp_config()
+            r4.add_vpp_config()
+            r5.add_vpp_config()
 
             cls.pg5.resolve_arp()
             cls.pg6.resolve_arp()
@@ -4560,7 +4525,17 @@ class TestNAT44EndpointDependent(MethodHolder):
             sw_if_index=self.pg1.sw_if_index,
             is_add=1)
         self.vapi.nat44_forwarding_enable_disable(enable=True)
+        reas_cfg1 = self.vapi.nat_get_reass()
+        # this test was intermittently failing in some cases
+        # until we temporarily bump the reassembly timeouts
+        self.vapi.nat_set_reass(timeout=20, max_reass=1024, max_frag=5,
+                                drop_frag=0)
         self.frag_in_order(proto=IP_PROTOS.tcp, dont_translate=True)
+        # restore the reassembly timeouts
+        self.vapi.nat_set_reass(timeout=reas_cfg1.ip4_timeout,
+                                max_reass=reas_cfg1.ip4_max_reass,
+                                max_frag=reas_cfg1.ip4_max_frag,
+                                drop_frag=reas_cfg1.ip4_drop_frag)
 
     def test_frag_out_of_order(self):
         """ NAT44 translate fragments arriving out of order """
@@ -4728,13 +4703,13 @@ class TestNAT44EndpointDependent(MethodHolder):
         self.assertEqual(1, nat_config.endpoint_dependent)
 
         # in2out
-        tcpn = self.statistics.get_counter(
+        tcpn = self.statistics.get_err_counter(
             '/err/nat44-ed-in2out-slowpath/TCP packets')
-        udpn = self.statistics.get_counter(
+        udpn = self.statistics.get_err_counter(
             '/err/nat44-ed-in2out-slowpath/UDP packets')
-        icmpn = self.statistics.get_counter(
+        icmpn = self.statistics.get_err_counter(
             '/err/nat44-ed-in2out-slowpath/ICMP packets')
-        totaln = self.statistics.get_counter(
+        totaln = self.statistics.get_err_counter(
             '/err/nat44-ed-in2out-slowpath/good in2out packets processed')
 
         pkts = self.create_stream_in(self.pg0, self.pg1)
@@ -4744,25 +4719,27 @@ class TestNAT44EndpointDependent(MethodHolder):
         capture = self.pg1.get_capture(len(pkts))
         self.verify_capture_out(capture)
 
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-ed-in2out-slowpath/TCP packets')
         self.assertEqual(err - tcpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-ed-in2out-slowpath/UDP packets')
         self.assertEqual(err - udpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-ed-in2out-slowpath/ICMP packets')
         self.assertEqual(err - icmpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-ed-in2out-slowpath/good in2out packets processed')
         self.assertEqual(err - totaln, 3)
 
         # out2in
-        tcpn = self.statistics.get_counter('/err/nat44-ed-out2in/TCP packets')
-        udpn = self.statistics.get_counter('/err/nat44-ed-out2in/UDP packets')
-        icmpn = self.statistics.get_counter(
+        tcpn = self.statistics.get_err_counter(
+            '/err/nat44-ed-out2in/TCP packets')
+        udpn = self.statistics.get_err_counter(
+            '/err/nat44-ed-out2in/UDP packets')
+        icmpn = self.statistics.get_err_counter(
             '/err/nat44-ed-out2in-slowpath/ICMP packets')
-        totaln = self.statistics.get_counter(
+        totaln = self.statistics.get_err_counter(
             '/err/nat44-ed-out2in/good out2in packets processed')
 
         pkts = self.create_stream_out(self.pg1)
@@ -4772,14 +4749,16 @@ class TestNAT44EndpointDependent(MethodHolder):
         capture = self.pg0.get_capture(len(pkts))
         self.verify_capture_in(capture, self.pg0)
 
-        err = self.statistics.get_counter('/err/nat44-ed-out2in/TCP packets')
+        err = self.statistics.get_err_counter(
+            '/err/nat44-ed-out2in/TCP packets')
         self.assertEqual(err - tcpn, 1)
-        err = self.statistics.get_counter('/err/nat44-ed-out2in/UDP packets')
+        err = self.statistics.get_err_counter(
+            '/err/nat44-ed-out2in/UDP packets')
         self.assertEqual(err - udpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-ed-out2in-slowpath/ICMP packets')
         self.assertEqual(err - icmpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat44-ed-out2in/good out2in packets processed')
         self.assertEqual(err - totaln, 2)
 
@@ -5804,7 +5783,7 @@ class TestNAT44EndpointDependent(MethodHolder):
                             self.config_flags.NAT_IS_EXT_HOST_VALID)
             self.assertTrue(sessions[0].flags &
                             self.config_flags.NAT_IS_TWICE_NAT)
-            self.logger.error(self.vapi.cli("show nat44 sessions detail"))
+            self.logger.info(self.vapi.cli("show nat44 sessions detail"))
             self.vapi.nat44_del_session(
                 address=sessions[0].inside_ip_address,
                 port=sessions[0].inside_port,
@@ -6818,7 +6797,7 @@ class TestNAT44EndpointDependent(MethodHolder):
         capture = self.pg1.assert_nothing_captured()
 
         # verify IPFIX logging
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         sleep(1)
         capture = self.pg2.get_capture(10)
         ipfix = IPFIXDecoder()
@@ -6847,7 +6826,8 @@ class TestNAT44EndpointDependent(MethodHolder):
 
     def test_syslog_sess(self):
         """ Test syslog session creation and deletion """
-        self.vapi.syslog_set_filter(SYSLOG_SEVERITY.INFO)
+        self.vapi.syslog_set_filter(
+            self.SYSLOG_SEVERITY.SYSLOG_API_SEVERITY_INFO)
         self.vapi.syslog_set_sender(self.pg2.local_ip4n, self.pg2.remote_ip4n)
         self.nat44_add_address(self.nat_addr)
         flags = self.config_flags.NAT_IS_INSIDE
@@ -6924,11 +6904,11 @@ class TestNAT44Out2InDPO(MethodHolder):
             cls.pg1.config_ip6()
             cls.pg1.resolve_ndp()
 
-            cls.vapi.ip_add_del_route(dst_address=b'\x00' * 16,
-                                      dst_address_length=0,
-                                      next_hop_address=cls.pg1.remote_ip6n,
-                                      next_hop_sw_if_index=cls.pg1.sw_if_index,
-                                      is_ipv6=True)
+            r1 = VppIpRoute(cls, "::", 0,
+                            [VppRoutePath(cls.pg1.remote_ip6,
+                                          cls.pg1.sw_if_index)],
+                            register=False)
+            r1.add_vpp_config()
 
         except Exception:
             super(TestNAT44Out2InDPO, cls).tearDownClass()
@@ -7597,7 +7577,7 @@ class TestDeterministicNAT(MethodHolder):
         self.assertEqual(1000, dms[0].ses_num)
 
         # verify IPFIX logging
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         sleep(1)
         capture = self.pg2.get_capture(2)
         ipfix = IPFIXDecoder()
@@ -7897,10 +7877,11 @@ class TestNAT64(MethodHolder):
                                           sw_if_index=self.pg1.sw_if_index)
 
         # in2out
-        tcpn = self.statistics.get_counter('/err/nat64-in2out/TCP packets')
-        udpn = self.statistics.get_counter('/err/nat64-in2out/UDP packets')
-        icmpn = self.statistics.get_counter('/err/nat64-in2out/ICMP packets')
-        totaln = self.statistics.get_counter(
+        tcpn = self.statistics.get_err_counter('/err/nat64-in2out/TCP packets')
+        udpn = self.statistics.get_err_counter('/err/nat64-in2out/UDP packets')
+        icmpn = self.statistics.get_err_counter(
+            '/err/nat64-in2out/ICMP packets')
+        totaln = self.statistics.get_err_counter(
             '/err/nat64-in2out/good in2out packets processed')
 
         pkts = self.create_stream_in_ip6(self.pg0, self.pg1)
@@ -7911,21 +7892,22 @@ class TestNAT64(MethodHolder):
         self.verify_capture_out(capture, nat_ip=self.nat_addr,
                                 dst_ip=self.pg1.remote_ip4)
 
-        err = self.statistics.get_counter('/err/nat64-in2out/TCP packets')
+        err = self.statistics.get_err_counter('/err/nat64-in2out/TCP packets')
         self.assertEqual(err - tcpn, 1)
-        err = self.statistics.get_counter('/err/nat64-in2out/UDP packets')
+        err = self.statistics.get_err_counter('/err/nat64-in2out/UDP packets')
         self.assertEqual(err - udpn, 1)
-        err = self.statistics.get_counter('/err/nat64-in2out/ICMP packets')
+        err = self.statistics.get_err_counter('/err/nat64-in2out/ICMP packets')
         self.assertEqual(err - icmpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat64-in2out/good in2out packets processed')
         self.assertEqual(err - totaln, 3)
 
         # out2in
-        tcpn = self.statistics.get_counter('/err/nat64-out2in/TCP packets')
-        udpn = self.statistics.get_counter('/err/nat64-out2in/UDP packets')
-        icmpn = self.statistics.get_counter('/err/nat64-out2in/ICMP packets')
-        totaln = self.statistics.get_counter(
+        tcpn = self.statistics.get_err_counter('/err/nat64-out2in/TCP packets')
+        udpn = self.statistics.get_err_counter('/err/nat64-out2in/UDP packets')
+        icmpn = self.statistics.get_err_counter(
+            '/err/nat64-out2in/ICMP packets')
+        totaln = self.statistics.get_err_counter(
             '/err/nat64-out2in/good out2in packets processed')
 
         pkts = self.create_stream_out(self.pg1, dst_ip=self.nat_addr)
@@ -7936,13 +7918,13 @@ class TestNAT64(MethodHolder):
         ip = IPv6(src=''.join(['64:ff9b::', self.pg1.remote_ip4]))
         self.verify_capture_in_ip6(capture, ip[IPv6].src, self.pg0.remote_ip6)
 
-        err = self.statistics.get_counter('/err/nat64-out2in/TCP packets')
+        err = self.statistics.get_err_counter('/err/nat64-out2in/TCP packets')
         self.assertEqual(err - tcpn, 1)
-        err = self.statistics.get_counter('/err/nat64-out2in/UDP packets')
+        err = self.statistics.get_err_counter('/err/nat64-out2in/UDP packets')
         self.assertEqual(err - udpn, 1)
-        err = self.statistics.get_counter('/err/nat64-out2in/ICMP packets')
+        err = self.statistics.get_err_counter('/err/nat64-out2in/ICMP packets')
         self.assertEqual(err - icmpn, 1)
-        err = self.statistics.get_counter(
+        err = self.statistics.get_err_counter(
             '/err/nat64-out2in/good out2in packets processed')
         self.assertEqual(err - totaln, 3)
 
@@ -8831,7 +8813,7 @@ class TestNAT64(MethodHolder):
         self.pg_start()
         self.pg1.assert_nothing_captured()
         sleep(1)
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(9)
         ipfix = IPFIXDecoder()
         # first load template
@@ -8859,7 +8841,7 @@ class TestNAT64(MethodHolder):
         self.pg_start()
         self.pg1.assert_nothing_captured()
         sleep(1)
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(1)
         # verify events in data set
         for p in capture:
@@ -8904,7 +8886,7 @@ class TestNAT64(MethodHolder):
         self.pg_start()
         self.pg1.assert_nothing_captured()
         sleep(1)
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(9)
         ipfix = IPFIXDecoder()
         # first load template
@@ -8958,7 +8940,7 @@ class TestNAT64(MethodHolder):
         self.pg_start()
         p = self.pg1.get_capture(1)
         self.tcp_port_out = p[0][TCP].sport
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(10)
         ipfix = IPFIXDecoder()
         # first load template
@@ -8993,7 +8975,7 @@ class TestNAT64(MethodHolder):
                                                 end_addr=self.nat_addr,
                                                 vrf_id=0xFFFFFFFF,
                                                 is_add=0)
-        self.vapi.cli("ipfix flush")  # FIXME this should be an API call
+        self.vapi.ipfix_flush()
         capture = self.pg3.get_capture(2)
         # verify events in data set
         for p in capture:
@@ -9033,7 +9015,8 @@ class TestNAT64(MethodHolder):
                                           sw_if_index=self.pg0.sw_if_index)
         self.vapi.nat64_add_del_interface(is_add=1, flags=0,
                                           sw_if_index=self.pg1.sw_if_index)
-        self.vapi.syslog_set_filter(SYSLOG_SEVERITY.INFO)
+        self.vapi.syslog_set_filter(
+            self.SYSLOG_SEVERITY.SYSLOG_API_SEVERITY_INFO)
         self.vapi.syslog_set_sender(self.pg3.local_ip4n, self.pg3.remote_ip4n)
 
         p = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) /
@@ -9073,7 +9056,8 @@ class TestNAT64(MethodHolder):
         self.ipfix_src_port = 4739
         self.ipfix_domain_id = 1
 
-        self.vapi.syslog_set_filter(SYSLOG_SEVERITY.EMERG)
+        self.vapi.syslog_set_filter(
+            self.SYSLOG_SEVERITY.SYSLOG_API_SEVERITY_EMERG)
 
         self.vapi.nat_set_timeouts(udp=300, tcp_established=7440,
                                    tcp_transitory=240, icmp=60)
@@ -9368,11 +9352,10 @@ class TestDSliteCE(MethodHolder):
         aftr_ip6_n = socket.inet_pton(socket.AF_INET6, aftr_ip6)
         self.vapi.dslite_set_aftr_addr(ip4_addr=aftr_ip4, ip6_addr=aftr_ip6)
 
-        self.vapi.ip_add_del_route(dst_address=aftr_ip6_n,
-                                   dst_address_length=128,
-                                   next_hop_address=self.pg1.remote_ip6n,
-                                   next_hop_sw_if_index=self.pg1.sw_if_index,
-                                   is_ipv6=1)
+        r1 = VppIpRoute(self, aftr_ip6, 128,
+                        [VppRoutePath(self.pg1.remote_ip6,
+                                      self.pg1.sw_if_index)])
+        r1.add_vpp_config()
 
         # UDP encapsulation
         p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /