2 """CRUD tests of APIs (Create, Read, Update, Delete) HLD:
4 - interface up/down/add/delete - interface type:
10 - tuntap (root privileges needed)
16 from scapy.layers.inet import IP, ICMP
17 from scapy.layers.l2 import Ether
19 from framework import VppTestCase, VppTestRunner
22 class TestLoopbackInterfaceCRUD(VppTestCase):
29 super(TestLoopbackInterfaceCRUD, cls).setUpClass()
31 cls.create_pg_interfaces(range(1))
32 for i in cls.pg_interfaces:
40 def tearDownClass(cls):
41 super(TestLoopbackInterfaceCRUD, cls).tearDownClass()
44 def create_icmp_stream(src_if, dst_ifs):
47 :param VppInterface src_if: Packets are send to this interface,
48 using this interfaces remote host.
49 :param list dst_ifs: IPv4 ICMP requests are send to interfaces
51 :return: List of generated packets.
55 p = (Ether(dst=src_if.local_mac, src=src_if.remote_mac) /
56 IP(src=src_if.remote_ip4, dst=i.local_ip4) /
57 ICMP(id=i.sw_if_index, type='echo-request'))
61 def verify_icmp(self, capture, request_src_if, dst_ifs):
64 :param capture: Capture to verify.
65 :param VppInterface request_src_if: Interface where was send packets.
66 :param list dst_ifs: Interfaces where was generated IPv4 ICMP requests.
76 info = (ip.src, ip.dst, icmp.type, icmp.id)
77 rcvd_icmp_pkts.append(info)
80 # 0 - icmp echo response
81 info = (i.local_ip4, request_src_if.remote_ip4, 0, i.sw_if_index)
82 self.assertIn(info, rcvd_icmp_pkts)
86 loopbacks = self.create_loopback_interfaces(20)
88 i.local_ip4_prefix_len = 32
92 # read (check sw if dump, ip4 fib, ip6 fib)
93 if_dump = self.vapi.sw_interface_dump()
94 fib4_dump = self.vapi.ip_fib_dump()
96 self.assertTrue(i.is_interface_config_in_dump(if_dump))
97 self.assertTrue(i.is_ip4_entry_in_fib_dump(fib4_dump))
100 stream = self.create_icmp_stream(self.pg0, loopbacks)
101 self.pg0.add_stream(stream)
102 self.pg_enable_capture(self.pg_interfaces)
104 capture = self.pg0.get_capture(expected_count=len(stream))
106 self.verify_icmp(capture, self.pg0, loopbacks)
110 i.remove_vpp_config()
112 # read (check not in sw if dump, ip4 fib, ip6 fib)
113 if_dump = self.vapi.sw_interface_dump()
114 fib4_dump = self.vapi.ip_fib_dump()
116 self.assertFalse(i.is_interface_config_in_dump(if_dump))
117 self.assertFalse(i.is_ip4_entry_in_fib_dump(fib4_dump))
120 stream = self.create_icmp_stream(self.pg0, loopbacks)
121 self.pg0.add_stream(stream)
122 self.pg_enable_capture(self.pg_interfaces)
124 self.pg0.assert_nothing_captured()
128 loopbacks = self.create_loopback_interfaces(20)
130 i.local_ip4_prefix_len = 32
139 # read (check not in sw if dump, ip4 fib, ip6 fib)
140 if_dump = self.vapi.sw_interface_dump()
141 fib4_dump = self.vapi.ip_fib_dump()
143 self.assertTrue(i.is_interface_config_in_dump(if_dump))
144 self.assertFalse(i.is_ip4_entry_in_fib_dump(fib4_dump))
147 stream = self.create_icmp_stream(self.pg0, loopbacks)
148 self.pg0.add_stream(stream)
149 self.pg_enable_capture(self.pg_interfaces)
151 self.pg0.assert_nothing_captured()
154 if __name__ == '__main__':
155 unittest.main(testRunner=VppTestRunner)