blob: 4566377f895a2073ea5721830a3f49f89a0bf5b9 [file] [log] [blame]
Renato Botelho do Coutoead1e532019-10-31 13:31:07 -05001#!/usr/bin/env python3
Eyal Baric86e5922017-07-02 18:33:16 +03002""" L2BD ARP term Test """
3
4import unittest
Eyal Baric86e5922017-07-02 18:33:16 +03005
Dave Wallace8800f732023-08-31 00:47:44 -04006from socket import AF_INET6, inet_pton, inet_ntop
Eyal Bari758137a2017-07-05 14:31:30 +03007
Eyal Baric86e5922017-07-02 18:33:16 +03008from scapy.layers.l2 import Ether, ARP
Klement Sekerad9b0c6f2022-04-26 19:02:15 +02009from scapy.utils6 import (
10 in6_getnsma,
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020011 in6_ptop,
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020012)
13from scapy.layers.inet6 import (
14 IPv6,
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020015 ICMPv6ND_NS,
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020016 ICMPv6NDOptSrcLLAddr,
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020017 ICMPv6NDOptSrcLLAddr,
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020018 ICMPv6ND_NA,
19 ICMPv6NDOptDstLLAddr,
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020020)
Eyal Baric86e5922017-07-02 18:33:16 +030021
Dave Wallace8800f732023-08-31 00:47:44 -040022from framework import VppTestCase
23from asfframework import VppTestRunner
24from util import Host
Eyal Baric86e5922017-07-02 18:33:16 +030025
26
27class TestL2bdArpTerm(VppTestCase):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020028 """L2BD arp termination Test Case"""
Eyal Baric86e5922017-07-02 18:33:16 +030029
30 @classmethod
31 def setUpClass(cls):
32 """
33 Perform standard class setup (defined by class method setUpClass in
34 class VppTestCase) before running the test case, set test case related
35 variables and configure VPP.
36 """
37 super(TestL2bdArpTerm, cls).setUpClass()
38
39 try:
40 # Create pg interfaces
41 n_bd = 1
42 cls.ifs_per_bd = ifs_per_bd = 3
43 n_ifs = n_bd * ifs_per_bd
44 cls.create_pg_interfaces(range(n_ifs))
45
46 # Set up all interfaces
47 for i in cls.pg_interfaces:
48 i.admin_up()
49
50 cls.hosts = set()
51
52 except Exception:
53 super(TestL2bdArpTerm, cls).tearDownClass()
54 raise
55
Paul Vinciguerra7f9b7f92019-03-12 19:23:27 -070056 @classmethod
57 def tearDownClass(cls):
58 super(TestL2bdArpTerm, cls).tearDownClass()
59
Eyal Baric86e5922017-07-02 18:33:16 +030060 def setUp(self):
61 """
62 Clear trace and packet infos before running each test.
63 """
64 self.reset_packet_infos()
65 super(TestL2bdArpTerm, self).setUp()
66
67 def tearDown(self):
68 """
69 Show various debug prints after each test.
70 """
71 super(TestL2bdArpTerm, self).tearDown()
Paul Vinciguerra90cf21b2019-03-13 09:23:05 -070072
73 def show_commands_at_teardown(self):
74 self.logger.info(self.vapi.ppcli("show l2fib verbose"))
Paul Vinciguerra9673e3e2019-05-10 20:41:08 -040075 # many tests delete bridge-domain 1 as the last task. don't output
76 # the details of a non-existent bridge-domain.
77 if self.vapi.l2_fib_table_dump(bd_id=1):
78 self.logger.info(self.vapi.ppcli("show bridge-domain 1 detail"))
Eyal Baric86e5922017-07-02 18:33:16 +030079
Eyal Bari758137a2017-07-05 14:31:30 +030080 def add_del_arp_term_hosts(self, entries, bd_id=1, is_add=1, is_ipv6=0):
Eyal Baric86e5922017-07-02 18:33:16 +030081 for e in entries:
Neale Ranns4d5b9172018-10-24 02:57:49 -070082 ip = e.ip4 if is_ipv6 == 0 else e.ip6
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020083 self.vapi.bd_ip_mac_add_del(
84 is_add=is_add, entry={"bd_id": bd_id, "ip": ip, "mac": e.mac}
85 )
Eyal Baric86e5922017-07-02 18:33:16 +030086
87 @classmethod
88 def mac_list(cls, b6_range):
89 return ["00:00:ca:fe:00:%02x" % b6 for b6 in b6_range]
90
91 @classmethod
92 def ip4_host(cls, subnet, host, mac):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020093 return Host(mac=mac, ip4="172.17.1%02u.%u" % (subnet, host))
Eyal Baric86e5922017-07-02 18:33:16 +030094
95 @classmethod
96 def ip4_hosts(cls, subnet, start, mac_list):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +020097 return {
98 cls.ip4_host(subnet, start + j, mac_list[j]) for j in range(len(mac_list))
99 }
Eyal Baric86e5922017-07-02 18:33:16 +0300100
101 @classmethod
Eyal Bari758137a2017-07-05 14:31:30 +0300102 def ip6_host(cls, subnet, host, mac):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200103 return Host(mac=mac, ip6="fd01:%x::%x" % (subnet, host))
Eyal Bari758137a2017-07-05 14:31:30 +0300104
105 @classmethod
106 def ip6_hosts(cls, subnet, start, mac_list):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200107 return {
108 cls.ip6_host(subnet, start + j, mac_list[j]) for j in range(len(mac_list))
109 }
Eyal Bari758137a2017-07-05 14:31:30 +0300110
111 @classmethod
Eyal Baric86e5922017-07-02 18:33:16 +0300112 def bd_swifs(cls, b):
113 n = cls.ifs_per_bd
114 start = (b - 1) * n
115 return [cls.pg_interfaces[j] for j in range(start, start + n)]
116
117 def bd_add_del(self, bd_id=1, is_add=1):
118 if is_add:
Laszlo Kiraly0f8f4352022-09-16 13:20:07 +0200119 self.vapi.bridge_domain_add_del_v2(
120 bd_id=bd_id, is_add=is_add, flood=1, uu_flood=1, forward=1, learn=1
121 )
Eyal Baric86e5922017-07-02 18:33:16 +0300122 for swif in self.bd_swifs(bd_id):
123 swif_idx = swif.sw_if_index
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200124 self.vapi.sw_interface_set_l2_bridge(
125 rx_sw_if_index=swif_idx, bd_id=bd_id, enable=is_add
126 )
Eyal Baric86e5922017-07-02 18:33:16 +0300127 if not is_add:
Laszlo Kiraly0f8f4352022-09-16 13:20:07 +0200128 self.vapi.bridge_domain_add_del_v2(bd_id=bd_id, is_add=is_add)
Eyal Baric86e5922017-07-02 18:33:16 +0300129
130 @classmethod
Eyal Bari20197482017-09-13 12:29:08 +0300131 def arp_req(cls, src_host, host):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200132 return Ether(dst="ff:ff:ff:ff:ff:ff", src=src_host.mac) / ARP(
133 op="who-has", hwsrc=src_host.bin_mac, pdst=host.ip4, psrc=src_host.ip4
134 )
Eyal Baric86e5922017-07-02 18:33:16 +0300135
136 @classmethod
137 def arp_reqs(cls, src_host, entries):
Eyal Bari20197482017-09-13 12:29:08 +0300138 return [cls.arp_req(src_host, e) for e in entries]
139
140 @classmethod
141 def garp_req(cls, host):
142 return cls.arp_req(host, host)
143
144 @classmethod
145 def garp_reqs(cls, entries):
146 return [cls.garp_req(e) for e in entries]
Eyal Baric86e5922017-07-02 18:33:16 +0300147
Eyal Bari758137a2017-07-05 14:31:30 +0300148 def arp_resp_host(self, src_host, arp_resp):
Eyal Baric86e5922017-07-02 18:33:16 +0300149 ether = arp_resp[Ether]
150 self.assertEqual(ether.dst, src_host.mac)
151
152 arp = arp_resp[ARP]
153 self.assertEqual(arp.hwtype, 1)
154 self.assertEqual(arp.ptype, 0x800)
155 self.assertEqual(arp.hwlen, 6)
156 self.assertEqual(arp.plen, 4)
157 arp_opts = {"who-has": 1, "is-at": 2}
158 self.assertEqual(arp.op, arp_opts["is-at"])
159 self.assertEqual(arp.hwdst, src_host.mac)
160 self.assertEqual(arp.pdst, src_host.ip4)
Eyal Bari758137a2017-07-05 14:31:30 +0300161 return Host(mac=arp.hwsrc, ip4=arp.psrc)
Eyal Baric86e5922017-07-02 18:33:16 +0300162
163 def arp_resp_hosts(self, src_host, pkts):
Eyal Bari758137a2017-07-05 14:31:30 +0300164 return {self.arp_resp_host(src_host, p) for p in pkts}
165
Paul Vinciguerra9db94452018-11-25 10:46:44 -0800166 @staticmethod
167 def inttoip4(ip):
Eyal Bari20197482017-09-13 12:29:08 +0300168 o1 = int(ip / 16777216) % 256
169 o2 = int(ip / 65536) % 256
170 o3 = int(ip / 256) % 256
171 o4 = int(ip) % 256
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200172 return "%s.%s.%s.%s" % (o1, o2, o3, o4)
Eyal Bari20197482017-09-13 12:29:08 +0300173
174 def arp_event_host(self, e):
Neale Ranns37029302018-08-10 05:30:06 -0700175 return Host(str(e.mac), ip4=str(e.ip))
Eyal Bari20197482017-09-13 12:29:08 +0300176
177 def arp_event_hosts(self, evs):
178 return {self.arp_event_host(e) for e in evs}
179
Eyal Baric125ecc2017-09-20 11:29:17 +0300180 def nd_event_host(self, e):
Neale Ranns37029302018-08-10 05:30:06 -0700181 return Host(str(e.mac), ip6=str(e.ip))
Eyal Baric125ecc2017-09-20 11:29:17 +0300182
183 def nd_event_hosts(self, evs):
184 return {self.nd_event_host(e) for e in evs}
185
Eyal Bari758137a2017-07-05 14:31:30 +0300186 @classmethod
187 def ns_req(cls, src_host, host):
188 nsma = in6_getnsma(inet_pton(AF_INET6, "fd10::ffff"))
189 d = inet_ntop(AF_INET6, nsma)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200190 return (
191 Ether(dst="ff:ff:ff:ff:ff:ff", src=src_host.mac)
192 / IPv6(dst=d, src=src_host.ip6)
193 / ICMPv6ND_NS(tgt=host.ip6)
194 / ICMPv6NDOptSrcLLAddr(lladdr=src_host.mac)
195 )
Eyal Bari758137a2017-07-05 14:31:30 +0300196
197 @classmethod
Eyal Baric125ecc2017-09-20 11:29:17 +0300198 def ns_reqs_dst(cls, entries, dst_host):
199 return [cls.ns_req(e, dst_host) for e in entries]
200
201 @classmethod
202 def ns_reqs_src(cls, src_host, entries):
Eyal Bari758137a2017-07-05 14:31:30 +0300203 return [cls.ns_req(src_host, e) for e in entries]
204
205 def na_resp_host(self, src_host, rx):
206 self.assertEqual(rx[Ether].dst, src_host.mac)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200207 self.assertEqual(in6_ptop(rx[IPv6].dst), in6_ptop(src_host.ip6))
Eyal Bari758137a2017-07-05 14:31:30 +0300208
209 self.assertTrue(rx.haslayer(ICMPv6ND_NA))
210 self.assertTrue(rx.haslayer(ICMPv6NDOptDstLLAddr))
211
212 na = rx[ICMPv6ND_NA]
213 return Host(mac=na.lladdr, ip6=na.tgt)
214
215 def na_resp_hosts(self, src_host, pkts):
216 return {self.na_resp_host(src_host, p) for p in pkts}
Eyal Baric86e5922017-07-02 18:33:16 +0300217
218 def set_bd_flags(self, bd_id, **args):
219 """
220 Enable/disable defined feature(s) of the bridge domain.
221
222 :param int bd_id: Bridge domain ID.
223 :param list args: List of feature/status pairs. Allowed features: \
224 learn, forward, flood, uu_flood and arp_term. Status False means \
225 disable, status True means enable the feature.
226 :raise: ValueError in case of unknown feature in the input.
227 """
228 for flag in args:
229 if flag == "learn":
230 feature_bitmap = 1 << 0
231 elif flag == "forward":
232 feature_bitmap = 1 << 1
233 elif flag == "flood":
234 feature_bitmap = 1 << 2
235 elif flag == "uu_flood":
236 feature_bitmap = 1 << 3
237 elif flag == "arp_term":
238 feature_bitmap = 1 << 4
239 else:
240 raise ValueError("Unknown feature used: %s" % flag)
241 is_set = 1 if args[flag] else 0
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200242 self.vapi.bridge_flags(bd_id=bd_id, is_set=is_set, flags=feature_bitmap)
Eyal Baric86e5922017-07-02 18:33:16 +0300243 self.logger.info("Bridge domain ID %d updated" % bd_id)
244
245 def verify_arp(self, src_host, req_hosts, resp_hosts, bd_id=1):
246 reqs = self.arp_reqs(src_host, req_hosts)
247
248 for swif in self.bd_swifs(bd_id):
249 swif.add_stream(reqs)
250
251 self.pg_enable_capture(self.pg_interfaces)
252 self.pg_start()
253
254 for swif in self.bd_swifs(bd_id):
255 resp_pkts = swif.get_capture(len(resp_hosts))
256 resps = self.arp_resp_hosts(src_host, resp_pkts)
257 self.assertEqual(len(resps ^ resp_hosts), 0)
258
Eyal Bari758137a2017-07-05 14:31:30 +0300259 def verify_nd(self, src_host, req_hosts, resp_hosts, bd_id=1):
Eyal Baric125ecc2017-09-20 11:29:17 +0300260 reqs = self.ns_reqs_src(src_host, req_hosts)
Eyal Bari758137a2017-07-05 14:31:30 +0300261
262 for swif in self.bd_swifs(bd_id):
263 swif.add_stream(reqs)
264
265 self.pg_enable_capture(self.pg_interfaces)
266 self.pg_start()
267
268 for swif in self.bd_swifs(bd_id):
269 resp_pkts = swif.get_capture(len(resp_hosts))
270 resps = self.na_resp_hosts(src_host, resp_pkts)
271 self.assertEqual(len(resps ^ resp_hosts), 0)
272
Eyal Baric86e5922017-07-02 18:33:16 +0300273 def test_l2bd_arp_term_01(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200274 """L2BD arp term - add 5 hosts, verify arp responses"""
Eyal Baric86e5922017-07-02 18:33:16 +0300275 src_host = self.ip4_host(50, 50, "00:00:11:22:33:44")
276 self.bd_add_del(1, is_add=1)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200277 self.set_bd_flags(1, arp_term=True, flood=False, uu_flood=False, learn=False)
Eyal Baric86e5922017-07-02 18:33:16 +0300278 macs = self.mac_list(range(1, 5))
279 hosts = self.ip4_hosts(4, 1, macs)
280 self.add_del_arp_term_hosts(hosts, is_add=1)
Neale Ranns4d5b9172018-10-24 02:57:49 -0700281
Eyal Baric86e5922017-07-02 18:33:16 +0300282 self.verify_arp(src_host, hosts, hosts)
283 type(self).hosts = hosts
284
285 def test_l2bd_arp_term_02(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200286 """L2BD arp term - delete 3 hosts, verify arp responses"""
Eyal Baric86e5922017-07-02 18:33:16 +0300287 src_host = self.ip4_host(50, 50, "00:00:11:22:33:44")
288 macs = self.mac_list(range(1, 3))
289 deleted = self.ip4_hosts(4, 1, macs)
290 self.add_del_arp_term_hosts(deleted, is_add=0)
291 remaining = self.hosts - deleted
292 self.verify_arp(src_host, self.hosts, remaining)
293 type(self).hosts = remaining
294 self.bd_add_del(1, is_add=0)
295
296 def test_l2bd_arp_term_03(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200297 """L2BD arp term - recreate BD1, readd 3 hosts, verify arp responses"""
Eyal Baric86e5922017-07-02 18:33:16 +0300298 src_host = self.ip4_host(50, 50, "00:00:11:22:33:44")
299 self.bd_add_del(1, is_add=1)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200300 self.set_bd_flags(1, arp_term=True, flood=False, uu_flood=False, learn=False)
Eyal Baric86e5922017-07-02 18:33:16 +0300301 macs = self.mac_list(range(1, 3))
302 readded = self.ip4_hosts(4, 1, macs)
303 self.add_del_arp_term_hosts(readded, is_add=1)
304 self.verify_arp(src_host, self.hosts | readded, readded)
305 type(self).hosts = readded
306
307 def test_l2bd_arp_term_04(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200308 """L2BD arp term - 2 IP4 addrs per host"""
Eyal Baric86e5922017-07-02 18:33:16 +0300309 src_host = self.ip4_host(50, 50, "00:00:11:22:33:44")
310 macs = self.mac_list(range(1, 3))
311 sub5_hosts = self.ip4_hosts(5, 1, macs)
312 self.add_del_arp_term_hosts(sub5_hosts, is_add=1)
313 hosts = self.hosts | sub5_hosts
314 self.verify_arp(src_host, hosts, hosts)
315 type(self).hosts = hosts
316 self.bd_add_del(1, is_add=0)
317
318 def test_l2bd_arp_term_05(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200319 """L2BD arp term - create and update 10 IP4-mac pairs"""
Eyal Baric86e5922017-07-02 18:33:16 +0300320 src_host = self.ip4_host(50, 50, "00:00:11:22:33:44")
321 self.bd_add_del(1, is_add=1)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200322 self.set_bd_flags(1, arp_term=True, flood=False, uu_flood=False, learn=False)
Eyal Baric86e5922017-07-02 18:33:16 +0300323 macs1 = self.mac_list(range(10, 20))
324 hosts1 = self.ip4_hosts(5, 1, macs1)
325 self.add_del_arp_term_hosts(hosts1, is_add=1)
326 self.verify_arp(src_host, hosts1, hosts1)
327 macs2 = self.mac_list(range(20, 30))
328 hosts2 = self.ip4_hosts(5, 1, macs2)
329 self.add_del_arp_term_hosts(hosts2, is_add=1)
330 self.verify_arp(src_host, hosts1, hosts2)
331 self.bd_add_del(1, is_add=0)
332
Eyal Bari758137a2017-07-05 14:31:30 +0300333 def test_l2bd_arp_term_06(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200334 """L2BD arp/ND term - hosts with both ip4/ip6"""
Eyal Bari758137a2017-07-05 14:31:30 +0300335 src_host4 = self.ip4_host(50, 50, "00:00:11:22:33:44")
336 src_host6 = self.ip6_host(50, 50, "00:00:11:22:33:44")
337 self.bd_add_del(1, is_add=1)
338 # enable flood to make sure requests are not flooded
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200339 self.set_bd_flags(1, arp_term=True, flood=True, uu_flood=False, learn=False)
Eyal Bari758137a2017-07-05 14:31:30 +0300340 macs = self.mac_list(range(10, 20))
341 hosts6 = self.ip6_hosts(5, 1, macs)
342 hosts4 = self.ip4_hosts(5, 1, macs)
343 self.add_del_arp_term_hosts(hosts4, is_add=1)
344 self.add_del_arp_term_hosts(hosts6, is_add=1, is_ipv6=1)
345 self.verify_arp(src_host4, hosts4, hosts4)
346 self.verify_nd(src_host6, hosts6, hosts6)
347 self.bd_add_del(1, is_add=0)
348
349 def test_l2bd_arp_term_07(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200350 """L2BD ND term - Add and Del hosts, verify ND replies"""
Eyal Bari758137a2017-07-05 14:31:30 +0300351 src_host6 = self.ip6_host(50, 50, "00:00:11:22:33:44")
352 self.bd_add_del(1, is_add=1)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200353 self.set_bd_flags(1, arp_term=True, flood=False, uu_flood=False, learn=False)
Eyal Bari758137a2017-07-05 14:31:30 +0300354 macs = self.mac_list(range(10, 20))
355 hosts6 = self.ip6_hosts(5, 1, macs)
356 self.add_del_arp_term_hosts(hosts6, is_add=1, is_ipv6=1)
357 self.verify_nd(src_host6, hosts6, hosts6)
358 del_macs = self.mac_list(range(10, 15))
359 deleted = self.ip6_hosts(5, 1, del_macs)
360 self.add_del_arp_term_hosts(deleted, is_add=0, is_ipv6=1)
361 self.verify_nd(src_host6, hosts6, hosts6 - deleted)
362 self.bd_add_del(1, is_add=0)
363
364 def test_l2bd_arp_term_08(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200365 """L2BD ND term - Add and update IP+mac, verify ND replies"""
Eyal Bari758137a2017-07-05 14:31:30 +0300366 src_host = self.ip6_host(50, 50, "00:00:11:22:33:44")
367 self.bd_add_del(1, is_add=1)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200368 self.set_bd_flags(1, arp_term=True, flood=False, uu_flood=False, learn=False)
Eyal Bari758137a2017-07-05 14:31:30 +0300369 macs1 = self.mac_list(range(10, 20))
370 hosts = self.ip6_hosts(5, 1, macs1)
371 self.add_del_arp_term_hosts(hosts, is_add=1, is_ipv6=1)
372 self.verify_nd(src_host, hosts, hosts)
373 macs2 = self.mac_list(range(20, 30))
374 updated = self.ip6_hosts(5, 1, macs2)
375 self.add_del_arp_term_hosts(updated, is_add=1, is_ipv6=1)
376 self.verify_nd(src_host, hosts, updated)
377 self.bd_add_del(1, is_add=0)
378
Eyal Bari20197482017-09-13 12:29:08 +0300379 def test_l2bd_arp_term_09(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200380 """L2BD arp term - send garps, verify arp event reports"""
Neale Rannscbe25aa2019-09-30 10:53:31 +0000381 self.vapi.want_l2_arp_term_events(enable=1)
Eyal Bari20197482017-09-13 12:29:08 +0300382 self.bd_add_del(1, is_add=1)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200383 self.set_bd_flags(1, arp_term=True, flood=False, uu_flood=False, learn=False)
Eyal Bari20197482017-09-13 12:29:08 +0300384 macs = self.mac_list(range(90, 95))
385 hosts = self.ip4_hosts(5, 1, macs)
386
387 garps = self.garp_reqs(hosts)
388 self.bd_swifs(1)[0].add_stream(garps)
389
390 self.pg_enable_capture(self.pg_interfaces)
391 self.pg_start()
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200392 evs = [
393 self.vapi.wait_for_event(1, "l2_arp_term_event") for i in range(len(hosts))
394 ]
Eyal Bari20197482017-09-13 12:29:08 +0300395 ev_hosts = self.arp_event_hosts(evs)
396 self.assertEqual(len(ev_hosts ^ hosts), 0)
397
398 def test_l2bd_arp_term_10(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200399 """L2BD arp term - send duplicate garps, verify suppression"""
Eyal Bari20197482017-09-13 12:29:08 +0300400 macs = self.mac_list(range(70, 71))
401 hosts = self.ip4_hosts(6, 1, macs)
402
403 """ send the packet 5 times expect one event
404 """
405 garps = self.garp_reqs(hosts) * 5
406 self.bd_swifs(1)[0].add_stream(garps)
407
408 self.pg_enable_capture(self.pg_interfaces)
409 self.pg_start()
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200410 evs = [
411 self.vapi.wait_for_event(1, "l2_arp_term_event") for i in range(len(hosts))
412 ]
Eyal Bari20197482017-09-13 12:29:08 +0300413 ev_hosts = self.arp_event_hosts(evs)
414 self.assertEqual(len(ev_hosts ^ hosts), 0)
415
416 def test_l2bd_arp_term_11(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200417 """L2BD arp term - disable ip4 arp events,send garps, verify no events"""
Neale Rannscbe25aa2019-09-30 10:53:31 +0000418 self.vapi.want_l2_arp_term_events(enable=0)
Eyal Bari20197482017-09-13 12:29:08 +0300419 macs = self.mac_list(range(90, 95))
420 hosts = self.ip4_hosts(5, 1, macs)
421
422 garps = self.garp_reqs(hosts)
423 self.bd_swifs(1)[0].add_stream(garps)
424
425 self.pg_enable_capture(self.pg_interfaces)
426 self.pg_start()
427 self.sleep(1)
428 self.assertEqual(len(self.vapi.collect_events()), 0)
429 self.bd_add_del(1, is_add=0)
430
Eyal Baric125ecc2017-09-20 11:29:17 +0300431 def test_l2bd_arp_term_12(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200432 """L2BD ND term - send NS packets verify reports"""
Neale Rannscbe25aa2019-09-30 10:53:31 +0000433 self.vapi.want_l2_arp_term_events(enable=1)
Eyal Baric125ecc2017-09-20 11:29:17 +0300434 dst_host = self.ip6_host(50, 50, "00:00:11:22:33:44")
435 self.bd_add_del(1, is_add=1)
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200436 self.set_bd_flags(1, arp_term=True, flood=False, uu_flood=False, learn=False)
Eyal Baric125ecc2017-09-20 11:29:17 +0300437 macs = self.mac_list(range(10, 15))
438 hosts = self.ip6_hosts(5, 1, macs)
439 reqs = self.ns_reqs_dst(hosts, dst_host)
440 self.bd_swifs(1)[0].add_stream(reqs)
441
442 self.pg_enable_capture(self.pg_interfaces)
443 self.pg_start()
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200444 evs = [
445 self.vapi.wait_for_event(2, "l2_arp_term_event") for i in range(len(hosts))
446 ]
Eyal Baric125ecc2017-09-20 11:29:17 +0300447 ev_hosts = self.nd_event_hosts(evs)
448 self.assertEqual(len(ev_hosts ^ hosts), 0)
449
450 def test_l2bd_arp_term_13(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200451 """L2BD ND term - send duplicate ns, verify suppression"""
Eyal Baric125ecc2017-09-20 11:29:17 +0300452 dst_host = self.ip6_host(50, 50, "00:00:11:22:33:44")
Ole Troandf0191e2019-10-25 17:03:54 +0200453 macs = self.mac_list(range(16, 17))
Eyal Baric125ecc2017-09-20 11:29:17 +0300454 hosts = self.ip6_hosts(5, 1, macs)
455 reqs = self.ns_reqs_dst(hosts, dst_host) * 5
456 self.bd_swifs(1)[0].add_stream(reqs)
457
458 self.pg_enable_capture(self.pg_interfaces)
459 self.pg_start()
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200460 evs = [
461 self.vapi.wait_for_event(2, "l2_arp_term_event") for i in range(len(hosts))
462 ]
Eyal Baric125ecc2017-09-20 11:29:17 +0300463 ev_hosts = self.nd_event_hosts(evs)
464 self.assertEqual(len(ev_hosts ^ hosts), 0)
465
466 def test_l2bd_arp_term_14(self):
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200467 """L2BD ND term - disable ip4 arp events,send ns, verify no events"""
Neale Rannscbe25aa2019-09-30 10:53:31 +0000468 self.vapi.want_l2_arp_term_events(enable=0)
Eyal Baric125ecc2017-09-20 11:29:17 +0300469 dst_host = self.ip6_host(50, 50, "00:00:11:22:33:44")
470 macs = self.mac_list(range(10, 15))
471 hosts = self.ip6_hosts(5, 1, macs)
472 reqs = self.ns_reqs_dst(hosts, dst_host)
473 self.bd_swifs(1)[0].add_stream(reqs)
474
475 self.pg_enable_capture(self.pg_interfaces)
476 self.pg_start()
477 self.sleep(1)
478 self.assertEqual(len(self.vapi.collect_events()), 0)
479 self.bd_add_del(1, is_add=0)
480
Eyal Baric86e5922017-07-02 18:33:16 +0300481
Klement Sekerad9b0c6f2022-04-26 19:02:15 +0200482if __name__ == "__main__":
Eyal Baric86e5922017-07-02 18:33:16 +0300483 unittest.main(testRunner=VppTestRunner)