Line data Source code
1 : /*
2 : *------------------------------------------------------------------
3 : * Copyright (c) 2021 Cisco and/or its affiliates.
4 : * Licensed under the Apache License, Version 2.0 (the "License");
5 : * you may not use this file except in compliance with the License.
6 : * You may obtain a copy of the License at:
7 : *
8 : * http://www.apache.org/licenses/LICENSE-2.0
9 : *
10 : * Unless required by applicable law or agreed to in writing, software
11 : * distributed under the License is distributed on an "AS IS" BASIS,
12 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 : * See the License for the specific language governing permissions and
14 : * limitations under the License.
15 : *------------------------------------------------------------------
16 : */
17 :
18 : #include <vat/vat.h>
19 : #include <vlibapi/api.h>
20 : #include <vlibmemory/api.h>
21 : #include <vppinfra/error.h>
22 : #include <vpp/api/types.h>
23 :
24 : #include <vnet/ip/ip_types_api.h>
25 :
26 : #define __plugin_msg_base interface_test_main.msg_id_base
27 : #include <vlibapi/vat_helper_macros.h>
28 :
29 : /* Declare message IDs */
30 : #include <vnet/format_fns.h>
31 : #include <vnet/interface.api_enum.h>
32 : #include <vnet/interface.api_types.h>
33 : #include <vlibmemory/vlib.api_types.h>
34 : #include <vlibmemory/memclnt.api_enum.h>
35 :
36 : #define vl_endianfun /* define message structures */
37 : #include <vnet/interface.api.h>
38 : #undef vl_endianfun
39 :
40 : typedef struct
41 : {
42 : /* API message ID base */
43 : u16 msg_id_base;
44 : vat_main_t *vat_main;
45 : } interface_test_main_t;
46 :
47 : static interface_test_main_t interface_test_main;
48 :
49 : static int
50 0 : api_sw_interface_set_flags (vat_main_t *vam)
51 : {
52 0 : unformat_input_t *i = vam->input;
53 : vl_api_sw_interface_set_flags_t *mp;
54 : u32 sw_if_index;
55 0 : u8 sw_if_index_set = 0;
56 0 : u8 admin_up = 0;
57 : int ret;
58 :
59 : /* Parse args required to build the message */
60 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
61 : {
62 0 : if (unformat (i, "admin-up"))
63 0 : admin_up = 1;
64 0 : else if (unformat (i, "admin-down"))
65 0 : admin_up = 0;
66 0 : else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
67 0 : sw_if_index_set = 1;
68 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
69 0 : sw_if_index_set = 1;
70 : else
71 0 : break;
72 : }
73 :
74 0 : if (sw_if_index_set == 0)
75 : {
76 0 : errmsg ("missing interface name or sw_if_index");
77 0 : return -99;
78 : }
79 :
80 : /* Construct the API message */
81 0 : M (SW_INTERFACE_SET_FLAGS, mp);
82 0 : mp->sw_if_index = ntohl (sw_if_index);
83 0 : mp->flags = ntohl ((admin_up) ? IF_STATUS_API_FLAG_ADMIN_UP : 0);
84 :
85 : /* send it... */
86 0 : S (mp);
87 :
88 : /* Wait for a reply, return the good/bad news... */
89 0 : W (ret);
90 0 : return ret;
91 : }
92 :
93 : static int
94 0 : api_hw_interface_set_mtu (vat_main_t *vam)
95 : {
96 0 : unformat_input_t *i = vam->input;
97 : vl_api_hw_interface_set_mtu_t *mp;
98 0 : u32 sw_if_index = ~0;
99 0 : u32 mtu = 0;
100 : int ret;
101 :
102 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
103 : {
104 0 : if (unformat (i, "mtu %d", &mtu))
105 : ;
106 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
107 : ;
108 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
109 : ;
110 : else
111 0 : break;
112 : }
113 :
114 0 : if (sw_if_index == ~0)
115 : {
116 0 : errmsg ("missing interface name or sw_if_index");
117 0 : return -99;
118 : }
119 :
120 0 : if (mtu == 0)
121 : {
122 0 : errmsg ("no mtu specified");
123 0 : return -99;
124 : }
125 :
126 : /* Construct the API message */
127 0 : M (HW_INTERFACE_SET_MTU, mp);
128 0 : mp->sw_if_index = ntohl (sw_if_index);
129 0 : mp->mtu = ntohs ((u16) mtu);
130 :
131 0 : S (mp);
132 0 : W (ret);
133 0 : return ret;
134 : }
135 :
136 : static int
137 0 : api_sw_interface_tag_add_del (vat_main_t *vam)
138 : {
139 0 : unformat_input_t *i = vam->input;
140 : vl_api_sw_interface_tag_add_del_t *mp;
141 0 : u32 sw_if_index = ~0;
142 0 : u8 *tag = 0;
143 0 : u8 enable = 1;
144 : int ret;
145 :
146 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
147 : {
148 0 : if (unformat (i, "tag %s", &tag))
149 : ;
150 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
151 : ;
152 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
153 : ;
154 0 : else if (unformat (i, "del"))
155 0 : enable = 0;
156 : else
157 0 : break;
158 : }
159 :
160 0 : if (sw_if_index == ~0)
161 : {
162 0 : errmsg ("missing interface name or sw_if_index");
163 0 : return -99;
164 : }
165 :
166 0 : if (enable && (tag == 0))
167 : {
168 0 : errmsg ("no tag specified");
169 0 : return -99;
170 : }
171 :
172 : /* Construct the API message */
173 0 : M (SW_INTERFACE_TAG_ADD_DEL, mp);
174 0 : mp->sw_if_index = ntohl (sw_if_index);
175 0 : mp->is_add = enable;
176 0 : if (enable)
177 0 : strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1);
178 0 : vec_free (tag);
179 :
180 0 : S (mp);
181 0 : W (ret);
182 0 : return ret;
183 : }
184 :
185 : static int
186 0 : api_sw_interface_add_del_mac_address (vat_main_t *vam)
187 : {
188 0 : unformat_input_t *i = vam->input;
189 0 : vl_api_mac_address_t mac = { 0 };
190 : vl_api_sw_interface_add_del_mac_address_t *mp;
191 0 : u32 sw_if_index = ~0;
192 0 : u8 is_add = 1;
193 0 : u8 mac_set = 0;
194 : int ret;
195 :
196 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
197 : {
198 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
199 : ;
200 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
201 : ;
202 0 : else if (unformat (i, "%U", unformat_vl_api_mac_address, &mac))
203 0 : mac_set++;
204 0 : else if (unformat (i, "del"))
205 0 : is_add = 0;
206 : else
207 0 : break;
208 : }
209 :
210 0 : if (sw_if_index == ~0)
211 : {
212 0 : errmsg ("missing interface name or sw_if_index");
213 0 : return -99;
214 : }
215 :
216 0 : if (!mac_set)
217 : {
218 0 : errmsg ("missing MAC address");
219 0 : return -99;
220 : }
221 :
222 : /* Construct the API message */
223 0 : M (SW_INTERFACE_ADD_DEL_MAC_ADDRESS, mp);
224 0 : mp->sw_if_index = ntohl (sw_if_index);
225 0 : mp->is_add = is_add;
226 0 : clib_memcpy (&mp->addr, &mac, sizeof (mac));
227 :
228 0 : S (mp);
229 0 : W (ret);
230 0 : return ret;
231 : }
232 :
233 : static void
234 3 : vl_api_sw_interface_details_t_handler (vl_api_sw_interface_details_t *mp)
235 : {
236 3 : vat_main_t *vam = &vat_main;
237 3 : u8 *s = format (0, "%s%c", mp->interface_name, 0);
238 :
239 6 : hash_set_mem (vam->sw_if_index_by_interface_name, s,
240 : ntohl (mp->sw_if_index));
241 :
242 : /* In sub interface case, fill the sub interface table entry */
243 3 : if (mp->sw_if_index != mp->sup_sw_if_index)
244 : {
245 0 : sw_interface_subif_t *sub = NULL;
246 :
247 0 : vec_add2 (vam->sw_if_subif_table, sub, 1);
248 :
249 0 : vec_validate (sub->interface_name, strlen ((char *) s) + 1);
250 0 : strncpy ((char *) sub->interface_name, (char *) s,
251 0 : vec_len (sub->interface_name));
252 0 : sub->sw_if_index = ntohl (mp->sw_if_index);
253 0 : sub->sub_id = ntohl (mp->sub_id);
254 :
255 0 : sub->raw_flags = ntohl (mp->sub_if_flags & SUB_IF_API_FLAG_MASK_VNET);
256 :
257 0 : sub->sub_number_of_tags = mp->sub_number_of_tags;
258 0 : sub->sub_outer_vlan_id = ntohs (mp->sub_outer_vlan_id);
259 0 : sub->sub_inner_vlan_id = ntohs (mp->sub_inner_vlan_id);
260 :
261 : /* vlan tag rewrite */
262 0 : sub->vtr_op = ntohl (mp->vtr_op);
263 0 : sub->vtr_push_dot1q = ntohl (mp->vtr_push_dot1q);
264 0 : sub->vtr_tag1 = ntohl (mp->vtr_tag1);
265 0 : sub->vtr_tag2 = ntohl (mp->vtr_tag2);
266 : }
267 3 : }
268 :
269 : static int
270 0 : api_sw_interface_get_mac_address (vat_main_t *vat)
271 : {
272 0 : return -1;
273 : }
274 :
275 : static void
276 0 : vl_api_sw_interface_get_mac_address_reply_t_handler (
277 : vl_api_sw_interface_get_mac_address_reply_t *mp)
278 : {
279 0 : }
280 :
281 : static int
282 0 : api_sw_interface_add_del_address (vat_main_t *vam)
283 : {
284 0 : unformat_input_t *i = vam->input;
285 : vl_api_sw_interface_add_del_address_t *mp;
286 : u32 sw_if_index;
287 0 : u8 sw_if_index_set = 0;
288 0 : u8 is_add = 1, del_all = 0;
289 0 : u32 address_length = 0;
290 0 : u8 v4_address_set = 0;
291 0 : u8 v6_address_set = 0;
292 : ip4_address_t v4address;
293 : ip6_address_t v6address;
294 : int ret;
295 :
296 : /* Parse args required to build the message */
297 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
298 : {
299 0 : if (unformat (i, "del-all"))
300 0 : del_all = 1;
301 0 : else if (unformat (i, "del"))
302 0 : is_add = 0;
303 0 : else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
304 0 : sw_if_index_set = 1;
305 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
306 0 : sw_if_index_set = 1;
307 0 : else if (unformat (i, "%U/%d", unformat_ip4_address, &v4address,
308 : &address_length))
309 0 : v4_address_set = 1;
310 0 : else if (unformat (i, "%U/%d", unformat_ip6_address, &v6address,
311 : &address_length))
312 0 : v6_address_set = 1;
313 : else
314 0 : break;
315 : }
316 :
317 0 : if (sw_if_index_set == 0)
318 : {
319 0 : errmsg ("missing interface name or sw_if_index");
320 0 : return -99;
321 : }
322 0 : if (v4_address_set && v6_address_set)
323 : {
324 0 : errmsg ("both v4 and v6 addresses set");
325 0 : return -99;
326 : }
327 0 : if (!v4_address_set && !v6_address_set && !del_all)
328 : {
329 0 : errmsg ("no addresses set");
330 0 : return -99;
331 : }
332 :
333 : /* Construct the API message */
334 0 : M (SW_INTERFACE_ADD_DEL_ADDRESS, mp);
335 :
336 0 : mp->sw_if_index = ntohl (sw_if_index);
337 0 : mp->is_add = is_add;
338 0 : mp->del_all = del_all;
339 0 : if (v6_address_set)
340 : {
341 0 : mp->prefix.address.af = ADDRESS_IP6;
342 0 : clib_memcpy (mp->prefix.address.un.ip6, &v6address, sizeof (v6address));
343 : }
344 : else
345 : {
346 0 : mp->prefix.address.af = ADDRESS_IP4;
347 0 : clib_memcpy (mp->prefix.address.un.ip4, &v4address, sizeof (v4address));
348 : }
349 0 : mp->prefix.len = address_length;
350 :
351 : /* send it... */
352 0 : S (mp);
353 :
354 : /* Wait for a reply, return good/bad news */
355 0 : W (ret);
356 0 : return ret;
357 : }
358 :
359 : static int
360 0 : api_sw_interface_get_table (vat_main_t *vam)
361 : {
362 0 : unformat_input_t *i = vam->input;
363 : vl_api_sw_interface_get_table_t *mp;
364 : u32 sw_if_index;
365 0 : u8 sw_if_index_set = 0;
366 0 : u8 is_ipv6 = 0;
367 : int ret;
368 :
369 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
370 : {
371 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
372 0 : sw_if_index_set = 1;
373 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
374 0 : sw_if_index_set = 1;
375 0 : else if (unformat (i, "ipv6"))
376 0 : is_ipv6 = 1;
377 : else
378 0 : break;
379 : }
380 :
381 0 : if (sw_if_index_set == 0)
382 : {
383 0 : errmsg ("missing interface name or sw_if_index");
384 0 : return -99;
385 : }
386 :
387 0 : M (SW_INTERFACE_GET_TABLE, mp);
388 0 : mp->sw_if_index = htonl (sw_if_index);
389 0 : mp->is_ipv6 = is_ipv6;
390 :
391 0 : S (mp);
392 0 : W (ret);
393 0 : return ret;
394 : }
395 :
396 : static int
397 0 : api_sw_interface_set_rx_mode (vat_main_t *vam)
398 : {
399 0 : unformat_input_t *i = vam->input;
400 : vl_api_sw_interface_set_rx_mode_t *mp;
401 : u32 sw_if_index;
402 0 : u8 sw_if_index_set = 0;
403 : int ret;
404 0 : u8 queue_id_valid = 0;
405 : u32 queue_id;
406 0 : vnet_hw_if_rx_mode mode = VNET_HW_IF_RX_MODE_UNKNOWN;
407 :
408 : /* Parse args required to build the message */
409 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
410 : {
411 0 : if (unformat (i, "queue %d", &queue_id))
412 0 : queue_id_valid = 1;
413 0 : else if (unformat (i, "polling"))
414 0 : mode = VNET_HW_IF_RX_MODE_POLLING;
415 0 : else if (unformat (i, "interrupt"))
416 0 : mode = VNET_HW_IF_RX_MODE_INTERRUPT;
417 0 : else if (unformat (i, "adaptive"))
418 0 : mode = VNET_HW_IF_RX_MODE_ADAPTIVE;
419 0 : else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
420 0 : sw_if_index_set = 1;
421 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
422 0 : sw_if_index_set = 1;
423 : else
424 0 : break;
425 : }
426 :
427 0 : if (sw_if_index_set == 0)
428 : {
429 0 : errmsg ("missing interface name or sw_if_index");
430 0 : return -99;
431 : }
432 0 : if (mode == VNET_HW_IF_RX_MODE_UNKNOWN)
433 : {
434 0 : errmsg ("missing rx-mode");
435 0 : return -99;
436 : }
437 :
438 : /* Construct the API message */
439 0 : M (SW_INTERFACE_SET_RX_MODE, mp);
440 0 : mp->sw_if_index = ntohl (sw_if_index);
441 0 : mp->mode = (vl_api_rx_mode_t) mode;
442 0 : mp->queue_id_valid = queue_id_valid;
443 0 : mp->queue_id = queue_id_valid ? ntohl (queue_id) : ~0;
444 :
445 : /* send it... */
446 0 : S (mp);
447 :
448 : /* Wait for a reply, return the good/bad news... */
449 0 : W (ret);
450 0 : return ret;
451 : }
452 :
453 : static int
454 0 : api_sw_interface_set_unnumbered (vat_main_t *vam)
455 : {
456 0 : unformat_input_t *i = vam->input;
457 : vl_api_sw_interface_set_unnumbered_t *mp;
458 : u32 sw_if_index;
459 0 : u32 unnum_sw_index = ~0;
460 0 : u8 is_add = 1;
461 0 : u8 sw_if_index_set = 0;
462 : int ret;
463 :
464 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
465 : {
466 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
467 0 : sw_if_index_set = 1;
468 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
469 0 : sw_if_index_set = 1;
470 0 : else if (unformat (i, "unnum_if_index %d", &unnum_sw_index))
471 : ;
472 0 : else if (unformat (i, "del"))
473 0 : is_add = 0;
474 : else
475 : {
476 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
477 0 : return -99;
478 : }
479 : }
480 :
481 0 : if (sw_if_index_set == 0)
482 : {
483 0 : errmsg ("missing interface name or sw_if_index");
484 0 : return -99;
485 : }
486 :
487 0 : M (SW_INTERFACE_SET_UNNUMBERED, mp);
488 :
489 0 : mp->sw_if_index = ntohl (sw_if_index);
490 0 : mp->unnumbered_sw_if_index = ntohl (unnum_sw_index);
491 0 : mp->is_add = is_add;
492 :
493 0 : S (mp);
494 0 : W (ret);
495 0 : return ret;
496 : }
497 :
498 : static void
499 0 : vl_api_sw_interface_get_table_reply_t_handler (
500 : vl_api_sw_interface_get_table_reply_t *mp)
501 : {
502 0 : vat_main_t *vam = interface_test_main.vat_main;
503 :
504 0 : fformat (vam->ofp, "%d", ntohl (mp->vrf_id));
505 :
506 0 : vam->retval = ntohl (mp->retval);
507 0 : vam->result_ready = 1;
508 0 : }
509 :
510 : static int
511 0 : api_sw_interface_address_replace_begin (vat_main_t *vam)
512 : {
513 0 : return -1;
514 : }
515 :
516 : static int
517 0 : api_sw_interface_set_mac_address (vat_main_t *vam)
518 : {
519 0 : return -1;
520 : }
521 :
522 : static int
523 0 : api_sw_interface_set_rx_placement (vat_main_t *vam)
524 : {
525 0 : unformat_input_t *i = vam->input;
526 : vl_api_sw_interface_set_rx_placement_t *mp;
527 : u32 sw_if_index;
528 0 : u8 sw_if_index_set = 0;
529 : int ret;
530 0 : u8 is_main = 0;
531 : u32 queue_id, thread_index;
532 :
533 : /* Parse args required to build the message */
534 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
535 : {
536 0 : if (unformat (i, "queue %d", &queue_id))
537 : ;
538 0 : else if (unformat (i, "main"))
539 0 : is_main = 1;
540 0 : else if (unformat (i, "worker %d", &thread_index))
541 : ;
542 0 : else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
543 0 : sw_if_index_set = 1;
544 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
545 0 : sw_if_index_set = 1;
546 : else
547 0 : break;
548 : }
549 :
550 0 : if (sw_if_index_set == 0)
551 : {
552 0 : errmsg ("missing interface name or sw_if_index");
553 0 : return -99;
554 : }
555 :
556 0 : if (is_main)
557 0 : thread_index = 0;
558 : /* Construct the API message */
559 0 : M (SW_INTERFACE_SET_RX_PLACEMENT, mp);
560 0 : mp->sw_if_index = ntohl (sw_if_index);
561 0 : mp->worker_id = ntohl (thread_index);
562 0 : mp->queue_id = ntohl (queue_id);
563 0 : mp->is_main = is_main;
564 :
565 : /* send it... */
566 0 : S (mp);
567 : /* Wait for a reply, return the good/bad news... */
568 0 : W (ret);
569 0 : return ret;
570 : }
571 :
572 : static int
573 0 : api_sw_interface_set_tx_placement (vat_main_t *vam)
574 : {
575 0 : unformat_input_t *i = vam->input;
576 : vl_api_sw_interface_set_tx_placement_t *mp;
577 : u32 sw_if_index;
578 0 : u8 sw_if_index_set = 0;
579 : int ret;
580 0 : uword *bitmap = 0;
581 0 : u32 queue_id, n_bits = 0;
582 : u32 v;
583 :
584 : /* Parse args required to build the message */
585 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
586 : {
587 0 : if (unformat (i, "queue %d", &queue_id))
588 : ;
589 0 : else if (unformat (i, "threads %U", unformat_bitmap_list, &bitmap))
590 : ;
591 0 : else if (unformat (i, "mask %U", unformat_bitmap_mask, &bitmap))
592 : ;
593 0 : else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
594 0 : sw_if_index_set = 1;
595 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
596 0 : sw_if_index_set = 1;
597 : else
598 0 : break;
599 : }
600 :
601 0 : if (sw_if_index_set == 0)
602 : {
603 0 : errmsg ("missing interface name or sw_if_index");
604 0 : return -99;
605 : }
606 :
607 0 : n_bits = clib_bitmap_count_set_bits (bitmap);
608 : /* Construct the API message */
609 0 : M2 (SW_INTERFACE_SET_TX_PLACEMENT, mp, sizeof (u32) * n_bits);
610 0 : mp->sw_if_index = htonl (sw_if_index);
611 0 : mp->queue_id = htonl (queue_id);
612 0 : mp->array_size = htonl (n_bits);
613 :
614 0 : v = clib_bitmap_first_set (bitmap);
615 0 : for (u32 j = 0; j < n_bits; j++)
616 : {
617 0 : mp->threads[j] = htonl (v);
618 0 : v = clib_bitmap_next_set (bitmap, v + 1);
619 : }
620 :
621 : /* send it... */
622 0 : S (mp);
623 : /* Wait for a reply, return the good/bad news... */
624 0 : W (ret);
625 0 : clib_bitmap_free (bitmap);
626 0 : return ret;
627 : }
628 :
629 : static int
630 0 : api_interface_name_renumber (vat_main_t *vam)
631 : {
632 0 : unformat_input_t *line_input = vam->input;
633 : vl_api_interface_name_renumber_t *mp;
634 0 : u32 sw_if_index = ~0;
635 0 : u32 new_show_dev_instance = ~0;
636 : int ret;
637 :
638 0 : while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
639 : {
640 0 : if (unformat (line_input, "%U", api_unformat_sw_if_index, vam,
641 : &sw_if_index))
642 : ;
643 0 : else if (unformat (line_input, "sw_if_index %d", &sw_if_index))
644 : ;
645 0 : else if (unformat (line_input, "new_show_dev_instance %d",
646 : &new_show_dev_instance))
647 : ;
648 : else
649 0 : break;
650 : }
651 :
652 0 : if (sw_if_index == ~0)
653 : {
654 0 : errmsg ("missing interface name or sw_if_index");
655 0 : return -99;
656 : }
657 :
658 0 : if (new_show_dev_instance == ~0)
659 : {
660 0 : errmsg ("missing new_show_dev_instance");
661 0 : return -99;
662 : }
663 :
664 0 : M (INTERFACE_NAME_RENUMBER, mp);
665 :
666 0 : mp->sw_if_index = ntohl (sw_if_index);
667 0 : mp->new_show_dev_instance = ntohl (new_show_dev_instance);
668 :
669 0 : S (mp);
670 0 : W (ret);
671 0 : return ret;
672 : }
673 :
674 : static int
675 0 : api_delete_subif (vat_main_t *vam)
676 : {
677 0 : unformat_input_t *i = vam->input;
678 : vl_api_delete_subif_t *mp;
679 0 : u32 sw_if_index = ~0;
680 : int ret;
681 :
682 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
683 : {
684 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
685 : ;
686 0 : if (unformat (i, "sw_if_index %d", &sw_if_index))
687 : ;
688 : else
689 0 : break;
690 : }
691 :
692 0 : if (sw_if_index == ~0)
693 : {
694 0 : errmsg ("missing sw_if_index");
695 0 : return -99;
696 : }
697 :
698 : /* Construct the API message */
699 0 : M (DELETE_SUBIF, mp);
700 0 : mp->sw_if_index = ntohl (sw_if_index);
701 :
702 0 : S (mp);
703 0 : W (ret);
704 0 : return ret;
705 : }
706 :
707 : static int
708 0 : api_delete_loopback (vat_main_t *vam)
709 : {
710 0 : unformat_input_t *i = vam->input;
711 : vl_api_delete_loopback_t *mp;
712 0 : u32 sw_if_index = ~0;
713 : int ret;
714 :
715 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
716 : {
717 0 : if (unformat (i, "sw_if_index %d", &sw_if_index))
718 : ;
719 : else
720 0 : break;
721 : }
722 :
723 0 : if (sw_if_index == ~0)
724 : {
725 0 : errmsg ("missing sw_if_index");
726 0 : return -99;
727 : }
728 :
729 : /* Construct the API message */
730 0 : M (DELETE_LOOPBACK, mp);
731 0 : mp->sw_if_index = ntohl (sw_if_index);
732 :
733 0 : S (mp);
734 0 : W (ret);
735 0 : return ret;
736 : }
737 :
738 : static int
739 0 : api_create_loopback_instance (vat_main_t *vat)
740 : {
741 0 : return -1;
742 : }
743 :
744 : static int
745 0 : api_create_loopback (vat_main_t *vam)
746 : {
747 0 : unformat_input_t *i = vam->input;
748 : vl_api_create_loopback_t *mp;
749 : vl_api_create_loopback_instance_t *mp_lbi;
750 : u8 mac_address[6];
751 0 : u8 mac_set = 0;
752 0 : u8 is_specified = 0;
753 0 : u32 user_instance = 0;
754 : int ret;
755 :
756 0 : clib_memset (mac_address, 0, sizeof (mac_address));
757 :
758 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
759 : {
760 0 : if (unformat (i, "mac %U", unformat_ethernet_address, mac_address))
761 0 : mac_set = 1;
762 0 : if (unformat (i, "instance %d", &user_instance))
763 0 : is_specified = 1;
764 : else
765 0 : break;
766 : }
767 :
768 0 : if (is_specified)
769 : {
770 0 : M (CREATE_LOOPBACK_INSTANCE, mp_lbi);
771 0 : mp_lbi->is_specified = is_specified;
772 0 : if (is_specified)
773 0 : mp_lbi->user_instance = htonl (user_instance);
774 0 : if (mac_set)
775 0 : clib_memcpy (mp_lbi->mac_address, mac_address, sizeof (mac_address));
776 0 : S (mp_lbi);
777 : }
778 : else
779 : {
780 : /* Construct the API message */
781 0 : M (CREATE_LOOPBACK, mp);
782 0 : if (mac_set)
783 0 : clib_memcpy (mp->mac_address, mac_address, sizeof (mac_address));
784 0 : S (mp);
785 : }
786 :
787 0 : W (ret);
788 0 : return ret;
789 : }
790 :
791 : static void
792 0 : vl_api_create_subif_reply_t_handler (vl_api_create_subif_reply_t *mp)
793 : {
794 0 : vat_main_t *vam = interface_test_main.vat_main;
795 0 : vam->result_ready = 1;
796 0 : }
797 :
798 : #define foreach_create_subif_bit \
799 : _ (no_tags) \
800 : _ (one_tag) \
801 : _ (two_tags) \
802 : _ (dot1ad) \
803 : _ (exact_match) \
804 : _ (default_sub) \
805 : _ (outer_vlan_id_any) \
806 : _ (inner_vlan_id_any)
807 :
808 : #define foreach_create_subif_flag \
809 : _ (0, "no_tags") \
810 : _ (1, "one_tag") \
811 : _ (2, "two_tags") \
812 : _ (3, "dot1ad") \
813 : _ (4, "exact_match") \
814 : _ (5, "default_sub") \
815 : _ (6, "outer_vlan_id_any") \
816 : _ (7, "inner_vlan_id_any")
817 :
818 : static int
819 0 : api_create_subif (vat_main_t *vam)
820 : {
821 0 : unformat_input_t *i = vam->input;
822 : vl_api_create_subif_t *mp;
823 : u32 sw_if_index;
824 0 : u8 sw_if_index_set = 0;
825 : u32 sub_id;
826 0 : u8 sub_id_set = 0;
827 0 : u32 __attribute__ ((unused)) no_tags = 0;
828 0 : u32 __attribute__ ((unused)) one_tag = 0;
829 0 : u32 __attribute__ ((unused)) two_tags = 0;
830 0 : u32 __attribute__ ((unused)) dot1ad = 0;
831 0 : u32 __attribute__ ((unused)) exact_match = 0;
832 0 : u32 __attribute__ ((unused)) default_sub = 0;
833 0 : u32 __attribute__ ((unused)) outer_vlan_id_any = 0;
834 0 : u32 __attribute__ ((unused)) inner_vlan_id_any = 0;
835 : u32 tmp;
836 0 : u16 outer_vlan_id = 0;
837 0 : u16 inner_vlan_id = 0;
838 : int ret;
839 :
840 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
841 : {
842 0 : if (unformat (i, "sw_if_index %d", &sw_if_index))
843 0 : sw_if_index_set = 1;
844 0 : else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
845 0 : sw_if_index_set = 1;
846 0 : else if (unformat (i, "sub_id %d", &sub_id))
847 0 : sub_id_set = 1;
848 0 : else if (unformat (i, "outer_vlan_id %d", &tmp))
849 0 : outer_vlan_id = tmp;
850 0 : else if (unformat (i, "inner_vlan_id %d", &tmp))
851 0 : inner_vlan_id = tmp;
852 :
853 : #define _(a) else if (unformat (i, #a)) a = 1;
854 0 : foreach_create_subif_bit
855 : #undef _
856 : else
857 : {
858 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
859 0 : return -99;
860 : }
861 : }
862 :
863 0 : if (sw_if_index_set == 0)
864 : {
865 0 : errmsg ("missing interface name or sw_if_index");
866 0 : return -99;
867 : }
868 :
869 0 : if (sub_id_set == 0)
870 : {
871 0 : errmsg ("missing sub_id");
872 0 : return -99;
873 : }
874 0 : M (CREATE_SUBIF, mp);
875 :
876 0 : mp->sw_if_index = ntohl (sw_if_index);
877 0 : mp->sub_id = ntohl (sub_id);
878 :
879 : #define _(a, b) mp->sub_if_flags |= (1 << a);
880 0 : foreach_create_subif_flag;
881 : #undef _
882 :
883 0 : mp->outer_vlan_id = ntohs (outer_vlan_id);
884 0 : mp->inner_vlan_id = ntohs (inner_vlan_id);
885 :
886 0 : S (mp);
887 0 : W (ret);
888 0 : return ret;
889 : }
890 :
891 : static void
892 0 : vl_api_sw_interface_rx_placement_details_t_handler (
893 : vl_api_sw_interface_rx_placement_details_t *mp)
894 : {
895 0 : vat_main_t *vam = interface_test_main.vat_main;
896 0 : u32 worker_id = ntohl (mp->worker_id);
897 :
898 0 : print (vam->ofp, "\n%-11d %-11s %-6d %-5d %-9s", ntohl (mp->sw_if_index),
899 : (worker_id == 0) ? "main" : "worker", worker_id, ntohl (mp->queue_id),
900 0 : (mp->mode == 1) ? "polling" :
901 0 : ((mp->mode == 2) ? "interrupt" : "adaptive"));
902 0 : }
903 :
904 : static __clib_unused void
905 0 : vl_api_sw_interface_tx_placement_details_t_handler (
906 : vl_api_sw_interface_tx_placement_details_t *mp)
907 : {
908 0 : vat_main_t *vam = interface_test_main.vat_main;
909 0 : u32 size = ntohl (mp->array_size);
910 0 : uword *bitmap = 0;
911 :
912 0 : for (u32 i = 0; i < size; i++)
913 : {
914 0 : u32 thread_index = ntohl (mp->threads[i]);
915 0 : bitmap = clib_bitmap_set (bitmap, thread_index, 1);
916 : }
917 :
918 0 : print (vam->ofp, "\n%-11d %-6d %-7s %U", ntohl (mp->sw_if_index),
919 0 : ntohl (mp->queue_id), (mp->shared == 1) ? "yes" : "no",
920 : format_bitmap_list, bitmap);
921 0 : }
922 :
923 : static void
924 0 : vl_api_create_vlan_subif_reply_t_handler (vl_api_create_vlan_subif_reply_t *mp)
925 : {
926 0 : vat_main_t *vam = interface_test_main.vat_main;
927 0 : vam->result_ready = 1;
928 0 : }
929 :
930 : static void
931 0 : vl_api_create_loopback_reply_t_handler (vl_api_create_loopback_reply_t *mp)
932 : {
933 0 : vat_main_t *vam = interface_test_main.vat_main;
934 0 : vam->result_ready = 1;
935 0 : }
936 :
937 : static void
938 0 : vl_api_create_loopback_instance_reply_t_handler (
939 : vl_api_create_loopback_instance_reply_t *mp)
940 : {
941 0 : vat_main_t *vam = interface_test_main.vat_main;
942 0 : vam->result_ready = 1;
943 0 : }
944 :
945 : static int
946 0 : api_create_vlan_subif (vat_main_t *vam)
947 : {
948 0 : unformat_input_t *i = vam->input;
949 : vl_api_create_vlan_subif_t *mp;
950 : u32 sw_if_index;
951 0 : u8 sw_if_index_set = 0;
952 : u32 vlan_id;
953 0 : u8 vlan_id_set = 0;
954 : int ret;
955 :
956 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
957 : {
958 0 : if (unformat (i, "sw_if_index %d", &sw_if_index))
959 0 : sw_if_index_set = 1;
960 0 : else if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
961 0 : sw_if_index_set = 1;
962 0 : else if (unformat (i, "vlan %d", &vlan_id))
963 0 : vlan_id_set = 1;
964 : else
965 : {
966 0 : clib_warning ("parse error '%U'", format_unformat_error, i);
967 0 : return -99;
968 : }
969 : }
970 :
971 0 : if (sw_if_index_set == 0)
972 : {
973 0 : errmsg ("missing interface name or sw_if_index");
974 0 : return -99;
975 : }
976 :
977 0 : if (vlan_id_set == 0)
978 : {
979 0 : errmsg ("missing vlan_id");
980 0 : return -99;
981 : }
982 0 : M (CREATE_VLAN_SUBIF, mp);
983 :
984 0 : mp->sw_if_index = ntohl (sw_if_index);
985 0 : mp->vlan_id = ntohl (vlan_id);
986 :
987 0 : S (mp);
988 0 : W (ret);
989 0 : return ret;
990 : }
991 :
992 : static int
993 0 : api_collect_detailed_interface_stats (vat_main_t *vam)
994 : {
995 0 : return -1;
996 : }
997 :
998 : static int
999 0 : api_sw_interface_rx_placement_dump (vat_main_t *vam)
1000 : {
1001 0 : unformat_input_t *i = vam->input;
1002 : vl_api_sw_interface_rx_placement_dump_t *mp;
1003 : vl_api_control_ping_t *mp_ping;
1004 : int ret;
1005 : u32 sw_if_index;
1006 0 : u8 sw_if_index_set = 0;
1007 :
1008 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1009 : {
1010 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
1011 0 : sw_if_index_set++;
1012 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
1013 0 : sw_if_index_set++;
1014 : else
1015 0 : break;
1016 : }
1017 :
1018 0 : fformat (vam->ofp, "\n%-11s %-11s %-6s %-5s %-4s", "sw_if_index",
1019 : "main/worker", "thread", "queue", "mode");
1020 :
1021 : /* Dump Interface rx placement */
1022 0 : M (SW_INTERFACE_RX_PLACEMENT_DUMP, mp);
1023 :
1024 0 : if (sw_if_index_set)
1025 0 : mp->sw_if_index = htonl (sw_if_index);
1026 : else
1027 0 : mp->sw_if_index = ~0;
1028 :
1029 0 : S (mp);
1030 :
1031 : /* Use a control ping for synchronization */
1032 0 : PING (&interface_test_main, mp_ping);
1033 0 : S (mp_ping);
1034 :
1035 0 : W (ret);
1036 0 : return ret;
1037 : }
1038 :
1039 : static int
1040 0 : api_sw_interface_tx_placement_get (vat_main_t *vam)
1041 : {
1042 0 : unformat_input_t *i = vam->input;
1043 : vl_api_sw_interface_tx_placement_get_t *mp;
1044 : vl_api_control_ping_t *mp_ping;
1045 : int ret;
1046 : u32 sw_if_index;
1047 0 : u8 sw_if_index_set = 0;
1048 :
1049 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1050 : {
1051 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
1052 0 : sw_if_index_set++;
1053 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
1054 0 : sw_if_index_set++;
1055 : else
1056 0 : break;
1057 : }
1058 :
1059 0 : fformat (vam->ofp, "\n%-11s %-6s %-7s %-11s", "sw_if_index", "queue",
1060 : "shared", "threads");
1061 :
1062 : /* Dump Interface tx placement */
1063 0 : M (SW_INTERFACE_TX_PLACEMENT_GET, mp);
1064 :
1065 0 : if (sw_if_index_set)
1066 0 : mp->sw_if_index = htonl (sw_if_index);
1067 : else
1068 0 : mp->sw_if_index = ~0;
1069 :
1070 0 : S (mp);
1071 :
1072 : /* Use a control ping for synchronization */
1073 0 : PING (&interface_test_main, mp_ping);
1074 0 : S (mp_ping);
1075 :
1076 0 : W (ret);
1077 0 : return ret;
1078 : }
1079 :
1080 : static void
1081 0 : vl_api_sw_interface_tx_placement_get_reply_t_handler ()
1082 : {
1083 0 : }
1084 :
1085 : static int
1086 0 : api_sw_interface_clear_stats (vat_main_t *vam)
1087 : {
1088 0 : unformat_input_t *i = vam->input;
1089 : vl_api_sw_interface_clear_stats_t *mp;
1090 : u32 sw_if_index;
1091 0 : u8 sw_if_index_set = 0;
1092 : int ret;
1093 :
1094 : /* Parse args required to build the message */
1095 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1096 : {
1097 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
1098 0 : sw_if_index_set = 1;
1099 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
1100 0 : sw_if_index_set = 1;
1101 : else
1102 0 : break;
1103 : }
1104 :
1105 : /* Construct the API message */
1106 0 : M (SW_INTERFACE_CLEAR_STATS, mp);
1107 :
1108 0 : if (sw_if_index_set == 1)
1109 0 : mp->sw_if_index = ntohl (sw_if_index);
1110 : else
1111 0 : mp->sw_if_index = ~0;
1112 :
1113 : /* send it... */
1114 0 : S (mp);
1115 :
1116 : /* Wait for a reply, return the good/bad news... */
1117 0 : W (ret);
1118 0 : return ret;
1119 : }
1120 :
1121 : static int
1122 0 : api_sw_interface_set_table (vat_main_t *vam)
1123 : {
1124 0 : unformat_input_t *i = vam->input;
1125 : vl_api_sw_interface_set_table_t *mp;
1126 0 : u32 sw_if_index, vrf_id = 0;
1127 0 : u8 sw_if_index_set = 0;
1128 0 : u8 is_ipv6 = 0;
1129 : int ret;
1130 :
1131 : /* Parse args required to build the message */
1132 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1133 : {
1134 0 : if (unformat (i, "%U", api_unformat_sw_if_index, vam, &sw_if_index))
1135 0 : sw_if_index_set = 1;
1136 0 : else if (unformat (i, "sw_if_index %d", &sw_if_index))
1137 0 : sw_if_index_set = 1;
1138 0 : else if (unformat (i, "vrf %d", &vrf_id))
1139 : ;
1140 0 : else if (unformat (i, "ipv6"))
1141 0 : is_ipv6 = 1;
1142 : else
1143 0 : break;
1144 : }
1145 :
1146 0 : if (sw_if_index_set == 0)
1147 : {
1148 0 : errmsg ("missing interface name or sw_if_index");
1149 0 : return -99;
1150 : }
1151 :
1152 : /* Construct the API message */
1153 0 : M (SW_INTERFACE_SET_TABLE, mp);
1154 :
1155 0 : mp->sw_if_index = ntohl (sw_if_index);
1156 0 : mp->is_ipv6 = is_ipv6;
1157 0 : mp->vrf_id = ntohl (vrf_id);
1158 :
1159 : /* send it... */
1160 0 : S (mp);
1161 :
1162 : /* Wait for a reply... */
1163 0 : W (ret);
1164 0 : return ret;
1165 : }
1166 :
1167 : static int
1168 0 : api_sw_interface_address_replace_end (vat_main_t *vam)
1169 : {
1170 0 : return -1;
1171 : }
1172 :
1173 : static int
1174 0 : api_sw_interface_set_ip_directed_broadcast (vat_main_t *vam)
1175 : {
1176 0 : return -1;
1177 : }
1178 :
1179 : static int
1180 0 : api_sw_interface_set_mtu (vat_main_t *vam)
1181 : {
1182 0 : return -1;
1183 : }
1184 :
1185 : static int
1186 0 : api_sw_interface_set_promisc (vat_main_t *vam)
1187 : {
1188 0 : return -1;
1189 : }
1190 :
1191 : static int
1192 0 : api_want_interface_events (vat_main_t *vam)
1193 : {
1194 0 : unformat_input_t *i = vam->input;
1195 : vl_api_want_interface_events_t *mp;
1196 0 : int enable = -1;
1197 : int ret;
1198 :
1199 0 : while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
1200 : {
1201 0 : if (unformat (i, "enable"))
1202 0 : enable = 1;
1203 0 : else if (unformat (i, "disable"))
1204 0 : enable = 0;
1205 : else
1206 0 : break;
1207 : }
1208 :
1209 0 : if (enable == -1)
1210 : {
1211 0 : errmsg ("missing enable|disable");
1212 0 : return -99;
1213 : }
1214 :
1215 0 : M (WANT_INTERFACE_EVENTS, mp);
1216 0 : mp->enable_disable = enable;
1217 :
1218 0 : vam->interface_event_display = enable;
1219 :
1220 0 : S (mp);
1221 0 : W (ret);
1222 0 : return ret;
1223 : }
1224 :
1225 : typedef struct
1226 : {
1227 : u8 *name;
1228 : u32 value;
1229 : } name_sort_t;
1230 :
1231 : int
1232 1 : api_sw_interface_dump (vat_main_t *vam)
1233 : {
1234 : vl_api_sw_interface_dump_t *mp;
1235 : vl_api_control_ping_t *mp_ping;
1236 : hash_pair_t *p;
1237 1 : name_sort_t *nses = 0, *ns;
1238 1 : sw_interface_subif_t *sub = NULL;
1239 : int ret;
1240 :
1241 : /* Toss the old name table */
1242 65 : hash_foreach_pair (p, vam->sw_if_index_by_interface_name, ({
1243 : vec_add2 (nses, ns, 1);
1244 : ns->name = (u8 *) (p->key);
1245 : ns->value = (u32) p->value[0];
1246 : }));
1247 :
1248 1 : hash_free (vam->sw_if_index_by_interface_name);
1249 :
1250 1 : vec_foreach (ns, nses)
1251 0 : vec_free (ns->name);
1252 :
1253 1 : vec_free (nses);
1254 :
1255 1 : vec_foreach (sub, vam->sw_if_subif_table)
1256 : {
1257 0 : vec_free (sub->interface_name);
1258 : }
1259 1 : vec_free (vam->sw_if_subif_table);
1260 :
1261 : /* recreate the interface name hash table */
1262 1 : vam->sw_if_index_by_interface_name = hash_create_string (0, sizeof (uword));
1263 :
1264 : /*
1265 : * Ask for all interface names. Otherwise, the epic catalog of
1266 : * name filters becomes ridiculously long, and vat ends up needing
1267 : * to be taught about new interface types.
1268 : */
1269 1 : M (SW_INTERFACE_DUMP, mp);
1270 1 : S (mp);
1271 :
1272 : /* Use a control ping for synchronization */
1273 1 : PING (&interface_test_main, mp_ping);
1274 1 : S (mp_ping);
1275 :
1276 49164 : W (ret);
1277 1 : return ret;
1278 : }
1279 :
1280 : static int
1281 0 : api_sw_interface_set_interface_name (vat_main_t *vam)
1282 : {
1283 0 : return -1;
1284 : }
1285 :
1286 : static int
1287 0 : api_pcap_trace_on (vat_main_t *vam)
1288 : {
1289 0 : return -1;
1290 : }
1291 :
1292 : static int
1293 0 : api_pcap_trace_off (vat_main_t *vam)
1294 : {
1295 0 : return -1;
1296 : }
1297 :
1298 : #include <vnet/interface.api_test.c>
1299 :
1300 : /*
1301 : * Local Variables:
1302 : * eval: (c-set-style "gnu")
1303 : * End:
1304 : */
|