6 from vpp_object import VppObject
7 from vpp_ip_route import MPLS_LABEL_INVALID, VppRoutePath, VppMplsLabel
10 class BIER_HDR_PAYLOAD:
11 BIER_HDR_PROTO_MPLS_DOWN_STREAM = 1
12 BIER_HDR_PROTO_MPLS_UP_STREAM = 2
13 BIER_HDR_PROTO_ETHERNET = 3
14 BIER_HDR_PROTO_IPV4 = 4
15 BIER_HDR_PROTO_IPV6 = 5
16 BIER_HDR_PROTO_VXLAN = 6
17 BIER_HDR_PROTO_CTRL = 7
18 BIER_HDR_PROTO_OAM = 8
21 class VppBierTableID():
22 def __init__(self, sub_domain_id, set_id, hdr_len_id):
24 self.sub_domain_id = sub_domain_id
25 self.hdr_len_id = hdr_len_id
28 def find_bier_table(test, bti):
29 tables = test.vapi.bier_table_dump()
31 if bti.set_id == t.bt_tbl_id.bt_set \
32 and bti.sub_domain_id == t.bt_tbl_id.bt_sub_domain \
33 and bti.hdr_len_id == t.bt_tbl_id.bt_hdr_len_id:
38 def find_bier_route(test, bti, bp):
39 routes = test.vapi.bier_route_dump(bti)
41 if bti.set_id == r.br_tbl_id.bt_set \
42 and bti.sub_domain_id == r.br_tbl_id.bt_sub_domain \
43 and bti.hdr_len_id == r.br_tbl_id.bt_hdr_len_id \
49 def find_bier_disp_table(test, bdti):
50 tables = test.vapi.bier_disp_table_dump()
52 if bdti == t.bdt_tbl_id:
57 def find_bier_disp_entry(test, bdti, bp):
58 entries = test.vapi.bier_disp_entry_dump(bdti)
61 and bdti == e.bde_tbl_id:
66 def find_bier_imp(test, bti, bp):
67 imps = test.vapi.bier_imp_dump()
69 if bti.set_id == i.bi_tbl_id.bt_set \
70 and bti.sub_domain_id == i.bi_tbl_id.bt_sub_domain \
71 and bti.hdr_len_id == i.bi_tbl_id.bt_hdr_len_id \
77 class VppBierTable(VppObject):
82 def __init__(self, test, id, mpls_label):
85 self.mpls_label = mpls_label
87 def add_vpp_config(self):
88 self._test.vapi.bier_table_add_del(
92 self._test.registry.register(self, self._test.logger)
94 def remove_vpp_config(self):
95 self._test.vapi.bier_table_add_del(
101 return self.object_id()
104 return "bier-table;[%d:%d:%d]" % (self.id.set_id,
105 self.id.sub_domain_id,
108 def query_vpp_config(self):
109 return find_bier_table(self._test, self.id)
112 class VppBierRoute(VppObject):
117 def __init__(self, test, tbl_id, bp, paths):
123 def encode_path(self, p):
125 for l in p.nh_labels:
126 if type(l) == VppMplsLabel:
127 lstack.append(l.encode())
129 lstack.append({'label': l, 'ttl': 255})
130 n_labels = len(lstack)
131 while (len(lstack) < 16):
133 return {'next_hop': p.nh_addr,
136 'sw_if_index': 0xffffffff,
138 'table_id': p.nh_table_id,
139 'next_hop_id': p.next_hop_id,
140 'is_udp_encap': p.is_udp_encap,
141 'n_labels': n_labels,
142 'label_stack': lstack}
144 def encode_paths(self):
147 br_paths.append(self.encode_path(p))
150 def add_vpp_config(self):
151 self._test.vapi.bier_route_add_del(
156 self._test.registry.register(self, self._test.logger)
158 def remove_vpp_config(self):
159 self._test.vapi.bier_route_add_del(
165 def update_paths(self, paths):
167 self._test.vapi.bier_route_add_del(
173 def add_path(self, path):
174 self._test.vapi.bier_route_add_del(
177 [self.encode_path(path)],
180 self.paths.append(path)
181 self._test.registry.register(self, self._test.logger)
183 def remove_path(self, path):
184 self._test.vapi.bier_route_add_del(
187 [self.encode_path(path)],
190 self.paths.remove(path)
192 def remove_all_paths(self):
193 self._test.vapi.bier_route_add_del(
202 return self.object_id()
205 return "bier-route;[%d:%d:%d:%d]" % (self.tbl_id.set_id,
206 self.tbl_id.sub_domain_id,
207 self.tbl_id.hdr_len_id,
210 def query_vpp_config(self):
211 return find_bier_route(self._test, self.tbl_id, self.bp)
214 class VppBierImp(VppObject):
219 def __init__(self, test, tbl_id, src, ibytes):
225 def add_vpp_config(self):
226 res = self._test.vapi.bier_imp_add(
230 self.bi_index = res.bi_index
231 self._test.registry.register(self, self._test.logger)
233 def remove_vpp_config(self):
234 self._test.vapi.bier_imp_del(
238 return self.object_id()
241 return "bier-imp;[%d:%d:%d:%d]" % (self.tbl_id.set_id,
242 self.tbl_id.sub_domain_id,
243 self.tbl_id.hdr_len_id,
246 def query_vpp_config(self):
247 return find_bier_imp(self._test, self.tbl_id, self.src)
250 class VppBierDispTable(VppObject):
252 BIER Disposition Table
255 def __init__(self, test, id):
259 def add_vpp_config(self):
260 self._test.vapi.bier_disp_table_add_del(
263 self._test.registry.register(self, self._test.logger)
265 def remove_vpp_config(self):
266 self._test.vapi.bier_disp_table_add_del(
271 return self.object_id()
274 return "bier-disp-table;[%d]" % (self.id)
276 def query_vpp_config(self):
277 return find_bier_disp_table(self._test, self.id)
280 class VppBierDispEntry(VppObject):
282 BIER Disposition Entry
285 def __init__(self, test, tbl_id, bp, payload_proto, nh_proto,
286 nh, nh_tbl, rpf_id=~0):
290 self.nh_proto = nh_proto
292 self.payload_proto = payload_proto
294 self.nh = socket.inet_pton(socket.AF_INET, nh)
296 def add_vpp_config(self):
297 self._test.vapi.bier_disp_entry_add_del(
306 self._test.registry.register(self, self._test.logger)
308 def remove_vpp_config(self):
309 self._test.vapi.bier_disp_entry_add_del(
320 return self.object_id()
323 return "bier-disp-entry;[%d:%d]" % (self.tbl_id,
326 def query_vpp_config(self):
327 return find_bier_disp_entry(self._test, self.tbl_id, self.bp)