import socket
from vpp_object import VppObject
+from vpp_ip_route import MPLS_LABEL_INVALID, VppRoutePath, VppMplsLabel
class BIER_HDR_PAYLOAD:
class VppBierTableID():
- def __init__(self, set_id, sub_domain_id, hdr_len_id):
+ def __init__(self, sub_domain_id, set_id, hdr_len_id):
self.set_id = set_id
self.sub_domain_id = sub_domain_id
self.hdr_len_id = hdr_len_id
BIER route
"""
- def __init__(self, test, tbl_id, bp, nh, out_label,
- disp_table=0):
+ def __init__(self, test, tbl_id, bp, paths):
self._test = test
self.tbl_id = tbl_id
- self.out_label = out_label
self.bp = bp
- self.disp_table = disp_table
- self.nh = socket.inet_pton(socket.AF_INET, nh)
+ self.paths = paths
+
+ def encode_path(self, p):
+ lstack = []
+ for l in p.nh_labels:
+ if type(l) == VppMplsLabel:
+ lstack.append(l.encode())
+ else:
+ lstack.append({'label': l, 'ttl': 255})
+ n_labels = len(lstack)
+ while (len(lstack) < 16):
+ lstack.append({})
+ return {'next_hop': p.nh_addr,
+ 'weight': 1,
+ 'afi': p.proto,
+ 'sw_if_index': 0xffffffff,
+ 'preference': 0,
+ 'table_id': p.nh_table_id,
+ 'next_hop_id': p.next_hop_id,
+ 'is_udp_encap': p.is_udp_encap,
+ 'n_labels': n_labels,
+ 'label_stack': lstack}
+
+ def encode_paths(self):
+ br_paths = []
+ for p in self.paths:
+ br_paths.append(self.encode_path(p))
+ return br_paths
def add_vpp_config(self):
self._test.vapi.bier_route_add_del(
self.tbl_id,
self.bp,
- self.nh,
- self.out_label,
- self.disp_table,
+ self.encode_paths(),
is_add=1)
self._test.registry.register(self, self._test.logger)
self._test.vapi.bier_route_add_del(
self.tbl_id,
self.bp,
- self.nh,
- self.out_label,
- self.disp_table,
+ self.encode_paths(),
is_add=0)
+ def update_paths(self, paths):
+ self.paths = paths
+ self._test.vapi.bier_route_add_del(
+ self.tbl_id,
+ self.bp,
+ self.encode_paths(),
+ is_replace=1)
+
+ def add_path(self, path):
+ self._test.vapi.bier_route_add_del(
+ self.tbl_id,
+ self.bp,
+ [self.encode_path(path)],
+ is_add=1,
+ is_replace=0)
+ self.paths.append(path)
+ self._test.registry.register(self, self._test.logger)
+
+ def remove_path(self, path):
+ self._test.vapi.bier_route_add_del(
+ self.tbl_id,
+ self.bp,
+ [self.encode_path(path)],
+ is_add=0,
+ is_replace=0)
+ self.paths.remove(path)
+
+ def remove_all_paths(self):
+ self._test.vapi.bier_route_add_del(
+ self.tbl_id,
+ self.bp,
+ [],
+ is_add=0,
+ is_replace=1)
+ self.paths = []
+
def __str__(self):
return self.object_id()
BIER Disposition Entry
"""
- def __init__(self, test, tbl_id, bp, payload_proto, nh, nh_tbl,
- rpf_id=~0):
+ def __init__(self, test, tbl_id, bp, payload_proto, nh_proto,
+ nh, nh_tbl, rpf_id=~0):
self._test = test
self.tbl_id = tbl_id
self.nh_tbl = nh_tbl
+ self.nh_proto = nh_proto
self.bp = bp
self.payload_proto = payload_proto
self.rpf_id = rpf_id
self.tbl_id,
self.bp,
self.payload_proto,
+ self.nh_proto,
self.nh,
self.nh_tbl,
self.rpf_id,
self.tbl_id,
self.bp,
self.payload_proto,
+ self.nh_proto,
self.nh,
self.nh_tbl,
self.rpf_id,