1 from scapy.layers.l2 import Dot1Q
3 from vpp_pg_interface import VppPGInterface
4 from vpp_interface import VppInterface
5 from vpp_papi import VppEnum
20 class VppSubInterface(VppPGInterface, metaclass=abc.ABCMeta):
24 """Parent interface for this sub-interface"""
29 """Sub-interface ID"""
44 def __init__(self, test, parent, sub_id):
45 VppInterface.__init__(self, test)
47 self._parent.add_sub_if(self)
49 self.DOT1AD_TYPE = 0x88A8
50 self.DOT1Q_TYPE = 0x8100
52 def set_sw_if_index(self, sw_if_index):
53 super(VppSubInterface, self).set_sw_if_index(sw_if_index)
54 self.set_vtr(L2_VTR_OP.L2_DISABLED)
57 def create_arp_req(self):
61 def create_ndp_req(self, addr=None):
64 def resolve_arp(self):
65 super(VppSubInterface, self).resolve_arp(self.parent)
67 def resolve_ndp(self):
68 super(VppSubInterface, self).resolve_ndp(self.parent)
71 def add_dot1_layer(self, pkt):
74 def remove_vpp_config(self):
75 self.test.vapi.delete_subif(self.sw_if_index)
77 def _add_tag(self, packet, vlan, tag_type):
78 payload = packet.payload
79 inner_type = packet.type
80 packet.remove_payload()
81 packet.add_payload(Dot1Q(vlan=vlan) / payload)
82 packet.payload.type = inner_type
83 packet.payload.vlan = vlan
84 packet.type = tag_type
87 def _remove_tag(self, packet, vlan=None, tag_type=None):
89 self.test.instance().assertEqual(packet.type, tag_type)
91 payload = packet.payload
93 self.test.instance().assertEqual(payload.vlan, vlan)
94 inner_type = payload.type
95 payload = payload.payload
96 packet.remove_payload()
97 packet.add_payload(payload)
98 packet.type = inner_type
101 def add_dot1q_layer(self, packet, vlan):
102 return self._add_tag(packet, vlan, self.DOT1Q_TYPE)
104 def add_dot1ad_layer(self, packet, outer, inner):
105 p = self._add_tag(packet, inner, self.DOT1Q_TYPE)
106 return self._add_tag(p, outer, self.DOT1AD_TYPE)
108 def remove_dot1q_layer(self, packet, vlan=None):
109 return self._remove_tag(packet, vlan, self.DOT1Q_TYPE)
111 def remove_dot1ad_layer(self, packet, outer=None, inner=None):
112 p = self._remove_tag(packet, outer, self.DOT1AD_TYPE)
113 return self._remove_tag(p, inner, self.DOT1Q_TYPE)
115 def set_vtr(self, vtr, push1q=0, tag=None, inner=None, outer=None):
120 if (vtr == L2_VTR_OP.L2_PUSH_1 or
121 vtr == L2_VTR_OP.L2_TRANSLATE_1_1 or
122 vtr == L2_VTR_OP.L2_TRANSLATE_2_1):
124 self._push1q = push1q
125 if (vtr == L2_VTR_OP.L2_PUSH_2 or
126 vtr == L2_VTR_OP.L2_TRANSLATE_1_2 or
127 vtr == L2_VTR_OP.L2_TRANSLATE_2_2):
130 self._push1q = push1q
132 self.test.vapi.l2_interface_vlan_tag_rewrite(
133 sw_if_index=self.sw_if_index, vtr_op=vtr, push_dot1q=self._push1q,
134 tag1=self._tag1, tag2=self._tag2)
138 class VppDot1QSubint(VppSubInterface):
145 def __init__(self, test, parent, sub_id, vlan=None):
146 super(VppDot1QSubint, self).__init__(test, parent, sub_id)
150 r = test.vapi.create_vlan_subif(parent.sw_if_index, vlan)
151 self.set_sw_if_index(r.sw_if_index)
153 def create_arp_req(self):
154 packet = VppPGInterface.create_arp_req(self)
155 return self.add_dot1_layer(packet)
157 def create_ndp_req(self, addr=None):
158 packet = VppPGInterface.create_ndp_req(self, addr)
159 return self.add_dot1_layer(packet)
161 # called before sending packet
162 def add_dot1_layer(self, packet):
163 return self.add_dot1q_layer(packet, self.vlan)
165 # called on received packet to "reverse" the add call
166 def remove_dot1_layer(self, packet):
167 return self.remove_dot1q_layer(packet, self.vlan)
170 class VppDot1ADSubint(VppSubInterface):
173 def outer_vlan(self):
175 return self._outer_vlan
178 def inner_vlan(self):
180 return self._inner_vlan
182 def __init__(self, test, parent, sub_id, outer_vlan, inner_vlan):
183 super(VppDot1ADSubint, self).__init__(test, parent, sub_id)
184 flags = (VppEnum.vl_api_sub_if_flags_t.SUB_IF_API_FLAG_DOT1AD |
185 VppEnum.vl_api_sub_if_flags_t.SUB_IF_API_FLAG_TWO_TAGS |
186 VppEnum.vl_api_sub_if_flags_t.SUB_IF_API_FLAG_EXACT_MATCH)
187 r = test.vapi.create_subif(sw_if_index=parent.sw_if_index,
188 sub_id=sub_id, outer_vlan_id=outer_vlan,
189 inner_vlan_id=inner_vlan,
191 self.set_sw_if_index(r.sw_if_index)
192 self._outer_vlan = outer_vlan
193 self._inner_vlan = inner_vlan
195 def create_arp_req(self):
196 packet = VppPGInterface.create_arp_req(self)
197 return self.add_dot1_layer(packet)
199 def create_ndp_req(self, addr=None):
200 packet = VppPGInterface.create_ndp_req(self, addr)
201 return self.add_dot1_layer(packet)
203 def add_dot1_layer(self, packet):
204 return self.add_dot1ad_layer(packet, self.outer_vlan, self.inner_vlan)
206 def remove_dot1_layer(self, packet):
207 return self.remove_dot1ad_layer(packet, self.outer_vlan,
211 class VppP2PSubint(VppSubInterface):
213 def __init__(self, test, parent, sub_id, remote_mac):
214 super(VppP2PSubint, self).__init__(test, parent, sub_id)
215 r = test.vapi.p2p_ethernet_add(parent.sw_if_index,
217 self.set_sw_if_index(r.sw_if_index)
218 self.parent_sw_if_index = parent.sw_if_index
219 self.p2p_remote_mac = remote_mac
221 def add_dot1_layer(self, packet):
224 def remove_dot1_layer(self, packet):
227 def create_arp_req(self):
228 packet = VppPGInterface.create_arp_req(self)
231 def create_ndp_req(self, addr=None):
232 packet = VppPGInterface.create_ndp_req(self, addr)