aboutsummaryrefslogtreecommitdiffstats
path: root/test/vpp_igmp.py
diff options
context:
space:
mode:
authorNeale Ranns <nranns@cisco.com>2018-06-07 23:48:20 -0700
committerFlorin Coras <florin.coras@gmail.com>2018-07-09 21:10:53 +0000
commit947ea6222dad1ef04595c34273e9231395aef443 (patch)
tree8990854b2901ff8cc2241b9abfc99b0b4b54d517 /test/vpp_igmp.py
parentdd47ecadcf63772a6037a1bb3715772d80e87f51 (diff)
IGMP improvements
- Enable/Disable an interface for IGMP - improve logging - refactor common code - no orphaned timers - IGMP state changes in main thread only - Large groups split over multiple state-change reports - SSM range configuration API. - more tests Change-Id: If5674f1044e7e97274a711f47807c9ba689d7b9a Signed-off-by: Neale Ranns <nranns@cisco.com>
Diffstat (limited to 'test/vpp_igmp.py')
-rw-r--r--test/vpp_igmp.py75
1 files changed, 58 insertions, 17 deletions
diff --git a/test/vpp_igmp.py b/test/vpp_igmp.py
index d1a308878c5..8f0191644bd 100644
--- a/test/vpp_igmp.py
+++ b/test/vpp_igmp.py
@@ -1,39 +1,80 @@
from vpp_object import VppObject
+import socket
+
+
+class IGMP_MODE:
+ ROUTER = 0
+ HOST = 1
+
+
+class IGMP_FILTER:
+ INCLUDE = 1
+ EXCLUDE = 0
+
+
+def find_igmp_state(states, itf, gaddr, saddr):
+ for s in states:
+ if s.sw_if_index == itf.sw_if_index and \
+ s.gaddr.address == socket.inet_pton(socket.AF_INET, gaddr) and \
+ s.saddr.address == socket.inet_pton(socket.AF_INET, saddr):
+ return True
+ return False
+
+
+def wait_for_igmp_event(test, timeout, itf, gaddr, saddr, ff):
+ ev = test.vapi.wait_for_event(timeout, "igmp_event")
+ if ev.sw_if_index == itf.sw_if_index and \
+ ev.gaddr.address == socket.inet_pton(socket.AF_INET, gaddr) and \
+ ev.saddr.address == socket.inet_pton(socket.AF_INET, saddr) and \
+ ev.filter == ff:
+ return True
+ return False
class IgmpSG():
- def __init__(self, saddr, gaddr):
- self.saddr = saddr
+ def __init__(self, gaddr, saddrs):
self.gaddr = gaddr
+ self.gaddr_p = socket.inet_pton(socket.AF_INET, gaddr)
+ self.saddrs = saddrs
+ self.saddrs_p = []
+ self.saddrs_encoded = []
+ for s in saddrs:
+ ss = socket.inet_pton(socket.AF_INET, s)
+ self.saddrs_p.append(ss)
+ self.saddrs_encoded.append({'address': ss})
+
+class IgmpRecord():
+ def __init__(self, sg, type):
+ self.sg = sg
+ self.type = type
-class VppIgmpConfig(VppObject):
- def __init__(self, test, sw_if_index, sg=None):
+
+class VppHostState(VppObject):
+ def __init__(self, test, filter, sw_if_index, sg):
self._test = test
self.sw_if_index = sw_if_index
- if isinstance(sg, list):
- self.sg_list = sg
- else:
- self.sg_list = []
- self.sg_list.append(sg)
-
- def add_sg(self, sg):
- self.sg.append(sg)
+ self.filter = filter
+ self.sg = sg
def add_vpp_config(self):
- for e in self.sg_list:
- self._test.vapi.igmp_listen(
- 1, self.sw_if_index, e.saddr, e.gaddr)
+ self._test.vapi.igmp_listen(
+ self.filter, self.sw_if_index,
+ self.sg.saddrs_encoded, self.sg.gaddr_p)
def remove_vpp_config(self):
- self._test.vapi.igmp_clear_interface(self.sw_if_index)
+ self._test.vapi.igmp_listen(
+ self.filter,
+ self.sw_if_index,
+ [],
+ self.sg.gaddr_p)
def __str__(self):
return self.object_id()
def object_id(self):
- return "%s:%d" % (self.sg_list, self.sw_if_index)
+ return "%s:%d" % (self.sg, self.sw_if_index)
def query_vpp_config(self):
return self._test.vapi.igmp_dump()