def __init__(self, test, src_addr, grp_addr, grp_addr_len, e_flags, paths, table_id=0, rpf_id=0): self._test = test self.paths = paths self.table_id = table_id self.e_flags = e_flags self.rpf_id = rpf_id self.prefix = VppIpMPrefix(src_addr, grp_addr, grp_addr_len) self.encoded_paths = [] for path in self.paths: self.encoded_paths.append(path.encode())
def find_mroute(test, grp_addr, src_addr, grp_addr_len, table_id=0): ip_mprefix = VppIpMPrefix(text_type(src_addr), text_type(grp_addr), grp_addr_len) if 4 == ip_mprefix.version: routes = test.vapi.ip_mroute_dump(table_id, False) else: routes = test.vapi.ip_mroute_dump(table_id, True) for e in routes: if table_id == e.route.table_id and ip_mprefix == e.route.prefix: return True return False
class VppIpMRoute(VppObject): """ IP Multicast Route """ def __init__(self, test, src_addr, grp_addr, grp_addr_len, e_flags, paths, table_id=0, rpf_id=0): self._test = test self.paths = paths self.table_id = table_id self.e_flags = e_flags self.rpf_id = rpf_id self.prefix = VppIpMPrefix(src_addr, grp_addr, grp_addr_len) self.encoded_paths = [] for path in self.paths: self.encoded_paths.append(path.encode()) def add_vpp_config(self): r = self._test.vapi.ip_mroute_add_del(self.table_id, self.prefix.encode(), self.e_flags, self.rpf_id, self.encoded_paths, is_add=1) self.stats_index = r.stats_index self._test.registry.register(self, self._test.logger) def remove_vpp_config(self): self._test.vapi.ip_mroute_add_del(self.table_id, self.prefix.encode(), self.e_flags, self.rpf_id, self.encoded_paths, is_add=0) def update_entry_flags(self, flags): self.e_flags = flags self._test.vapi.ip_mroute_add_del(self.table_id, self.prefix.encode(), self.e_flags, self.rpf_id, [], is_add=1) def update_rpf_id(self, rpf_id): self.rpf_id = rpf_id self._test.vapi.ip_mroute_add_del(self.table_id, self.prefix.encode(), self.e_flags, self.rpf_id, [], is_add=1) def update_path_flags(self, itf, flags): for p in range(len(self.paths)): if self.paths[p].nh_itf == itf: self.paths[p].nh_i_flags = flags self.encoded_paths[p] = self.paths[p].encode() break self._test.vapi.ip_mroute_add_del(self.table_id, self.prefix.encode(), self.e_flags, self.rpf_id, [self.encoded_paths[p]], is_add=1, is_multipath=0) def query_vpp_config(self): return find_mroute(self._test, self.prefix.gaddr, self.prefix.saddr, self.prefix.length, self.table_id) def object_id(self): return ("%d:(%s,%s/%d)" % (self.table_id, self.prefix.saddr, self.prefix.gaddr, self.prefix.length)) def get_stats(self): c = self._test.statistics.get_counter("/net/mroute") return c[0][self.stats_index]