11 from framework import VppTestCase, VppTestRunner
12 from ipfix import IPFIX, Set, Template, Data, IPFIXDecoder
13 from scapy.all import (
26 from scapy.data import IP_PROTOS
27 from scapy.layers.inet import IP, TCP, UDP, ICMP
28 from scapy.layers.inet import IPerror, TCPerror, UDPerror, ICMPerror
29 from scapy.layers.inet6 import ICMPv6DestUnreach, IPerror6, IPv6ExtHdrFragment
30 from scapy.layers.inet6 import (
39 from scapy.layers.l2 import Ether, ARP, GRE
40 from scapy.packet import Raw
41 from syslog_rfc5424_parser import SyslogMessage, ParseError
42 from syslog_rfc5424_parser.constants import SyslogSeverity
43 from util import ip4_range
44 from util import ppc, ppp
45 from vpp_acl import AclRule, VppAcl, VppAclInterface
46 from vpp_ip_route import VppIpRoute, VppRoutePath
47 from vpp_neighbor import VppNeighbor
48 from vpp_papi import VppEnum
51 class TestNAT66(VppTestCase):
52 """NAT66 Test Cases"""
56 super(TestNAT66, cls).setUpClass()
58 cls.nat_addr = "fd01:ff::2"
59 cls.create_pg_interfaces(range(2))
60 cls.interfaces = list(cls.pg_interfaces)
62 for i in cls.interfaces:
65 i.configure_ipv6_neighbors()
68 def config_flags(self):
69 return VppEnum.vl_api_nat_config_flags_t
71 def plugin_enable(self):
72 self.vapi.nat66_plugin_enable_disable(enable=1)
74 def plugin_disable(self):
75 self.vapi.nat66_plugin_enable_disable(enable=0)
78 super(TestNAT66, self).setUp()
82 super(TestNAT66, self).tearDown()
86 def test_static(self):
88 flags = self.config_flags.NAT_IS_INSIDE
89 self.vapi.nat66_add_del_interface(
90 is_add=1, flags=flags, sw_if_index=self.pg0.sw_if_index
92 self.vapi.nat66_add_del_interface(is_add=1, sw_if_index=self.pg1.sw_if_index)
93 self.vapi.nat66_add_del_static_mapping(
94 local_ip_address=self.pg0.remote_ip6,
95 external_ip_address=self.nat_addr,
102 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
103 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
108 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
109 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
114 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
115 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
116 / ICMPv6EchoRequest()
120 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
121 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
127 self.pg0.add_stream(pkts)
128 self.pg_enable_capture(self.pg_interfaces)
130 capture = self.pg1.get_capture(len(pkts))
132 for packet in capture:
134 self.assertEqual(packet[IPv6].src, self.nat_addr)
135 self.assertEqual(packet[IPv6].dst, self.pg1.remote_ip6)
136 self.assert_packet_checksums_valid(packet)
138 self.logger.error(ppp("Unexpected or invalid packet:", packet))
144 Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac)
145 / IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr)
150 Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac)
151 / IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr)
156 Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac)
157 / IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr)
162 Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac)
163 / IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr)
169 self.pg1.add_stream(pkts)
170 self.pg_enable_capture(self.pg_interfaces)
172 capture = self.pg0.get_capture(len(pkts))
173 for packet in capture:
175 self.assertEqual(packet[IPv6].src, self.pg1.remote_ip6)
176 self.assertEqual(packet[IPv6].dst, self.pg0.remote_ip6)
177 self.assert_packet_checksums_valid(packet)
179 self.logger.error(ppp("Unexpected or invalid packet:", packet))
182 sm = self.vapi.nat66_static_mapping_dump()
183 self.assertEqual(len(sm), 1)
184 self.assertEqual(sm[0].total_pkts, 8)
186 def test_check_no_translate(self):
187 """NAT66 translate only when egress interface is outside interface"""
188 flags = self.config_flags.NAT_IS_INSIDE
189 self.vapi.nat66_add_del_interface(
190 is_add=1, flags=flags, sw_if_index=self.pg0.sw_if_index
192 self.vapi.nat66_add_del_interface(
193 is_add=1, flags=flags, sw_if_index=self.pg1.sw_if_index
195 self.vapi.nat66_add_del_static_mapping(
196 local_ip_address=self.pg0.remote_ip6,
197 external_ip_address=self.nat_addr,
203 Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac)
204 / IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6)
207 self.pg0.add_stream([p])
208 self.pg_enable_capture(self.pg_interfaces)
210 capture = self.pg1.get_capture(1)
213 self.assertEqual(packet[IPv6].src, self.pg0.remote_ip6)
214 self.assertEqual(packet[IPv6].dst, self.pg1.remote_ip6)
216 self.logger.error(ppp("Unexpected or invalid packet:", packet))
220 if __name__ == "__main__":
221 unittest.main(testRunner=VppTestRunner)