5 from framework import VppTestCase, VppTestRunner
7 from scapy.layers.inet6 import IPv6, ICMPv6EchoRequest
8 from scapy.layers.l2 import Ether
9 from scapy.packet import Raw
12 class TestNPT66(VppTestCase):
15 extra_vpp_plugin_config = [
16 "plugin npt66_plugin.so {enable}",
20 super(TestNPT66, self).setUp()
22 # create 2 pg interfaces
23 self.create_pg_interfaces(range(2))
25 for i in self.pg_interfaces:
31 for i in self.pg_interfaces:
34 super(TestNPT66, self).tearDown()
36 def send_and_verify(self, internal):
39 local_mac = self.pg0.local_mac
40 remote_mac = self.pg0.remote_mac
41 src = ipaddress.ip_interface(internal).ip + 1
42 dst = self.pg1.remote_ip6
45 Ether(dst=local_mac, src=remote_mac)
46 / IPv6(src=src, dst=dst)
50 rxs = self.send_and_expect(sendif, p, recvif)
52 original_cksum = rx[ICMPv6EchoRequest].cksum
53 del rx[ICMPv6EchoRequest].cksum
54 rx = rx.__class__(bytes(rx))
55 self.assertEqual(original_cksum, rx[ICMPv6EchoRequest].cksum)
59 Ether(dst=rx[Ether].src, src=local_mac)
60 / IPv6(src=rx[IPv6].dst, dst=rx[IPv6].src)
65 replies = self.send_and_expect(recvif, reply, sendif)
67 self.assertEqual(str(p[IPv6].src), r[IPv6].dst)
68 original_cksum = r[ICMPv6EchoRequest].cksum
69 del r[ICMPv6EchoRequest].cksum
70 r = r.__class__(bytes(r))
71 self.assertEqual(original_cksum, r[ICMPv6EchoRequest].cksum)
73 def do_test(self, internal, external):
74 self.vapi.npt66_binding_add_del(
75 sw_if_index=self.pg1.sw_if_index,
81 self.vapi.cli(f"ip route add {internal} via {self.pg0.remote_ip6}")
83 self.send_and_verify(internal)
85 self.vapi.npt66_binding_add_del(
86 sw_if_index=self.pg1.sw_if_index,
92 def test_npt66_simple(self):
93 """Send and receive a packet through NPT66"""
95 self.do_test("fd00:0000:0000::/48", "2001:4650:c3ed::/48")
96 self.do_test("fc00:1::/48", "2001:db8:1::/48")
97 self.do_test("fc00:1234::/32", "2001:db8:1::/32")
98 self.do_test("fc00:1234::/63", "2001:db8:1::/56")
101 if __name__ == "__main__":
102 unittest.main(testRunner=VppTestRunner)