1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015 Intel Corporation
5 #include <cmdline_parse.h>
6 #include <cmdline_parse_num.h>
7 #include <cmdline_parse_string.h>
8 #include <cmdline_parse_etheraddr.h>
9 #include <cmdline_socket.h>
12 #include "rte_ethtool.h"
15 #define EEPROM_DUMP_CHUNKSIZE 1024
18 struct pcmd_get_params {
19 cmdline_fixed_string_t cmd;
21 struct pcmd_int_params {
22 cmdline_fixed_string_t cmd;
25 struct pcmd_intstr_params {
26 cmdline_fixed_string_t cmd;
28 cmdline_fixed_string_t opt;
30 struct pcmd_intmac_params {
31 cmdline_fixed_string_t cmd;
33 struct ether_addr mac;
35 struct pcmd_str_params {
36 cmdline_fixed_string_t cmd;
37 cmdline_fixed_string_t opt;
39 struct pcmd_vlan_params {
40 cmdline_fixed_string_t cmd;
42 cmdline_fixed_string_t mode;
45 struct pcmd_intintint_params {
46 cmdline_fixed_string_t cmd;
53 /* Parameter-less commands */
54 cmdline_parse_token_string_t pcmd_quit_token_cmd =
55 TOKEN_STRING_INITIALIZER(struct pcmd_get_params, cmd, "quit");
56 cmdline_parse_token_string_t pcmd_stats_token_cmd =
57 TOKEN_STRING_INITIALIZER(struct pcmd_get_params, cmd, "stats");
58 cmdline_parse_token_string_t pcmd_drvinfo_token_cmd =
59 TOKEN_STRING_INITIALIZER(struct pcmd_get_params, cmd, "drvinfo");
60 cmdline_parse_token_string_t pcmd_link_token_cmd =
61 TOKEN_STRING_INITIALIZER(struct pcmd_get_params, cmd, "link");
63 /* Commands taking just port id */
64 cmdline_parse_token_string_t pcmd_open_token_cmd =
65 TOKEN_STRING_INITIALIZER(struct pcmd_int_params, cmd, "open");
66 cmdline_parse_token_string_t pcmd_stop_token_cmd =
67 TOKEN_STRING_INITIALIZER(struct pcmd_int_params, cmd, "stop");
68 cmdline_parse_token_string_t pcmd_rxmode_token_cmd =
69 TOKEN_STRING_INITIALIZER(struct pcmd_int_params, cmd, "rxmode");
70 cmdline_parse_token_string_t pcmd_portstats_token_cmd =
71 TOKEN_STRING_INITIALIZER(struct pcmd_int_params, cmd, "portstats");
72 cmdline_parse_token_num_t pcmd_int_token_port =
73 TOKEN_NUM_INITIALIZER(struct pcmd_int_params, port, UINT16);
75 /* Commands taking port id and string */
76 cmdline_parse_token_string_t pcmd_eeprom_token_cmd =
77 TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params, cmd, "eeprom");
78 cmdline_parse_token_string_t pcmd_module_eeprom_token_cmd =
79 TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params, cmd,
81 cmdline_parse_token_string_t pcmd_mtu_token_cmd =
82 TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params, cmd, "mtu");
83 cmdline_parse_token_string_t pcmd_regs_token_cmd =
84 TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params, cmd, "regs");
86 cmdline_parse_token_num_t pcmd_intstr_token_port =
87 TOKEN_NUM_INITIALIZER(struct pcmd_intstr_params, port, UINT16);
88 cmdline_parse_token_string_t pcmd_intstr_token_opt =
89 TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params, opt, NULL);
91 /* Commands taking port id and a MAC address string */
92 cmdline_parse_token_string_t pcmd_macaddr_token_cmd =
93 TOKEN_STRING_INITIALIZER(struct pcmd_intmac_params, cmd, "macaddr");
94 cmdline_parse_token_num_t pcmd_intmac_token_port =
95 TOKEN_NUM_INITIALIZER(struct pcmd_intmac_params, port, UINT16);
96 cmdline_parse_token_etheraddr_t pcmd_intmac_token_mac =
97 TOKEN_ETHERADDR_INITIALIZER(struct pcmd_intmac_params, mac);
99 /* Command taking just a MAC address */
100 cmdline_parse_token_string_t pcmd_validate_token_cmd =
101 TOKEN_STRING_INITIALIZER(struct pcmd_intmac_params, cmd, "validate");
104 /* Commands taking port id and two integers */
105 cmdline_parse_token_string_t pcmd_ringparam_token_cmd =
106 TOKEN_STRING_INITIALIZER(struct pcmd_intintint_params, cmd,
108 cmdline_parse_token_num_t pcmd_intintint_token_port =
109 TOKEN_NUM_INITIALIZER(struct pcmd_intintint_params, port, UINT16);
110 cmdline_parse_token_num_t pcmd_intintint_token_tx =
111 TOKEN_NUM_INITIALIZER(struct pcmd_intintint_params, tx, UINT16);
112 cmdline_parse_token_num_t pcmd_intintint_token_rx =
113 TOKEN_NUM_INITIALIZER(struct pcmd_intintint_params, rx, UINT16);
117 cmdline_parse_token_string_t pcmd_pause_token_cmd =
118 TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params, cmd, "pause");
119 cmdline_parse_token_num_t pcmd_pause_token_port =
120 TOKEN_NUM_INITIALIZER(struct pcmd_intstr_params, port, UINT16);
121 cmdline_parse_token_string_t pcmd_pause_token_opt =
122 TOKEN_STRING_INITIALIZER(struct pcmd_intstr_params,
123 opt, "all#tx#rx#none");
126 cmdline_parse_token_string_t pcmd_vlan_token_cmd =
127 TOKEN_STRING_INITIALIZER(struct pcmd_vlan_params, cmd, "vlan");
128 cmdline_parse_token_num_t pcmd_vlan_token_port =
129 TOKEN_NUM_INITIALIZER(struct pcmd_vlan_params, port, UINT16);
130 cmdline_parse_token_string_t pcmd_vlan_token_mode =
131 TOKEN_STRING_INITIALIZER(struct pcmd_vlan_params, mode, "add#del");
132 cmdline_parse_token_num_t pcmd_vlan_token_vid =
133 TOKEN_NUM_INITIALIZER(struct pcmd_vlan_params, vid, UINT16);
137 pcmd_quit_callback(__rte_unused void *ptr_params,
139 __rte_unused void *ptr_data)
146 pcmd_drvinfo_callback(__rte_unused void *ptr_params,
147 __rte_unused struct cmdline *ctx,
148 __rte_unused void *ptr_data)
150 struct ethtool_drvinfo info;
153 RTE_ETH_FOREACH_DEV(id_port) {
154 memset(&info, 0, sizeof(info));
155 if (rte_ethtool_get_drvinfo(id_port, &info)) {
156 printf("Error getting info for port %i\n", id_port);
159 printf("Port %i driver: %s (ver: %s)\n",
160 id_port, info.driver, info.version
162 printf("firmware-version: %s\n", info.fw_version);
163 printf("bus-info: %s\n", info.bus_info);
169 pcmd_link_callback(__rte_unused void *ptr_params,
170 __rte_unused struct cmdline *ctx,
171 __rte_unused void *ptr_data)
176 RTE_ETH_FOREACH_DEV(id_port) {
177 if (!rte_eth_dev_is_valid_port(id_port))
179 stat_port = rte_ethtool_get_link(id_port);
182 printf("Port %i: Down\n", id_port);
185 printf("Port %i: Up\n", id_port);
188 printf("Port %i: Error getting link status\n",
199 pcmd_regs_callback(void *ptr_params,
200 __rte_unused struct cmdline *ctx,
201 __rte_unused void *ptr_data)
203 struct pcmd_intstr_params *params = ptr_params;
205 struct ethtool_regs regs;
206 unsigned char *buf_data;
209 if (!rte_eth_dev_is_valid_port(params->port)) {
210 printf("Error: Invalid port number %i\n", params->port);
213 len_regs = rte_ethtool_get_regs_len(params->port);
215 printf("Port %i: %i bytes\n", params->port, len_regs);
216 buf_data = malloc(len_regs);
217 if (buf_data == NULL) {
218 printf("Error allocating %i bytes for buffer\n",
222 if (!rte_ethtool_get_regs(params->port, ®s, buf_data)) {
223 fp_regs = fopen(params->opt, "wb");
224 if (fp_regs == NULL) {
225 printf("Error opening '%s' for writing\n",
228 if ((int)fwrite(buf_data,
230 fp_regs) != len_regs)
231 printf("Error writing '%s'\n",
237 } else if (len_regs == -ENOTSUP)
238 printf("Port %i: Operation not supported\n", params->port);
240 printf("Port %i: Error getting registers\n", params->port);
245 pcmd_eeprom_callback(void *ptr_params,
246 __rte_unused struct cmdline *ctx,
247 __rte_unused void *ptr_data)
249 struct pcmd_intstr_params *params = ptr_params;
250 struct ethtool_eeprom info_eeprom;
254 unsigned char bytes_eeprom[EEPROM_DUMP_CHUNKSIZE];
257 if (!rte_eth_dev_is_valid_port(params->port)) {
258 printf("Error: Invalid port number %i\n", params->port);
261 len_eeprom = rte_ethtool_get_eeprom_len(params->port);
262 if (len_eeprom > 0) {
263 fp_eeprom = fopen(params->opt, "wb");
264 if (fp_eeprom == NULL) {
265 printf("Error opening '%s' for writing\n",
269 printf("Total EEPROM length: %i bytes\n", len_eeprom);
270 info_eeprom.len = EEPROM_DUMP_CHUNKSIZE;
272 pos_eeprom < len_eeprom;
273 pos_eeprom += EEPROM_DUMP_CHUNKSIZE) {
274 info_eeprom.offset = pos_eeprom;
275 if (pos_eeprom + EEPROM_DUMP_CHUNKSIZE > len_eeprom)
276 info_eeprom.len = len_eeprom - pos_eeprom;
278 info_eeprom.len = EEPROM_DUMP_CHUNKSIZE;
279 stat = rte_ethtool_get_eeprom(
280 params->port, &info_eeprom, bytes_eeprom
283 printf("EEPROM read error %i\n", stat);
286 if (fwrite(bytes_eeprom,
288 fp_eeprom) != info_eeprom.len) {
289 printf("Error writing '%s'\n", params->opt);
294 } else if (len_eeprom == 0)
295 printf("Port %i: Device does not have EEPROM\n", params->port);
296 else if (len_eeprom == -ENOTSUP)
297 printf("Port %i: Operation not supported\n", params->port);
299 printf("Port %i: Error getting EEPROM\n", params->port);
304 pcmd_module_eeprom_callback(void *ptr_params,
305 __rte_unused struct cmdline *ctx,
306 __rte_unused void *ptr_data)
308 struct pcmd_intstr_params *params = ptr_params;
309 struct ethtool_eeprom info_eeprom;
310 uint32_t module_info[2];
312 unsigned char bytes_eeprom[EEPROM_DUMP_CHUNKSIZE];
315 if (!rte_eth_dev_is_valid_port(params->port)) {
316 printf("Error: Invalid port number %i\n", params->port);
320 stat = rte_ethtool_get_module_info(params->port, module_info);
322 printf("Module EEPROM information read error %i\n", stat);
326 info_eeprom.len = module_info[1];
327 info_eeprom.offset = 0;
329 stat = rte_ethtool_get_module_eeprom(params->port,
330 &info_eeprom, bytes_eeprom);
332 printf("Module EEPROM read error %i\n", stat);
336 fp_eeprom = fopen(params->opt, "wb");
337 if (fp_eeprom == NULL) {
338 printf("Error opening '%s' for writing\n", params->opt);
341 printf("Total plugin module EEPROM length: %i bytes\n",
343 if (fwrite(bytes_eeprom, 1, info_eeprom.len,
344 fp_eeprom) != info_eeprom.len) {
345 printf("Error writing '%s'\n", params->opt);
352 pcmd_pause_callback(void *ptr_params,
353 __rte_unused struct cmdline *ctx,
356 struct pcmd_intstr_params *params = ptr_params;
357 struct ethtool_pauseparam info;
360 if (!rte_eth_dev_is_valid_port(params->port)) {
361 printf("Error: Invalid port number %i\n", params->port);
364 if (ptr_data != NULL) {
365 stat = rte_ethtool_get_pauseparam(params->port, &info);
367 memset(&info, 0, sizeof(info));
368 if (strcasecmp("all", params->opt) == 0) {
371 } else if (strcasecmp("tx", params->opt) == 0) {
374 } else if (strcasecmp("rx", params->opt) == 0) {
381 /* Assume auto-negotiation wanted */
383 stat = rte_ethtool_set_pauseparam(params->port, &info);
386 if (info.rx_pause && info.tx_pause)
387 printf("Port %i: Tx & Rx Paused\n", params->port);
388 else if (info.rx_pause)
389 printf("Port %i: Rx Paused\n", params->port);
390 else if (info.tx_pause)
391 printf("Port %i: Tx Paused\n", params->port);
393 printf("Port %i: Tx & Rx not paused\n", params->port);
394 } else if (stat == -ENOTSUP)
395 printf("Port %i: Operation not supported\n", params->port);
397 printf("Port %i: Error %i\n", params->port, stat);
402 pcmd_open_callback(__rte_unused void *ptr_params,
403 __rte_unused struct cmdline *ctx,
404 __rte_unused void *ptr_data)
406 struct pcmd_int_params *params = ptr_params;
409 if (!rte_eth_dev_is_valid_port(params->port)) {
410 printf("Error: Invalid port number %i\n", params->port);
413 lock_port(params->port);
414 stat = rte_ethtool_net_open(params->port);
415 mark_port_active(params->port);
416 unlock_port(params->port);
419 else if (stat == -ENOTSUP)
420 printf("Port %i: Operation not supported\n", params->port);
422 printf("Port %i: Error opening device\n", params->port);
426 pcmd_stop_callback(__rte_unused void *ptr_params,
427 __rte_unused struct cmdline *ctx,
428 __rte_unused void *ptr_data)
430 struct pcmd_int_params *params = ptr_params;
433 if (!rte_eth_dev_is_valid_port(params->port)) {
434 printf("Error: Invalid port number %i\n", params->port);
437 lock_port(params->port);
438 stat = rte_ethtool_net_stop(params->port);
439 mark_port_inactive(params->port);
440 unlock_port(params->port);
443 else if (stat == -ENOTSUP)
444 printf("Port %i: Operation not supported\n", params->port);
446 printf("Port %i: Error stopping device\n", params->port);
451 pcmd_rxmode_callback(void *ptr_params,
452 __rte_unused struct cmdline *ctx,
453 __rte_unused void *ptr_data)
455 struct pcmd_intstr_params *params = ptr_params;
458 if (!rte_eth_dev_is_valid_port(params->port)) {
459 printf("Error: Invalid port number %i\n", params->port);
462 stat = rte_ethtool_net_set_rx_mode(params->port);
465 else if (stat == -ENOTSUP)
466 printf("Port %i: Operation not supported\n", params->port);
468 printf("Port %i: Error setting rx mode\n", params->port);
473 pcmd_macaddr_callback(void *ptr_params,
474 __rte_unused struct cmdline *ctx,
477 struct pcmd_intmac_params *params = ptr_params;
478 struct ether_addr mac_addr;
482 if (!rte_eth_dev_is_valid_port(params->port)) {
483 printf("Error: Invalid port number %i\n", params->port);
486 if (ptr_data != NULL) {
487 lock_port(params->port);
488 stat = rte_ethtool_net_set_mac_addr(params->port,
490 mark_port_newmac(params->port);
491 unlock_port(params->port);
493 printf("MAC address changed\n");
497 stat = rte_ethtool_net_get_mac_addr(params->port, &mac_addr);
500 "Port %i MAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n",
502 mac_addr.addr_bytes[0],
503 mac_addr.addr_bytes[1],
504 mac_addr.addr_bytes[2],
505 mac_addr.addr_bytes[3],
506 mac_addr.addr_bytes[4],
507 mac_addr.addr_bytes[5]);
512 printf("Port %i: Error %s\n", params->port,
517 pcmd_mtu_callback(void *ptr_params,
518 __rte_unused struct cmdline *ctx,
519 __rte_unused void *ptr_data)
521 struct pcmd_intstr_params *params = ptr_params;
526 if (!rte_eth_dev_is_valid_port(params->port)) {
527 printf("Error: Invalid port number %i\n", params->port);
530 new_mtu = atoi(params->opt);
531 new_mtu = strtoul(params->opt, &ptr_parse_end, 10);
532 if (*ptr_parse_end != '\0' ||
533 new_mtu < ETHER_MIN_MTU ||
534 new_mtu > ETHER_MAX_JUMBO_FRAME_LEN) {
535 printf("Port %i: Invalid MTU value\n", params->port);
538 stat = rte_ethtool_net_change_mtu(params->port, new_mtu);
540 printf("Port %i: MTU set to %i\n", params->port, new_mtu);
541 else if (stat == -ENOTSUP)
542 printf("Port %i: Operation not supported\n", params->port);
544 printf("Port %i: Error setting MTU\n", params->port);
549 static void pcmd_portstats_callback(__rte_unused void *ptr_params,
550 __rte_unused struct cmdline *ctx,
551 __rte_unused void *ptr_data)
553 struct pcmd_int_params *params = ptr_params;
554 struct rte_eth_stats stat_info;
557 if (!rte_eth_dev_is_valid_port(params->port)) {
558 printf("Error: Invalid port number %i\n", params->port);
561 stat = rte_ethtool_net_get_stats64(params->port, &stat_info);
563 printf("Port %i stats\n", params->port);
564 printf(" In: %" PRIu64 " (%" PRIu64 " bytes)\n"
565 " Out: %"PRIu64" (%"PRIu64 " bytes)\n"
571 stat_info.ierrors+stat_info.oerrors
573 } else if (stat == -ENOTSUP)
574 printf("Port %i: Operation not supported\n", params->port);
576 printf("Port %i: Error fetching statistics\n", params->port);
579 static void pcmd_ringparam_callback(__rte_unused void *ptr_params,
580 __rte_unused struct cmdline *ctx,
583 struct pcmd_intintint_params *params = ptr_params;
584 struct ethtool_ringparam ring_data;
585 struct ethtool_ringparam ring_params;
588 if (!rte_eth_dev_is_valid_port(params->port)) {
589 printf("Error: Invalid port number %i\n", params->port);
592 if (ptr_data == NULL) {
593 stat = rte_ethtool_get_ringparam(params->port, &ring_data);
595 printf("Port %i ring parameters\n"
596 " Rx Pending: %i (%i max)\n"
597 " Tx Pending: %i (%i max)\n",
599 ring_data.rx_pending,
600 ring_data.rx_max_pending,
601 ring_data.tx_pending,
602 ring_data.tx_max_pending);
605 if (params->tx < 1 || params->rx < 1) {
606 printf("Error: Invalid parameters\n");
609 memset(&ring_params, 0, sizeof(struct ethtool_ringparam));
610 ring_params.tx_pending = params->tx;
611 ring_params.rx_pending = params->rx;
612 lock_port(params->port);
613 stat = rte_ethtool_set_ringparam(params->port, &ring_params);
614 unlock_port(params->port);
618 else if (stat == -ENOTSUP)
619 printf("Port %i: Operation not supported\n", params->port);
621 printf("Port %i: Error fetching statistics\n", params->port);
624 static void pcmd_validate_callback(void *ptr_params,
625 __rte_unused struct cmdline *ctx,
626 __rte_unused void *ptr_data)
628 struct pcmd_intmac_params *params = ptr_params;
630 if (rte_ethtool_net_validate_addr(0, ¶ms->mac))
631 printf("Address is unicast\n");
633 printf("Address is not unicast\n");
637 static void pcmd_vlan_callback(__rte_unused void *ptr_params,
638 __rte_unused struct cmdline *ctx,
639 __rte_unused void *ptr_data)
641 struct pcmd_vlan_params *params = ptr_params;
644 if (!rte_eth_dev_is_valid_port(params->port)) {
645 printf("Error: Invalid port number %i\n", params->port);
650 if (strcasecmp("add", params->mode) == 0) {
651 stat = rte_ethtool_net_vlan_rx_add_vid(
652 params->port, params->vid
655 printf("VLAN vid %i added\n", params->vid);
657 } else if (strcasecmp("del", params->mode) == 0) {
658 stat = rte_ethtool_net_vlan_rx_kill_vid(
659 params->port, params->vid
662 printf("VLAN vid %i removed\n", params->vid);
664 /* Should not happen! */
665 printf("Error: Bad mode %s\n", params->mode);
667 if (stat == -ENOTSUP)
668 printf("Port %i: Operation not supported\n", params->port);
669 else if (stat == -ENOSYS)
670 printf("Port %i: VLAN filtering disabled\n", params->port);
672 printf("Port %i: Error changing VLAN setup (code %i)\n",
673 params->port, -stat);
677 cmdline_parse_inst_t pcmd_quit = {
678 .f = pcmd_quit_callback,
680 .help_str = "quit\n Exit program",
681 .tokens = {(void *)&pcmd_quit_token_cmd, NULL},
683 cmdline_parse_inst_t pcmd_drvinfo = {
684 .f = pcmd_drvinfo_callback,
686 .help_str = "drvinfo\n Print driver info",
687 .tokens = {(void *)&pcmd_drvinfo_token_cmd, NULL},
689 cmdline_parse_inst_t pcmd_link = {
690 .f = pcmd_link_callback,
692 .help_str = "link\n Print port link states",
693 .tokens = {(void *)&pcmd_link_token_cmd, NULL},
695 cmdline_parse_inst_t pcmd_regs = {
696 .f = pcmd_regs_callback,
698 .help_str = "regs <port_id> <filename>\n"
699 " Dump port register(s) to file",
701 (void *)&pcmd_regs_token_cmd,
702 (void *)&pcmd_intstr_token_port,
703 (void *)&pcmd_intstr_token_opt,
707 cmdline_parse_inst_t pcmd_eeprom = {
708 .f = pcmd_eeprom_callback,
710 .help_str = "eeprom <port_id> <filename>\n Dump EEPROM to file",
712 (void *)&pcmd_eeprom_token_cmd,
713 (void *)&pcmd_intstr_token_port,
714 (void *)&pcmd_intstr_token_opt,
718 cmdline_parse_inst_t pcmd_module_eeprom = {
719 .f = pcmd_module_eeprom_callback,
721 .help_str = "module-eeprom <port_id> <filename>\n"
722 " Dump plugin module EEPROM to file",
724 (void *)&pcmd_module_eeprom_token_cmd,
725 (void *)&pcmd_intstr_token_port,
726 (void *)&pcmd_intstr_token_opt,
730 cmdline_parse_inst_t pcmd_pause_noopt = {
731 .f = pcmd_pause_callback,
732 .data = (void *)0x01,
733 .help_str = "pause <port_id>\n Print port pause state",
735 (void *)&pcmd_pause_token_cmd,
736 (void *)&pcmd_pause_token_port,
740 cmdline_parse_inst_t pcmd_pause = {
741 .f = pcmd_pause_callback,
744 "pause <port_id> <all|tx|rx|none>\n Pause/unpause port",
746 (void *)&pcmd_pause_token_cmd,
747 (void *)&pcmd_pause_token_port,
748 (void *)&pcmd_pause_token_opt,
752 cmdline_parse_inst_t pcmd_open = {
753 .f = pcmd_open_callback,
755 .help_str = "open <port_id>\n Open port",
757 (void *)&pcmd_open_token_cmd,
758 (void *)&pcmd_int_token_port,
762 cmdline_parse_inst_t pcmd_stop = {
763 .f = pcmd_stop_callback,
765 .help_str = "stop <port_id>\n Stop port",
767 (void *)&pcmd_stop_token_cmd,
768 (void *)&pcmd_int_token_port,
772 cmdline_parse_inst_t pcmd_rxmode = {
773 .f = pcmd_rxmode_callback,
775 .help_str = "rxmode <port_id>\n Toggle port Rx mode",
777 (void *)&pcmd_rxmode_token_cmd,
778 (void *)&pcmd_int_token_port,
782 cmdline_parse_inst_t pcmd_macaddr_get = {
783 .f = pcmd_macaddr_callback,
785 .help_str = "macaddr <port_id>\n"
788 (void *)&pcmd_macaddr_token_cmd,
789 (void *)&pcmd_intstr_token_port,
793 cmdline_parse_inst_t pcmd_macaddr = {
794 .f = pcmd_macaddr_callback,
795 .data = (void *)0x01,
797 "macaddr <port_id> <mac_addr>\n"
800 (void *)&pcmd_macaddr_token_cmd,
801 (void *)&pcmd_intmac_token_port,
802 (void *)&pcmd_intmac_token_mac,
806 cmdline_parse_inst_t pcmd_mtu = {
807 .f = pcmd_mtu_callback,
809 .help_str = "mtu <port_id> <mtu_value>\n"
812 (void *)&pcmd_mtu_token_cmd,
813 (void *)&pcmd_intstr_token_port,
814 (void *)&pcmd_intstr_token_opt,
818 cmdline_parse_inst_t pcmd_portstats = {
819 .f = pcmd_portstats_callback,
821 .help_str = "portstats <port_id>\n"
822 " Print port eth statistics",
824 (void *)&pcmd_portstats_token_cmd,
825 (void *)&pcmd_int_token_port,
829 cmdline_parse_inst_t pcmd_ringparam = {
830 .f = pcmd_ringparam_callback,
832 .help_str = "ringparam <port_id>\n"
833 " Print ring parameters",
835 (void *)&pcmd_ringparam_token_cmd,
836 (void *)&pcmd_intintint_token_port,
840 cmdline_parse_inst_t pcmd_ringparam_set = {
841 .f = pcmd_ringparam_callback,
843 .help_str = "ringparam <port_id> <tx_param> <rx_param>\n"
844 " Set ring parameters",
846 (void *)&pcmd_ringparam_token_cmd,
847 (void *)&pcmd_intintint_token_port,
848 (void *)&pcmd_intintint_token_tx,
849 (void *)&pcmd_intintint_token_rx,
853 cmdline_parse_inst_t pcmd_validate = {
854 .f = pcmd_validate_callback,
856 .help_str = "validate <mac_addr>\n"
857 " Check that MAC address is valid unicast address",
859 (void *)&pcmd_validate_token_cmd,
860 (void *)&pcmd_intmac_token_mac,
864 cmdline_parse_inst_t pcmd_vlan = {
865 .f = pcmd_vlan_callback,
867 .help_str = "vlan <port_id> <add|del> <vlan_id>\n"
868 " Add/remove VLAN id",
870 (void *)&pcmd_vlan_token_cmd,
871 (void *)&pcmd_vlan_token_port,
872 (void *)&pcmd_vlan_token_mode,
873 (void *)&pcmd_vlan_token_vid,
879 cmdline_parse_ctx_t list_prompt_commands[] = {
880 (cmdline_parse_inst_t *)&pcmd_drvinfo,
881 (cmdline_parse_inst_t *)&pcmd_eeprom,
882 (cmdline_parse_inst_t *)&pcmd_module_eeprom,
883 (cmdline_parse_inst_t *)&pcmd_link,
884 (cmdline_parse_inst_t *)&pcmd_macaddr_get,
885 (cmdline_parse_inst_t *)&pcmd_macaddr,
886 (cmdline_parse_inst_t *)&pcmd_mtu,
887 (cmdline_parse_inst_t *)&pcmd_open,
888 (cmdline_parse_inst_t *)&pcmd_pause_noopt,
889 (cmdline_parse_inst_t *)&pcmd_pause,
890 (cmdline_parse_inst_t *)&pcmd_portstats,
891 (cmdline_parse_inst_t *)&pcmd_regs,
892 (cmdline_parse_inst_t *)&pcmd_ringparam,
893 (cmdline_parse_inst_t *)&pcmd_ringparam_set,
894 (cmdline_parse_inst_t *)&pcmd_rxmode,
895 (cmdline_parse_inst_t *)&pcmd_stop,
896 (cmdline_parse_inst_t *)&pcmd_validate,
897 (cmdline_parse_inst_t *)&pcmd_vlan,
898 (cmdline_parse_inst_t *)&pcmd_quit,
903 void ethapp_main(void)
905 struct cmdline *ctx_cmdline;
907 ctx_cmdline = cmdline_stdin_new(list_prompt_commands, "EthApp> ");
908 cmdline_interact(ctx_cmdline);
909 cmdline_stdin_exit(ctx_cmdline);