diff options
author | Neale Ranns <nranns@cisco.com> | 2018-06-07 23:48:20 -0700 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2018-07-09 21:10:53 +0000 |
commit | 947ea6222dad1ef04595c34273e9231395aef443 (patch) | |
tree | 8990854b2901ff8cc2241b9abfc99b0b4b54d517 /test/vpp_igmp.py | |
parent | dd47ecadcf63772a6037a1bb3715772d80e87f51 (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.py | 75 |
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() |