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
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()
32 bti.set_id == t.bt_tbl_id.bt_set
33 and bti.sub_domain_id == t.bt_tbl_id.bt_sub_domain
34 and bti.hdr_len_id == t.bt_tbl_id.bt_hdr_len_id
40 def find_bier_route(test, bti, bp):
41 routes = test.vapi.bier_route_dump(bti)
44 bti.set_id == r.br_route.br_tbl_id.bt_set
45 and bti.sub_domain_id == r.br_route.br_tbl_id.bt_sub_domain
46 and bti.hdr_len_id == r.br_route.br_tbl_id.bt_hdr_len_id
47 and bp == r.br_route.br_bp
53 def find_bier_disp_table(test, bdti):
54 tables = test.vapi.bier_disp_table_dump()
56 if bdti == t.bdt_tbl_id:
61 def find_bier_disp_entry(test, bdti, bp):
62 entries = test.vapi.bier_disp_entry_dump(bdti)
64 if bp == e.bde_bp and bdti == e.bde_tbl_id:
69 def find_bier_imp(test, bti, bp):
70 imps = test.vapi.bier_imp_dump()
73 bti.set_id == i.bi_tbl_id.bt_set
74 and bti.sub_domain_id == i.bi_tbl_id.bt_sub_domain
75 and bti.hdr_len_id == i.bi_tbl_id.bt_hdr_len_id
82 class VppBierTable(VppObject):
87 def __init__(self, test, id, mpls_label):
90 self.mpls_label = mpls_label
92 def add_vpp_config(self):
93 self._test.vapi.bier_table_add_del(self.id, self.mpls_label, is_add=1)
94 self._test.registry.register(self, self._test.logger)
96 def remove_vpp_config(self):
97 self._test.vapi.bier_table_add_del(self.id, self.mpls_label, is_add=0)
100 return "bier-table;[%d:%d:%d]" % (
102 self.id.sub_domain_id,
106 def query_vpp_config(self):
107 return find_bier_table(self._test, self.id)
110 class VppBierRoute(VppObject):
115 def __init__(self, test, tbl_id, bp, paths):
120 self.encoded_paths = []
121 for path in self.paths:
122 self.encoded_paths.append(path.encode())
124 def add_vpp_config(self):
125 self._test.vapi.bier_route_add_del(
126 self.tbl_id, self.bp, self.encoded_paths, is_add=1
128 self._test.registry.register(self, self._test.logger)
130 def remove_vpp_config(self):
131 self._test.vapi.bier_route_add_del(
132 self.tbl_id, self.bp, self.encoded_paths, is_add=0
135 def update_paths(self, paths):
137 self.encoded_paths = []
138 for path in self.paths:
139 self.encoded_paths.append(path.encode())
140 self._test.vapi.bier_route_add_del(
141 self.tbl_id, self.bp, self.encoded_paths, is_replace=1
144 def add_path(self, path):
145 self.encoded_paths.append(path.encode())
146 self._test.vapi.bier_route_add_del(
147 self.tbl_id, self.bp, [path.encode()], is_add=1, is_replace=0
149 self.paths.append(path)
150 self._test.registry.register(self, self._test.logger)
152 def remove_path(self, path):
153 self.encoded_paths.remove(path.encode())
154 self._test.vapi.bier_route_add_del(
155 self.tbl_id, self.bp, [path.encode()], is_add=0, is_replace=0
157 self.paths.remove(path)
159 def remove_all_paths(self):
160 self._test.vapi.bier_route_add_del(
161 self.tbl_id, self.bp, [], is_add=0, is_replace=1
166 return "bier-route;[%d:%d:%d:%d]" % (
168 self.tbl_id.sub_domain_id,
169 self.tbl_id.hdr_len_id,
173 def query_vpp_config(self):
174 return find_bier_route(self._test, self.tbl_id, self.bp)
177 class VppBierImp(VppObject):
182 def __init__(self, test, tbl_id, src, ibytes):
188 def add_vpp_config(self):
189 res = self._test.vapi.bier_imp_add(self.tbl_id, self.src, self.ibytes)
190 self.bi_index = res.bi_index
191 self._test.registry.register(self, self._test.logger)
193 def remove_vpp_config(self):
194 self._test.vapi.bier_imp_del(self.bi_index)
197 return "bier-imp;[%d:%d:%d:%d]" % (
199 self.tbl_id.sub_domain_id,
200 self.tbl_id.hdr_len_id,
204 def query_vpp_config(self):
205 return find_bier_imp(self._test, self.tbl_id, self.src)
208 class VppBierDispTable(VppObject):
210 BIER Disposition Table
213 def __init__(self, test, id):
217 def add_vpp_config(self):
218 self._test.vapi.bier_disp_table_add_del(self.id, is_add=1)
219 self._test.registry.register(self, self._test.logger)
221 def remove_vpp_config(self):
222 self._test.vapi.bier_disp_table_add_del(self.id, is_add=0)
225 return "bier-disp-table;[%d]" % (self.id)
227 def query_vpp_config(self):
228 return find_bier_disp_table(self._test, self.id)
231 class VppBierDispEntry(VppObject):
233 BIER Disposition Entry
237 self, test, tbl_id, bp, payload_proto, nh_proto, nh, nh_tbl, rpf_id=~0
242 self.nh_proto = nh_proto
244 self.payload_proto = payload_proto
246 self.nh = socket.inet_pton(socket.AF_INET, nh)
248 def add_vpp_config(self):
249 self._test.vapi.bier_disp_entry_add_del(
259 self._test.registry.register(self, self._test.logger)
261 def remove_vpp_config(self):
262 self._test.vapi.bier_disp_entry_add_del(
274 return "bier-disp-entry;[%d:%d]" % (self.tbl_id, self.bp)
276 def query_vpp_config(self):
277 return find_bier_disp_entry(self._test, self.tbl_id, self.bp)