openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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