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

flowtracker.c (14159B)


      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: flowtracker.c
      8  *  Purpose:  diag commands for flowtracker
      9  */
     10 #include <appl/diag/shell.h>
     11 #include <appl/diag/system.h>
     12 #include <appl/diag/parse.h>
     13 
     14 #include <soc/defs.h>
     15 #include <soc/drv.h>
     16 #include <soc/mem.h>
     17 
     18 #include <bcm/types.h>
     19 #include <bcm/error.h>
     20 
     21 #if defined (BCM_TOMAHAWK3_SUPPORT)
     22 #include <bcm/flowtracker.h>
     23 #include <soc/tomahawk3.h>
     24 #endif
     25 
     26 
     27 #if defined(BCM_FLOWTRACKER_SUPPORT)
     28 #include <bcm_int/esw/flowtracker/ft_group.h>
     29 #endif
     30 
     31 #if defined(INCLUDE_FLOWTRACKER)
     32 #include <bcm_int/esw/flowtracker.h>
     33 #endif /* INCLUDE_FLOWTRACKER */
     34 
     35 
     36 char cmd_ft_usage[] =
     37     "Usages:\n"
     38 #ifdef COMPILER_STRING_CONST_LIMIT
     39     "  FlowTracker <option> [args...]\n"
     40 #else
     41 #if defined (BCM_TOMAHAWK3_SUPPORT)
     42     "  ft etrap stats [Clear=<True|False>]\n\t"
     43     "      - Show the ETRAP statistics\n"
     44     "  ft etrap dump [Pipe=<pipe>] [StartIndex=<index>] [EndIndex=<index>] [Valid=<True|False>]\n\t"
     45     "      - Dump Elephant flow table entries\n"
     46 #endif
     47 #if defined(BCM_FLOWTRACKER_SUPPORT)
     48     "  ft init    - Init FT.\n"
     49     "  ft detach  - Detach FT.\n"
     50 
     51     "  ft key add <DIP>=<val> <SIP>=<val> <L4DestPort>=<val> <L4SrcPortVRF>=<val>]\n\t"
     52     "                   <Proto>=<val>] \n\t"
     53     "                   - Add an entry into FT table with above key\n"
     54     "  ft key lookup <DIP>=<val> <SIP>=<val> <L4DestPort>=<val> <L4SrcPortVRF>=<val>]\n\t"
     55     "                   <Proto>=<val>] \n\t"
     56     "                   - Returns the index associated with the above key.\n"
     57     "  ft show group <Group=<val> - Dumps the state of group. \n"
     58     "  ft show session_data <Group=<val> <DIP>=<val> <SIP>=<val> <L4DestPort>=<val> <L4SrcPortVRF>=<val>]\n\t"
     59     "                   <Proto>=<val>] \n\t"
     60     "                   - Dumps the Session data corresponding to user provided key.\n"
     61     "  ft show alu32 <index=<val> - Dump ALU32 entry with index. \n"
     62     "  ft show alu16 <index=<val> - Dump ALU32 entry with index. \n"
     63     "\n"
     64 #endif
     65 #if defined(INCLUDE_FLOWTRACKER)
     66     "  ft stats learn \n\t"
     67     "      - Show the Learn statistics\n"
     68     "  ft stats export \n\t"
     69     "      - Show the Export statistics\n"
     70     "  ft stats age \n\t"
     71     "      - Show the Aging statistics\n"
     72     "  ft stats elephant \n\t"
     73     "      - Show the Elephant statistics\n"
     74 #endif /* INCLUDE_FLOWTRACKER */
     75 
     76 #endif /* !COMPILER_STRING_CONST_LIMIT */
     77 ;
     78 
     79 
     80 #if defined (BCM_TOMAHAWK3_SUPPORT)
     81 /*
     82  * function:   cmd_ft_th3_etrap
     83  * purpose:    TH3 Flowtracker ETRAP diag commands
     84  * parameters: unit - unit
     85  *             a - args, each of the files to be displayed.
     86  * returns:    CMD_OK/CMD_FAIL/CMD_USAGE
     87  */
     88 cmd_result_t
     89 cmd_ft_th3_etrap(int unit, args_t *a)
     90 {
     91     char *c;
     92     int rv;
     93     int pipe, start_idx, end_idx, valid, clear;
     94     parse_table_t pt;
     95     cmd_result_t retCode;
     96 
     97     if (!soc_feature(unit, soc_feature_hw_etrap)) {
     98         return (CMD_NFND);
     99     }
    100 
    101     c = ARG_GET(a);
    102     if(!c) {
    103         return (CMD_USAGE);
    104     }
    105     if (!sal_strcmp(c, "stats")) {
    106         /* Set  default value */
    107         clear = FALSE;
    108 
    109         parse_table_init(unit, &pt);
    110         parse_table_add(&pt, "Clear",      PQ_DFL|PQ_BOOL, &clear,      &clear,     NULL);
    111         if (!parseEndOk(a, &pt, &retCode)) {
    112             return retCode;
    113         }
    114         rv = _bcm_th3_ft_dump_stats(unit, clear);
    115 	if (rv != BCM_E_NONE) {
    116 	    cli_out("%s ERROR: %s\n", ARG_CMD(a), bcm_errmsg(rv));
    117 	    return CMD_FAIL;
    118 	}
    119     } else if (!sal_strcmp(c, "dump")) {
    120         /* Set up the default values */
    121         pipe      = 0;
    122         start_idx = 0;
    123         end_idx   = -1;
    124         valid     = TRUE;
    125 
    126         parse_table_init(unit, &pt);
    127         parse_table_add(&pt, "Pipe",       PQ_DFL|PQ_INT,  &pipe,      &pipe,      NULL);
    128         parse_table_add(&pt, "StartIndex", PQ_DFL|PQ_INT,  &start_idx, &start_idx, NULL);
    129         parse_table_add(&pt, "EndIndex",   PQ_DFL|PQ_INT,  &end_idx,   &end_idx,   NULL);
    130         parse_table_add(&pt, "Valid",      PQ_DFL|PQ_BOOL, &valid,     &valid,     NULL);
    131         if (!parseEndOk(a, &pt, &retCode)) {
    132             return retCode;
    133         }
    134 
    135         rv = _bcm_th3_ft_dump_flow_table(unit, pipe, start_idx, end_idx, valid);
    136 	if (rv != BCM_E_NONE) {
    137 	    cli_out("%s ERROR: %s\n", ARG_CMD(a), bcm_errmsg(rv));
    138 	    return CMD_FAIL;
    139 	}
    140     }
    141     return CMD_OK;
    142 }
    143 #endif /* BCM_TOMAHAWK3_SUPPORT */
    144 
    145 #if defined(BCM_FLOWTRACKER_SUPPORT)
    146 
    147 STATIC cmd_result_t
    148 bcmi_diag_ft_table_insert(int unit, args_t *a)
    149 {
    150     cmd_result_t      retCode;
    151     parse_table_t     pt;
    152 /*    int               rv;*/
    153     bcm_ip_t dip=0, sip=0;
    154     int l4destport=0, l4srcport=0;
    155     int proto=0;
    156 
    157     parse_table_init(unit, &pt);
    158 
    159     parse_table_add(&pt, "DIP", PQ_DFL|PQ_IP, 0, (void*)&dip, NULL);
    160     parse_table_add(&pt, "SIP", PQ_DFL|PQ_IP, 0, (void*)&sip, NULL);
    161     cli_out("DIP = %d: SIP = %d\n", dip, sip);
    162     parse_table_add(&pt, "L4DestPort", PQ_DFL|PQ_INT, 0, (void*)&l4destport, NULL);
    163     parse_table_add(&pt, "L4SrcPort", PQ_DFL|PQ_INT, 0, (void*)&l4srcport, NULL);
    164     parse_table_add(&pt, "PROTO", PQ_DFL|PQ_INT, 0, (void*)&proto, NULL);
    165 
    166     if (!parseEndOk(a, &pt, &retCode)) {
    167         return retCode;
    168     }
    169 
    170     bcmi_ft_table_insert(unit, dip, sip, l4destport, l4srcport, proto);
    171 
    172     return CMD_OK;
    173 }
    174 
    175 
    176 
    177 
    178 STATIC cmd_result_t
    179 bcmi_diag_ft_table_lookup(int unit, args_t *a)
    180 {
    181     cmd_result_t      retCode;
    182     parse_table_t     pt;
    183 /*    int               rv;*/
    184     bcm_ip_t dip=0, sip=0;
    185     int l4destport=0, l4srcport=0;
    186     int proto=0;
    187     int index = -1;
    188 
    189     parse_table_init(unit, &pt);
    190 
    191     parse_table_add(&pt, "DIP", PQ_DFL|PQ_IP, 0, (void*)&dip, NULL);
    192     parse_table_add(&pt, "SIP", PQ_DFL|PQ_IP, 0, (void*)&sip, NULL);
    193     cli_out("DIP = %d: SIP = %d\n", dip, sip);
    194     parse_table_add(&pt, "L4DestPort", PQ_DFL|PQ_INT, 0, (void*)&l4destport, NULL);
    195     parse_table_add(&pt, "L4SrcPort", PQ_DFL|PQ_INT, 0, (void*)&l4srcport, NULL);
    196     parse_table_add(&pt, "PROTO", PQ_DFL|PQ_INT, 0, (void*)&proto, NULL);
    197 
    198     if (!parseEndOk(a, &pt, &retCode)) {
    199         return retCode;
    200     }
    201 
    202     bcmi_ft_table_lookup(unit, 0, dip, sip,
    203         l4destport, l4srcport, proto, &index);
    204 
    205     cli_out("FT table index is = %d \n", index);
    206 
    207     return CMD_OK;
    208 }
    209 
    210 
    211 
    212 
    213 STATIC cmd_result_t
    214 bcmi_diag_ft_group_dump(int unit, args_t *a)
    215 {
    216     cmd_result_t      retCode;
    217     parse_table_t     pt;
    218     int group_id = -1;
    219 
    220     parse_table_init(unit, &pt);
    221 
    222     parse_table_add(&pt, "Group", PQ_DFL|PQ_INT, 0, (void*)&group_id, NULL);
    223     if (!parseEndOk(a, &pt, &retCode)) {
    224         return retCode;
    225     }
    226 
    227     cli_out("Flowtracker Group Id :\t%5d\n", group_id);
    228 
    229     bcmi_ft_group_state_dump(unit, group_id);
    230 
    231     return CMD_OK;
    232 }
    233 
    234 
    235 
    236 
    237 
    238 STATIC cmd_result_t
    239 bcmi_diag_ft_session_data_dump(int unit, args_t *a)
    240 {
    241     cmd_result_t      retCode;
    242     parse_table_t     pt;
    243     bcm_ip_t dip=0, sip=0;
    244     int l4destport=0, l4srcport=0;
    245     int proto=0;
    246     int index = -1;
    247     int group_id = -1;
    248 
    249     parse_table_init(unit, &pt);
    250 
    251     parse_table_add(&pt, "Group", PQ_DFL|PQ_INT, 0, (void*)&group_id, NULL);
    252     parse_table_add(&pt, "DIP", PQ_DFL|PQ_IP, 0, (void*)&dip, NULL);
    253     parse_table_add(&pt, "SIP", PQ_DFL|PQ_IP, 0, (void*)&sip, NULL);
    254     parse_table_add(&pt, "L4DestPort", PQ_DFL|PQ_INT, 0, (void*)&l4destport, NULL);
    255     parse_table_add(&pt, "L4SrcPort", PQ_DFL|PQ_INT, 0, (void*)&l4srcport, NULL);
    256     parse_table_add(&pt, "PROTO", PQ_DFL|PQ_INT, 0, (void*)&proto, NULL);
    257 
    258     if (!parseEndOk(a, &pt, &retCode)) {
    259         return retCode;
    260     }
    261 
    262     bcmi_ft_table_lookup(unit, group_id, dip, sip,
    263         l4destport, l4srcport, proto, &index);
    264 
    265     cli_out("FT table index is = %d \n", index);
    266 
    267     if (index != -1) {
    268 
    269         bcmi_ft_group_session_data_dump(unit, group_id, index);
    270     }
    271 
    272     return CMD_OK;
    273 }
    274 
    275 
    276 STATIC cmd_result_t
    277 bcmi_diag_ft_session_data_index_dump(int unit, args_t *a)
    278 {
    279     cmd_result_t      retCode;
    280     parse_table_t     pt;
    281     int index = -1;
    282     int group_id = -1;
    283 
    284     parse_table_init(unit, &pt);
    285 
    286     parse_table_add(&pt, "Group", PQ_DFL|PQ_INT, 0, (void*)&group_id, NULL);
    287     parse_table_add(&pt, "index", PQ_DFL|PQ_INT, 0, (void*)&index, NULL);
    288 
    289     if (!parseEndOk(a, &pt, &retCode)) {
    290         return retCode;
    291     }
    292 
    293     cli_out("FT table index is = %d and group = %d \n", index, group_id);
    294 
    295     if (index != -1) {
    296 
    297         bcmi_ft_group_session_data_dump(unit, group_id, index);
    298     }
    299 
    300     return CMD_OK;
    301 }
    302 
    303 STATIC cmd_result_t
    304 bcmi_diag_ft_alu32_dump(int unit, args_t *a)
    305 {
    306     cmd_result_t      retCode;
    307     parse_table_t     pt;
    308     int index = 0;
    309 
    310     parse_table_init(unit, &pt);
    311 
    312     parse_table_add(&pt, "index", PQ_DFL|PQ_INT, 0, (void*)&index, NULL);
    313 
    314     if (!parseEndOk(a, &pt, &retCode)) {
    315         return retCode;
    316     }
    317 
    318     cli_out("Alu32 index to dump is = %d\n", index);
    319 
    320     bcmi_ft_alu32_dump(unit, index);
    321 
    322     return CMD_OK;
    323 }
    324 
    325 
    326 STATIC cmd_result_t
    327 bcmi_diag_ft_alu16_dump(int unit, args_t *a)
    328 {
    329     cmd_result_t      retCode;
    330     parse_table_t     pt;
    331     int index = 0;
    332 
    333     parse_table_init(unit, &pt);
    334 
    335     parse_table_add(&pt, "index", PQ_DFL|PQ_INT, 0, (void*)&index, NULL);
    336 
    337     if (!parseEndOk(a, &pt, &retCode)) {
    338         return retCode;
    339     }
    340 
    341     cli_out("Alu32 index to dump is = %d\n", index);
    342 
    343     bcmi_ft_alu16_dump(unit, index);
    344 
    345     return CMD_OK;
    346 }
    347 
    348 STATIC cmd_result_t
    349 bcmi_diag_ft_alu_hash_dump(int unit, args_t *a)
    350 {
    351     bcmi_ft_alu_load_hash_dump(unit);
    352 
    353     return CMD_OK;
    354 }
    355 
    356 #endif /*BCM_FLOWTRACKER_SUPPORT*/
    357 
    358 
    359 /*
    360  * function:   cmd_ft
    361  * purpose:    Flowtracker diag commands
    362  * parameters: unit - unit
    363  *             a - args, each of the files to be displayed.
    364  * returns:    CMD_OK/CMD_FAIL/CMD_USAGE
    365  */
    366 cmd_result_t
    367 cmd_ft(int unit, args_t *a)
    368 {
    369     char *c;
    370 #if defined (BCM_FLOWTRACKER_SUPPORT) || defined (INCLUDE_FLOWTRACKER)
    371     char *subcmd_s;
    372 #endif /* BCM_FLOWTRACKER_SUPPORT || INCLUDE_FLOWTRACKER */
    373 #if defined (BCM_FLOWTRACKER_SUPPORT)
    374     int r;
    375     int ft_key_flag = FALSE;
    376     int group_dump_enable = FALSE;
    377 #endif
    378 
    379     /* Check valid device to operation on ... */
    380     if (!sh_check_attached(ARG_CMD(a), unit)) {
    381         return CMD_FAIL;
    382     }
    383 
    384     c = ARG_GET(a);
    385     if(!c) {
    386         return (CMD_USAGE);
    387     } else if(!sal_strcasecmp(c, "help")) {
    388         return (CMD_USAGE);
    389     }
    390 
    391 #if defined (BCM_TOMAHAWK3_SUPPORT)
    392     if (!sal_strcmp(c, "etrap")) {
    393         return cmd_ft_th3_etrap(unit, a);
    394     }
    395 #endif /* BCM_TOMAHAWK3_SUPPORT */
    396 
    397 #if defined(BCM_FLOWTRACKER_SUPPORT)
    398     if (soc_feature(unit, soc_feature_flex_flowtracker_ver_1)) {
    399 
    400         /* FT init */
    401         if (sal_strcasecmp(c, "init") == 0) {
    402             if ((r = bcmi_ft_init(unit)) < 0) {
    403                 cli_out("%s: error initializing: %s\n", ARG_CMD(a), bcm_errmsg(r));
    404             }
    405             return CMD_OK;
    406         } 
    407 
    408         /* FT detach */
    409         if (sal_strcasecmp(c, "detach") == 0) {
    410             if ((r = bcmi_ft_cleanup(unit)) < 0) {
    411                 cli_out("%s: error detaching: %s\n", ARG_CMD(a), bcm_errmsg(r));
    412             }
    413             return CMD_OK;
    414         }
    415 
    416         /* Start gettng the key and then we can add entry in hash table.*/
    417         if ((sal_strcasecmp(c, "key") == 0)) {
    418             ft_key_flag = TRUE;
    419             if ((subcmd_s = ARG_GET(a)) == NULL) {
    420                 return CMD_USAGE;
    421             }
    422         }
    423         if (ft_key_flag) {
    424             if (sal_strcasecmp(subcmd_s, "add") == 0) {
    425                 return bcmi_diag_ft_table_insert(unit, a);
    426             }
    427 
    428             if (sal_strcasecmp(subcmd_s, "lookup") == 0) {
    429                 return bcmi_diag_ft_table_lookup(unit, a);
    430             }
    431 
    432         }
    433 
    434 
    435         if (sal_strcasecmp(c, "show") == 0) {
    436             group_dump_enable = TRUE;
    437             if ((subcmd_s = ARG_GET(a)) == NULL) {
    438                 return CMD_USAGE;
    439             }
    440         }
    441         if (group_dump_enable) {
    442             if (sal_strcasecmp(subcmd_s, "group") == 0) {
    443                 return bcmi_diag_ft_group_dump(unit, a);
    444             }
    445 
    446             if (sal_strcasecmp(subcmd_s, "session_data") == 0) {
    447                 return bcmi_diag_ft_session_data_dump(unit, a);
    448             }
    449 
    450             if (sal_strcasecmp(subcmd_s, "session_data_index") == 0) {
    451                 return bcmi_diag_ft_session_data_index_dump(unit, a);
    452             }
    453 
    454             if (sal_strcasecmp(subcmd_s, "alu32") == 0) {
    455                 return bcmi_diag_ft_alu32_dump(unit, a);
    456             }
    457             if (sal_strcasecmp(subcmd_s, "alu16") == 0) {
    458                 return bcmi_diag_ft_alu16_dump(unit, a);
    459             }
    460             if (sal_strcasecmp(subcmd_s, "alu_hash") == 0) {
    461                 return bcmi_diag_ft_alu_hash_dump(unit, a);
    462             }
    463         }
    464 
    465     }
    466 /*
    467     if (sal_strcasecmp(subcmd_s, "find") == 0) {
    468         index = bcmi_ft_table_lookup(unit, a);
    469     }
    470     if (sal_strcasecmp(subcmd_s, "destroy") == 0 ||
    471         sal_strcasecmp(subcmd_s, "delete") == 0) {
    472     subcmd = L3_DESTROY;
    473     }
    474     if (sal_strcasecmp(subcmd_s, "set") == 0) {
    475     subcmd = L3_SET;
    476     }
    477 */
    478 #endif
    479 
    480 #if defined(INCLUDE_FLOWTRACKER)
    481     if (soc_feature(unit, soc_feature_uc_flowtracker_learn) ||
    482         soc_feature(unit, soc_feature_uc_flowtracker_export)) { 
    483         /* FT app stats */
    484         if (sal_strcasecmp(c, "stats") == 0) {
    485             if ((subcmd_s = ARG_GET(a)) == NULL) {
    486                 return CMD_USAGE;
    487             }
    488             if (sal_strcasecmp(subcmd_s, "learn") == 0) {
    489                 _bcm_esw_flowtracker_dump_stats_learn(unit);
    490             }
    491             if (sal_strcasecmp(subcmd_s, "export") == 0) {
    492                 _bcm_esw_flowtracker_dump_stats_export(unit);
    493             }
    494             if (sal_strcasecmp(subcmd_s, "age") == 0) {
    495                 _bcm_esw_flowtracker_dump_stats_age(unit);
    496             }
    497             if ((sal_strcasecmp(subcmd_s, "elephant") == 0) &&
    498                 (!soc_feature(unit, soc_feature_hw_etrap))) {
    499                  _bcm_esw_flowtracker_dump_stats_elephant(unit);
    500             }
    501 
    502             return CMD_OK;
    503         }
    504     }
    505 #endif /* INCLUDE_FLOWTRACKER */
    506 
    507     return CMD_NFND;
    508 }
    509