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