4 object abstractions for representing IP routes in VPP
9 # from vnet/vnet/mpls/mpls_types.h
10 MPLS_IETF_MAX_LABEL = 0xfffff
11 MPLS_LABEL_INVALID = MPLS_IETF_MAX_LABEL + 1
14 class RoutePath(object):
22 nh_via_label=MPLS_LABEL_INVALID,
24 self.nh_itf = nh_sw_if_index
25 self.nh_table_id = nh_table_id
26 self.nh_via_label = nh_via_label
27 self.nh_labels = labels
29 self.nh_addr = socket.inet_pton(socket.AF_INET6, nh_addr)
31 self.nh_addr = socket.inet_pton(socket.AF_INET, nh_addr)
34 class MRoutePath(RoutePath):
36 def __init__(self, nh_sw_if_index, flags):
37 super(MRoutePath, self).__init__("0.0.0.0",
39 self.nh_i_flags = flags
47 def __init__(self, test, dest_addr,
48 dest_addr_len, paths, table_id=0, is_ip6=0, is_local=0):
51 self.dest_addr_len = dest_addr_len
52 self.table_id = table_id
54 self.is_local = is_local
56 self.dest_addr = socket.inet_pton(socket.AF_INET6, dest_addr)
58 self.dest_addr = socket.inet_pton(socket.AF_INET, dest_addr)
60 def add_vpp_config(self):
62 self._test.vapi.ip_add_del_route(
65 socket.inet_pton(socket.AF_INET6, "::"),
68 table_id=self.table_id,
71 for path in self.paths:
72 self._test.vapi.ip_add_del_route(
77 table_id=self.table_id,
78 next_hop_out_label_stack=path.nh_labels,
79 next_hop_n_out_labels=len(
81 next_hop_via_label=path.nh_via_label,
84 def remove_vpp_config(self):
86 self._test.vapi.ip_add_del_route(
89 socket.inet_pton(socket.AF_INET6, "::"),
93 table_id=self.table_id,
96 for path in self.paths:
97 self._test.vapi.ip_add_del_route(self.dest_addr,
101 table_id=self.table_id,
110 def __init__(self, test, src_addr, grp_addr,
111 grp_addr_len, e_flags, paths, table_id=0, is_ip6=0):
114 self.grp_addr_len = grp_addr_len
115 self.table_id = table_id
116 self.e_flags = e_flags
120 self.grp_addr = socket.inet_pton(socket.AF_INET6, grp_addr)
121 self.src_addr = socket.inet_pton(socket.AF_INET6, src_addr)
123 self.grp_addr = socket.inet_pton(socket.AF_INET, grp_addr)
124 self.src_addr = socket.inet_pton(socket.AF_INET, src_addr)
126 def add_vpp_config(self):
127 for path in self.paths:
128 self._test.vapi.ip_mroute_add_del(self.src_addr,
134 table_id=self.table_id,
137 def remove_vpp_config(self):
138 for path in self.paths:
139 self._test.vapi.ip_mroute_add_del(self.src_addr,
145 table_id=self.table_id,
149 def update_entry_flags(self, flags):
151 self._test.vapi.ip_mroute_add_del(self.src_addr,
157 table_id=self.table_id,
160 def update_path_flags(self, itf, flags):
161 for path in self.paths:
162 if path.nh_itf == itf:
163 path.nh_i_flags = flags
165 self._test.vapi.ip_mroute_add_del(self.src_addr,
171 table_id=self.table_id,
176 def __init__(self, test, route, interface, packet):
178 self.interface = interface
182 def compare(self, signal):
183 self.test.assertEqual(self.interface, signal.sw_if_index)
184 self.test.assertEqual(self.route.table_id, signal.table_id)
185 self.test.assertEqual(self.route.grp_addr_len,
186 signal.grp_address_len)
187 for i in range(self.route.grp_addr_len / 8):
188 self.test.assertEqual(self.route.grp_addr[i],
189 signal.grp_address[i])
190 if (self.route.grp_addr_len > 32):
192 self.test.assertEqual(self.route.src_addr[i],
193 signal.src_address[i])
201 def __init__(self, test, local_label, dest_addr, dest_addr_len):
203 self.dest_addr = socket.inet_pton(socket.AF_INET, dest_addr)
204 self.dest_addr_len = dest_addr_len
205 self.local_label = local_label
207 def add_vpp_config(self):
208 self._test.vapi.mpls_ip_bind_unbind(self.local_label,
212 def remove_vpp_config(self):
213 self._test.vapi.mpls_ip_bind_unbind(self.local_label,
224 def __init__(self, test, local_label, eos_bit, paths, table_id=0):
227 self.local_label = local_label
228 self.eos_bit = eos_bit
229 self.table_id = table_id
231 def add_vpp_config(self):
232 for path in self.paths:
233 self._test.vapi.mpls_route_add_del(
239 table_id=self.table_id,
240 next_hop_out_label_stack=path.nh_labels,
241 next_hop_n_out_labels=len(
243 next_hop_via_label=path.nh_via_label,
244 next_hop_table_id=path.nh_table_id)
246 def remove_vpp_config(self):
247 for path in self.paths:
248 self._test.vapi.mpls_route_add_del(self.local_label,
253 table_id=self.table_id,