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
27 class SRv6PolicyType():
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):
45 def __init__(self, test, localsid, behavior, nh_addr,
46 end_psp, sw_if_index, vlan_index, fib_table):
48 self.localsid = localsid
49 self.behavior = behavior
50 self.nh_addr = nh_addr
51 self.end_psp = end_psp
52 self.sw_if_index = sw_if_index
53 self.vlan_index = vlan_index
54 self.fib_table = fib_table
55 self._configured = False
57 def add_vpp_config(self):
58 self._test.vapi.sr_localsid_add_del(
59 localsid=self.localsid,
60 behavior=self.behavior,
64 sw_if_index=self.sw_if_index,
65 vlan_index=self.vlan_index,
66 fib_table=self.fib_table)
67 self._configured = True
69 def remove_vpp_config(self):
70 self._test.vapi.sr_localsid_add_del(
71 localsid=self.localsid,
72 behavior=self.behavior,
76 sw_if_index=self.sw_if_index,
77 vlan_index=self.vlan_index,
78 fib_table=self.fib_table)
79 self._configured = False
81 def query_vpp_config(self):
82 # sr_localsids_dump API is disabled
83 # use _configured flag for now
84 return self._configured
93 class VppSRv6Policy(VppObject):
98 def __init__(self, test, bsid,
99 is_encap, sr_type, weight, fib_table,
103 self.is_encap = is_encap
104 self.sr_type = sr_type
106 self.fib_table = fib_table
107 self.segments = segments
108 self.n_segments = len(segments)
109 # source not passed to API
110 # self.source = inet_pton(AF_INET6, source)
112 self._configured = False
114 def add_vpp_config(self):
115 self._test.vapi.sr_policy_add(
118 is_encap=self.is_encap,
119 is_spray=self.sr_type,
120 fib_table=self.fib_table,
121 sids={'num_sids': self.n_segments, 'sids': self.segments})
122 self._configured = True
124 def remove_vpp_config(self):
125 self._test.vapi.sr_policy_del(
127 self._configured = False
129 def query_vpp_config(self):
130 # no API to query SR Policies
131 # use _configured flag for now
132 return self._configured
135 return ("%d;%s-><%s>;%d"
138 ','.join(self.segments),
142 class VppSRv6Steering(VppObject):
147 def __init__(self, test,
158 self.mask_width = mask_width
159 self.traffic_type = traffic_type
160 self.sr_policy_index = sr_policy_index
161 self.sw_if_index = sw_if_index
162 self.table_id = table_id
163 self._configured = False
165 def add_vpp_config(self):
166 self._test.vapi.sr_steering_add_del(
169 sr_policy_index=self.sr_policy_index,
170 table_id=self.table_id,
171 prefix={'address': self.prefix, 'len': self.mask_width},
172 sw_if_index=self.sw_if_index,
173 traffic_type=self.traffic_type)
174 self._configured = True
176 def remove_vpp_config(self):
177 self._test.vapi.sr_steering_add_del(
180 sr_policy_index=self.sr_policy_index,
181 table_id=self.table_id,
182 prefix={'address': self.prefix, 'len': self.mask_width},
183 sw_if_index=self.sw_if_index,
184 traffic_type=self.traffic_type)
185 self._configured = False
187 def query_vpp_config(self):
188 # no API to query steering entries
189 # use _configured flag for now
190 return self._configured
193 return ("%d;%d;%s/%d->%s"