X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_gbp.py;h=cc38bc9c1ce668112a1d5ad20b551ab0f434f904;hb=dd1e3e780;hp=ee842b3305224e85babf441a7b30327df8fc24dd;hpb=7363d479655d6dd2b8fc6cd93faded8e76bf4412;p=vpp.git diff --git a/test/test_gbp.py b/test/test_gbp.py index ee842b33052..cc38bc9c1ce 100644 --- a/test/test_gbp.py +++ b/test/test_gbp.py @@ -447,13 +447,14 @@ class VppGbpContract(VppObject): rules = [] for r in self.rules: rules.append(r.encode()) - self._test.vapi.gbp_contract_add_del( + r = self._test.vapi.gbp_contract_add_del( 1, self.sclass, self.dclass, self.acl_index, rules, self.allowed_ethertypes) + self.stats_index = r.stats_index self._test.registry.register(self, self._test.logger) def remove_vpp_config(self): @@ -478,6 +479,14 @@ class VppGbpContract(VppObject): return True return False + def get_drop_stats(self): + c = self._test.statistics.get_counter("/net/gbp/contract/drop") + return c[0][self.stats_index] + + def get_permit_stats(self): + c = self._test.statistics.get_counter("/net/gbp/contract/permit") + return c[0][self.stats_index] + class VppGbpVxlanTunnel(VppInterface): """ @@ -566,6 +575,18 @@ class VppGbpAcl(VppObject): class TestGBP(VppTestCase): """ GBP Test Case """ + @property + def config_flags(self): + return VppEnum.vl_api_nat_config_flags_t + + @classmethod + def setUpClass(cls): + super(TestGBP, cls).setUpClass() + + @classmethod + def tearDownClass(cls): + super(TestGBP, cls).tearDownClass() + def setUp(self): super(TestGBP, self).setUp() @@ -778,12 +799,11 @@ class TestGBP(VppTestCase): self.router_mac.packed) # The BVIs are NAT inside interfaces + flags = self.config_flags.NAT_IS_INSIDE self.vapi.nat44_interface_add_del_feature(epg.bvi.sw_if_index, - is_inside=1, - is_add=1) + flags=flags) self.vapi.nat66_add_del_interface(epg.bvi.sw_if_index, - is_inside=1, - is_add=1) + flags=flags) if_ip4 = VppIpInterfaceAddress(self, epg.bvi, epg.bvi_ip4, 32) if_ip6 = VppIpInterfaceAddress(self, epg.bvi, epg.bvi_ip6, 128) @@ -815,13 +835,9 @@ class TestGBP(VppTestCase): recirc.epg.rd.t6).add_vpp_config() self.vapi.nat44_interface_add_del_feature( - recirc.recirc.sw_if_index, - is_inside=0, - is_add=1) + recirc.recirc.sw_if_index) self.vapi.nat66_add_del_interface( - recirc.recirc.sw_if_index, - is_inside=0, - is_add=1) + recirc.recirc.sw_if_index) recirc.add_vpp_config() @@ -841,10 +857,11 @@ class TestGBP(VppTestCase): for (ip, fip) in zip(ep.ips, ep.fips): # Add static mappings for each EP from the 10/8 to 11/8 network if ip.af == AF_INET: + flags = self.config_flags.NAT_IS_ADDR_ONLY self.vapi.nat44_add_del_static_mapping(ip.bytes, fip.bytes, vrf_id=0, - addr_only=1) + flags=flags) else: self.vapi.nat66_add_del_static_mapping(ip.bytes, fip.bytes, @@ -1154,6 +1171,11 @@ class TestGBP(VppTestCase): pkt_inter_epg_221_to_220 * 65, eps[0].itf) + ds = c2.get_drop_stats() + self.assertEqual(ds['packets'], 0) + ps = c2.get_permit_stats() + self.assertEqual(ps['packets'], 65) + # # the contract does not allow non-IP # @@ -1382,11 +1404,12 @@ class TestGBP(VppTestCase): # for ep in eps: # del static mappings for each EP from the 10/8 to 11/8 network + flags = self.config_flags.NAT_IS_ADDR_ONLY self.vapi.nat44_add_del_static_mapping(ep.ip4.bytes, ep.fip4.bytes, vrf_id=0, - addr_only=1, - is_add=0) + is_add=0, + flags=flags) self.vapi.nat66_add_del_static_mapping(ep.ip6.bytes, ep.fip6.bytes, vrf_id=0, @@ -1395,21 +1418,20 @@ class TestGBP(VppTestCase): for epg in epgs: # IP config on the BVI interfaces if epg != epgs[0] and epg != epgs[3]: + flags = self.config_flags.NAT_IS_INSIDE self.vapi.nat44_interface_add_del_feature(epg.bvi.sw_if_index, - is_inside=1, + flags=flags, is_add=0) self.vapi.nat66_add_del_interface(epg.bvi.sw_if_index, - is_inside=1, + flags=flags, is_add=0) for recirc in recircs: self.vapi.nat44_interface_add_del_feature( recirc.recirc.sw_if_index, - is_inside=0, is_add=0) self.vapi.nat66_add_del_interface( recirc.recirc.sw_if_index, - is_inside=0, is_add=0) def wait_for_ep_timeout(self, sw_if_index=None, ip=None, mac=None, @@ -1425,6 +1447,8 @@ class TestGBP(VppTestCase): def test_gbp_learn_l2(self): """ GBP L2 Endpoint Learning """ + self.vapi.cli("clear errors") + ep_flags = VppEnum.vl_api_gbp_endpoint_flags_t learnt = [{'mac': '00:00:11:11:11:01', 'ip': '10.0.0.1', @@ -1533,6 +1557,10 @@ class TestGBP(VppTestCase): self.send_and_assert_no_replies(self.pg2, p) + self.logger.info(self.vapi.cli("sh error")) + # self.assert_packet_counter_equal( + # '/err/gbp-policy-port/drop-no-contract', 1) + # # we should not have learnt a new tunnel endpoint, since # the EPG was not learnt. @@ -1543,7 +1571,7 @@ class TestGBP(VppTestCase): self.pg2.remote_hosts[0].ip4, 99)) - # epg is not learnt, because the EPG is unknwon + # epg is not learnt, because the EPG is unknown self.assertEqual(len(self.vapi.gbp_endpoint_dump()), 1) # @@ -1584,6 +1612,9 @@ class TestGBP(VppTestCase): vx_tun_l2_1.sw_if_index, ip=l['ip'])) + # self.assert_packet_counter_equal( + # '/err/gbp-policy-port/allow-intra-sclass', 2) + self.logger.info(self.vapi.cli("show gbp endpoint")) self.logger.info(self.vapi.cli("show gbp vxlan")) self.logger.info(self.vapi.cli("show ip mfib")) @@ -1782,6 +1813,30 @@ class TestGBP(VppTestCase): vx_tun_l2_1.sw_if_index, mac=l['mac'])) + # + # repeat in the other EPG + # there's no contract between 220 and 330, but the sclass is set to 1 + # so the packet is cleared for delivery + # + for l in learnt: + # a packet with an sclass from a known EPG + p = (Ether(src=self.pg2.remote_mac, + dst=self.pg2.local_mac) / + IP(src=self.pg2.remote_hosts[1].ip4, + dst=self.pg2.local_ip4) / + UDP(sport=1234, dport=48879) / + VXLAN(vni=99, gpid=1, flags=0x88) / + Ether(src=l['mac'], dst=ep.mac) / + IP(src=l['ip'], dst=ep.ip4.address) / + UDP(sport=1234, dport=1234) / + Raw('\xa5' * 100)) + + rx = self.send_and_expect(self.pg2, p*65, self.pg0) + + self.assertTrue(find_gbp_endpoint(self, + vx_tun_l2_1.sw_if_index, + mac=l['mac'])) + # # static EP cannot reach the learnt EPs since there is no contract # only test 1 EP as the others could timeout @@ -3634,6 +3689,22 @@ class TestGBP(VppTestCase): self.assertEqual(inner[IP].src, "10.220.0.1") self.assertEqual(inner[IP].dst, "10.222.0.1") + # + # ping from host in remote to local external subnets + # there's no contract for this, but sclass is 1. + # + p = (Ether(src=self.pg7.remote_mac, dst=self.pg7.local_mac) / + IP(src=self.pg7.remote_ip4, dst=self.pg7.local_ip4) / + UDP(sport=1234, dport=48879) / + VXLAN(vni=445, gpid=1, flags=0x88) / + Ether(src=self.pg0.remote_mac, dst=str(self.router_mac)) / + IP(src="10.222.0.1", dst="10.220.0.1") / + UDP(sport=1234, dport=1234) / + Raw('\xa5' * 100)) + + rxs = self.send_and_expect(self.pg7, p * 3, self.pg0) + self.assertFalse(find_gbp_endpoint(self, ip="10.222.0.1")) + # # ping from host in remote to local external subnets # there's no contract for this, but the A bit is set.