1 # Copyright (c) 2019 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
14 """Memif interface library."""
16 from resources.libraries.python.ssh import SSH
17 from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal
18 from resources.libraries.python.topology import NodeType, Topology
22 """Memif interface class."""
28 def create_memif_interface(node, filename, mid, sid, rxq=1, txq=1,
30 """Create Memif interface on the given node.
32 :param node: Given node to create Memif interface on.
33 :param filename: Memif interface socket filename.
34 :param mid: Memif interface ID.
35 :param sid: Socket ID.
36 :param rxq: Number of RX queues; 0 means do not set.
37 :param txq: Number of TX queues; 0 means do not set.
38 :param role: Memif interface role [master|slave]. Default is master.
46 :returns: SW interface index.
48 :raises ValueError: If command 'create memif' fails.
51 rx_q = 'rx-queues {rxq}'.format(rxq=rxq) if rxq else ''
52 tx_q = 'tx-queues {txq}'.format(txq=txq) if txq else ''
54 with VatTerminal(node, json_param=False) as vat:
55 vat.vat_terminal_exec_cmd_from_template(
56 'memif_socket_filename_add_del.vat',
57 add_del='add', id=sid, filename='/tmp/'+filename)
58 vat.vat_terminal_exec_cmd_from_template(
59 'memif_create.vat', id=mid, socket=sid, rx_q=rx_q, tx_q=tx_q,
61 if 'sw_if_index' in vat.vat_stdout:
63 sw_if_idx = int(vat.vat_stdout.split()[4])
64 if_key = Topology.add_new_port(node, 'memif')
65 Topology.update_interface_sw_if_index(
66 node, if_key, sw_if_idx)
67 ifc_name = Memif.vpp_get_memif_interface_name(
69 Topology.update_interface_name(node, if_key, ifc_name)
70 ifc_mac = Memif.vpp_get_memif_interface_mac(node, sw_if_idx)
71 Topology.update_interface_mac_address(node, if_key, ifc_mac)
72 Topology.update_interface_memif_socket(node, if_key,
74 Topology.update_interface_memif_id(node, if_key, mid)
75 Topology.update_interface_memif_role(node, if_key, role)
78 raise ValueError('Create Memif interface failed on node '
79 '{}'.format(node['host']))
81 raise ValueError('Create Memif interface failed on node '
82 '{}'.format(node['host']))
86 """Dump Memif data for the given node.
88 :param node: Given node to show Memif data on.
92 vat.execute_script("memif_dump.vat", node, json_out=False)
96 """Show Memif data for the given node.
98 :param node: Given node to show Memif data on.
102 vat.execute_script("show_memif.vat", node, json_out=False)
105 def show_memif_on_all_duts(nodes):
106 """Show Memif data on all DUTs.
108 :param nodes: Topology nodes.
111 for node in nodes.values():
112 if node['type'] == NodeType.DUT:
113 Memif.show_memif(node)
116 def clear_memif_socks(node, *socks):
117 """Clear Memif sockets for the given node.
119 :param node: Given node to clear Memif sockets on.
120 :param socks: Memif sockets.
128 ssh.exec_command_sudo('rm -f {}'.format(sock))
131 def parse_memif_dump_data(memif_data):
132 """Convert Memif data to dictionary.
134 :param memif_data: Dump of Memif interfaces data.
135 :type memif_data: str
136 :returns: Memif interfaces data in dictionary.
138 :raises RuntimeError: If there is no memif interface name found in
143 memif_data = str(memif_data)
147 for garbage in clutter:
148 memif_data = memif_data.replace(garbage, '')
150 for line in memif_data.splitlines():
151 if not line or line.startswith('Sending'):
153 elif line.startswith('memif'):
155 memif_dict[memif_name] = values
156 line_split = line.split(':', 1)
157 memif_name = str(line_split[0])
160 line_split = line.split()
161 for i in range(0, len(line_split), 2):
162 key = str(line_split[i])
164 value = line_split[i+1]
169 memif_dict[memif_name] = values
171 raise RuntimeError('No memif interface name found')
176 def vpp_get_memif_interface_name(node, sw_if_idx):
177 """Get Memif interface name from Memif interfaces dump.
179 :param node: DUT node.
180 :param sw_if_idx: DUT node.
183 :returns: Memif interface name, or None if not found.
186 with VatTerminal(node, json_param=False) as vat:
187 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
188 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
189 for item in memif_data:
190 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
195 def vpp_get_memif_interface_mac(node, sw_if_idx):
196 """Get Memif interface MAC address from Memif interfaces dump.
198 :param node: DUT node.
199 :param sw_if_idx: DUT node.
202 :returns: Memif interface MAC address, or None if not found.
205 with VatTerminal(node, json_param=False) as vat:
206 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
207 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
208 for item in memif_data:
209 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
210 return memif_data[item].get('mac', None)
214 def vpp_get_memif_interface_socket(node, sw_if_idx):
215 """Get Memif interface socket path from Memif interfaces dump.
217 :param node: DUT node.
218 :param sw_if_idx: DUT node.
221 :returns: Memif interface socket path, or None if not found.
224 with VatTerminal(node, json_param=False) as vat:
225 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
226 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
227 for item in memif_data:
228 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
229 return memif_data[item].get('socket', None)
233 def vpp_get_memif_interface_id(node, sw_if_idx):
234 """Get Memif interface ID from Memif interfaces dump.
236 :param node: DUT node.
237 :param sw_if_idx: DUT node.
240 :returns: Memif interface ID, or None if not found.
243 with VatTerminal(node, json_param=False) as vat:
244 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
245 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
246 for item in memif_data:
247 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
248 return int(memif_data[item].get('id', None))
252 def vpp_get_memif_interface_role(node, sw_if_idx):
253 """Get Memif interface role from Memif interfaces dump.
255 :param node: DUT node.
256 :param sw_if_idx: DUT node.
259 :returns: Memif interface role, or None if not found.
262 with VatTerminal(node, json_param=False) as vat:
263 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
264 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
265 for item in memif_data:
266 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
267 return memif_data[item].get('role', None)