12 from framework import VppTestCase, VppTestRunner, running_extended_tests
13 from ipfix import IPFIX, Set, Template, Data, IPFIXDecoder
14 from scapy.all import bind_layers, Packet, ByteEnumField, ShortField, \
15 IPField, IntField, LongField, XByteField, FlagsField, FieldLenField, \
17 from scapy.data import IP_PROTOS
18 from scapy.layers.inet import IP, TCP, UDP, ICMP
19 from scapy.layers.inet import IPerror, TCPerror, UDPerror, ICMPerror
20 from scapy.layers.inet6 import ICMPv6DestUnreach, IPerror6, IPv6ExtHdrFragment
21 from scapy.layers.inet6 import IPv6, ICMPv6EchoRequest, ICMPv6EchoReply, \
22 ICMPv6ND_NS, ICMPv6ND_NA, ICMPv6NDOptDstLLAddr, fragment6
23 from scapy.layers.l2 import Ether, ARP, GRE
24 from scapy.packet import Raw
25 from syslog_rfc5424_parser import SyslogMessage, ParseError
26 from syslog_rfc5424_parser.constants import SyslogSeverity
27 from util import ip4_range
28 from util import ppc, ppp
29 from vpp_acl import AclRule, VppAcl, VppAclInterface
30 from vpp_ip_route import VppIpRoute, VppRoutePath
31 from vpp_neighbor import VppNeighbor
32 from vpp_papi import VppEnum
35 class TestNAT66(VppTestCase):
36 """ NAT66 Test Cases """
40 super(TestNAT66, cls).setUpClass()
42 cls.nat_addr = 'fd01:ff::2'
43 cls.create_pg_interfaces(range(2))
44 cls.interfaces = list(cls.pg_interfaces)
46 for i in cls.interfaces:
49 i.configure_ipv6_neighbors()
52 def config_flags(self):
53 return VppEnum.vl_api_nat_config_flags_t
55 def plugin_enable(self):
56 self.vapi.nat66_plugin_enable_disable(enable=1)
58 def plugin_disable(self):
59 self.vapi.nat66_plugin_enable_disable(enable=0)
62 super(TestNAT66, self).setUp()
66 super(TestNAT66, self).tearDown()
70 def test_static(self):
71 """ 1:1 NAT66 test """
72 flags = self.config_flags.NAT_IS_INSIDE
73 self.vapi.nat66_add_del_interface(is_add=1, flags=flags,
74 sw_if_index=self.pg0.sw_if_index)
75 self.vapi.nat66_add_del_interface(is_add=1,
76 sw_if_index=self.pg1.sw_if_index)
77 self.vapi.nat66_add_del_static_mapping(
78 local_ip_address=self.pg0.remote_ip6,
79 external_ip_address=self.nat_addr,
84 p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
85 IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6) /
88 p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
89 IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6) /
92 p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
93 IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6) /
96 p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
97 IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6) /
100 self.pg0.add_stream(pkts)
101 self.pg_enable_capture(self.pg_interfaces)
103 capture = self.pg1.get_capture(len(pkts))
105 for packet in capture:
107 self.assertEqual(packet[IPv6].src, self.nat_addr)
108 self.assertEqual(packet[IPv6].dst, self.pg1.remote_ip6)
109 self.assert_packet_checksums_valid(packet)
111 self.logger.error(ppp("Unexpected or invalid packet:", packet))
116 p = (Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac) /
117 IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr) /
120 p = (Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac) /
121 IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr) /
124 p = (Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac) /
125 IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr) /
128 p = (Ether(dst=self.pg1.local_mac, src=self.pg1.remote_mac) /
129 IPv6(src=self.pg1.remote_ip6, dst=self.nat_addr) /
130 GRE() / IP() / TCP())
132 self.pg1.add_stream(pkts)
133 self.pg_enable_capture(self.pg_interfaces)
135 capture = self.pg0.get_capture(len(pkts))
136 for packet in capture:
138 self.assertEqual(packet[IPv6].src, self.pg1.remote_ip6)
139 self.assertEqual(packet[IPv6].dst, self.pg0.remote_ip6)
140 self.assert_packet_checksums_valid(packet)
142 self.logger.error(ppp("Unexpected or invalid packet:", packet))
145 sm = self.vapi.nat66_static_mapping_dump()
146 self.assertEqual(len(sm), 1)
147 self.assertEqual(sm[0].total_pkts, 8)
149 def test_check_no_translate(self):
150 """ NAT66 translate only when egress interface is outside interface """
151 flags = self.config_flags.NAT_IS_INSIDE
152 self.vapi.nat66_add_del_interface(is_add=1, flags=flags,
153 sw_if_index=self.pg0.sw_if_index)
154 self.vapi.nat66_add_del_interface(is_add=1, flags=flags,
155 sw_if_index=self.pg1.sw_if_index)
156 self.vapi.nat66_add_del_static_mapping(
157 local_ip_address=self.pg0.remote_ip6,
158 external_ip_address=self.nat_addr,
162 p = (Ether(dst=self.pg0.local_mac, src=self.pg0.remote_mac) /
163 IPv6(src=self.pg0.remote_ip6, dst=self.pg1.remote_ip6) /
165 self.pg0.add_stream([p])
166 self.pg_enable_capture(self.pg_interfaces)
168 capture = self.pg1.get_capture(1)
171 self.assertEqual(packet[IPv6].src, self.pg0.remote_ip6)
172 self.assertEqual(packet[IPv6].dst, self.pg1.remote_ip6)
174 self.logger.error(ppp("Unexpected or invalid packet:", packet))
178 if __name__ == '__main__':
179 unittest.main(testRunner=VppTestRunner)