DPO_PROTO_NSH = 5
+class MplsLspMode:
+ PIPE = 0
+ UNIFORM = 1
+
+
def find_route(test, ip_addr, len, table_id=0, inet=AF_INET):
if inet == AF_INET:
s = 4
self.table_id))
+class VppMplsLabel(object):
+ def __init__(self, value, mode=MplsLspMode.PIPE, ttl=64, exp=0):
+ self.value = value
+ self.mode = mode
+ self.ttl = ttl
+ self.exp = exp
+
+ def encode(self):
+ is_uniform = 0 if self.mode is MplsLspMode.PIPE else 1
+ return {'label': self.value,
+ 'ttl': self.ttl,
+ 'exp': self.exp,
+ 'is_uniform': is_uniform}
+
+
class VppRoutePath(object):
def __init__(
self.next_hop_id = next_hop_id
self.is_dvr = is_dvr
+ def encode_labels(self):
+ lstack = []
+ for l in self.nh_labels:
+ if type(l) == VppMplsLabel:
+ lstack.append(l.encode())
+ else:
+ lstack.append({'label': l,
+ 'ttl': 255})
+ return lstack
+
+ def encode(self):
+ return {'next_hop': self.nh_addr,
+ 'weight': 1,
+ 'afi': 0,
+ 'preference': 0,
+ 'table_id': self.nh_table_id,
+ 'next_hop_id': self.next_hop_id,
+ 'sw_if_index': self.nh_itf,
+ 'afi': self.proto,
+ 'is_udp_encap': self.is_udp_encap,
+ 'n_labels': len(self.nh_labels),
+ 'label_stack': self.encode_labels()}
+
class VppMRoutePath(VppRoutePath):
def __init__(self, nh_sw_if_index, flags,
+ nh=None,
proto=DpoProto.DPO_PROTO_IP4,
bier_imp=0):
- super(VppMRoutePath, self).__init__(
- "::" if proto is DpoProto.DPO_PROTO_IP6 else "0.0.0.0",
- nh_sw_if_index,
- proto=proto)
+ if not nh:
+ nh = "::" if proto is DpoProto.DPO_PROTO_IP6 else "0.0.0.0"
+ super(VppMRoutePath, self).__init__(nh,
+ nh_sw_if_index,
+ proto=proto)
self.nh_i_flags = flags
self.bier_imp = bier_imp
is_ipv6=self.is_ip6)
else:
for path in self.paths:
+ lstack = path.encode_labels()
+
self._test.vapi.ip_add_del_route(
self.dest_addr,
self.dest_addr_len,
path.nh_addr,
path.nh_itf,
table_id=self.table_id,
- next_hop_out_label_stack=path.nh_labels,
- next_hop_n_out_labels=len(
- path.nh_labels),
+ next_hop_out_label_stack=lstack,
+ next_hop_n_out_labels=len(lstack),
next_hop_via_label=path.nh_via_label,
next_hop_table_id=path.nh_table_id,
next_hop_id=path.next_hop_id,
self.e_flags,
path.proto,
path.nh_itf,
+ path.nh_addr,
path.nh_i_flags,
bier_imp=path.bier_imp,
rpf_id=self.rpf_id,
self.e_flags,
path.proto,
path.nh_itf,
+ path.nh_addr,
path.nh_i_flags,
table_id=self.table_id,
bier_imp=path.bier_imp,
self.e_flags,
0,
0xffffffff,
+ "",
0,
table_id=self.table_id,
is_ipv6=self.is_ip6)
self.e_flags,
0,
0xffffffff,
+ "",
0,
rpf_id=self.rpf_id,
table_id=self.table_id,
self.e_flags,
path.proto,
path.nh_itf,
+ path.nh_addr,
path.nh_i_flags,
table_id=self.table_id,
is_ipv6=self.is_ip6)
def add_vpp_config(self):
is_multipath = len(self.paths) > 1
for path in self.paths:
+ lstack = path.encode_labels()
+
self._test.vapi.mpls_route_add_del(
self.local_label,
self.eos_bit,
table_id=self.table_id,
is_interface_rx=path.is_interface_rx,
is_rpf_id=path.is_rpf_id,
- next_hop_out_label_stack=path.nh_labels,
- next_hop_n_out_labels=len(
- path.nh_labels),
+ next_hop_out_label_stack=lstack,
+ next_hop_n_out_labels=len(lstack),
next_hop_via_label=path.nh_via_label,
next_hop_table_id=path.nh_table_id)
self._test.registry.register(self, self._test.logger)