X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_punt.py;h=3471a3f7dd59c041cbab58b6f42ff40ffe27bb94;hb=794599bccae8bfb57c17b0c3c8b96630b0bf9bb9;hp=9627e542c2cf31167c91891c7150313e0d402064;hpb=cbe25aab3be72154f2c706c39eeba6a77f34450f;p=vpp.git diff --git a/test/test_punt.py b/test/test_punt.py index 9627e542c2c..3471a3f7dd5 100644 --- a/test/test_punt.py +++ b/test/test_punt.py @@ -26,12 +26,13 @@ from scapy.layers.ipsec import ESP import scapy.layers.inet6 as inet6 from scapy.layers.inet6 import IPv6, ICMPv6DestUnreach from scapy.contrib.ospf import OSPF_Hdr, OSPFv3_Hello +from framework import tag_fixme_vpp_workers from framework import VppTestCase, VppTestRunner from vpp_ip import DpoProto from vpp_ip_route import VppIpRoute, VppRoutePath +from vpp_ipsec import VppIpsecSA, VppIpsecTunProtect, VppIpsecInterface from vpp_papi import VppEnum -from vpp_ipsec_tun_interface import VppIpsecTunInterface NUM_PKTS = 67 @@ -45,11 +46,11 @@ class serverSocketThread(threading.Thread): self.sockName = sockName self.sock = None self.rx_pkts = [] - self.keep_running = True + self.stop_running = False def rx_packets(self): # Wait for some packets on socket - while self.keep_running: + while True: try: data = self.sock.recv(65536) @@ -60,7 +61,9 @@ class serverSocketThread(threading.Thread): self.rx_pkts.append(Ether(data[8:])) except IOError as e: if e.errno == 11: - # nothing to receive, sleep a little + # nothing to receive, stop running or sleep a little + if self.stop_running: + break time.sleep(0.1) pass else: @@ -80,8 +83,9 @@ class serverSocketThread(threading.Thread): self.rx_packets() def close(self): + self.stop_running = True + threading.Thread.join(self) self.sock.close() - self.keep_running = False return self.rx_pkts @@ -130,7 +134,6 @@ class TestPuntSocket(VppTestCase): rx_pkts = [] for thread in self.sock_servers: rx_pkts += thread.close() - thread.join() return rx_pkts def verify_port(self, pr, vpr): @@ -793,41 +796,14 @@ class TestExceptionPuntSocket(TestPuntSocket): } } - # - # we need an IPSec tunnels for this to work otherwise ESP gets dropped - # due to unknown IP proto - # - VppIpsecTunInterface(self, self.pg0, 1000, 1000, - (VppEnum.vl_api_ipsec_crypto_alg_t. - IPSEC_API_CRYPTO_ALG_AES_CBC_128), - b"0123456701234567", - b"0123456701234567", - (VppEnum.vl_api_ipsec_integ_alg_t. - IPSEC_API_INTEG_ALG_SHA1_96), - b"0123456701234567", - b"0123456701234567").add_vpp_config() - VppIpsecTunInterface(self, self.pg1, 1000, 1000, - (VppEnum.vl_api_ipsec_crypto_alg_t. - IPSEC_API_CRYPTO_ALG_AES_CBC_128), - b"0123456701234567", - b"0123456701234567", - (VppEnum.vl_api_ipsec_integ_alg_t. - IPSEC_API_INTEG_ALG_SHA1_96), - b"0123456701234567", - b"0123456701234567", - udp_encap=True).add_vpp_config() - # # we're dealing with IPSec tunnels punting for no-such-tunnel - # adn SPI=0 + # (SPI=0 goes to ikev2) # cfgs = dict() cfgs['ipsec4-no-such-tunnel'] = {'spi': 99, 'udp': False, 'itf': self.pg0} - cfgs['ipsec4-spi-o-udp-0'] = {'spi': 0, - 'udp': True, - 'itf': self.pg1} # # find the VPP ID for these punt exception reasin @@ -835,6 +811,8 @@ class TestExceptionPuntSocket(TestPuntSocket): rs = self.vapi.punt_reason_dump() for key in cfgs: for r in rs: + print(r.reason.name) + print(key) if r.reason.name == key: cfgs[key]['id'] = r.reason.id cfgs[key]['vpp'] = copy.deepcopy( @@ -880,6 +858,47 @@ class TestExceptionPuntSocket(TestPuntSocket): cfg['spi'], cfg['udp']) # + # add some tunnels, make sure it still punts + # + tun = VppIpsecInterface(self).add_vpp_config() + sa_in = VppIpsecSA(self, 11, 11, + (VppEnum.vl_api_ipsec_integ_alg_t. + IPSEC_API_INTEG_ALG_SHA1_96), + b"0123456701234567", + (VppEnum.vl_api_ipsec_crypto_alg_t. + IPSEC_API_CRYPTO_ALG_AES_CBC_128), + b"0123456701234567", + 50, + self.pg0.local_ip4, + self.pg0.remote_ip4).add_vpp_config() + sa_out = VppIpsecSA(self, 22, 22, + (VppEnum.vl_api_ipsec_integ_alg_t. + IPSEC_API_INTEG_ALG_SHA1_96), + b"0123456701234567", + (VppEnum.vl_api_ipsec_crypto_alg_t. + IPSEC_API_CRYPTO_ALG_AES_CBC_128), + b"0123456701234567", + 50, + self.pg0.local_ip4, + self.pg0.remote_ip4).add_vpp_config() + protect = VppIpsecTunProtect(self, tun, + sa_out, + [sa_in]).add_vpp_config() + + # + # send packets for each SPI we expect to be punted + # + for cfg in cfgs.values(): + self.send_and_assert_no_replies(cfg['itf'], cfg['pkts']) + + # + # verify the punted packets arrived on the associated socket + # + for cfg in cfgs.values(): + rx = cfg['sock'].close() + self.verify_esp_pkts(rx, len(cfg['pkts']), + cfg['spi'], cfg['udp']) + # # socket deregister # for cfg in cfgs.values(): @@ -1030,6 +1049,7 @@ class TestIpProtoPuntSocket(TestPuntSocket): self.vapi.punt_socket_deregister(punt_ospf) +@tag_fixme_vpp_workers class TestPunt(VppTestCase): """ Exception Punt Test Case """