4 object abstractions for representing IP routes in VPP
8 from vpp_object import *
10 # from vnet/vnet/mpls/mpls_types.h
11 MPLS_IETF_MAX_LABEL = 0xfffff
12 MPLS_LABEL_INVALID = MPLS_IETF_MAX_LABEL + 1
15 class VppRoutePath(object):
23 nh_via_label=MPLS_LABEL_INVALID,
25 self.nh_itf = nh_sw_if_index
26 self.nh_table_id = nh_table_id
27 self.nh_via_label = nh_via_label
28 self.nh_labels = labels
30 self.nh_addr = socket.inet_pton(socket.AF_INET6, nh_addr)
32 self.nh_addr = socket.inet_pton(socket.AF_INET, nh_addr)
35 class VppMRoutePath(VppRoutePath):
37 def __init__(self, nh_sw_if_index, flags):
38 super(VppMRoutePath, self).__init__("0.0.0.0",
40 self.nh_i_flags = flags
43 class VppIpRoute(VppObject):
48 def __init__(self, test, dest_addr,
49 dest_addr_len, paths, table_id=0, is_ip6=0, is_local=0,
50 is_unreach=0, is_prohibit=0):
53 self.dest_addr_len = dest_addr_len
54 self.table_id = table_id
56 self.is_local = is_local
57 self.is_unreach = is_unreach
58 self.is_prohibit = is_prohibit
60 self.dest_addr = socket.inet_pton(socket.AF_INET6, dest_addr)
62 self.dest_addr = socket.inet_pton(socket.AF_INET, dest_addr)
64 def add_vpp_config(self):
65 if self.is_local or self.is_unreach or self.is_prohibit:
66 self._test.vapi.ip_add_del_route(
69 socket.inet_pton(socket.AF_INET6, "::"),
71 is_local=self.is_local,
72 is_unreach=self.is_unreach,
73 is_prohibit=self.is_prohibit,
74 table_id=self.table_id,
77 for path in self.paths:
78 self._test.vapi.ip_add_del_route(
83 table_id=self.table_id,
84 next_hop_out_label_stack=path.nh_labels,
85 next_hop_n_out_labels=len(
87 next_hop_via_label=path.nh_via_label,
89 self._test.registry.register(self, self._test.logger)
91 def remove_vpp_config(self):
92 if self.is_local or self.is_unreach or self.is_prohibit:
93 self._test.vapi.ip_add_del_route(
96 socket.inet_pton(socket.AF_INET6, "::"),
98 is_local=self.is_local,
99 is_unreach=self.is_unreach,
100 is_prohibit=self.is_prohibit,
102 table_id=self.table_id,
105 for path in self.paths:
106 self._test.vapi.ip_add_del_route(self.dest_addr,
110 table_id=self.table_id,
113 def query_vpp_config(self):
114 dump = self._test.vapi.ip_fib_dump()
116 if self.dest_addr == e.address \
117 and self.dest_addr_len == e.address_length \
118 and self.table_id == e.table_id:
123 return self.object_id()
129 socket.inet_ntop(socket.AF_INET6, self.dest_addr),
134 socket.inet_ntop(socket.AF_INET, self.dest_addr),
138 class VppIpMRoute(VppObject):
143 def __init__(self, test, src_addr, grp_addr,
144 grp_addr_len, e_flags, paths, table_id=0, is_ip6=0):
147 self.grp_addr_len = grp_addr_len
148 self.table_id = table_id
149 self.e_flags = e_flags
153 self.grp_addr = socket.inet_pton(socket.AF_INET6, grp_addr)
154 self.src_addr = socket.inet_pton(socket.AF_INET6, src_addr)
156 self.grp_addr = socket.inet_pton(socket.AF_INET, grp_addr)
157 self.src_addr = socket.inet_pton(socket.AF_INET, src_addr)
159 def add_vpp_config(self):
160 for path in self.paths:
161 self._test.vapi.ip_mroute_add_del(self.src_addr,
167 table_id=self.table_id,
169 self._test.registry.register(self, self._test.logger)
171 def remove_vpp_config(self):
172 for path in self.paths:
173 self._test.vapi.ip_mroute_add_del(self.src_addr,
179 table_id=self.table_id,
183 def update_entry_flags(self, flags):
185 self._test.vapi.ip_mroute_add_del(self.src_addr,
191 table_id=self.table_id,
194 def update_path_flags(self, itf, flags):
195 for path in self.paths:
196 if path.nh_itf == itf:
197 path.nh_i_flags = flags
199 self._test.vapi.ip_mroute_add_del(self.src_addr,
205 table_id=self.table_id,
208 def query_vpp_config(self):
209 dump = self._test.vapi.ip_fib_dump()
211 if self.grp_addr == e.address \
212 and self.grp_addr_len == e.address_length \
213 and self.table_id == e.table_id:
218 return self.object_id()
222 return ("%d:(%s,%s/%d)"
224 socket.inet_ntop(socket.AF_INET6, self.src_addr),
225 socket.inet_ntop(socket.AF_INET6, self.grp_addr),
228 return ("%d:(%s,%s/%d)"
230 socket.inet_ntop(socket.AF_INET, self.src_addr),
231 socket.inet_ntop(socket.AF_INET, self.grp_addr),
235 class VppMFibSignal(object):
236 def __init__(self, test, route, interface, packet):
238 self.interface = interface
242 def compare(self, signal):
243 self.test.assertEqual(self.interface, signal.sw_if_index)
244 self.test.assertEqual(self.route.table_id, signal.table_id)
245 self.test.assertEqual(self.route.grp_addr_len,
246 signal.grp_address_len)
247 for i in range(self.route.grp_addr_len / 8):
248 self.test.assertEqual(self.route.grp_addr[i],
249 signal.grp_address[i])
250 if (self.route.grp_addr_len > 32):
252 self.test.assertEqual(self.route.src_addr[i],
253 signal.src_address[i])
256 class VppMplsIpBind(VppObject):
261 def __init__(self, test, local_label, dest_addr, dest_addr_len,
262 table_id=0, ip_table_id=0):
264 self.dest_addr = socket.inet_pton(socket.AF_INET, dest_addr)
265 self.dest_addr_len = dest_addr_len
266 self.local_label = local_label
267 self.table_id = table_id
268 self.ip_table_id = ip_table_id
270 def add_vpp_config(self):
271 self._test.vapi.mpls_ip_bind_unbind(self.local_label,
274 table_id=self.table_id,
275 ip_table_id=self.ip_table_id)
276 self._test.registry.register(self, self._test.logger)
278 def remove_vpp_config(self):
279 self._test.vapi.mpls_ip_bind_unbind(self.local_label,
284 def query_vpp_config(self):
285 dump = self._test.vapi.mpls_fib_dump()
287 if self.local_label == e.label \
288 and self.eos_bit == e.eos_bit \
289 and self.table_id == e.table_id:
294 return self.object_id()
297 return ("%d:%s binds %d:%s/%d"
301 socket.inet_ntop(socket.AF_INET, self.dest_addr),
305 class VppMplsRoute(VppObject):
310 def __init__(self, test, local_label, eos_bit, paths, table_id=0):
313 self.local_label = local_label
314 self.eos_bit = eos_bit
315 self.table_id = table_id
317 def add_vpp_config(self):
318 for path in self.paths:
319 self._test.vapi.mpls_route_add_del(
325 table_id=self.table_id,
326 next_hop_out_label_stack=path.nh_labels,
327 next_hop_n_out_labels=len(
329 next_hop_via_label=path.nh_via_label,
330 next_hop_table_id=path.nh_table_id)
331 self._test.registry.register(self, self._test.logger)
333 def remove_vpp_config(self):
334 for path in self.paths:
335 self._test.vapi.mpls_route_add_del(self.local_label,
340 table_id=self.table_id,
343 def query_vpp_config(self):
344 dump = self._test.vapi.mpls_fib_dump()
346 if self.local_label == e.label \
347 and self.eos_bit == e.eos_bit \
348 and self.table_id == e.table_id:
353 return self.object_id()