4 object abstractions for representing SRv6 localSIDs in VPP
7 from vpp_object import VppObject
8 from socket import inet_pton, inet_ntop, AF_INET, AF_INET6
11 class SRv6LocalSIDBehaviors:
12 # from src/vnet/srv6/sr.h
16 SR_BEHAVIOR_D_FIRST = 4 # Unused. Separator in between regular and D
22 SR_BEHAVIOR_END_UN_PERF = 10
23 SR_BEHAVIOR_END_UN = 11
24 SR_BEHAVIOR_LAST = 12 # Must always be the last one
28 # from src/vnet/srv6/sr.h
29 SR_POLICY_TYPE_DEFAULT = 0
30 SR_POLICY_TYPE_SPRAY = 1
33 class SRv6PolicySteeringTypes:
34 # from src/vnet/srv6/sr.h
40 class VppSRv6LocalSID(VppObject):
57 self.localsid = localsid
58 self.behavior = behavior
59 self.nh_addr = nh_addr
60 self.end_psp = end_psp
61 self.sw_if_index = sw_if_index
62 self.vlan_index = vlan_index
63 self.fib_table = fib_table
64 self._configured = False
66 def add_vpp_config(self):
67 self._test.vapi.sr_localsid_add_del(
68 localsid=self.localsid,
69 behavior=self.behavior,
73 sw_if_index=self.sw_if_index,
74 vlan_index=self.vlan_index,
75 fib_table=self.fib_table,
77 self._configured = True
79 def remove_vpp_config(self):
80 self._test.vapi.sr_localsid_add_del(
81 localsid=self.localsid,
82 behavior=self.behavior,
86 sw_if_index=self.sw_if_index,
87 vlan_index=self.vlan_index,
88 fib_table=self.fib_table,
90 self._configured = False
92 def query_vpp_config(self):
93 # sr_localsids_dump API is disabled
94 # use _configured flag for now
95 return self._configured
98 return "%d;%s,%d" % (self.fib_table, self.localsid, self.behavior)
101 class VppSRv6Policy(VppObject):
107 self, test, bsid, is_encap, sr_type, weight, fib_table, segments, source
111 self.is_encap = is_encap
112 self.sr_type = sr_type
114 self.fib_table = fib_table
115 self.segments = segments
116 self.n_segments = len(segments)
117 # source not passed to API
118 # self.source = inet_pton(AF_INET6, source)
120 self._configured = False
122 def add_vpp_config(self):
123 self._test.vapi.sr_policy_add(
126 is_encap=self.is_encap,
127 is_spray=self.sr_type,
128 fib_table=self.fib_table,
129 sids={"num_sids": self.n_segments, "sids": self.segments},
131 self._configured = True
133 def remove_vpp_config(self):
134 self._test.vapi.sr_policy_del(self.bsid)
135 self._configured = False
137 def query_vpp_config(self):
138 # no API to query SR Policies
139 # use _configured flag for now
140 return self._configured
143 return "%d;%s-><%s>;%d" % (
146 ",".join(self.segments),
151 class VppSRv6Steering(VppObject):
170 self.mask_width = mask_width
171 self.traffic_type = traffic_type
172 self.sr_policy_index = sr_policy_index
173 self.sw_if_index = sw_if_index
174 self.table_id = table_id
175 self._configured = False
177 def add_vpp_config(self):
178 self._test.vapi.sr_steering_add_del(
181 sr_policy_index=self.sr_policy_index,
182 table_id=self.table_id,
183 prefix={"address": self.prefix, "len": self.mask_width},
184 sw_if_index=self.sw_if_index,
185 traffic_type=self.traffic_type,
187 self._configured = True
189 def remove_vpp_config(self):
190 self._test.vapi.sr_steering_add_del(
193 sr_policy_index=self.sr_policy_index,
194 table_id=self.table_id,
195 prefix={"address": self.prefix, "len": self.mask_width},
196 sw_if_index=self.sw_if_index,
197 traffic_type=self.traffic_type,
199 self._configured = False
201 def query_vpp_config(self):
202 # no API to query steering entries
203 # use _configured flag for now
204 return self._configured
207 return "%d;%d;%s/%d->%s" % (