X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=test%2Ftest_nat44_ed.py;h=ec8d7c8d159b7b9bf403c9008460f109b7963456;hb=40ba69271b27beca78eb8e4dbc5b13c05100299a;hp=ee76ce845c686f8028d663dce775500b3b6bfbd8;hpb=05b5a5b3b4b04823776feed6403b5a99b2e06d76;p=vpp.git diff --git a/test/test_nat44_ed.py b/test/test_nat44_ed.py index ee76ce845c6..ec8d7c8d159 100644 --- a/test/test_nat44_ed.py +++ b/test/test_nat44_ed.py @@ -949,6 +949,50 @@ class TestNAT44ED(NAT44EDTestCase): self.logger.info(ppp("p2 packet:", p2)) self.logger.info(ppp("capture packet:", capture)) + def test_icmp_echo_reply_trailer(self): + """ ICMP echo reply with ethernet trailer""" + + self.nat_add_address(self.nat_addr) + self.nat_add_inside_interface(self.pg0) + self.nat_add_outside_interface(self.pg1) + + # in2out + p1 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / + IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4) / + ICMP(type=8, id=0xabcd, seq=0)) + + self.pg0.add_stream(p1) + self.pg_enable_capture(self.pg_interfaces) + self.pg_start() + c = self.pg1.get_capture(1)[0] + + self.logger.debug(self.vapi.cli("show trace")) + + # out2in + p2 = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / + IP(src=self.pg1.remote_ip4, dst=self.nat_addr, id=0xee59) / + ICMP(type=0, id=c[ICMP].id, seq=0)) + + # force checksum calculation + p2 = p2.__class__(bytes(p2)) + + self.logger.debug(ppp("Packet before modification:", p2)) + + # hex representation of vss monitoring ethernet trailer + # this seems to be just added to end of packet without modifying + # IP or ICMP lengths / checksums + p2 = p2 / Raw("\x00\x00\x52\x54\x00\x46\xab\x04\x84\x18") + # change it so that IP/ICMP is unaffected + p2[IP].len = 28 + + self.logger.debug(ppp("Packet with added trailer:", p2)) + + self.pg1.add_stream(p2) + self.pg_enable_capture(self.pg_interfaces) + self.pg_start() + + self.pg0.get_capture(1) + def test_users_dump(self): """ NAT44ED API test - nat44_user_dump """ @@ -3637,7 +3681,7 @@ class TestNAT44EDMW(TestNAT44ED): capture = self.pg8.get_capture(len(pkts)) self.verify_capture_out(capture, ignore_port=True) - if_idx = self.pg7.sw_if_index + if_idx = self.pg8.sw_if_index cnt = self.statistics['/nat44-ed/in2out/slowpath/tcp'] self.assertEqual(cnt[:, if_idx].sum() - tcpn[:, if_idx].sum(), 2) cnt = self.statistics['/nat44-ed/in2out/slowpath/udp'] @@ -3808,6 +3852,51 @@ class TestNAT44EDMW(TestNAT44ED): self.logger.error(ppp("Unexpected or invalid packet:", p)) raise + def test_icmp_error_fwd_outbound(self): + """ NAT44ED ICMP error outbound with forwarding enabled """ + + # Ensure that an outbound ICMP error message is properly associated + # with the inbound forward bypass session it is related to. + payload = "H" * 10 + + self.nat_add_address(self.nat_addr) + self.nat_add_inside_interface(self.pg0) + self.nat_add_outside_interface(self.pg1) + + # enable forwarding and initiate connection out2in + self.vapi.nat44_forwarding_enable_disable(enable=1) + p1 = (Ether(src=self.pg1.remote_mac, dst=self.pg1.local_mac) / + IP(src=self.pg1.remote_ip4, dst=self.pg0.remote_ip4) / + UDP(sport=21, dport=20) / payload) + + self.pg1.add_stream(p1) + self.pg_enable_capture(self.pg_interfaces) + self.pg_start() + capture = self.pg0.get_capture(1)[0] + + self.logger.info(self.vapi.cli("show nat44 sessions")) + + # reply with ICMP error message in2out + # We cannot reliably retrieve forward bypass sessions via the API. + # session dumps for a user will only look on the worker that the + # user is supposed to be mapped to in2out. The forward bypass session + # is not necessarily created on that worker. + p2 = (Ether(src=self.pg0.remote_mac, dst=self.pg0.local_mac) / + IP(src=self.pg0.remote_ip4, dst=self.pg1.remote_ip4) / + ICMP(type='dest-unreach', code='port-unreachable') / + capture[IP:]) + + self.pg0.add_stream(p2) + self.pg_enable_capture(self.pg_interfaces) + self.pg_start() + capture = self.pg1.get_capture(1)[0] + + self.logger.info(self.vapi.cli("show nat44 sessions")) + + self.logger.info(ppp("p1 packet:", p1)) + self.logger.info(ppp("p2 packet:", p2)) + self.logger.info(ppp("capture packet:", capture)) + if __name__ == '__main__': unittest.main(testRunner=VppTestRunner)