5 from framework import VppTestCase
6 from asfframework import VppTestRunner
7 from scapy.layers.inet import IP, TCP, UDP
8 from scapy.layers.inet6 import (
13 from scapy.layers.l2 import Ether, GRE
15 from vpp_papi import VppEnum
18 class TestNAT66(VppTestCase):
19 """NAT66 Test Cases"""
23 super(TestNAT66, cls).setUpClass()
25 cls.nat_addr = "fd01:ff::2"
26 cls.create_pg_interfaces(range(2))
27 cls.interfaces = list(cls.pg_interfaces)
29 for i in cls.interfaces:
32 i.configure_ipv6_neighbors()
35 def config_flags(self):
36 return VppEnum.vl_api_nat_config_flags_t
38 def plugin_enable(self):
39 self.vapi.nat66_plugin_enable_disable(enable=1)
41 def plugin_disable(self):
42 self.vapi.nat66_plugin_enable_disable(enable=0)
45 super(TestNAT66, self).setUp()
49 super(TestNAT66, self).tearDown()
53 def test_static(self):
55 flags = self.config_flags.NAT_IS_INSIDE
56 self.vapi.nat66_add_del_interface(
57 is_add=1, flags=flags, sw_if_index=self.pg0.sw_if_index
59 self.vapi.nat66_add_del_interface(is_add=1, sw_if_index=self.pg1.sw_if_index)
60 self.vapi.nat66_add_del_static_mapping(
61 local_ip_address=self.pg0.remote_ip6,
62 external_ip_address=self.nat_addr,
69 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
70 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
75 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
76 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
81 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
82 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
87 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
88 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
94 self.pg0.add_stream(pkts)
95 self.pg_enable_capture(self.pg_interfaces)
97 capture = self.pg1.get_capture(len(pkts))
99 for packet in capture:
101 self.assertEqual(packet[IPv6].src, self.nat_addr)
102 self.assertEqual(packet[IPv6].dst, self.pg1.remote_ip6)
103 self.assert_packet_checksums_valid(packet)
105 self.logger.error(ppp("Unexpected or invalid packet:", packet))
111 Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac)
112 / IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr)
117 Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac)
118 / IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr)
123 Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac)
124 / IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr)
129 Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac)
130 / IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr)
136 self.pg1.add_stream(pkts)
137 self.pg_enable_capture(self.pg_interfaces)
139 capture = self.pg0.get_capture(len(pkts))
140 for packet in capture:
142 self.assertEqual(packet[IPv6].src, self.pg1.remote_ip6)
143 self.assertEqual(packet[IPv6].dst, self.pg0.remote_ip6)
144 self.assert_packet_checksums_valid(packet)
146 self.logger.error(ppp("Unexpected or invalid packet:", packet))
149 sm = self.vapi.nat66_static_mapping_dump()
150 self.assertEqual(len(sm), 1)
151 self.assertEqual(sm[0].total_pkts, 8)
153 def test_check_no_translate(self):
154 """NAT66 translate only when egress interface is outside interface"""
155 flags = self.config_flags.NAT_IS_INSIDE
156 self.vapi.nat66_add_del_interface(
157 is_add=1, flags=flags, sw_if_index=self.pg0.sw_if_index
159 self.vapi.nat66_add_del_interface(
160 is_add=1, flags=flags, sw_if_index=self.pg1.sw_if_index
162 self.vapi.nat66_add_del_static_mapping(
163 local_ip_address=self.pg0.remote_ip6,
164 external_ip_address=self.nat_addr,
170 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
171 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
174 self.pg0.add_stream([p])
175 self.pg_enable_capture(self.pg_interfaces)
177 capture = self.pg1.get_capture(1)
180 self.assertEqual(packet[IPv6].src, self.pg0.remote_ip6)
181 self.assertEqual(packet[IPv6].dst, self.pg1.remote_ip6)
183 self.logger.error(ppp("Unexpected or invalid packet:", packet))
187 if __name__ == "__main__":
188 unittest.main(testRunner=VppTestRunner)