cmds.c (5657B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * File: cmds.c 8 * Purpose: Other BCMX CLI commands 9 */ 10 11 #include <sal/appl/io.h> 12 #include <sal/appl/sal.h> 13 14 #include <bcm/rate.h> 15 16 #include <bcm/error.h> 17 #include <bcmx/bcmx.h> 18 #include <bcmx/rate.h> 19 #include <bcmx/link.h> 20 21 #include <appl/diag/shell.h> 22 #include <appl/diag/system.h> 23 #include <appl/diag/parse.h> 24 25 #include "bcmx.h" 26 #include <appl/diag/diag.h> 27 28 STATIC void 29 _bcmx_link_callback(bcmx_lport_t lport, bcm_port_info_t *info) 30 { 31 if (info->linkstatus == BCM_PORT_LINK_STATUS_UP) { 32 sal_printf("BCMX: Link change UP, uport %s, %dMb %s.\n", 33 bcmx_lport_to_uport_str(lport), info->speed, 34 info->duplex ? "Full Duplex" : "Half Duplex"); 35 } else { 36 sal_printf("BCMX: Link change DOWN, uport %s.\n", 37 bcmx_lport_to_uport_str(lport)); 38 } 39 } 40 41 42 char bcmx_cmd_link_usage[] = 43 "LINKscan [check | reg | unreg | <usecs>]\n" 44 " Simple linkscan control command.\n" 45 " With no arguments, does a simple enable-get\n" 46 " check - Enable-get with consistency check\n" 47 " reg - Register local handler\n" 48 " unreg - Unregister local handler\n" 49 " <usecs> - Enable set with the given time; 0 disables\n"; 50 51 cmd_result_t 52 bcmx_cmd_link(int unit, args_t *args) 53 { 54 int us, consistent; 55 char *param; 56 int rv; 57 static int reg_count = 0; 58 59 if ((param = ARG_GET(args)) == NULL) { 60 rv = bcmx_linkscan_enable_get(&us, NULL); 61 if (rv < 0) { 62 sal_printf("ERROR getting bcmx link status %d: %s\n", 63 rv, bcm_errmsg(rv)); 64 return CMD_FAIL; 65 } 66 sal_printf("BCMX linkscan time %d: %s\n", us, 67 us > 0 ? "enabled" : "disabled"); 68 sal_printf("BCMX register count is %d\n", reg_count); 69 return CMD_OK; 70 } 71 72 if (!sal_strcasecmp(param, "check")) { 73 rv = bcmx_linkscan_enable_get(&us, &consistent); 74 if (rv < 0) { 75 sal_printf("ERROR getting bcmx link status %d: %s\n", 76 rv, bcm_errmsg(rv)); 77 return CMD_FAIL; 78 } 79 sal_printf("BCMX linkscan time %d: %s. Units are %sconsistent\n", 80 us, us > 0 ? "enabled" : "disabled", 81 consistent ? "" : "not "); 82 sal_printf("BCMX register count is %d\n", reg_count); 83 } else if (!sal_strcasecmp(param, "reg")) { 84 rv = bcmx_linkscan_register(_bcmx_link_callback); 85 ++reg_count; 86 sal_printf("BCMX linkscan register returns %d: %s\n", 87 rv, bcm_errmsg(rv)); 88 } else if (!sal_strcasecmp(param, "unreg")) { 89 rv = bcmx_linkscan_unregister(_bcmx_link_callback); 90 --reg_count; 91 sal_printf("BCMX linkscan register returns %d: %s\n", 92 rv, bcm_errmsg(rv)); 93 } else if (isdigit((unsigned) *param) || *param == '-') { 94 us = parse_integer(param); 95 rv = bcmx_linkscan_enable_set(us); 96 sal_printf("Set BCMX linkscan time to %d. Result %d: %s\n", us, 97 rv, bcm_errmsg(rv)); 98 } else { 99 sal_printf("Unknown subcommand %s.\n", param); 100 return CMD_USAGE; 101 } 102 103 return CMD_OK; 104 } 105 106 char bcmx_cmd_rate_usage[] = 107 "BCMX RATE Usages:\n" 108 " rate <Limit=val> [Bcast=val] [Mcast=val] [Dlf=val]\n" 109 " - Set specified packet rate limit\n\n" 110 " limit : packets per second\n" 111 " bcast : Enable broadcast rate control\n" 112 " mcast : Enable multicast rate control\n" 113 " dlf : Enable DLF flooding rate control\n" 114 " If no flags are given, displays the current rate settings\n"; 115 116 cmd_result_t 117 bcmx_cmd_rate(int unit, args_t *args) 118 { 119 parse_table_t pt; 120 int limit; 121 int bc_limit; 122 int mc_limit; 123 int dlf_limit; 124 int flags = 0; 125 int rv = BCM_E_NONE; 126 127 if ((rv = bcmx_rate_get(&limit, &flags)) < 0) { 128 sal_printf("ERROR: could not get rate: %s\n", bcm_errmsg(rv)); 129 return (CMD_FAIL); 130 } 131 132 bc_limit = ((flags & BCM_RATE_BCAST) ? TRUE : FALSE); 133 mc_limit = ((flags & BCM_RATE_MCAST) ? TRUE : FALSE); 134 dlf_limit = ((flags & BCM_RATE_DLF) ? TRUE : FALSE); 135 136 parse_table_init(0, &pt); 137 parse_table_add(&pt, "Limit", PQ_DFL|PQ_HEX, INT_TO_PTR(limit) , &limit, 0); 138 parse_table_add(&pt, "Bcast", PQ_DFL|PQ_BOOL, (void *)0, &bc_limit, 0); 139 parse_table_add(&pt, "Mcast", PQ_BOOL, INT_TO_PTR(mc_limit), &mc_limit, 0); 140 parse_table_add(&pt, "Dlf", PQ_DFL|PQ_BOOL, INT_TO_PTR(dlf_limit), &dlf_limit, 0); 141 142 if (ARG_GET(args) == NULL) { 143 sal_printf("Current settings:\n"); 144 parse_eq_format(&pt); 145 parse_arg_eq_done(&pt); 146 147 return(CMD_OK); 148 } 149 150 if (parse_arg_eq(args, &pt) < 0) { 151 sal_printf("Error: Unknown option: %s\n", ARG_CUR(args)); 152 parse_arg_eq_done(&pt); 153 154 return(CMD_FAIL); 155 } 156 157 if (bc_limit) { 158 flags |= (BCM_RATE_BCAST); 159 } else { 160 flags &= (~(BCM_RATE_BCAST)); 161 } 162 163 if (mc_limit) { 164 flags |= (BCM_RATE_MCAST); 165 } else { 166 flags &= (~(BCM_RATE_MCAST)); 167 } 168 169 if (dlf_limit) { 170 flags |= (BCM_RATE_DLF); 171 } else { 172 flags &= (~(BCM_RATE_DLF)); 173 } 174 175 if ((rv = bcmx_rate_set(limit, flags)) < 0) { 176 sal_printf("ERROR: could not set rate: %s\n", bcm_errmsg(rv)); 177 parse_arg_eq_done(&pt); 178 179 return (CMD_FAIL); 180 } 181 182 parse_arg_eq_done(&pt); 183 184 return CMD_OK; 185 } 186 187