vppinfra: toeplitz hash
[vpp.git] / test / vpp_l2.py
1 """
2   L2/BD Types
3
4 """
5
6 from vpp_object import VppObject
7 from vpp_lo_interface import VppLoInterface
8 from vpp_papi import MACAddress
9 from vpp_sub_interface import L2_VTR_OP
10 try:
11     text_type = unicode
12 except NameError:
13     text_type = str
14
15
16 class L2_PORT_TYPE:
17     NORMAL = 0
18     BVI = 1
19     UU_FWD = 2
20
21
22 class BRIDGE_FLAGS:
23     NONE = 0
24     LEARN = 1
25     FWD = 2
26     FLOOD = 4
27     UU_FLOOD = 8
28     ARP_TERM = 16
29     ARP_UFWD = 32
30
31
32 def find_bridge_domain(test, bd_id):
33     bds = test.vapi.bridge_domain_dump(bd_id)
34     return len(bds) == 1
35
36
37 def find_bridge_domain_port(test, bd_id, sw_if_index):
38     bds = test.vapi.bridge_domain_dump(bd_id)
39     for bd in bds:
40         for p in bd.sw_if_details:
41             if p.sw_if_index == sw_if_index:
42                 return True
43     return False
44
45
46 def find_bridge_domain_arp_entry(test, bd_id, mac, ip):
47     arps = test.vapi.bd_ip_mac_dump(bd_id)
48     for arp in arps:
49         # do IP addr comparison too once .api is fixed...
50         if mac == str(arp.entry.mac) and \
51            ip == str(arp.entry.ip):
52             return True
53     return False
54
55
56 def find_l2_fib_entry(test, bd_id, mac, sw_if_index):
57     vmac = MACAddress(mac)
58     lfs = test.vapi.l2_fib_table_dump(bd_id)
59     for lf in lfs:
60         if vmac.packed == lf.mac and sw_if_index == lf.sw_if_index:
61             return True
62     return False
63
64
65 class VppBridgeDomain(VppObject):
66
67     def __init__(self, test, bd_id,
68                  flood=1, uu_flood=1, forward=1,
69                  learn=1, arp_term=1, arp_ufwd=0):
70         self._test = test
71         self.bd_id = bd_id
72         self.flood = flood
73         self.uu_flood = uu_flood
74         self.forward = forward
75         self.learn = learn
76         self.arp_term = arp_term
77         self.arp_ufwd = arp_ufwd
78
79     def add_vpp_config(self):
80         self._test.vapi.bridge_domain_add_del(bd_id=self.bd_id,
81                                               flood=self.flood,
82                                               uu_flood=self.uu_flood,
83                                               forward=self.forward,
84                                               learn=self.learn,
85                                               arp_term=self.arp_term,
86                                               arp_ufwd=self.arp_ufwd,
87                                               is_add=1)
88         self._test.registry.register(self, self._test.logger)
89         return self
90
91     def remove_vpp_config(self):
92         self._test.vapi.bridge_domain_add_del(bd_id=self.bd_id, is_add=0)
93
94     def query_vpp_config(self):
95         return find_bridge_domain(self._test, self.bd_id)
96
97     def object_id(self):
98         return "bridge-domain-%d" % (self.bd_id)
99
100
101 class VppBridgeDomainPort(VppObject):
102
103     def __init__(self, test, bd, itf,
104                  port_type=L2_PORT_TYPE.NORMAL):
105         self._test = test
106         self.bd = bd
107         self.itf = itf
108         self.port_type = port_type
109
110     def add_vpp_config(self):
111         self._test.vapi.sw_interface_set_l2_bridge(
112             rx_sw_if_index=self.itf.sw_if_index, bd_id=self.bd.bd_id,
113             port_type=self.port_type, enable=1)
114         self._test.registry.register(self, self._test.logger)
115         return self
116
117     def remove_vpp_config(self):
118         self._test.vapi.sw_interface_set_l2_bridge(
119             rx_sw_if_index=self.itf.sw_if_index, bd_id=self.bd.bd_id,
120             port_type=self.port_type, enable=0)
121
122     def query_vpp_config(self):
123         return find_bridge_domain_port(self._test,
124                                        self.bd.bd_id,
125                                        self.itf.sw_if_index)
126
127     def object_id(self):
128         return "BD-Port-%s-%s" % (self.bd, self.itf)
129
130
131 class VppBridgeDomainArpEntry(VppObject):
132
133     def __init__(self, test, bd, mac, ip):
134         self._test = test
135         self.bd = bd
136         self.mac = mac
137         self.ip = ip
138
139     def add_vpp_config(self):
140         self._test.vapi.bd_ip_mac_add_del(is_add=1,
141                                           entry={
142                                               'bd_id': self.bd.bd_id,
143                                               'ip': self.ip,
144                                               'mac': self.mac})
145         self._test.registry.register(self, self._test.logger)
146         return self
147
148     def remove_vpp_config(self):
149         self._test.vapi.bd_ip_mac_add_del(is_add=0,
150                                           entry={
151                                               'bd_id': self.bd.bd_id,
152                                               'ip': self.ip,
153                                               'mac': self.mac})
154
155     def query_vpp_config(self):
156         return find_bridge_domain_arp_entry(self._test,
157                                             self.bd.bd_id,
158                                             self.mac,
159                                             self.ip)
160
161     def object_id(self):
162         return "BD-Arp-Entry-%s-%s-%s" % (self.bd, self.mac, self.ip)
163
164
165 class VppL2FibEntry(VppObject):
166
167     def __init__(self, test, bd, mac, itf,
168                  static_mac=0, filter_mac=0, bvi_mac=-1):
169         self._test = test
170         self.bd = bd
171         self.mac = MACAddress(mac)
172         self.itf = itf
173         self.static_mac = static_mac
174         self.filter_mac = filter_mac
175         if bvi_mac == -1:
176             self.bvi_mac = isinstance(self.itf, VppLoInterface)
177         else:
178             self.bvi_mac = bvi_mac
179
180     def add_vpp_config(self):
181         self._test.vapi.l2fib_add_del(
182             self.mac.packed,
183             self.bd.bd_id,
184             self.itf.sw_if_index,
185             is_add=1,
186             static_mac=self.static_mac,
187             filter_mac=self.filter_mac,
188             bvi_mac=self.bvi_mac)
189         self._test.registry.register(self, self._test.logger)
190         return self
191
192     def remove_vpp_config(self):
193         self._test.vapi.l2fib_add_del(
194             self.mac.packed,
195             self.bd.bd_id,
196             self.itf.sw_if_index,
197             is_add=0)
198
199     def query_vpp_config(self):
200         return find_l2_fib_entry(self._test,
201                                  self.bd.bd_id,
202                                  self.mac.packed,
203                                  self.itf.sw_if_index)
204
205     def object_id(self):
206         return "L2-Fib-Entry-%s-%s-%s" % (self.bd, self.mac, self.itf)
207
208
209 class VppL2Vtr(VppObject):
210
211     def __init__(self, test, itf, op):
212         self._test = test
213         self.itf = itf
214         self.op = op
215
216     def add_vpp_config(self):
217         self.itf.set_vtr(self.op)
218         self._test.registry.register(self, self._test.logger)
219         return self
220
221     def remove_vpp_config(self):
222         self.itf.set_vtr(L2_VTR_OP.L2_DISABLED)
223
224     def query_vpp_config(self):
225         ds = self._test.vapi.sw_interface_dump()
226         d = self.itf.get_interface_config_from_dump(ds)
227
228         if d is not None:
229             return (d.vtr_op == self.op)
230         return False
231
232     def object_id(self):
233         return "L2-vtr-%s-%d" % (str(self.itf), self.op)