sat.c (121551B)
1 /* 2 * 3 * 4 * SAT specific commands. 5 * 6 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 7 * 8 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 9 */ 10 11 #include <soc/defs.h> 12 #ifdef BCM_SAT_SUPPORT 13 #include <sal/types.h> 14 #include <shared/bsl.h> 15 #include <appl/diag/shell.h> 16 #include <appl/diag/parse.h> 17 #include <appl/diag/system.h> 18 #include <bcm/sat.h> 19 #include <bcm/error.h> 20 21 22 #if defined(BCM_ESW_SUPPORT) && !defined(BCM_PETRA_SUPPORT) 23 #define SAT_GTF_PACKET_SET_USAGE \ 24 "sat Gtf Packetconfig Set <gtfId> [HeaderType=<val>] [PayloadType=<val>] [PayloadPattern=<val>]\n\t" \ 25 " [CirNumofctfs=<val>] [CiraddendTlv=true|false] [CiraddCrc=true|false]\n\t" \ 26 " [EirNumofctfs=<val>] [EiraddendTlv=true|false] [EiraddCrc=true|false]\n\t" \ 27 " [Offsetofseqnum=<val>]" 28 #endif /* BCM_ESW_SUPPORT && !BCM_PETRA_SUPPORT */ 29 #if defined(BCM_ESW_SUPPORT) 30 #define SAT_GTF_OLPHEADER_USAGE \ 31 "sat Gtf Packetconfig OlpHeader Set <gtfId> [rawData=<data>]\n\t" \ 32 " L2 <gtfId> [DMac=<mac>] [SMac=<mac>] [Tpid=<val>] [Vlan=<vid>]\n\t" \ 33 " [vlanPri=<val>] [vlanCfi=<val>] [ETHertype=<val>]\n\t" \ 34 " Tx <gtfId> [isDown=true|false] [destModid=<val>] [destPort=<val>]\n\t" \ 35 " [isAddTs=true|false] [timestampFormat=<val>] [OffsetofTs=<val>]" 36 #ifndef COMPILER_STRING_CONST_LIMIT 37 #define SAT_EP_SHOW_USAGE \ 38 "sat Endpoint SHOW [<epId>]" 39 #define SAT_EP_DESTROY_USAGE \ 40 "sat Endpoint Destroy [<epId>] [isDowN=true|false]" 41 #define SAT_EP_CREATE_USAGE \ 42 "sat Endpoint Create [<epId>] [isDowN=true|false] [MatchOuterVlan=true|false] [MatchInnerVlan=true|false]\n\t" \ 43 " [DMac=<mac>] [SMac=<mac>] [OuterVlan=<val>] [InnerVlan=<val>]\n\t" \ 44 " [SrcPort=<port>] [ETHertype=<val>] [Drop=true|false] [Redirect=true|false]\n\t" \ 45 " [LLF=true|false] [CopytoCpu=true|false] [timeStamp=true|false] [pktPri=<val>]\n\t" \ 46 " [DestPort=<port>] [timeStampFormat=<val>] [sessionId=<val>]" 47 #define SAT_EP_REPLACE_USAGE \ 48 " Replace <epId> [isDowN=true|false] [MatchOuterVlan=true|false] [MatchInnerVlan=true|false]\n\t" \ 49 " [DMac=<mac>] [SMac=<mac>] [OuterVlan=<val>] [InnerVlan=<val>]\n\t" \ 50 " [SrcPort=<port>] [ETHertype=<val>] [Drop=true|false] [Redirect=true|false]\n\t" \ 51 " [LLF=true|false] [CopytoCpu=true|false] [timeStamp=true|false] [pktPri=<val>]\n\t" \ 52 " [DestPort=<port>] [timeStampFormat=<val>] [sessionId=<val>]" 53 #else 54 #define SAT_EP_SHOW_USAGE \ 55 "Full documentation cannot be displayed with -pedantic compiler\n\t" 56 #define SAT_EP_DESTROY_USAGE \ 57 "Full documentation cannot be displayed with -pedantic compiler\n\t" 58 #define SAT_EP_CREATE_USAGE \ 59 "Full documentation cannot be displayed with -pedantic compiler\n\t" 60 #define SAT_EP_REPLACE_USAGE \ 61 "Full documentation cannot be displayed with -pedantic compiler\n\t" 62 #endif 63 #define SAT_ENDPOINT_CONFIGURE_USAGE \ 64 SAT_EP_SHOW_USAGE "\n\t" \ 65 SAT_EP_DESTROY_USAGE "\n\t" \ 66 SAT_EP_CREATE_USAGE "\n\t" \ 67 SAT_EP_REPLACE_USAGE "\n\t" \ 68 " - Set/display SAT endpoint configuration" 69 #else 70 #define SAT_GTF_OLPHEADER_USAGE 71 #define SAT_ENDPOINT_CONFIGURE_USAGE 72 #endif /* BCM_ESW_SUPPORT */ 73 #if defined(BCM_PETRA_SUPPORT) 74 #define SAT_GTF_PACKET_SET_USAGE \ 75 "sat Gtf Packetconfig Set <gtfId> [HeaderType=<val>] [PayloadType=<val>] [PayloadPattern=<val>]\n\t" \ 76 " [CirNumofctfs=<val>] [CiraddendTlv=true|false] [CiraddCrc=true|false]\n\t" \ 77 " [EirNumofctfs=<val>] [EiraddendTlv=true|false] [EiraddCrc=true|false]\n\t" \ 78 " [pktContext=<val>] [Offsetofseqnum=<val>]" 79 #define SAT_GTF_DNXHEADER_USAGE \ 80 "sat Gtf Packetconfig DnxHeader Set <gtfId> [rawData=<data>]\n\t" \ 81 " Ptch <gtfId> [srcGport=<port>] [opaqueAttr=<val>]\n\t" \ 82 " [isNextHeaderItmh=true|false]\n\t" \ 83 " Itmh <gtfId> [dstGport=<port>] [Prio=<val>] [Color=<val>]\n\t" \ 84 " [inMirrorFlag=true|false] [snoopCMD=<val>] [pphType=<val>]\n\t" \ 85 " Otsh <gtfId> [Type=<val>] [SubType=<val>] [isDowN=true|false]\n\t" \ 86 " [tsData=<val>] [tsOffset=<val>]" 87 #define SAT_CTF_DNX_TRAP_USAGE \ 88 "sat Ctf Trap Add <trapId>\n\t" \ 89 " Remove [<trapId>]" 90 #else 91 #define SAT_GTF_DNXHEADER_USAGE 92 #define SAT_CTF_DNX_TRAP_USAGE 93 #endif /* BCM_PETRA_SUPPORT */ 94 #define SAT_GTF_SHOW_USAGE \ 95 "sat Gtf SHOW [<gtfId>]" 96 #define SAT_GTF_CREATE_USAGE \ 97 "sat Gtf Create [<gtfId>]" 98 #define SAT_GTF_DESTROY_USAGE \ 99 "sat Gtf Destroy [<gtfId>]" 100 #define SAT_GTF_START_USAGE \ 101 "sat Gtf START <gtfId> <priority>" 102 #define SAT_GTF_STOP_USAGE \ 103 "sat Gtf STOP <gtfId> <priority>" 104 #define SAT_GTF_STAT_USAGE \ 105 "sat Gtf STat <gtfId> <priority>" 106 #define SAT_GTF_BANDWIDTH_USAGE \ 107 "sat Gtf Bandwidth Set <gtfId> <priority> [Rate=<val>] [maxBurst=<val>]\n\t" \ 108 " Get <gtfId> <priority>" 109 #define SAT_GTF_RATEPATTERN_USAGE \ 110 "sat Gtf Ratepattern Set <gtfId> <priority> [Mode=<val>] [HighThresh=<val>]\n\t" \ 111 " [LowThresh=<val>] [stopITerCnt=<val>] [stopBurstCnt=<val>]\n\t" \ 112 " [stopIntervalCnt=<val>] [BurstpktWeight=<val>]\n\t" \ 113 " [IntervalpktWeight=<val>] [StopintervalEqburst=true|false]\n\t" \ 114 " Get <gtfId> <priority>" 115 #ifndef COMPILER_STRING_CONST_LIMIT 116 #define SAT_GTF_PACKETCONFIG_USAGE \ 117 "sat Gtf Packetconfig Format <gtfId>\n\t" \ 118 SAT_GTF_PACKET_SET_USAGE "\n\t" \ 119 SAT_GTF_OLPHEADER_USAGE "\n\t" \ 120 SAT_GTF_DNXHEADER_USAGE "\n\t" \ 121 "sat Gtf Packetconfig Packetdata <gtfId> [DMac=<mac>] [SMac=<mac>] [Tpid=<val>]\n\t" \ 122 " [Vlan=<val>] [vlanPri=<val>] [extData=<data>]\n\t" \ 123 "sat Gtf Packetconfig Length <gtfId> <priority> [pktLens=<val>]\n\t" \ 124 " [pktlenPatterns=<val>] [PatternLens=<val>]\n\t" \ 125 "sat Gtf Packetconfig STamp <gtfId> <priority> [StampTypes=<val>] [stampFieldTypes=<val>]\n\t" \ 126 " [stampIncSteps=<val>] [stampIncPeriods=<val>] [stampValues=<val>]\n\t" \ 127 " [stampOffsets=<val>] [Numofstamps=<val>]" 128 #else 129 #define SAT_GTF_PACKETCONFIG_USAGE \ 130 "Full documentation cannot be displayed with -pedantic compiler\n\t" 131 #endif 132 #define SAT_CTF_CREATE_USAGE \ 133 "sat Ctf Create [<ctfId>]" 134 #define SAT_CTF_DESTROY_USAGE \ 135 "sat Ctf Destroy [<ctfId>]" 136 #define SAT_CTF_PACKETCONFIG_USAGE \ 137 "sat Ctf Packetconfig <ctfId> [HeaderType=<val>] [PayloadType=<val>] [PayloadPattern=<val>]\n\t" \ 138 " [PayloadOffset=<val>] [SeqnumberOffset=<val>] [TimestampOffset=<val>]\n\t" \ 139 " [addendTlv=true|false] [addCrc=true|false]" 140 #define SAT_CTF_IDENTIFER_USAGE \ 141 "sat Ctf Identifier Add <ctfId> [TC=<val>] [Color=<val>] [TrapId=<val>] [SessionId=<val>]\n\t" \ 142 " Remove [TC=<val>] [Color=<val>] [TrapId=<val>] [SessionId=<val>]" 143 #define SAT_CTF_TRAP_USAGE \ 144 SAT_CTF_DNX_TRAP_USAGE "\n\t" \ 145 "sat Ctf Trap Data2Session Add [trapData=<val>] [trapdataMask=<val>] [sessionId=<val>]\n\t" \ 146 " Remove [trapData=<val>] [trapdataMask=<val>]" 147 #define SAT_CTF_BINLIMIT_USAGE \ 148 "sat Ctf Binlimit SHOW\n\t" \ 149 " Set [Bins=<val>]" 150 #define SAT_CTF_AVAILABILITY_USAGE \ 151 "sat Ctf Availability <ctfId> [Noofslot=<val>] [Thresholdperslot=<val>]" 152 #define SAT_CTF_REPORT_USAGE \ 153 "sat Ctf Report <ctfId> [samplePercent=<val>] [addSeqnum=true|false] [addDelay=true|false]" 154 #define SAT_CTF_STAT_USAGE \ 155 "sat Ctf Stat Set <ctfId> [useGlobalbin=true|false] [binMinDelay=<val>]\n\t" \ 156 " [binStep=<val>] [updateCntInUnavail=true|false]\n\t" \ 157 " SHOW [<ctfId>] [Clronread=true|false]" 158 159 #define SAT_GLOBAL_CONFIGURE_USAGE \ 160 "sat CONFig Set [timestampFormat=<type>] [crcReversedData=true|false] [crcInvert=true|false]\n\t" \ 161 " [crcHighReset=true|false] [prbsUseNxor=true|false]\n\t" \ 162 "sat CONFig SHOW\n\t" \ 163 " - Set/display global SAT configuration" 164 165 #ifndef COMPILER_STRING_CONST_LIMIT 166 #define SAT_GTF_CONFIGURE_USAGE \ 167 SAT_GTF_SHOW_USAGE "\n\t" \ 168 SAT_GTF_CREATE_USAGE "\n\t" \ 169 SAT_GTF_DESTROY_USAGE "\n\t" \ 170 SAT_GTF_START_USAGE "\n\t" \ 171 SAT_GTF_STOP_USAGE "\n\t" \ 172 SAT_GTF_STAT_USAGE "\n\t" \ 173 SAT_GTF_BANDWIDTH_USAGE "\n\t" \ 174 SAT_GTF_RATEPATTERN_USAGE "\n\t" \ 175 SAT_GTF_PACKETCONFIG_USAGE "\n\t" \ 176 " - Set/display SAT GTF configuration" 177 178 #define SAT_CTF_CONFIGURE_USAGE \ 179 SAT_CTF_CREATE_USAGE "\n\t" \ 180 SAT_CTF_DESTROY_USAGE "\n\t" \ 181 SAT_CTF_PACKETCONFIG_USAGE "\n\t" \ 182 SAT_CTF_IDENTIFER_USAGE "\n\t" \ 183 SAT_CTF_TRAP_USAGE "\n\t" \ 184 SAT_CTF_BINLIMIT_USAGE "\n\t" \ 185 SAT_CTF_AVAILABILITY_USAGE "\n\t" \ 186 SAT_CTF_REPORT_USAGE "\n\t" \ 187 SAT_CTF_STAT_USAGE "\n\t" \ 188 " - Set/display SAT CTF configuration" 189 #else 190 #define SAT_GTF_CONFIGURE_USAGE \ 191 "Full documentation cannot be displayed with -pedantic compiler\n\t" 192 193 #define SAT_CTF_CONFIGURE_USAGE \ 194 "Full documentation cannot be displayed with -pedantic compiler\n\t" 195 #endif 196 char cmd_sat_usage[] = 197 "Usages:\n\t" 198 #ifdef COMPILER_STRING_CONST_LIMIT 199 "sat sub_command <option> [args...]\n" 200 #else 201 SAT_GLOBAL_CONFIGURE_USAGE "\n\n\t" 202 SAT_GTF_CONFIGURE_USAGE "\n\n\t" 203 SAT_CTF_CONFIGURE_USAGE "\n\n\t" 204 SAT_ENDPOINT_CONFIGURE_USAGE "\n" 205 #endif 206 ; 207 208 #define _SAT_CMD_GTF_PRI_COMMON (-1) /* Priority value which means EIR together with CIR. */ 209 #define _SAT_CMD_GTF_CNT_MAX 8 210 #define _SAT_CMD_CTF_CNT_MAX 32 211 212 typedef struct sat_subcommand_s { 213 char *str; 214 cmd_result_t (*func)(int unit, args_t *args); 215 const char* help; 216 const char* help_ext; /* To prevent strings > 255 chars */ 217 } sat_subcommand_t; 218 219 typedef struct _sat_gtf_pkt_info_s { 220 bcm_sat_gtf_packet_config_t cfg; 221 bcm_pkt_t *sat_header; /* release resource properly */ 222 int32 packet_length[BCM_SAT_GTF_NUM_OF_PRIORITIES][BCM_SAT_GTF_PACKET_LENGTH_NUM_OF_PATTERNS]; 223 int32 dev_header_len; /* Internal header length. OLP or DNX */ 224 int32 ctrl_info_len; /* From Internal to PDU TLV header */ 225 int32 dev_header_1_offset; /* Internal headers' position */ 226 int32 dev_header_2_offset; 227 int32 dev_header_3_offset; 228 int32 eth_header_offset; 229 int32 pdu_offset; 230 } _sat_gtf_pkt_info_t; 231 232 #define SAT_IF_ERROR_RETURN(op) \ 233 do { \ 234 int __rv__; \ 235 if ((__rv__ = (op)) < 0) { \ 236 cli_out("Error: %s\n", bcm_errmsg(__rv__)); \ 237 return CMD_FAIL; \ 238 } \ 239 } while (0) 240 241 #define SAT_GTF_ID_CHECK_RETURN(id) \ 242 do { \ 243 if ((id < 0) || (id >= _SAT_CMD_GTF_CNT_MAX)) { \ 244 cli_out("Invalid GTF ID: %d\n", id); \ 245 return CMD_FAIL; \ 246 } \ 247 } while (0) 248 249 #define SAT_CTF_ID_CHECK_RETURN(id) \ 250 do { \ 251 if ((id < 0) || (id >= _SAT_CMD_CTF_CNT_MAX)) { \ 252 cli_out("Invalid CTF ID: %d\n", id); \ 253 return CMD_FAIL; \ 254 } \ 255 } while (0) 256 257 /* 258 * Macro: 259 * SAT_ARG_NUMB_GET 260 * Purpose: 261 * Get a nonnegative numerical value from stdin. 262 */ 263 #define SAT_ARG_NUMB_GET(args, str, numb) \ 264 do { \ 265 if (((str) = ARG_GET(args)) == NULL) { \ 266 return CMD_USAGE; \ 267 } \ 268 (numb) = _parse_integer(str); \ 269 if (numb < 0) { \ 270 return CMD_FAIL; \ 271 } \ 272 } while (0) 273 274 /* 275 * Macro: 276 * SAT_ARG_INT_GET 277 * Purpose: 278 * Get a numerical value from stdin. 279 */ 280 #define SAT_ARG_INT_GET(args, str, numb) \ 281 do { \ 282 if (((str) = ARG_GET(args)) == NULL) { \ 283 return CMD_USAGE; \ 284 } \ 285 (numb) = _parse_integer(str); \ 286 } while (0) 287 288 STATIC uint32 _gtf_pkt_header_max_len = 128; /* Internal + Eth + PDU */ 289 STATIC _sat_gtf_pkt_info_t _gtf_pkt_cfg_default; 290 STATIC _sat_gtf_pkt_info_t _gtf_pkt_cfg[_SAT_CMD_GTF_CNT_MAX]; 291 STATIC bcm_sat_ctf_packet_info_t _ctf_pkt_cfg[_SAT_CMD_CTF_CNT_MAX]; 292 293 /* 294 * Read an integer: return unsigned representation. 295 * Number format explained below. 296 * 297 * Expects: 298 * [-]0x[0-9|A-F|a-f]+ -hexadecimal if the string begins with "0x" 299 * [-][0-9]+ -decimal integer 300 * [-]0[0-7]+ -octal integer 301 * [-]0b[0-1]+ -binary if the string begins with "0b" 302 */ 303 STATIC int 304 _parse_integer(char *str) 305 { 306 if (!isint(str)) { 307 cli_out("ERROR: malformed integer \"%s\"\n", str); 308 return CMD_FAIL; 309 } 310 311 return _shr_ctoi(str); 312 } 313 314 /* 315 * Process a comma seperated list and store elements in a data array. 316 * Returns element count. 317 */ 318 STATIC int 319 _list_to_data_array(char *str, uint32 max_array_len, int32 *array) 320 { 321 int index = 0; 322 int num, tmp_size = 16; 323 char *head = str, *rear = str; 324 char tmp[16]; 325 326 if ((array == NULL) || (str == NULL)) { 327 return -1; 328 } 329 while ((index < max_array_len) && (*head != '\0')) { 330 rear = sal_strchr(head, ','); 331 if (!rear) { 332 rear = str + sal_strlen(str); 333 } 334 sal_memset(tmp, 0, tmp_size); 335 sal_memcpy(tmp, head, rear - head); 336 num = parse_integer(tmp); 337 array[index] = num; 338 index++; 339 340 if (*rear == '\0') { 341 break; 342 } 343 head = rear + 1; 344 } 345 346 return index; 347 } 348 349 /* 350 * Parsing string given by user as packet data 351 * NOTE: Must be used pair with "_parse_packet_data_end". 352 */ 353 STATIC int 354 _parse_packet_data(int unit, char *packet, int *length, uint8 **data) 355 { 356 uint8 *p; 357 char tmp, data_iter; 358 int data_len, i, j, pkt_len, data_base; 359 360 /* If string data starts with 0x or 0X, skip it */ 361 if ((packet[0] == '0') 362 && (packet[1] == 'x' || packet[1] == 'X')) { 363 data_base = 2; 364 } else { 365 data_base = 0; 366 } 367 368 data_len = strlen(packet) - data_base; 369 pkt_len = (data_len + 1) / 2; 370 371 p = sal_alloc(pkt_len, "sat_packet"); 372 if (p == NULL) { 373 data = NULL; 374 return -1; 375 } 376 sal_memset(p, 0, pkt_len); 377 /* Convert char to value */ 378 i = j = 0; 379 while (j < data_len) { 380 data_iter = packet[data_base + j]; 381 if (('0' <= data_iter) && (data_iter <= '9')) { 382 tmp = data_iter - '0'; 383 } else if (('a' <= data_iter) && (data_iter <= 'f')) { 384 tmp = data_iter - 'a' + 10; 385 } else if (('A' <= data_iter) && (data_iter <= 'F')) { 386 tmp = data_iter - 'A' + 10; 387 } else if (data_iter == ' ') { 388 ++j; 389 continue; 390 } else { 391 sal_free(p); 392 data = NULL; 393 return -1; 394 } 395 396 /* String input is in 4b unit. Below we're filling in 8b: 397 offset is /2, and we shift by 4b if the input char is odd */ 398 p[i / 2] |= tmp << (((i + 1) % 2) * 4); 399 ++i; 400 ++j; 401 } 402 403 *length = i / 2; 404 *data = p; 405 406 return 0; 407 } 408 409 /* 410 * Release allocated resources in previous _parse_packet_data 411 */ 412 STATIC int 413 _parse_packet_data_end(int unit, char *packet, int *length, uint8 *data) 414 { 415 if (data == NULL) { 416 return -1; 417 } 418 sal_free(data); 419 420 return 0; 421 } 422 423 STATIC void 424 _sat_gtf_pkt_info_t_init(_sat_gtf_pkt_info_t *info) 425 { 426 if (info == NULL) { 427 return; 428 } 429 sal_memset(info, 0, sizeof(_sat_gtf_pkt_info_t)); 430 info->packet_length[bcmSatGtfPriCir][0] = 64; 431 info->packet_length[bcmSatGtfPriEir][0] = 64; 432 info->dev_header_len = -1; 433 info->ctrl_info_len = -1; 434 info->dev_header_1_offset = -1; 435 info->dev_header_2_offset = -1; 436 info->dev_header_3_offset = -1; 437 info->eth_header_offset = -1; 438 info->pdu_offset = -1; 439 } 440 441 #if defined(BCM_PETRA_SUPPORT) 442 /* 443 * PTCH-2 Header format: 444 * Field Size Bit/s 445 * Parser-Program-Control 1 15 446 * Opaque-PT-Attributes 3 14:12 447 * Reserved 4 11:8 448 * PP-SSP 8 7:0 449 */ 450 STATIC int 451 _insert_dnx_ptch2(uint8* buffer, int byte_start_offset, 452 uint8 next_header_is_itmh, 453 uint8 opaque_value, 454 uint8 pp_ssp) 455 { 456 int offset = byte_start_offset; 457 int parser_program_ctl = 0; 458 459 parser_program_ctl = next_header_is_itmh ? 0 : 1; 460 buffer[offset++] = (parser_program_ctl<<7) | (opaque_value<<4); 461 buffer[offset++] = pp_ssp; 462 463 return offset; 464 } 465 466 /* 467 * Arad-style ITMH Header format: 468 * Field Size Bit/s 469 * PPH_TYPE 2 31:30 470 * IN_MIRR_DISABLE 1 29 471 * SNOOP_CMD 4 28:25 472 * FWD_TRAFFIC_CLASS 3 24:22 473 * FWD_DP 2 21:20 474 * FWD_DEST_INFO 20 19:0 475 * 476 * Arad-style FWD_DEST_INFO(20bits) 477 478 * 0 Multicast-ID(19) 479 * 1 0 0 ISQ-Flow-ID(17) 480 * 1 1 1 OUTLIT(17) 481 * 1 1 0 0 Dest-System-Port-Agr(16) 482 * 1 1 0 1 Multicast-Flow-ID(17) 483 * 1 1 1 Flow-ID(17) 484 */ 485 STATIC int 486 _insert_dnx_itmh_arad(uint8* buffer, int byte_start_offset, 487 int dst_sys_port, 488 uint8 fwd_tc, 489 uint8 fwd_dp, 490 uint8 snoop_cmd, 491 uint8 in_mirr_flag, 492 uint8 pph_type) 493 { 494 int offset = byte_start_offset; 495 int fwd_dest_info = 0xc0000 | dst_sys_port; 496 497 buffer[offset++] = ((pph_type&0x3)<<6)|((in_mirr_flag&0x1)<<5)|((snoop_cmd&0xf)<<1)|((fwd_tc&0x4)>>2); 498 buffer[offset++] = ((fwd_tc&0x3)<<6) | ((fwd_dp&0x3)<<4) | ((fwd_dest_info&0xf0000)>>16); 499 buffer[offset++] = (fwd_dest_info&0xff00)>>8; 500 buffer[offset++] = (fwd_dest_info&0xff); 501 502 return offset; 503 } 504 505 /* 506 * OAM-TS Header format: 507 * Field Size Bit/s 508 * Type 2 47:46 509 * OAM-Sub-Type 3 45:43 510 * MEP-Type 1 42 511 * OAM-TS-Data 34 41:8 512 * Offset 8 7:0 513 */ 514 STATIC int 515 _insert_dnx_oam_ts(uint8* buffer, int byte_start_offset, 516 uint8 type, 517 uint8 sub_type, 518 uint8 is_up_mep, 519 uint64 ts_data, 520 uint8 ts_offset) 521 { 522 int offset = byte_start_offset; 523 int mep_type; 524 int ts_data_hi = 0, ts_data_lo = 0; 525 526 mep_type = is_up_mep?1:0; 527 ts_data_hi = COMPILER_64_HI(ts_data); 528 ts_data_lo = COMPILER_64_LO(ts_data); 529 buffer[offset++] = ((type&0x3)<<6)|((sub_type&0x7)<<3)|((mep_type&0x1)<<2)|(ts_data_hi&0x3); 530 buffer[offset++] = (ts_data_lo&0xff000000)>>24; 531 buffer[offset++] = (ts_data_lo&0xff0000)>>16; 532 buffer[offset++] = (ts_data_lo&0xff00)>>8; 533 buffer[offset++] = (ts_data_lo&0xff); 534 buffer[offset++] = ts_offset&0xff; 535 536 return offset; 537 } 538 #endif 539 #if defined(BCM_ESW_SUPPORT) 540 /* 541 * XGS OLP L2 Header 542 * Field Size 543 * OLP-DA 48 544 * OLP-SA 48 545 * OLP-VLAN 32 546 */ 547 STATIC int 548 _insert_xgs_olp_l2(uint8* buffer, int byte_start_offset, 549 bcm_mac_t dest_addr, 550 bcm_mac_t src_addr, 551 uint16 tpid, 552 bcm_vlan_t vlan, 553 uint8 vlan_pri, 554 uint8 vlan_cfi, 555 uint16 ether_type) 556 { 557 int i = 0, offset = byte_start_offset; 558 for (i = 0; i < 6; i++) { 559 buffer[offset++] = dest_addr[i]; 560 } 561 for (i = 0; i < 6; i++) { 562 buffer[offset++] = src_addr[i]; 563 } 564 565 buffer[offset++] = (tpid>>8)&0xff; 566 buffer[offset++] = tpid&0xff; 567 buffer[offset++] = (vlan_pri<<5)|((vlan_cfi&&0x1)<<4)|((vlan>>8)&0xff); 568 buffer[offset++] = vlan&0xff; 569 570 buffer[offset++] = (ether_type>>8)&0xff; 571 buffer[offset++] = ether_type&0xff; 572 573 return offset; 574 } 575 576 /* 577 * XGS OLP TX Header 578 * From SB2_OLP_Architecture_Spec_0.94_Clean.docx 579 * Field Size Bit/s Bytes Description 580 * Version 4 127:124 15 Version =0 for Saber 2 & Katana 2 581 * HEADER_TYPE 8 123:116 15-14 00=OAM_TX_HEADER 582 * HEADER_SUBTYPE 8 115:108 14-13 03 = SAT_DOWN_MEP_TX 583 * 04 = SAT_UPMEP_TX 584 * INT_PRI 4 107:104 13 Internal Priority used for UP-MEP Tx. DP is assumed to be green. 585 * PORT_ID 16 103:88 12-11 [15-8] : MODID 586 * [7-0] : PORT_NUM 587 * COUNTER_1_LOCATION 1 87 10 0 = in IP 588 * 1 = in EP 589 * COUNTER_1_ID 15 86:72 10-9 Counter ID to be incremented or sampled by this packet 590 * COUNTER_1_ACTION 2 71:70 8 00: No-op 591 * 01: Increment 592 * 10: Sample 593 * 11: reserved 594 * COUNTER_2_LOCATION 1 69 8 595 * COUNTER_2_ID 15 68:54 8-6 596 * COUNTER_2_ACTION 2 53:52 6 597 * TIMESTAMP_ACTION 2 51:50 6 00: No-op 598 * 01: Sample 1588 Timestamp 599 * 10: Sample NTP Timestamp 600 * 11: Reserved 601 * OAM_REPLACEMENT_OFFSET 8 49:42 6-5 602 * RELATIVE_LM_REPLACEMENT_OFFSET 4 41:38 5-4 603 * RELATIVE_LM_REPLACEMENT_OFFSET_ADD_OR_SUB 1 37 4 604 * COUNTER_3_LOCATION 1 36 4 605 * COUNTER_3_ID 15 35:21 4-2 606 * COUNTER_3_ACTION 2 20:19 2 607 * COUNTER1_OFFSET_TO_LM_PAYLOAD 6 18:13 2-1 608 * COUNTER2_OFFSET_TO_LM_PAYLOAD 6 12:7 1-0 609 * COUNTER3_OFFSET_TO_LM_PAYLOAD 6 6:1 0 610 * Reserved 1 0 0 611 * Total 128 612 */ 613 STATIC int 614 _insert_xgs_olp_tx(uint8* buffer, int byte_start_offset, 615 int is_down_mep, 616 int modid, 617 int port, 618 int timestamp_action, 619 int oam_offset) 620 { 621 int offset = byte_start_offset; 622 int version = 0; 623 int header_type = 0; 624 int header_subtype = (is_down_mep) ? (2) : (3); 625 int int_pri = 0; 626 int oam_replacement_offset = 0; 627 628 oam_replacement_offset = (oam_offset - 14) / 2; 629 630 /* byte 15: Version [3:0]->[7:4], 631 * header_type[7:4]->[3:0] 632 */ 633 buffer[offset++] = ((version&0xf)<<4)|((header_type&0xf0)>>4); 634 /* byte 14: header_type [3:0]->[7:4], 635 * header_subtype[7:4]->[3:0] 636 */ 637 buffer[offset++] = ((header_type&0xf)<<4)|((header_subtype&0xf0)>>4); 638 /* byte 13: header_subtype[3:0]->[7:4], 639 * int_pri [3:0]->[3:0] 640 */ 641 buffer[offset++] = ((header_subtype&0xf)<<4)|(int_pri&0xf); 642 /* byte 12: MODID [7:0]->[7:0] */ 643 buffer[offset++] = (modid&0xff); 644 /* byte 11: port [7:0]->[7:0] */ 645 buffer[offset++] = (port&0xff); 646 /* byte 10: COUNTER_1_LOCATION [0]->[7] 647 * COUNTER_1_ID [14:8]->[6:0] 648 */ 649 buffer[offset++] = 0; 650 /* byte 9: COUNTER_1_ID [7:0]->[7:0] */ 651 buffer[offset++] = 0; 652 /* byte 8: COUNTER_1_ACTION [1:0]->[7:6] 653 * COUNTER_2_LOCATION [0]->[5] 654 * COUNTER_2_ID [14:10]->[4:0] 655 */ 656 buffer[offset++] = 0; 657 /* byte 7: COUNTER_2_ID [9:2]->[7:0] 658 */ 659 buffer[offset++] = 0; 660 /* byte 6: COUNTER_2_ID [1:0]->[7:6] 661 * COUNTER_2_ACTION [1:0]->[5:4] 662 * TIMESTAMP_ACTION [1:0]->[3:2] 663 * OAM_REPLACEMENT_OFFSET [7:6]->[1:0] 664 */ 665 buffer[offset++] = ((timestamp_action&0x3)<<2)|((oam_replacement_offset&0xc0)>>6); 666 /* byte 5: OAM_REPLACEMENT_OFFSET [5:0]->[7:2] 667 * RELATIVE_LM_REPLACEMENT_OFFSET [3:2]->[1:0] 668 */ 669 buffer[offset++] = (oam_replacement_offset&0x3f)<<2; 670 /* byte 4: RELATIVE_LM_REPLACEMENT_OFFSET [1:0]->[7:6] 671 * RELATIVE_LM_REPLACEMENT_OFFSET_ADD_OR_SUB [0]->[5] 672 * COUNTER_3_LOCATION [0]->[4] 673 * COUNTER_3_ID [14:11]->[3:0] 674 */ 675 buffer[offset++] = 0; 676 /* byte 3: COUNTER_3_ID [10:3]->[7:0] */ 677 buffer[offset++] = 0; 678 /* byte 2: COUNTER_3_ID [2:0]->[7:5] 679 * COUNTER_3_ACTION [1:0]->[4:3] 680 * COUNTER1_OFFSET_TO_LM_PAYLOAD [5:3]->[2:0] 681 */ 682 buffer[offset++] = 0; 683 /* byte 1: COUNTER1_OFFSET_TO_LM_PAYLOAD [2:0]->[7:5] 684 * COUNTER2_OFFSET_TO_LM_PAYLOAD [5:1]->[4:0] 685 */ 686 buffer[offset++] = 0; 687 /* byte 0: COUNTER2_OFFSET_TO_LM_PAYLOAD [0]->[7] 688 * COUNTER2_OFFSET_TO_LM_PAYLOAD [5:0]->[6:1] 689 * Reserved [0]->[0] 690 */ 691 buffer[offset++] = 0; 692 693 return offset; 694 } 695 #endif 696 697 /* 698 * Insert Ethernet Header 699 */ 700 STATIC int 701 _insert_eth(uint8* buffer, int byte_start_offset, 702 bcm_mac_t dest_addr, 703 bcm_mac_t src_addr, 704 uint16* tpids, 705 bcm_vlan_t* vlans, 706 uint8* vlan_pri, 707 uint8* vlan_cfi, 708 int no_tags, 709 uint16 ether_type) 710 { 711 int i = 0, offset = byte_start_offset; 712 for (i = 0; i < 6; i++) { 713 buffer[offset++] = dest_addr[i]; 714 } 715 for (i = 0; i < 6; i++) { 716 buffer[offset++] = src_addr[i]; 717 } 718 i = 0; 719 while (no_tags) { 720 buffer[offset++] = (tpids[i]>>8)&0xff; 721 buffer[offset++] = tpids[i]&0xff; 722 buffer[offset++] = (vlan_pri[i]<<5)|((vlan_cfi[i]&0x1)<<4)|((vlans[i]>>8)&0xff); 723 buffer[offset++] = vlans[i]&0xff; 724 --no_tags; 725 i++; 726 } 727 728 buffer[offset++] = (ether_type>>8)&0xff; 729 buffer[offset++] = ether_type&0xff; 730 731 return offset; 732 } 733 734 /* 735 * FL PDU Header format: Refer to MEF Sat spec. 736 */ 737 STATIC int 738 _insert_fl_pdu(uint8* buffer, int byte_start_offset, int header_len, int pkt_len, 739 uint8 mel, 740 uint8 version, 741 uint8 opcode, 742 uint8 flags, 743 uint8 tlv_offset, 744 uint16 source_mep_id, 745 uint32 session_id, 746 uint8 add_data_tlv) 747 { 748 int tmp = 0, offset = byte_start_offset; 749 uint16 data_tlv_len; 750 uint32 data_tlv_type = 3; 751 752 buffer[offset++] = ((mel&0x7)<<5)|(version&0x1f); 753 buffer[offset++] = opcode; 754 buffer[offset++] = flags; 755 buffer[offset++] = tlv_offset; /* TLV Offset: 16 */ 756 buffer[offset++] = source_mep_id>>8; 757 buffer[offset++] = source_mep_id&0xff; 758 buffer[offset++] = 0; /* Reserved */ 759 buffer[offset++] = 0; /* Reserved */ 760 buffer[offset++] = (session_id>>24)&0xff; 761 buffer[offset++] = (session_id>>16)&0xff; 762 buffer[offset++] = (session_id>>8)&0xff; 763 buffer[offset++] = (session_id&0xff); 764 offset += 4; /* Sequence Number */ 765 buffer[offset++] = 0; /* Reserved */ 766 buffer[offset++] = 0; /* Reserved */ 767 buffer[offset++] = 0; /* Reserved */ 768 buffer[offset++] = 0; /* Reserved */ 769 770 if (add_data_tlv) { 771 tmp = offset - header_len; 772 data_tlv_len = pkt_len - tmp - 4 - 3; /* 4bytes CRC for whole packet + 3bytes Data TLV Header */ 773 774 buffer[offset++] = data_tlv_type; /* Data TLV Type */ 775 buffer[offset++] = (data_tlv_len>>8)&0xff; /* Data TLV Length */ 776 buffer[offset++] = (data_tlv_len&0xff); /* Data TLV Length */ 777 } 778 779 return offset; 780 } 781 782 /* 783 * FL Packet format will be : 784 * PTCH-2-|-ITMH-|-EthernetHeader-|-FL PDU for Down MEPs 785 */ 786 STATIC int 787 _sat_gtf_packet_header_config_fl_down(int unit, uint8* pkt_data) 788 { 789 int offset = 0; 790 bcm_mac_t pkt_smac = {0x00, 0x00, 0x00, 0x00, 0x00, 0x02}; 791 bcm_mac_t pkt_dmac = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; 792 uint16 pkt_tpid = 0x8100; 793 bcm_vlan_t pkt_vid = 0x100; 794 uint8 pkt_pri = 0, pkt_cfi = 0; 795 uint16 pkt_eth_type = 0x8902; 796 uint8 pdu_mel = 0x3; 797 uint8 pdu_version = 0x0; 798 uint8 pdu_fl_opcode = 43; 799 uint8 pdu_flags = 0; 800 uint16 pdu_source_mep_id = 0; 801 uint32 pdu_session_id = 0x12345678; 802 uint8 pdu_add_data_tlv = 0; 803 804 /* 1. Prepare internal header */ 805 #if defined(BCM_ESW_SUPPORT) 806 bcm_mac_t olp_mac = {0x00, 0x00, 0x00, 0x00, 0x00, 0x02}; 807 bcm_mac_t xgs_mac = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; 808 uint16 olp_tpid = 0xa96d; 809 uint16 olp_vlan = 0xdd4; 810 uint8 olp_pri = 7; 811 uint16 olp_ether_type = 0x5843; 812 int is_down = 1; 813 int dst_port = 1; 814 int stamp_action = 0; /* add no TS */ 815 int oam_offset = 22; 816 { 817 /* 1.1 Prepare XGS OLP L2 Header */ 818 _gtf_pkt_cfg_default.dev_header_1_offset = offset; 819 offset = _insert_xgs_olp_l2(pkt_data, offset, 820 /* dest_addr */ xgs_mac, 821 /* src_addr */ olp_mac, 822 /* tpid */ olp_tpid, 823 /* vlan */ olp_vlan, 824 /* vlan_pri */ olp_pri, 825 /* vlan_cfi */ 0, 826 /* ether_type */ olp_ether_type); 827 828 /* 1.2 Prepare XGS OLP TX Header */ 829 _gtf_pkt_cfg_default.dev_header_2_offset = offset; 830 offset = _insert_xgs_olp_tx(pkt_data, offset, 831 /* is_down_mep */ is_down, 832 /* modid */ 0, 833 /* port */ dst_port, 834 /* timestamp_action */ stamp_action, 835 /* oam_offset */ oam_offset); 836 } 837 #elif defined(BCM_PETRA_SUPPORT) 838 uint8 next_is_itmh = 1; 839 uint8 opaque_value = 7; 840 uint8 src_gport = 13; 841 int dst_gport = 14; 842 uint8 pri = 3; 843 { 844 /* 1.1 Prepare internal DUNE header: PTCH */ 845 _gtf_pkt_cfg_default.dev_header_1_offset = offset; 846 offset = _insert_dnx_ptch2(pkt_data, offset, 847 /* next_header_is_itmh */ next_is_itmh, 848 /* opaque_value */ opaque_value, 849 /* pp_ssp */ src_gport); 850 851 /* 1.2 Prepare internal DUNE header: ITMH */ 852 _gtf_pkt_cfg_default.dev_header_2_offset = offset; 853 offset = _insert_dnx_itmh_arad(pkt_data, offset, 854 /* dst_sys_port */ dst_gport, 855 /* fwd_tc */ pri, 856 /* fwd_dp */ 0, 857 /* snoop_cmd */ 0, 858 /* in_mirr_flag */ 0, 859 /* pph_type */ 0); 860 } 861 #endif 862 _gtf_pkt_cfg_default.dev_header_len = offset; 863 864 /* 2. Prepare Ethernet header */ 865 _gtf_pkt_cfg_default.eth_header_offset = offset; 866 offset = _insert_eth(pkt_data, offset, 867 /* dmac */ pkt_dmac, 868 /* smac */ pkt_smac, 869 /* tpid */ &pkt_tpid, 870 /* vid */ &pkt_vid, 871 /* pri */ &pkt_pri, 872 /* cfi */ &pkt_cfi, 873 /* num_of_tags */ 1, 874 /* ether_type */ pkt_eth_type); 875 876 /* 3. Prepare FL PDU header */ 877 _gtf_pkt_cfg_default.pdu_offset = offset; 878 offset = _insert_fl_pdu(pkt_data, offset, 879 _gtf_pkt_cfg_default.dev_header_len, 880 _gtf_pkt_cfg_default.packet_length[0][0], 881 pdu_mel, 882 pdu_version, 883 pdu_fl_opcode, 884 pdu_flags, 885 /* tlv_offset */ 16, 886 pdu_source_mep_id, 887 pdu_session_id, 888 pdu_add_data_tlv); 889 890 _gtf_pkt_cfg_default.ctrl_info_len = offset; 891 892 return offset; 893 } 894 895 STATIC cmd_result_t 896 sat_gtf_packet_default_load(int unit, bcm_sat_gtf_t id) 897 { 898 bcm_pkt_t *sat_header; 899 900 SAT_GTF_ID_CHECK_RETURN(id); 901 if (_gtf_pkt_cfg[id].sat_header) { 902 bcm_pkt_free(unit, _gtf_pkt_cfg[id].sat_header); 903 _gtf_pkt_cfg[id].sat_header = NULL; 904 } 905 906 sal_memcpy(&_gtf_pkt_cfg[id], &_gtf_pkt_cfg_default, 907 sizeof(_gtf_pkt_cfg_default)); 908 SAT_IF_ERROR_RETURN(bcm_pkt_alloc(unit, _gtf_pkt_header_max_len, 0, 909 &sat_header)); 910 sal_memcpy(sat_header->pkt_data->data, 911 _gtf_pkt_cfg_default.cfg.header_info.pkt_data->data, 912 _gtf_pkt_cfg_default.cfg.header_info.pkt_data->len); 913 sat_header->pkt_data->len = _gtf_pkt_cfg_default.cfg.header_info.pkt_data->len; 914 _gtf_pkt_cfg[id].cfg.header_info.pkt_data = sat_header->pkt_data; 915 _gtf_pkt_cfg[id].sat_header = sat_header; 916 917 return CMD_OK; 918 } 919 920 STATIC cmd_result_t 921 sat_gtf_packet_default_init(int unit) 922 { 923 static int flag = 0; 924 int id, pri, index; 925 int pkt_size = 0; 926 bcm_pkt_t *sat_header; 927 928 if (flag) { 929 return CMD_OK; 930 } 931 flag = 1; 932 933 _sat_gtf_pkt_info_t_init(&_gtf_pkt_cfg_default); 934 /* Fill in default GTF packet config. */ 935 /* 1. Configure header type*/ 936 _gtf_pkt_cfg_default.cfg.sat_header_type = bcmSatHeaderUserDefined; 937 938 /* 2. Configure header info */ 939 SAT_IF_ERROR_RETURN(bcm_pkt_alloc(unit, _gtf_pkt_header_max_len, 0, 940 &sat_header)); 941 pkt_size = _sat_gtf_packet_header_config_fl_down( 942 unit, sat_header->pkt_data->data); 943 sat_header->pkt_data->len = pkt_size; 944 _gtf_pkt_cfg_default.cfg.header_info.pkt_data = sat_header->pkt_data; 945 _gtf_pkt_cfg_default.cfg.header_info.blk_count = 1; 946 _gtf_pkt_cfg_default.sat_header = sat_header; 947 948 /* 3. Configure payload */ 949 _gtf_pkt_cfg_default.cfg.payload.payload_type = bcmSatPayloadPRBS; 950 for (index = 0; index < BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE; index++) { 951 _gtf_pkt_cfg_default.cfg.payload.payload_pattern[index] = 0x1; 952 } 953 954 /* 4. Configure packet edit */ 955 for (pri = 0; pri < BCM_SAT_GTF_NUM_OF_PRIORITIES; pri++) { 956 _gtf_pkt_cfg_default.cfg.packet_edit[pri].packet_length[0] = 64; 957 _gtf_pkt_cfg_default.cfg.packet_edit[pri].pattern_length = 1; 958 for (index = 0; index < BCM_SAT_GTF_MAX_STAMPS; index++) { 959 _gtf_pkt_cfg_default.cfg.packet_edit[pri].stamps[index].stamp_type = 960 bcmSatStampInvalid; 961 _gtf_pkt_cfg_default.cfg.packet_edit[pri].stamps[index].field_type = 962 bcmSatStampFieldUserDefined; 963 _gtf_pkt_cfg_default.cfg.packet_edit[pri].stamps[index].inc_step = 1; 964 _gtf_pkt_cfg_default.cfg.packet_edit[pri].stamps[index].inc_period_packets = 1; 965 } 966 _gtf_pkt_cfg_default.cfg.packet_edit[pri].number_of_ctfs = 1; 967 } 968 969 /* 5. Configure packet offset */ 970 _gtf_pkt_cfg_default.cfg.offsets.seq_number_offset = -1; 971 972 /* Init GTF packet config DB. */ 973 for (id = 0; id < _SAT_CMD_GTF_CNT_MAX; id++) { 974 _sat_gtf_pkt_info_t_init(&_gtf_pkt_cfg[id]); 975 SAT_IF_ERROR_RETURN(sat_gtf_packet_default_load(unit, id)); 976 } 977 978 return CMD_OK; 979 } 980 981 STATIC cmd_result_t 982 sat_subcommand_exec(int unit, args_t *a, sat_subcommand_t *command_list) 983 { 984 cmd_result_t rv; 985 char *arg = NULL; 986 sat_subcommand_t *list = command_list; 987 988 arg = ARG_GET(a); 989 990 /* Match & exec subcommand. */ 991 if (arg) { 992 while (list->str) { 993 if (parse_cmp(list->str, arg, 0)) { 994 rv = (*list->func)(unit, a); 995 if ((rv == CMD_USAGE) || (rv == CMD_NFND)) { 996 cli_out("\t%s\n", list->help); 997 rv = CMD_OK; 998 } 999 return rv; 1000 } 1001 list++; 1002 } 1003 } 1004 1005 /* Provide help when no match. */ 1006 list = command_list; 1007 while (list->str) { 1008 cli_out("\t%s\n", list->help); 1009 list++; 1010 } 1011 1012 return CMD_OK; 1013 } 1014 1015 STATIC cmd_result_t 1016 sat_gtf_show(int unit, bcm_sat_gtf_t id, void *cookie) 1017 { 1018 int pri; 1019 uint64 stat; 1020 bcm_sat_gtf_bandwidth_t bw; 1021 bcm_sat_gtf_rate_pattern_t pattern; 1022 1023 cli_out("GTF %d:\n", id); 1024 for (pri = 0; pri < BCM_SAT_GTF_NUM_OF_PRIORITIES; pri++) { 1025 bcm_sat_gtf_bandwidth_t_init(&bw); 1026 bcm_sat_gtf_rate_pattern_t_init(&pattern); 1027 SAT_IF_ERROR_RETURN(bcm_sat_gtf_bandwidth_get(unit, id, pri, &bw)); 1028 SAT_IF_ERROR_RETURN(bcm_sat_gtf_rate_pattern_get(unit, id, pri, 1029 &pattern)); 1030 SAT_IF_ERROR_RETURN(bcm_sat_gtf_stat_get(unit, id, pri, 0, 1031 bcmSatGtfStatPacketCount, &stat)); 1032 cli_out("\tPriority %d - bandwidth: rate=%d kbps, burst=%d kbit\n", 1033 pri, bw.rate, bw.max_burst); 1034 cli_out("\t pattern : mode=%d, flag=0x%08x\n", 1035 pattern.rate_pattern_mode, pattern.flags); 1036 cli_out("\t thresh_low=%d, thresh_high=%d \n", 1037 pattern.low_threshold, pattern.high_threshold); 1038 cli_out("\t " \ 1039 "cnt_iter=%d, cnt_burst=%d, cnt_interval=%d\n", 1040 pattern.stop_interval_count, pattern.stop_burst_count, 1041 pattern.stop_iter_count); 1042 cli_out("\t weight_burst=%d, weight_interval=%d\n", 1043 pattern.burst_packet_weight, pattern.interval_packet_weight); 1044 cli_out("\t TX : 0x%08x%08x packets\n", 1045 COMPILER_64_HI(stat), COMPILER_64_LO(stat)); 1046 } 1047 1048 return CMD_OK; 1049 } 1050 1051 #if defined(BCM_ESW_SUPPORT) || defined(BCM_PETRA_SUPPORT) 1052 STATIC cmd_result_t 1053 sat_gtf_header_raw_set(int unit, args_t *a) 1054 { 1055 char *arg = NULL; 1056 int index, header_len; 1057 int cnt, pos, input_len; 1058 char *arg_data = NULL; 1059 uint8 *input_data = NULL; 1060 parse_table_t pt; 1061 bcm_sat_gtf_t id; 1062 bcm_sat_gtf_packet_config_t *config; 1063 1064 SAT_ARG_NUMB_GET(a, arg, id); 1065 SAT_GTF_ID_CHECK_RETURN(id); 1066 1067 config = sal_alloc(sizeof(bcm_sat_gtf_packet_config_t), 1068 "bcm_sat_gtf_packet_config"); 1069 if (!config) { 1070 return CMD_FAIL; 1071 } 1072 1073 header_len = (2*_gtf_pkt_cfg[id].dev_header_len + 5); 1074 arg_data = sal_alloc(header_len, "sat_header"); 1075 if (!arg_data) { 1076 sal_free(config); 1077 return CMD_FAIL; 1078 } 1079 sal_memset(arg_data, 0, header_len); 1080 sal_memcpy(config, &_gtf_pkt_cfg[id].cfg, 1081 sizeof(bcm_sat_gtf_packet_config_t)); 1082 pos = 0; 1083 for (index = 0; index < _gtf_pkt_cfg[id].dev_header_len; index++) { 1084 cnt = sal_sprintf(arg_data + pos, "%02x", 1085 *(config->header_info.pkt_data->data + index)); 1086 pos += cnt; 1087 } 1088 parse_table_init(unit, &pt); 1089 parse_table_add(&pt, "rawData", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1090 &arg_data, NULL); 1091 if (!ARG_CNT(a)) { /* Display settings */ 1092 cli_out("Current settings:\n"); 1093 parse_eq_format(&pt); 1094 parse_arg_eq_done(&pt); 1095 sal_free(config); 1096 return CMD_OK; 1097 } 1098 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 1099 cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(a), ARG_CUR(a)); 1100 parse_arg_eq_done(&pt); 1101 sal_free(config); 1102 return CMD_FAIL; 1103 } 1104 (void)_parse_packet_data(unit, arg_data, &input_len, &input_data); 1105 parse_arg_eq_done(&pt);/* Do not do this before arg_data is parsed. */ 1106 if (!input_data) { 1107 sal_free(config); 1108 return CMD_FAIL; 1109 } 1110 1111 sal_memset(config->header_info.pkt_data->data, 0, 1112 _gtf_pkt_cfg[id].dev_header_len); 1113 sal_memcpy(config->header_info.pkt_data->data, input_data, input_len); 1114 (void)_parse_packet_data_end(unit, arg_data, &input_len, input_data); 1115 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, config)); 1116 sal_memcpy(&_gtf_pkt_cfg[id].cfg, config, 1117 sizeof(bcm_sat_gtf_packet_config_t)); 1118 sal_free(config); 1119 1120 return CMD_OK; 1121 } 1122 #endif 1123 1124 #if defined(BCM_ESW_SUPPORT) 1125 STATIC cmd_result_t 1126 sat_gtf_olpheader(int unit, args_t *a) 1127 { 1128 char *arg = NULL; 1129 cmd_result_t retCode; 1130 sal_mac_addr_t arg_dmac, arg_smac; 1131 uint32 arg_tpid, arg_vid, arg_pri, arg_cfi, arg_eth_type; 1132 uint32 arg_down, arg_mod, arg_port, arg_ts, arg_ts_format, arg_ts_offset; 1133 uint32 sub_type, ts_action, oam_replacement_offset; 1134 uint8 *data; 1135 parse_table_t pt; 1136 bcm_sat_gtf_t id; 1137 bcm_sat_gtf_packet_config_t *config; 1138 1139 arg = ARG_GET(a); 1140 if (!arg) { 1141 return CMD_USAGE; 1142 } else if (parse_cmp("Set", arg, 0)) { 1143 return sat_gtf_header_raw_set(unit, a); 1144 } else if (parse_cmp("L2", arg, 0)) { 1145 SAT_ARG_NUMB_GET(a, arg, id); 1146 SAT_GTF_ID_CHECK_RETURN(id); 1147 1148 config = sal_alloc(sizeof(bcm_sat_gtf_packet_config_t), 1149 "bcm_sat_gtf_packet_config"); 1150 if (!config) { 1151 return CMD_FAIL; 1152 } 1153 sal_memcpy(config, &_gtf_pkt_cfg[id].cfg, 1154 sizeof(bcm_sat_gtf_packet_config_t)); 1155 data = config->header_info.pkt_data->data + 1156 _gtf_pkt_cfg[id].dev_header_1_offset; 1157 sal_memcpy(arg_dmac, data, sizeof(arg_dmac)); 1158 sal_memcpy(arg_smac, data + 6, sizeof(arg_smac)); 1159 arg_tpid = (*(data + 12) << 8) + *(data + 13); 1160 arg_vid = ((*(data + 14) & 0xf) << 8) + *(data + 15); 1161 arg_pri = (*(data + 14) & 0xe0) >> 5; 1162 arg_cfi = (*(data + 14) & 0x10) >> 4; 1163 arg_eth_type = (*(data + 16) << 8) + *(data + 17); 1164 parse_table_init(unit, &pt); 1165 parse_table_add(&pt, "DMac", PQ_DFL|PQ_MAC, NULL, 1166 &arg_dmac, NULL); 1167 parse_table_add(&pt, "SMac", PQ_DFL|PQ_MAC, NULL, 1168 &arg_smac, NULL); 1169 parse_table_add(&pt, "Tpid", PQ_DFL|PQ_HEX, NULL, 1170 &arg_tpid, NULL); 1171 parse_table_add(&pt, "Vlan", PQ_DFL|PQ_INT, NULL, 1172 &arg_vid, NULL); 1173 parse_table_add(&pt, "vlanPri", PQ_DFL|PQ_INT, NULL, 1174 &arg_pri, NULL); 1175 parse_table_add(&pt, "vlanCfi", PQ_DFL|PQ_INT, NULL, 1176 &arg_cfi, NULL); 1177 parse_table_add(&pt, "ETHertype", PQ_DFL|PQ_HEX, NULL, 1178 &arg_eth_type, NULL); 1179 if (!parseEndOk(a, &pt, &retCode)) { 1180 sal_free(config); 1181 return retCode; 1182 } 1183 (void)_insert_xgs_olp_l2(data, 0, arg_dmac, arg_smac, arg_tpid, 1184 arg_vid, arg_pri, arg_cfi, arg_eth_type); 1185 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, config)); 1186 sal_memcpy(&_gtf_pkt_cfg[id].cfg, config, 1187 sizeof(bcm_sat_gtf_packet_config_t)); 1188 sal_free(config); 1189 } else if (parse_cmp("Tx", arg, 0)) { 1190 SAT_ARG_NUMB_GET(a, arg, id); 1191 SAT_GTF_ID_CHECK_RETURN(id); 1192 config = sal_alloc(sizeof(bcm_sat_gtf_packet_config_t), 1193 "bcm_sat_gtf_packet_config"); 1194 if (!config) { 1195 return CMD_FAIL; 1196 } 1197 1198 sal_memcpy(config, &_gtf_pkt_cfg[id].cfg, 1199 sizeof(bcm_sat_gtf_packet_config_t)); 1200 data = config->header_info.pkt_data->data + 1201 _gtf_pkt_cfg[id].dev_header_2_offset; 1202 sub_type = ((*(data + 1) & 0xf) << 4) + ((*(data + 2) & 0xf0) >> 4); 1203 if (sub_type == 2) { 1204 arg_down = 1; 1205 }else { 1206 arg_down = 0; 1207 } 1208 arg_mod = *(data + 3); 1209 arg_port = *(data + 4); 1210 ts_action = (*(data + 9) >> 2) & 0x3; 1211 if (ts_action == 0) { 1212 arg_ts = 0; 1213 arg_ts_format = bcmSATTimestampFormatIEEE1588v1; 1214 } else { 1215 arg_ts = 1; 1216 arg_ts_format = (ts_action == 2)? bcmSATTimestampFormatNTP:\ 1217 bcmSATTimestampFormatIEEE1588v1; 1218 } 1219 1220 oam_replacement_offset = ((*(data + 9) & 0x3) << 6) + 1221 ((*(data + 10) & 0xfc) >> 2); 1222 arg_ts_offset = (oam_replacement_offset * 2) + 14; 1223 parse_table_init(unit, &pt); 1224 parse_table_add(&pt, "isDown", PQ_DFL|PQ_BOOL, NULL, 1225 &arg_down, NULL); 1226 parse_table_add(&pt, "destModid", PQ_DFL|PQ_INT, NULL, 1227 &arg_mod, NULL); 1228 parse_table_add(&pt, "destPort", PQ_DFL|PQ_INT, NULL, 1229 &arg_port, NULL); 1230 parse_table_add(&pt, "isAddTs", PQ_DFL|PQ_BOOL, NULL, 1231 &arg_ts, NULL); 1232 parse_table_add(&pt, "timestampFormat", PQ_DFL|PQ_INT, NULL, 1233 &arg_ts_format, NULL); 1234 parse_table_add(&pt, "OffsetofTs", PQ_DFL|PQ_INT, NULL, 1235 &arg_ts_offset, NULL); 1236 if (!parseEndOk(a, &pt, &retCode)) { 1237 sal_free(config); 1238 return retCode; 1239 } 1240 if (!arg_ts) { 1241 ts_action = 0; 1242 } else { 1243 ts_action = (arg_ts_format == bcmSATTimestampFormatNTP)? 2:1; 1244 } 1245 (void)_insert_xgs_olp_tx(data, 0, arg_down, arg_mod, arg_port, 1246 ts_action, arg_ts_offset); 1247 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, config)); 1248 sal_memcpy(&_gtf_pkt_cfg[id].cfg, config, 1249 sizeof(bcm_sat_gtf_packet_config_t)); 1250 sal_free(config); 1251 } else { 1252 return CMD_NFND; 1253 } 1254 1255 return CMD_OK; 1256 } 1257 #endif 1258 #if defined(BCM_PETRA_SUPPORT) 1259 STATIC cmd_result_t 1260 sat_gtf_dnxheader(int unit, args_t *a) 1261 { 1262 char *arg = NULL; 1263 cmd_result_t retCode; 1264 uint32 arg_port, arg_attr, arg_next; 1265 uint32 arg_pri, arg_color, arg_flag, arg_cmd, arg_type; 1266 uint32 arg_subtype, arg_down, arg_offset; 1267 uint64 arg_data; 1268 uint32 fwd_dest_info, ts_data_hi, ts_data_lo, pos; 1269 uint8 *data = NULL; 1270 parse_table_t pt; 1271 bcm_sat_gtf_t id; 1272 bcm_sat_gtf_packet_config_t config; 1273 1274 arg = ARG_GET(a); 1275 if (!arg) { 1276 return CMD_USAGE; 1277 } else if (parse_cmp("Set", arg, 0)) { 1278 return sat_gtf_header_raw_set(unit, a); 1279 } else if (parse_cmp("Ptch", arg, 0)) { 1280 SAT_ARG_NUMB_GET(a, arg, id); 1281 SAT_GTF_ID_CHECK_RETURN(id); 1282 sal_memcpy(&config, &_gtf_pkt_cfg[id].cfg, sizeof(config)); 1283 data = config.header_info.pkt_data->data + 1284 _gtf_pkt_cfg[id].dev_header_1_offset; 1285 arg_port = *(data + 1); 1286 arg_attr = (*data & 0x70) >> 4; 1287 arg_next = ((*data & 0x80) >> 7) ^ 0x1; 1288 parse_table_init(unit, &pt); 1289 parse_table_add(&pt, "srcGport", PQ_DFL|PQ_INT, NULL, 1290 &arg_port, NULL); 1291 parse_table_add(&pt, "opaqueAttr", PQ_DFL|PQ_INT, NULL, 1292 &arg_attr, NULL); 1293 parse_table_add(&pt, "isNextHeaderItmh", PQ_DFL|PQ_BOOL, NULL, 1294 &arg_next, NULL); 1295 if (!parseEndOk(a, &pt, &retCode)) { 1296 return retCode; 1297 } 1298 (void)_insert_dnx_ptch2(data, 0, arg_next, arg_attr, arg_port); 1299 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, &config)); 1300 sal_memcpy(&_gtf_pkt_cfg[id].cfg, &config, sizeof(config)); 1301 } else if (parse_cmp("Itmh", arg, 0)) { 1302 SAT_ARG_NUMB_GET(a, arg, id); 1303 SAT_GTF_ID_CHECK_RETURN(id); 1304 sal_memcpy(&config, &_gtf_pkt_cfg[id].cfg, sizeof(config)); 1305 data = config.header_info.pkt_data->data + 1306 _gtf_pkt_cfg[id].dev_header_2_offset; 1307 fwd_dest_info = ((*(data + 1) & 0x0f) << 16) + 1308 (*(data + 2) << 8) + *(data + 3); 1309 arg_port = fwd_dest_info & (~0xc0000); 1310 arg_pri = ((*(data + 1) & 0xc0) >> 6) + ((*data & 0x1) << 2); 1311 arg_color = (*(data + 1) & 0x30) >> 4; 1312 arg_flag = (*data & 0x20) >> 5; 1313 arg_cmd = (*data & 0x1e) >> 1; 1314 arg_type = (*data & 0xc0) >> 6; 1315 parse_table_init(unit, &pt); 1316 parse_table_add(&pt, "dstGport", PQ_DFL|PQ_INT, NULL, 1317 &arg_port, NULL); 1318 parse_table_add(&pt, "Prio", PQ_DFL|PQ_INT, NULL, 1319 &arg_pri, NULL); 1320 parse_table_add(&pt, "Color", PQ_DFL|PQ_INT, NULL, 1321 &arg_color, NULL); 1322 parse_table_add(&pt, "inMirrorFlag", PQ_DFL|PQ_BOOL, NULL, 1323 &arg_flag, NULL); 1324 parse_table_add(&pt, "snoopCMD", PQ_DFL|PQ_INT, NULL, 1325 &arg_cmd, NULL); 1326 parse_table_add(&pt, "pphType", PQ_DFL|PQ_INT, NULL, 1327 &arg_type, NULL); 1328 if (!parseEndOk(a, &pt, &retCode)) { 1329 return retCode; 1330 } 1331 (void)_insert_dnx_itmh_arad(data, 0, arg_port, arg_pri, arg_color, 1332 arg_cmd, arg_flag, arg_type); 1333 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, &config)); 1334 sal_memcpy(&_gtf_pkt_cfg[id].cfg, &config, sizeof(config)); 1335 } else if (parse_cmp("Otsh", arg, 0)) { 1336 SAT_ARG_NUMB_GET(a, arg, id); 1337 SAT_GTF_ID_CHECK_RETURN(id); 1338 sal_memcpy(&config, &_gtf_pkt_cfg[id].cfg, sizeof(config)); 1339 if (_gtf_pkt_cfg[id].dev_header_3_offset > 0) { /* OAM header included */ 1340 data = config.header_info.pkt_data->data + 1341 _gtf_pkt_cfg[id].dev_header_3_offset; 1342 arg_type = (*data & 0xc0) >> 6; 1343 arg_subtype = (*data & 0x38) >> 3; 1344 arg_down = ((*data & 0x4) >> 2) ^ 1; 1345 ts_data_hi = (*data & 0x3); 1346 ts_data_lo = (*(data + 1) << 24) + (*(data + 2) << 16) + 1347 (*(data + 3) << 8) + *(data + 4); 1348 COMPILER_64_SET(arg_data, ts_data_hi, ts_data_lo); 1349 arg_offset = *(data + 5); 1350 } else { /* Currently no OAM header */ 1351 arg_type = 0; 1352 arg_subtype = 0; 1353 arg_down = 0; 1354 COMPILER_64_SET(arg_data, 0, 0); 1355 arg_offset = 0; 1356 } 1357 parse_table_init(unit, &pt); 1358 parse_table_add(&pt, "Type", PQ_DFL|PQ_INT, NULL, 1359 &arg_type, NULL); 1360 parse_table_add(&pt, "SubType", PQ_DFL|PQ_INT, NULL, 1361 &arg_subtype, NULL); 1362 parse_table_add(&pt, "isDowN", PQ_DFL|PQ_BOOL, NULL, 1363 &arg_down, NULL); 1364 parse_table_add(&pt, "tsData", PQ_DFL|PQ_INT64, NULL, 1365 &arg_data, NULL); 1366 parse_table_add(&pt, "tsOffset", PQ_DFL|PQ_INT, NULL, 1367 &arg_offset, NULL); 1368 if (!parseEndOk(a, &pt, &retCode)) { 1369 return retCode; 1370 } 1371 if (_gtf_pkt_cfg[id].dev_header_3_offset < 0) { /* newly add OAM header */ 1372 pos = _gtf_pkt_cfg[id].ctrl_info_len; 1373 while (pos >= _gtf_pkt_cfg[id].eth_header_offset) { 1374 *(config.header_info.pkt_data->data + pos + 6) = 1375 *(config.header_info.pkt_data->data + pos); 1376 pos--; 1377 } 1378 _gtf_pkt_cfg[id].dev_header_3_offset = 1379 _gtf_pkt_cfg[id].eth_header_offset; 1380 _gtf_pkt_cfg[id].eth_header_offset += 6; /* OAM header takes 6Bytes */ 1381 _gtf_pkt_cfg[id].pdu_offset += 6; 1382 _gtf_pkt_cfg[id].dev_header_len += 6; 1383 _gtf_pkt_cfg[id].ctrl_info_len += 6; 1384 config.header_info.pkt_data->len += 6; 1385 data = config.header_info.pkt_data->data + 1386 _gtf_pkt_cfg[id].dev_header_3_offset; 1387 sal_memset(data, 0, 6); 1388 } 1389 (void)_insert_dnx_oam_ts(data, 0, arg_type, arg_subtype, arg_down? 0:1, 1390 arg_data, arg_offset); 1391 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, &config)); 1392 sal_memcpy(&_gtf_pkt_cfg[id].cfg, &config, sizeof(config)); 1393 } else { 1394 return CMD_NFND; 1395 } 1396 1397 return CMD_OK; 1398 } 1399 #endif 1400 1401 STATIC cmd_result_t 1402 sat_gtf_packet_data(int unit, args_t *a) 1403 { 1404 char *arg = NULL; 1405 sal_mac_addr_t arg_dmac, arg_smac; 1406 uint32 arg_tpid; 1407 int index, header_len, pkt_header_len; 1408 int cnt, pos, input_len, eth_type, ext_data_offset; 1409 char *arg_data = NULL; 1410 uint8 *input_data = NULL, *data, arg_pri, cfi; 1411 uint16 arg_vid, tpid; 1412 parse_table_t pt; 1413 bcm_sat_gtf_t id; 1414 bcm_sat_gtf_packet_config_t *config; 1415 1416 SAT_ARG_NUMB_GET(a, arg, id); 1417 SAT_GTF_ID_CHECK_RETURN(id); 1418 1419 config = sal_alloc(sizeof(bcm_sat_gtf_packet_config_t), 1420 "bcm_sat_gtf_packet_config"); 1421 if (!config) { 1422 return CMD_FAIL; 1423 } 1424 1425 pkt_header_len = _gtf_pkt_cfg[id].ctrl_info_len - 1426 _gtf_pkt_cfg[id].eth_header_offset; 1427 header_len = (2*(pkt_header_len) + 5); 1428 arg_data = sal_alloc(header_len, "sat_header"); 1429 if (!arg_data) { 1430 sal_free(config); 1431 return CMD_FAIL; 1432 } 1433 sal_memset(arg_data, 0, header_len); 1434 sal_memcpy(config, &_gtf_pkt_cfg[id].cfg, 1435 sizeof(bcm_sat_gtf_packet_config_t)); 1436 pos = 0; 1437 ext_data_offset = _gtf_pkt_cfg[id].eth_header_offset + 12 + 4; 1438 for (index = ext_data_offset; 1439 index < _gtf_pkt_cfg[id].ctrl_info_len; index++) { 1440 cnt = sal_sprintf(arg_data + pos, "%02x", 1441 *(config->header_info.pkt_data->data + index)); 1442 pos += cnt; 1443 } 1444 data = config->header_info.pkt_data->data + 1445 _gtf_pkt_cfg[id].eth_header_offset; 1446 sal_memcpy(arg_dmac, data, sizeof(arg_dmac)); 1447 sal_memcpy(arg_smac, data + 6, sizeof(arg_smac)); 1448 arg_tpid = (*(data + 12) << 8) + *(data + 13); 1449 arg_vid = ((*(data + 14) & 0xf) << 8) + *(data + 15); 1450 arg_pri = (*(data + 14) & 0xe0) >> 5; 1451 parse_table_init(unit, &pt); 1452 parse_table_add(&pt, "DMac", PQ_DFL|PQ_MAC, NULL, 1453 &arg_dmac, NULL); 1454 parse_table_add(&pt, "SMac", PQ_DFL|PQ_MAC, NULL, 1455 &arg_smac, NULL); 1456 parse_table_add(&pt, "Tpid", PQ_DFL|PQ_HEX, NULL, 1457 &arg_tpid, NULL); 1458 parse_table_add(&pt, "Vlan", PQ_DFL|PQ_INT16, NULL, 1459 &arg_vid, NULL); 1460 parse_table_add(&pt, "vlanPri", PQ_DFL|PQ_INT8, NULL, 1461 &arg_pri, NULL); 1462 parse_table_add(&pt, "extData", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1463 &arg_data, NULL); 1464 if (!ARG_CNT(a)) { /* Display settings */ 1465 cli_out("Current settings:\n"); 1466 parse_eq_format(&pt); 1467 parse_arg_eq_done(&pt); 1468 sal_free(config); 1469 return CMD_OK; 1470 } 1471 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 1472 cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(a), ARG_CUR(a)); 1473 parse_arg_eq_done(&pt); 1474 sal_free(config); 1475 return CMD_FAIL; 1476 } 1477 (void)_parse_packet_data(unit, arg_data, &input_len, &input_data); 1478 parse_arg_eq_done(&pt);/* Do not do this before arg_data is parsed. */ 1479 if (!input_data) { 1480 sal_free(config); 1481 return CMD_FAIL; 1482 } 1483 1484 if (input_len > (_gtf_pkt_header_max_len - ext_data_offset)) { 1485 (void)_parse_packet_data_end(unit, arg_data, &input_len, input_data); 1486 cli_out("Data length exceeds limit.\n"); 1487 sal_free(config); 1488 return CMD_FAIL; 1489 } 1490 1491 cfi = (*(data + 14) & 0x10) >> 4; 1492 eth_type = (*(data + 16) << 8) + *(data + 17); 1493 tpid = arg_tpid & 0xffff; 1494 (void)_insert_eth(data, 0, arg_dmac, arg_smac, &tpid, &arg_vid, &arg_pri, 1495 &cfi, 1, eth_type); 1496 1497 sal_memset(config->header_info.pkt_data->data + ext_data_offset, 1498 0, _gtf_pkt_cfg[id].ctrl_info_len - ext_data_offset); 1499 sal_memcpy(config->header_info.pkt_data->data + ext_data_offset, 1500 input_data, input_len); 1501 (void)_parse_packet_data_end(unit, arg_data, &input_len, input_data); 1502 _gtf_pkt_cfg[id].ctrl_info_len = ext_data_offset + input_len; 1503 1504 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, config)); 1505 sal_memcpy(&_gtf_pkt_cfg[id].cfg, config, sizeof(bcm_sat_gtf_packet_config_t)); 1506 sal_free(config); 1507 1508 return CMD_OK; 1509 } 1510 1511 STATIC cmd_result_t 1512 sat_gtf_packet_length(int unit, args_t *a) 1513 { 1514 char *arg = NULL; 1515 char *arg_length, *arg_pattern; 1516 uint32 arg_pattern_len; 1517 int32 length[BCM_SAT_GTF_PACKET_LENGTH_NUM_OF_PATTERNS]; 1518 int32 pattern[BCM_SAT_GTF_PACKET_MAX_PATTERN_LENGTH]; 1519 int pri, index, cnt, pos; 1520 int pattern_len = BCM_SAT_GTF_PACKET_MAX_PATTERN_LENGTH*4; 1521 int length_len = BCM_SAT_GTF_PACKET_LENGTH_NUM_OF_PATTERNS*5; 1522 parse_table_t pt; 1523 bcm_sat_gtf_t id; 1524 bcm_sat_gtf_packet_config_t *config; 1525 1526 SAT_ARG_NUMB_GET(a, arg, id); 1527 SAT_GTF_ID_CHECK_RETURN(id); 1528 SAT_ARG_NUMB_GET(a, arg, pri); 1529 1530 config = sal_alloc(sizeof(bcm_sat_gtf_packet_config_t), 1531 "bcm_sat_gtf_packet_config"); 1532 if (!config) { 1533 return CMD_FAIL; 1534 } 1535 1536 sal_memcpy(config, &_gtf_pkt_cfg[id].cfg, 1537 sizeof(bcm_sat_gtf_packet_config_t)); 1538 arg_length = sal_alloc(length_len, "sat_length"); 1539 if (!arg_length) { 1540 sal_free(config); 1541 return CMD_FAIL; 1542 } 1543 sal_memset(arg_length, 0, length_len); 1544 pos = 0; 1545 for (index = 0; 1546 (index < BCM_SAT_GTF_PACKET_LENGTH_NUM_OF_PATTERNS) && 1547 (config->packet_edit[pri].packet_length[index] > 0); 1548 index++) { 1549 cnt = sal_sprintf(arg_length + pos, "%u,", 1550 config->packet_edit[pri].packet_length[index]); 1551 pos += cnt; 1552 } 1553 arg_pattern = sal_alloc(pattern_len, "sat_pattern"); 1554 if (!arg_pattern) { 1555 sal_free(arg_length); 1556 sal_free(config); 1557 return CMD_FAIL; 1558 } 1559 sal_memset(arg_pattern, 0, pattern_len); 1560 pos = 0; 1561 for (index = 0; index < config->packet_edit[pri].pattern_length; index++) { 1562 cnt = sal_sprintf(arg_pattern + pos, "%u,", 1563 config->packet_edit[pri].packet_length_pattern[index]); 1564 pos += cnt; 1565 } 1566 arg_pattern_len = config->packet_edit[pri].pattern_length; 1567 parse_table_init(unit, &pt); 1568 parse_table_add(&pt, "pktLens", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1569 &arg_length, NULL); 1570 parse_table_add(&pt, "pktlenPatterns", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1571 &arg_pattern, NULL); 1572 parse_table_add(&pt, "PatternLens", PQ_DFL|PQ_INT, NULL, 1573 &arg_pattern_len, NULL); 1574 if (!ARG_CNT(a)) { /* Display settings */ 1575 cli_out("Current settings:\n"); 1576 parse_eq_format(&pt); 1577 parse_arg_eq_done(&pt); 1578 sal_free(config); 1579 return CMD_OK; 1580 } 1581 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 1582 cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(a), ARG_CUR(a)); 1583 parse_arg_eq_done(&pt); 1584 sal_free(config); 1585 return CMD_FAIL; 1586 } 1587 sal_memset(length, 0, sizeof(length)); 1588 (void)_list_to_data_array(arg_length, 1589 BCM_SAT_GTF_PACKET_LENGTH_NUM_OF_PATTERNS, 1590 length); 1591 sal_memset(pattern, 0, sizeof(pattern)); 1592 (void)_list_to_data_array(arg_pattern, 1593 BCM_SAT_GTF_PACKET_MAX_PATTERN_LENGTH, pattern); 1594 parse_arg_eq_done(&pt);/* Do not do this before arg_pattern is parsed. */ 1595 1596 for (index = 0; 1597 index < BCM_SAT_GTF_PACKET_LENGTH_NUM_OF_PATTERNS; index++) { 1598 config->packet_edit[pri].packet_length[index] = length[index]; 1599 } 1600 for (index = 0; 1601 index < BCM_SAT_GTF_PACKET_MAX_PATTERN_LENGTH; index++) { 1602 config->packet_edit[pri].packet_length_pattern[index] = pattern[index]; 1603 } 1604 config->packet_edit[pri].pattern_length = arg_pattern_len; 1605 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, config)); 1606 sal_memcpy(&_gtf_pkt_cfg[id].cfg, config, 1607 sizeof(bcm_sat_gtf_packet_config_t)); 1608 sal_free(config); 1609 return CMD_OK; 1610 } 1611 1612 STATIC cmd_result_t 1613 sat_gtf_packet_stamp(int unit, args_t *a) 1614 { 1615 char *arg = NULL; 1616 char *arg_type, *arg_field, *arg_step, *arg_period, *arg_value, *arg_offset; 1617 uint32 arg_stamp_cnt; 1618 int32 type[BCM_SAT_GTF_MAX_STAMPS], field[BCM_SAT_GTF_MAX_STAMPS]; 1619 int32 step[BCM_SAT_GTF_MAX_STAMPS], period[BCM_SAT_GTF_MAX_STAMPS]; 1620 int32 value[BCM_SAT_GTF_MAX_STAMPS], offset[BCM_SAT_GTF_MAX_STAMPS]; 1621 int pri, index, cnt; 1622 int type_pos = 0, field_pos = 0, step_pos = 0; 1623 int period_pos = 0, value_pos = 0, offset_pos = 0; 1624 int list_len = BCM_SAT_GTF_MAX_STAMPS*4; 1625 parse_table_t pt; 1626 bcm_sat_gtf_t id; 1627 bcm_sat_gtf_packet_config_t *config; 1628 1629 SAT_ARG_NUMB_GET(a, arg, id); 1630 SAT_GTF_ID_CHECK_RETURN(id); 1631 SAT_ARG_NUMB_GET(a, arg, pri); 1632 1633 config = sal_alloc(sizeof(bcm_sat_gtf_packet_config_t), 1634 "bcm_sat_gtf_packet_config"); 1635 if (!config) { 1636 return CMD_FAIL; 1637 } 1638 1639 sal_memcpy(config, &_gtf_pkt_cfg[id].cfg, 1640 sizeof(bcm_sat_gtf_packet_config_t)); 1641 if (!(arg_type = sal_alloc(list_len, "sat_type"))) { 1642 sal_free(config); 1643 return CMD_FAIL; 1644 } 1645 sal_memset(arg_type, 0, list_len); 1646 if (!(arg_field = sal_alloc(list_len, "sat_field"))) { 1647 sal_free(arg_type); 1648 sal_free(config); 1649 return CMD_FAIL; 1650 } 1651 sal_memset(arg_field, 0, list_len); 1652 if (!(arg_step = sal_alloc(list_len, "sat_step"))) { 1653 sal_free(arg_type); 1654 sal_free(arg_field); 1655 sal_free(config); 1656 return CMD_FAIL; 1657 } 1658 sal_memset(arg_step, 0, list_len); 1659 if (!(arg_period = sal_alloc(list_len, "sat_period"))) { 1660 sal_free(arg_type); 1661 sal_free(arg_field); 1662 sal_free(arg_step); 1663 sal_free(config); 1664 return CMD_FAIL; 1665 } 1666 sal_memset(arg_period, 0, list_len); 1667 if (!(arg_value = sal_alloc(list_len, "sat_value"))) { 1668 sal_free(arg_type); 1669 sal_free(arg_field); 1670 sal_free(arg_step); 1671 sal_free(arg_period); 1672 sal_free(config); 1673 return CMD_FAIL; 1674 } 1675 sal_memset(arg_value, 0, list_len); 1676 if (!(arg_offset = sal_alloc(list_len, "sat_offset"))) { 1677 sal_free(arg_type); 1678 sal_free(arg_field); 1679 sal_free(arg_step); 1680 sal_free(arg_period); 1681 sal_free(arg_value); 1682 sal_free(config); 1683 return CMD_FAIL; 1684 } 1685 sal_memset(arg_offset, 0, list_len); 1686 for (index = 0; index < BCM_SAT_GTF_MAX_STAMPS; index++) { 1687 cnt = sal_sprintf(arg_type + type_pos, "%u,", 1688 config->packet_edit[pri].stamps[index].stamp_type); 1689 type_pos += cnt; 1690 cnt = sal_sprintf(arg_field + field_pos, "%u,", 1691 config->packet_edit[pri].stamps[index].field_type); 1692 field_pos += cnt; 1693 cnt = sal_sprintf(arg_step + step_pos, "%u,", 1694 config->packet_edit[pri].stamps[index].inc_step); 1695 step_pos += cnt; 1696 cnt = sal_sprintf(arg_period + period_pos, "%u,", 1697 config->packet_edit[pri].stamps[index].inc_period_packets); 1698 period_pos += cnt; 1699 cnt = sal_sprintf(arg_value + value_pos, "%u,", 1700 config->packet_edit[pri].stamps[index].value); 1701 value_pos += cnt; 1702 cnt = sal_sprintf(arg_offset + offset_pos, "%u,", 1703 config->packet_edit[pri].stamps[index].offset); 1704 offset_pos += cnt; 1705 } 1706 arg_stamp_cnt = config->packet_edit[pri].number_of_stamps; 1707 parse_table_init(unit, &pt); 1708 parse_table_add(&pt, "StampTypes", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1709 &arg_type, NULL); 1710 parse_table_add(&pt, "stampFieldTypes", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1711 &arg_field, NULL); 1712 parse_table_add(&pt, "stampIncSteps", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1713 &arg_step, NULL); 1714 parse_table_add(&pt, "stampIncPeriods", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1715 &arg_period, NULL); 1716 parse_table_add(&pt, "stampValues", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1717 &arg_value, NULL); 1718 parse_table_add(&pt, "stampOffsets", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 1719 &arg_offset, NULL); 1720 parse_table_add(&pt, "Numofstamps", PQ_DFL|PQ_INT, NULL, 1721 &arg_stamp_cnt, NULL); 1722 if (!ARG_CNT(a)) { /* Display settings */ 1723 cli_out("Current settings:\n"); 1724 parse_eq_format(&pt); 1725 parse_arg_eq_done(&pt); 1726 sal_free(config); 1727 return CMD_OK; 1728 } 1729 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 1730 cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(a), ARG_CUR(a)); 1731 parse_arg_eq_done(&pt); 1732 sal_free(config); 1733 return CMD_FAIL; 1734 } 1735 sal_memset(type, 0, sizeof(type)); 1736 (void)_list_to_data_array(arg_type, BCM_SAT_GTF_MAX_STAMPS, type); 1737 sal_memset(field, 0, sizeof(field)); 1738 (void)_list_to_data_array(arg_field, BCM_SAT_GTF_MAX_STAMPS, field); 1739 sal_memset(step, 0, sizeof(step)); 1740 (void)_list_to_data_array(arg_step, BCM_SAT_GTF_MAX_STAMPS, step); 1741 sal_memset(period, 0, sizeof(period)); 1742 (void)_list_to_data_array(arg_period, BCM_SAT_GTF_MAX_STAMPS, period); 1743 sal_memset(value, 0, sizeof(value)); 1744 (void)_list_to_data_array(arg_value, BCM_SAT_GTF_MAX_STAMPS, value); 1745 sal_memset(offset, 0, sizeof(offset)); 1746 (void)_list_to_data_array(arg_offset, BCM_SAT_GTF_MAX_STAMPS, offset); 1747 parse_arg_eq_done(&pt);/* Do not do this before arg_offset is parsed. */ 1748 for (index = 0; index < BCM_SAT_GTF_MAX_STAMPS; index++) { 1749 config->packet_edit[pri].stamps[index].stamp_type = type[index]; 1750 config->packet_edit[pri].stamps[index].field_type = field[index]; 1751 config->packet_edit[pri].stamps[index].inc_step = step[index]; 1752 config->packet_edit[pri].stamps[index].inc_period_packets = period[index]; 1753 config->packet_edit[pri].stamps[index].value = value[index]; 1754 config->packet_edit[pri].stamps[index].offset = offset[index]; 1755 } 1756 config->packet_edit[pri].number_of_stamps = arg_stamp_cnt; 1757 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, config)); 1758 sal_memcpy(&_gtf_pkt_cfg[id].cfg, config, 1759 sizeof(bcm_sat_gtf_packet_config_t)); 1760 sal_free(config); 1761 1762 return CMD_OK; 1763 } 1764 1765 STATIC cmd_result_t 1766 sat_ctf_packet_default_load(int unit, bcm_sat_ctf_t id) 1767 { 1768 int index; 1769 1770 SAT_CTF_ID_CHECK_RETURN(id); 1771 sal_memset(&_ctf_pkt_cfg[id], 0, sizeof(_ctf_pkt_cfg[id])); 1772 _ctf_pkt_cfg[id].sat_header_type = bcmSatHeaderUserDefined; 1773 _ctf_pkt_cfg[id].payload.payload_type = bcmSatPayloadPRBS; 1774 for (index = 0; index < BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE; index++) { 1775 _ctf_pkt_cfg[id].payload.payload_pattern[index] = 1; 1776 } 1777 _ctf_pkt_cfg[id].offsets.payload_offset = 32; 1778 _ctf_pkt_cfg[id].flags |= BCM_SAT_CTF_PACKET_INFO_ADD_END_TLV; 1779 1780 return CMD_OK; 1781 } 1782 1783 STATIC cmd_result_t 1784 sat_ctf_trap_data2session(int unit, args_t *a) 1785 { 1786 char *arg = NULL; 1787 uint32 arg_data = 0, arg_mask = 0xff, arg_id = 0; 1788 parse_table_t pt; 1789 cmd_result_t retCode; 1790 1791 arg = ARG_GET(a); 1792 if (!arg) { 1793 return CMD_USAGE; 1794 } else if (parse_cmp("Add", arg, 0)) { 1795 parse_table_init(unit, &pt); 1796 parse_table_add(&pt, "trapData", PQ_DFL|PQ_INT, NULL, 1797 &arg_data, NULL); 1798 parse_table_add(&pt, "trapdataMask", PQ_DFL|PQ_HEX, NULL, 1799 &arg_mask, NULL); 1800 parse_table_add(&pt, "sessionId", PQ_DFL|PQ_INT, NULL, 1801 &arg_id, NULL); 1802 if (!parseEndOk(a, &pt, &retCode)) { 1803 return retCode; 1804 } 1805 SAT_IF_ERROR_RETURN(bcm_sat_ctf_trap_data_to_session_map( 1806 unit, arg_data, arg_mask, arg_id)); 1807 } else if (parse_cmp("Remove", arg, 0)) { 1808 parse_table_init(unit, &pt); 1809 parse_table_add(&pt, "trapData", PQ_DFL|PQ_INT, NULL, 1810 &arg_data, NULL); 1811 parse_table_add(&pt, "trapdataMask", PQ_DFL|PQ_HEX, NULL, 1812 &arg_mask, NULL); 1813 if (!parseEndOk(a, &pt, &retCode)) { 1814 return retCode; 1815 } 1816 SAT_IF_ERROR_RETURN(bcm_sat_ctf_trap_data_to_session_unmap( 1817 unit, arg_data, arg_mask)); 1818 } else { 1819 return CMD_NFND; 1820 } 1821 1822 return CMD_OK; 1823 } 1824 1825 STATIC cmd_result_t 1826 sat_ctf_show(int unit, bcm_sat_ctf_t id, void *cookie) 1827 { 1828 int index; 1829 uint32 flags = *(uint32 *)cookie; 1830 bcm_sat_ctf_stat_t stat; 1831 1832 bcm_sat_ctf_stat_t_init(&stat); 1833 cli_out("CTF %d:\n", id); 1834 SAT_IF_ERROR_RETURN(bcm_sat_ctf_stat_get(unit, id, flags, &stat)); 1835 cli_out("\tReceived Packet : 0x%08x%08x", 1836 COMPILER_64_HI(stat.received_packet_cnt), 1837 COMPILER_64_LO(stat.received_packet_cnt)); 1838 cli_out("\t\t\tReceived Octet : 0x%08x%08x\n", 1839 COMPILER_64_HI(stat.received_octet_cnt), 1840 COMPILER_64_LO(stat.received_octet_cnt)); 1841 cli_out("\tOut-of-Order Packet: 0x%08x%08x", 1842 COMPILER_64_HI(stat.out_of_order_packet_cnt), 1843 COMPILER_64_LO(stat.out_of_order_packet_cnt)); 1844 cli_out("\t\t\tOut-of-Order Octet: 0x%08x%08x\n", 1845 COMPILER_64_HI(stat.out_of_order_octet_cnt), 1846 COMPILER_64_LO(stat.out_of_order_octet_cnt)); 1847 cli_out("\tError Packet : 0x%08x%08x", 1848 COMPILER_64_HI(stat.err_packet_cnt), 1849 COMPILER_64_LO(stat.err_packet_cnt)); 1850 cli_out("\t\t\tError Octet : 0x%08x%08x\n", 1851 COMPILER_64_HI(stat.err_octet_cnt), 1852 COMPILER_64_LO(stat.err_octet_cnt)); 1853 cli_out("\tLast Packet Delay : 0x%08x%08x\n", 1854 COMPILER_64_HI(stat.last_packet_delay), 1855 COMPILER_64_LO(stat.last_packet_delay)); 1856 cli_out("\tBin Delay Counter : "); 1857 for (index = 0; index < BCM_SAT_CTF_STAT_MAX_NUM_OF_BINS; index++) { 1858 cli_out("0x%08x%08x,", COMPILER_64_HI(stat.bin_delay_counters[index]), 1859 COMPILER_64_LO(stat.bin_delay_counters[index])); 1860 } 1861 cli_out("\n\tAcc Delay Count : 0x%08x%08x\n", 1862 COMPILER_64_HI(stat.accumulated_delay_count), 1863 COMPILER_64_LO(stat.accumulated_delay_count)); 1864 cli_out("\tMin Packet Delay : 0x%08x%08x\n", 1865 COMPILER_64_HI(stat.min_packet_delay), 1866 COMPILER_64_LO(stat.min_packet_delay)); 1867 cli_out("\tMax Packet Delay : 0x%08x%08x\n", 1868 COMPILER_64_HI(stat.max_packet_delay), 1869 COMPILER_64_LO(stat.max_packet_delay)); 1870 cli_out("\tTime-of-Day Stamp : 0x%08x%08x\n", 1871 COMPILER_64_HI(stat.time_of_day_stamp), 1872 COMPILER_64_LO(stat.time_of_day_stamp)); 1873 cli_out("\tSec-in-Avail Count : 0x%08x%08x\n", 1874 COMPILER_64_HI(stat.sec_in_avail_state_counter), 1875 COMPILER_64_LO(stat.sec_in_avail_state_counter)); 1876 1877 return CMD_OK; 1878 } 1879 1880 STATIC cmd_result_t 1881 cmd_sat_gtf_show(int unit, args_t *a) 1882 { 1883 char *arg = NULL; 1884 int rv = 0, foo; 1885 bcm_sat_gtf_t id; 1886 1887 arg = ARG_GET(a); 1888 if (arg) { 1889 id = _parse_integer(arg); 1890 SAT_GTF_ID_CHECK_RETURN(id); 1891 rv = sat_gtf_show(unit, id, NULL); 1892 } else { 1893 (void)bcm_sat_gtf_traverse(unit, sat_gtf_show, (void *)&foo); 1894 } 1895 1896 return (rv? CMD_FAIL:CMD_OK); 1897 } 1898 1899 STATIC cmd_result_t 1900 cmd_sat_gtf_create(int unit, args_t *a) 1901 { 1902 char *arg = NULL; 1903 uint32 flag = 0; 1904 bcm_sat_gtf_t id; 1905 1906 SAT_IF_ERROR_RETURN(sat_gtf_packet_default_init(unit)); 1907 arg = ARG_GET(a); 1908 if (arg) { 1909 id = _parse_integer(arg); 1910 SAT_GTF_ID_CHECK_RETURN(id); 1911 flag |= BCM_SAT_GTF_WITH_ID; 1912 } 1913 SAT_IF_ERROR_RETURN(bcm_sat_gtf_create(unit, flag, &id)); 1914 if (!(flag & BCM_SAT_GTF_WITH_ID)) { 1915 cli_out("GTF ID: %d\n", id); 1916 } 1917 1918 return CMD_OK; 1919 } 1920 1921 STATIC cmd_result_t 1922 cmd_sat_gtf_destroy(int unit, args_t *a) 1923 { 1924 char *arg = NULL; 1925 bcm_sat_gtf_t id; 1926 1927 arg = ARG_GET(a); 1928 if (arg) { 1929 id = _parse_integer(arg); 1930 SAT_GTF_ID_CHECK_RETURN(id); 1931 SAT_IF_ERROR_RETURN(bcm_sat_gtf_destroy(unit, id)); 1932 } else { 1933 cli_out("Destroy all GTF...\n"); 1934 SAT_IF_ERROR_RETURN(bcm_sat_gtf_destroy_all(unit)); 1935 } 1936 1937 return CMD_OK; 1938 } 1939 1940 STATIC cmd_result_t 1941 cmd_sat_gtf_start(int unit, args_t *a) 1942 { 1943 char *arg = NULL; 1944 int pri; 1945 bcm_sat_gtf_t id; 1946 1947 SAT_ARG_NUMB_GET(a, arg, id); 1948 SAT_ARG_INT_GET(a, arg, pri); 1949 if (pri < _SAT_CMD_GTF_PRI_COMMON) { 1950 return CMD_FAIL; 1951 } 1952 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_start(unit, id, pri)); 1953 1954 return CMD_OK; 1955 } 1956 1957 STATIC cmd_result_t 1958 cmd_sat_gtf_stop(int unit, args_t *a) 1959 { 1960 char *arg = NULL; 1961 int pri; 1962 bcm_sat_gtf_t id; 1963 1964 SAT_ARG_NUMB_GET(a, arg, id); 1965 SAT_ARG_INT_GET(a, arg, pri); 1966 if (pri < _SAT_CMD_GTF_PRI_COMMON) { 1967 return CMD_FAIL; 1968 } 1969 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_stop(unit, id, pri)); 1970 1971 return CMD_OK; 1972 } 1973 1974 STATIC cmd_result_t 1975 cmd_sat_gtf_stat(int unit, args_t *a) 1976 { 1977 char *arg = NULL; 1978 uint64 stat; 1979 int pri; 1980 bcm_sat_gtf_t id; 1981 1982 SAT_ARG_NUMB_GET(a, arg, id); 1983 SAT_ARG_NUMB_GET(a, arg, pri); 1984 SAT_IF_ERROR_RETURN(bcm_sat_gtf_stat_get(unit, id, pri, 0, 1985 bcmSatGtfStatPacketCount, &stat)); 1986 cli_out("\tTransmitted : 0x%08x%08x packets\n", 1987 COMPILER_64_HI(stat), COMPILER_64_LO(stat)); 1988 1989 return CMD_OK; 1990 } 1991 1992 STATIC cmd_result_t 1993 cmd_sat_gtf_bandwidth(int unit, args_t *a) 1994 { 1995 char *arg = NULL; 1996 uint32 arg_rate = 100, arg_burst = 1000; 1997 int pri; 1998 bcm_sat_gtf_t id; 1999 bcm_sat_gtf_bandwidth_t bw; 2000 parse_table_t pt; 2001 cmd_result_t retCode; 2002 2003 arg = ARG_GET(a); 2004 if (!arg) { 2005 return CMD_USAGE; 2006 } else if (parse_cmp("Set", arg, 0)) { 2007 SAT_ARG_NUMB_GET(a, arg, id); 2008 SAT_ARG_INT_GET(a, arg, pri); 2009 if (pri < _SAT_CMD_GTF_PRI_COMMON) { 2010 return CMD_FAIL; 2011 } 2012 parse_table_init(unit, &pt); 2013 parse_table_add(&pt, "Rate", PQ_DFL|PQ_INT, NULL, 2014 &arg_rate, NULL); 2015 parse_table_add(&pt, "maxBurst", PQ_DFL|PQ_INT, NULL, 2016 &arg_burst, NULL); 2017 if (!parseEndOk(a, &pt, &retCode)) { 2018 return retCode; 2019 } 2020 2021 bcm_sat_gtf_bandwidth_t_init(&bw); 2022 bw.rate= arg_rate; 2023 bw.max_burst = arg_burst; 2024 SAT_IF_ERROR_RETURN(bcm_sat_gtf_bandwidth_set(unit, id, pri, &bw)); 2025 } else if (parse_cmp("Get", arg, 0)) { 2026 SAT_ARG_NUMB_GET(a, arg, id); 2027 SAT_ARG_INT_GET(a, arg, pri); 2028 if (pri < _SAT_CMD_GTF_PRI_COMMON) { 2029 return CMD_FAIL; 2030 } 2031 bcm_sat_gtf_bandwidth_t_init(&bw); 2032 SAT_IF_ERROR_RETURN(bcm_sat_gtf_bandwidth_get(unit, id, pri, &bw)); 2033 cli_out("\tbandwidth: rate=%d kbps, burst=%d kbit\n", 2034 bw.rate, bw.max_burst); 2035 } else { 2036 return CMD_NFND; 2037 } 2038 2039 return CMD_OK; 2040 } 2041 2042 STATIC cmd_result_t 2043 cmd_sat_gtf_ratepattern(int unit, args_t *a) 2044 { 2045 char *arg = NULL; 2046 uint32 arg_mode = bcmSatGtfRatePatternContinues; 2047 uint32 arg_high = 10, arg_low = 10; 2048 uint32 arg_cnt_iter = 100, arg_cnt_burst = 100, arg_cnt_interval = 1000; 2049 uint32 arg_wt_burst = 1, arg_wt_interval = 1, arg_stop_eq = 0; 2050 int pri; 2051 bcm_sat_gtf_t id; 2052 bcm_sat_gtf_rate_pattern_t pattern; 2053 parse_table_t pt; 2054 cmd_result_t retCode; 2055 2056 arg = ARG_GET(a); 2057 if (!arg) { 2058 return CMD_USAGE; 2059 } else if (parse_cmp("Set", arg, 0)) { 2060 SAT_ARG_NUMB_GET(a, arg, id); 2061 SAT_ARG_NUMB_GET(a, arg, pri); 2062 parse_table_init(unit, &pt); 2063 parse_table_add(&pt, "Mode", PQ_DFL|PQ_INT, NULL, 2064 &arg_mode, NULL); 2065 parse_table_add(&pt, "HighThresh", PQ_DFL|PQ_INT, NULL, 2066 &arg_high, NULL); 2067 parse_table_add(&pt, "LowThresh", PQ_DFL|PQ_INT, NULL, 2068 &arg_low, NULL); 2069 parse_table_add(&pt, "stopITerCnt", PQ_DFL|PQ_INT, NULL, 2070 &arg_cnt_iter, NULL); 2071 parse_table_add(&pt, "stopBurstCnt", PQ_DFL|PQ_INT, NULL, 2072 &arg_cnt_burst, NULL); 2073 parse_table_add(&pt, "stopIntervalCnt", PQ_DFL|PQ_INT, NULL, 2074 &arg_cnt_interval, NULL); 2075 parse_table_add(&pt, "BurstpktWeight", PQ_DFL|PQ_INT, NULL, 2076 &arg_wt_burst, NULL); 2077 parse_table_add(&pt, "IntervalpktWeight", PQ_DFL|PQ_INT, NULL, 2078 &arg_wt_interval, NULL); 2079 parse_table_add(&pt, "StopintervalEqburst", PQ_DFL|PQ_BOOL, NULL, 2080 &arg_stop_eq, NULL); 2081 if (!parseEndOk(a, &pt, &retCode)) { 2082 return retCode; 2083 } 2084 2085 bcm_sat_gtf_rate_pattern_t_init(&pattern); 2086 pattern.rate_pattern_mode = arg_mode; 2087 pattern.high_threshold = arg_high; 2088 pattern.low_threshold = arg_low; 2089 pattern.stop_iter_count = arg_cnt_iter; 2090 pattern.stop_burst_count = arg_cnt_burst; 2091 pattern.stop_interval_count = arg_cnt_interval; 2092 pattern.burst_packet_weight = arg_wt_burst; 2093 pattern.interval_packet_weight = arg_wt_interval; 2094 if (arg_stop_eq) { 2095 pattern.flags |= BCM_SAT_GTF_RATE_PATTERN_STOP_INTERVAL_EQ_BURST; 2096 } 2097 SAT_IF_ERROR_RETURN(bcm_sat_gtf_rate_pattern_set(unit, id, pri, 2098 &pattern)); 2099 } else if (parse_cmp("Get", arg, 0)) { 2100 SAT_ARG_NUMB_GET(a, arg, id); 2101 SAT_ARG_NUMB_GET(a, arg, pri); 2102 2103 bcm_sat_gtf_rate_pattern_t_init(&pattern); 2104 SAT_IF_ERROR_RETURN(bcm_sat_gtf_rate_pattern_get(unit, id, pri, 2105 &pattern)); 2106 cli_out("\tpattern : mode=%d, flag=0x%08x\n", 2107 pattern.rate_pattern_mode, pattern.flags); 2108 cli_out("\t thresh_low=%d, thresh_high=%d \n", 2109 pattern.low_threshold, pattern.high_threshold); 2110 cli_out("\t cnt_iter=%d, cnt_burst=%d, cnt_interval=%d\n", 2111 pattern.stop_interval_count, pattern.stop_burst_count, 2112 pattern.stop_iter_count); 2113 cli_out("\t weight_burst=%d, weight_interval=%d\n", 2114 pattern.burst_packet_weight, pattern.interval_packet_weight); 2115 } else { 2116 return CMD_NFND; 2117 } 2118 2119 return CMD_OK; 2120 } 2121 2122 STATIC cmd_result_t 2123 cmd_sat_gtf_packet(int unit, args_t *a) 2124 { 2125 char *arg = NULL; 2126 int index, cnt, pos; 2127 int arg_pattern_len = BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE * 6; 2128 int32 pattern[BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE]; 2129 uint32 arg_ht, arg_pt; 2130 char *arg_pattern; 2131 uint32 arg_cir_num, arg_cir_tlv, arg_cir_crc; 2132 uint32 arg_eir_num, arg_eir_tlv, arg_eir_crc; 2133 uint32 arg_context, arg_offset; 2134 bcm_sat_gtf_t id; 2135 parse_table_t pt; 2136 bcm_sat_gtf_packet_config_t *config; 2137 2138 SAT_IF_ERROR_RETURN(sat_gtf_packet_default_init(unit)); 2139 arg = ARG_GET(a); 2140 if (!arg) { 2141 return CMD_USAGE; 2142 } else if (parse_cmp("Format", arg, 0)) { 2143 SAT_ARG_NUMB_GET(a, arg, id); 2144 SAT_GTF_ID_CHECK_RETURN(id); 2145 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, 2146 &_gtf_pkt_cfg_default.cfg)); 2147 SAT_IF_ERROR_RETURN(sat_gtf_packet_default_load(unit, id)); 2148 } else if (parse_cmp("Set", arg, 0)) { 2149 SAT_ARG_NUMB_GET(a, arg, id); 2150 SAT_GTF_ID_CHECK_RETURN(id); 2151 2152 config = sal_alloc(sizeof(bcm_sat_gtf_packet_config_t), 2153 "bcm_sat_gtf_packet_config"); 2154 if (!config) { 2155 return CMD_FAIL; 2156 } 2157 sal_memcpy(config, &_gtf_pkt_cfg[id].cfg, 2158 sizeof(bcm_sat_gtf_packet_config_t)); 2159 arg_ht = config->sat_header_type; 2160 arg_pt = config->payload.payload_type; 2161 if (!(arg_pattern = sal_alloc(arg_pattern_len, "sat_arg"))) { 2162 sal_free(config); 2163 return CMD_FAIL; 2164 } 2165 sal_memset(arg_pattern, 0, arg_pattern_len); 2166 pos = 0; 2167 for (index = 0; index < BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE; index++) { 2168 cnt = sal_sprintf(arg_pattern + pos, "0x%02x,", 2169 config->payload.payload_pattern[index]); 2170 pos += cnt; 2171 } 2172 arg_cir_num = config->packet_edit[bcmSatGtfPriCir].number_of_ctfs; 2173 arg_cir_tlv = (config->packet_edit[bcmSatGtfPriCir].flags & 2174 BCM_SAT_GTF_PACKET_EDIT_ADD_END_TLV); 2175 arg_cir_crc = (config->packet_edit[bcmSatGtfPriCir].flags & 2176 BCM_SAT_GTF_PACKET_EDIT_ADD_CRC); 2177 arg_eir_num = config->packet_edit[bcmSatGtfPriEir].number_of_ctfs; 2178 arg_eir_tlv = (config->packet_edit[bcmSatGtfPriEir].flags & 2179 BCM_SAT_GTF_PACKET_EDIT_ADD_END_TLV); 2180 arg_eir_crc = (config->packet_edit[bcmSatGtfPriEir].flags & 2181 BCM_SAT_GTF_PACKET_EDIT_ADD_CRC); 2182 arg_context = config->packet_context_id; 2183 arg_offset = config->offsets.seq_number_offset; 2184 parse_table_init(unit, &pt); 2185 parse_table_add(&pt, "HeaderType", PQ_DFL|PQ_INT, NULL, 2186 &arg_ht, NULL); 2187 parse_table_add(&pt, "PayloadType", PQ_DFL|PQ_INT, NULL, 2188 &arg_pt, NULL); 2189 parse_table_add(&pt, "PayloadPattern", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 2190 &arg_pattern, NULL); 2191 parse_table_add(&pt, "CirNumofctfs", PQ_DFL|PQ_INT, NULL, 2192 &arg_cir_num, NULL); 2193 parse_table_add(&pt, "CiraddendTlv", PQ_DFL|PQ_BOOL, NULL, 2194 &arg_cir_tlv, NULL); 2195 parse_table_add(&pt, "CiraddCrc", PQ_DFL|PQ_BOOL, NULL, 2196 &arg_cir_crc, NULL); 2197 parse_table_add(&pt, "EirNumofctfs", PQ_DFL|PQ_INT, NULL, 2198 &arg_eir_num, NULL); 2199 parse_table_add(&pt, "EiraddendTlv", PQ_DFL|PQ_BOOL, NULL, 2200 &arg_eir_tlv, NULL); 2201 parse_table_add(&pt, "EiraddCrc", PQ_DFL|PQ_BOOL, NULL, 2202 &arg_eir_crc, NULL); 2203 #if defined(BCM_PETRA_SUPPORT) 2204 parse_table_add(&pt, "pktContext", PQ_DFL|PQ_INT, NULL, 2205 &arg_context, NULL); 2206 #endif 2207 parse_table_add(&pt, "Offsetofseqnum", PQ_DFL|PQ_INT, NULL, 2208 &arg_offset, NULL); 2209 if (!ARG_CNT(a)) { /* Display settings */ 2210 cli_out("Current settings:\n"); 2211 parse_eq_format(&pt); 2212 parse_arg_eq_done(&pt); 2213 sal_free(config); 2214 return CMD_OK; 2215 } 2216 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 2217 cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(a), ARG_CUR(a)); 2218 parse_arg_eq_done(&pt); 2219 sal_free(config); 2220 return CMD_FAIL; 2221 } 2222 sal_memset(pattern, 0, sizeof(pattern)); 2223 (void)_list_to_data_array(arg_pattern, BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE, 2224 pattern); 2225 parse_arg_eq_done(&pt);/* Do not do this before arg_pattern is parsed. */ 2226 2227 config->sat_header_type = arg_ht; 2228 config->payload.payload_type = arg_pt; 2229 for (index = 0; index < BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE; index++) { 2230 config->payload.payload_pattern[index] = (uint8)pattern[index]; 2231 } 2232 config->packet_edit[bcmSatGtfPriCir].number_of_ctfs = arg_cir_num; 2233 if (arg_cir_tlv) { 2234 config->packet_edit[bcmSatGtfPriCir].flags |= 2235 BCM_SAT_GTF_PACKET_EDIT_ADD_END_TLV; 2236 } else { 2237 config->packet_edit[bcmSatGtfPriCir].flags &= 2238 ~BCM_SAT_GTF_PACKET_EDIT_ADD_END_TLV; 2239 } 2240 if (arg_cir_crc) { 2241 config->packet_edit[bcmSatGtfPriCir].flags |= 2242 BCM_SAT_GTF_PACKET_EDIT_ADD_CRC; 2243 } else { 2244 config->packet_edit[bcmSatGtfPriCir].flags &= 2245 ~BCM_SAT_GTF_PACKET_EDIT_ADD_CRC; 2246 } 2247 config->packet_edit[bcmSatGtfPriEir].number_of_ctfs = arg_eir_num; 2248 if (arg_eir_tlv) { 2249 config->packet_edit[bcmSatGtfPriEir].flags |= 2250 BCM_SAT_GTF_PACKET_EDIT_ADD_END_TLV; 2251 } else { 2252 config->packet_edit[bcmSatGtfPriEir].flags &= 2253 ~BCM_SAT_GTF_PACKET_EDIT_ADD_END_TLV; 2254 } 2255 if (arg_eir_crc) { 2256 config->packet_edit[bcmSatGtfPriEir].flags |= 2257 BCM_SAT_GTF_PACKET_EDIT_ADD_CRC; 2258 } else { 2259 config->packet_edit[bcmSatGtfPriEir].flags &= 2260 ~BCM_SAT_GTF_PACKET_EDIT_ADD_CRC; 2261 } 2262 config->packet_context_id = arg_context; 2263 config->offsets.seq_number_offset = arg_offset; 2264 SAT_IF_ERROR_RETURN(bcm_sat_gtf_packet_config(unit, id, config)); 2265 sal_memcpy(&_gtf_pkt_cfg[id].cfg, config, 2266 sizeof(bcm_sat_gtf_packet_config_t)); 2267 sal_free(config); 2268 } 2269 #if defined(BCM_ESW_SUPPORT) 2270 else if (parse_cmp("OlpHeader", arg, 0)) { 2271 return sat_gtf_olpheader(unit, a); 2272 } 2273 #endif 2274 #if defined(BCM_PETRA_SUPPORT) 2275 else if (parse_cmp("DnxHeader", arg, 0)) { 2276 return sat_gtf_dnxheader(unit, a); 2277 } 2278 #endif 2279 else if (parse_cmp("Packetdata", arg, 0)) { 2280 return sat_gtf_packet_data(unit, a); 2281 } else if (parse_cmp("Length", arg, 0)) { 2282 return sat_gtf_packet_length(unit, a); 2283 } else if (parse_cmp("STamp", arg, 0)) { 2284 return sat_gtf_packet_stamp(unit, a); 2285 } else { 2286 return CMD_NFND; 2287 } 2288 2289 return CMD_OK; 2290 } 2291 2292 STATIC cmd_result_t 2293 cmd_sat_ctf_create(int unit, args_t *a) 2294 { 2295 char *arg = NULL; 2296 uint32 flag = 0; 2297 bcm_sat_ctf_t id; 2298 2299 arg = ARG_GET(a); 2300 if (arg) { 2301 id = _parse_integer(arg); 2302 SAT_CTF_ID_CHECK_RETURN(id); 2303 flag |= BCM_SAT_CTF_WITH_ID; 2304 } 2305 SAT_IF_ERROR_RETURN(bcm_sat_ctf_create(unit, flag, &id)); 2306 if (!(flag & BCM_SAT_CTF_WITH_ID)) { 2307 cli_out("CTF ID: %d\n", id); 2308 } 2309 SAT_IF_ERROR_RETURN(sat_ctf_packet_default_load(unit, id)); 2310 2311 return CMD_OK; 2312 } 2313 2314 STATIC cmd_result_t 2315 cmd_sat_ctf_destroy(int unit, args_t *a) 2316 { 2317 char *arg = NULL; 2318 bcm_sat_ctf_t id; 2319 2320 arg = ARG_GET(a); 2321 if (arg) { 2322 id = _parse_integer(arg); 2323 SAT_CTF_ID_CHECK_RETURN(id); 2324 SAT_IF_ERROR_RETURN(bcm_sat_ctf_destroy(unit, id)); 2325 } else { 2326 cli_out("Destroy all CTF...\n"); 2327 SAT_IF_ERROR_RETURN(bcm_sat_ctf_destroy_all(unit)); 2328 } 2329 2330 return CMD_OK; 2331 } 2332 2333 STATIC cmd_result_t 2334 cmd_sat_ctf_packet(int unit, args_t *a) 2335 { 2336 char *arg = NULL; 2337 int index, cnt, pos = 0; 2338 int arg_pattern_len = BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE*6; 2339 int32 pattern[BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE]; 2340 char *arg_pattern; 2341 uint32 arg_ht, arg_pt, arg_p_off, arg_seq_off, arg_ts_off; 2342 uint32 arg_tlv, arg_crc; 2343 parse_table_t pt; 2344 bcm_sat_ctf_t id; 2345 bcm_sat_ctf_packet_info_t config; 2346 2347 SAT_ARG_NUMB_GET(a, arg, id); 2348 SAT_CTF_ID_CHECK_RETURN(id); 2349 sal_memcpy(&config, &_ctf_pkt_cfg[id], sizeof(config)); 2350 arg_ht = config.sat_header_type; 2351 arg_pt = config.payload.payload_type; 2352 if (!(arg_pattern = sal_alloc(arg_pattern_len, "sat_pattern"))) { 2353 return CMD_FAIL; 2354 } 2355 sal_memset(arg_pattern, 0, arg_pattern_len); 2356 for (index = 0; index < BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE; index++) { 2357 cnt = sal_sprintf(arg_pattern + pos, "0x%02x,", 2358 config.payload.payload_pattern[index]); 2359 pos += cnt; 2360 } 2361 arg_p_off = config.offsets.payload_offset; 2362 arg_seq_off = config.offsets.seq_number_offset; 2363 arg_ts_off = config.offsets.timestamp_offset; 2364 arg_tlv = (config.flags & BCM_SAT_CTF_PACKET_INFO_ADD_END_TLV); 2365 arg_crc = (config.flags & BCM_SAT_CTF_PACKET_INFO_ADD_CRC); 2366 parse_table_init(unit, &pt); 2367 parse_table_add(&pt, "HeaderType", PQ_DFL|PQ_INT, NULL, 2368 &arg_ht, NULL); 2369 parse_table_add(&pt, "PayloadType", PQ_DFL|PQ_INT, NULL, 2370 &arg_pt, NULL); 2371 parse_table_add(&pt, "PayloadPattern", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 2372 &arg_pattern, NULL); 2373 parse_table_add(&pt, "PayloadOffset", PQ_DFL|PQ_INT, NULL, 2374 &arg_p_off, NULL); 2375 parse_table_add(&pt, "SeqnumberOffset", PQ_DFL|PQ_INT, NULL, 2376 &arg_seq_off, NULL); 2377 parse_table_add(&pt, "TimestampOffset", PQ_DFL|PQ_INT, NULL, 2378 &arg_ts_off, NULL); 2379 parse_table_add(&pt, "addendTlv", PQ_DFL|PQ_BOOL, NULL, 2380 &arg_tlv, NULL); 2381 parse_table_add(&pt, "addCrc", PQ_DFL|PQ_BOOL, NULL, 2382 &arg_crc, NULL); 2383 if (!ARG_CNT(a)) { /* Display settings */ 2384 cli_out("Current settings:\n"); 2385 parse_eq_format(&pt); 2386 parse_arg_eq_done(&pt); 2387 return CMD_OK; 2388 } 2389 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 2390 cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(a), ARG_CUR(a)); 2391 parse_arg_eq_done(&pt); 2392 return CMD_FAIL; 2393 } 2394 sal_memset(pattern, 0, sizeof(pattern)); 2395 (void)_list_to_data_array(arg_pattern, BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE, 2396 pattern); 2397 parse_arg_eq_done(&pt);/* Do not do this before arg_pattern is parsed. */ 2398 2399 config.sat_header_type = arg_ht; 2400 config.payload.payload_type = arg_pt; 2401 for (index = 0; index < BCM_SAT_PAYLOAD_MAX_PATTERN_SIZE; index++) { 2402 config.payload.payload_pattern[index] = (uint8)pattern[index]; 2403 } 2404 config.offsets.payload_offset = arg_p_off; 2405 config.offsets.seq_number_offset = arg_seq_off; 2406 config.offsets.timestamp_offset = arg_ts_off; 2407 if (arg_tlv) { 2408 config.flags |= BCM_SAT_CTF_PACKET_INFO_ADD_END_TLV; 2409 } else { 2410 config.flags &= ~BCM_SAT_CTF_PACKET_INFO_ADD_END_TLV; 2411 } 2412 if (arg_crc) { 2413 config.flags |= BCM_SAT_CTF_PACKET_INFO_ADD_CRC; 2414 } else { 2415 config.flags &= ~BCM_SAT_CTF_PACKET_INFO_ADD_CRC; 2416 } 2417 SAT_IF_ERROR_RETURN(bcm_sat_ctf_packet_config(unit, id, &config)); 2418 sal_memcpy(&_ctf_pkt_cfg[id], &config, sizeof(config)); 2419 2420 return CMD_OK; 2421 } 2422 2423 STATIC cmd_result_t 2424 cmd_sat_ctf_identifer(int unit, args_t *a) 2425 { 2426 char *arg = NULL; 2427 uint32 arg_tc = 0, arg_dp = 0, arg_trap_id = 0, arg_session_id = 0; 2428 parse_table_t pt; 2429 bcm_sat_ctf_t id; 2430 bcm_sat_ctf_identifier_t config; 2431 cmd_result_t retCode; 2432 2433 arg = ARG_GET(a); 2434 if (!arg) { 2435 return CMD_USAGE; 2436 } else if (parse_cmp("Add", arg, 0)) { 2437 SAT_ARG_NUMB_GET(a, arg, id); 2438 SAT_CTF_ID_CHECK_RETURN(id); 2439 parse_table_init(unit, &pt); 2440 parse_table_add(&pt, "TC", PQ_DFL|PQ_INT, NULL, 2441 &arg_tc, NULL); 2442 parse_table_add(&pt, "Color", PQ_DFL|PQ_INT, NULL, 2443 &arg_dp, NULL); 2444 parse_table_add(&pt, "TrapId", PQ_DFL|PQ_INT, NULL, 2445 &arg_trap_id, NULL); 2446 parse_table_add(&pt, "SessionId", PQ_DFL|PQ_INT, NULL, 2447 &arg_session_id, NULL); 2448 if (!parseEndOk(a, &pt, &retCode)) { 2449 return retCode; 2450 } 2451 bcm_sat_ctf_identifier_t_init(&config); 2452 config.tc = arg_tc; 2453 config.color = arg_dp; 2454 config.trap_id = arg_trap_id; 2455 config.session_id = arg_session_id; 2456 SAT_IF_ERROR_RETURN(bcm_sat_ctf_identifier_map(unit, &config, id)); 2457 } else if (parse_cmp("Remove", arg, 0)) { 2458 parse_table_init(unit, &pt); 2459 parse_table_add(&pt, "TC", PQ_DFL|PQ_INT, NULL, 2460 &arg_tc, NULL); 2461 parse_table_add(&pt, "Color", PQ_DFL|PQ_INT, NULL, 2462 &arg_dp, NULL); 2463 parse_table_add(&pt, "TrapId", PQ_DFL|PQ_INT, NULL, 2464 &arg_trap_id, NULL); 2465 parse_table_add(&pt, "SessionId", PQ_DFL|PQ_INT, NULL, 2466 &arg_session_id, NULL); 2467 if (!parseEndOk(a, &pt, &retCode)) { 2468 return retCode; 2469 } 2470 bcm_sat_ctf_identifier_t_init(&config); 2471 config.tc = arg_tc; 2472 config.color = arg_dp; 2473 config.trap_id = arg_trap_id; 2474 config.session_id = arg_session_id; 2475 SAT_IF_ERROR_RETURN(bcm_sat_ctf_identifier_unmap(unit, &config)); 2476 } else { 2477 return CMD_NFND; 2478 } 2479 2480 return CMD_OK; 2481 } 2482 2483 STATIC cmd_result_t 2484 cmd_sat_ctf_trap(int unit, args_t *a) 2485 { 2486 char *arg = NULL; 2487 #if defined(BCM_PETRA_SUPPORT) 2488 uint32 id; 2489 #endif 2490 2491 arg = ARG_GET(a); 2492 if (!arg) { 2493 return CMD_USAGE; 2494 } 2495 #if defined(BCM_PETRA_SUPPORT) 2496 else if (parse_cmp("Add", arg, 0)) { 2497 /* coverity[unsigned_compare] */ 2498 SAT_ARG_NUMB_GET(a, arg, id); 2499 SAT_IF_ERROR_RETURN(bcm_sat_ctf_trap_add(unit, id)); 2500 } else if (parse_cmp("Remove", arg, 0)) { 2501 arg = ARG_GET(a); 2502 if (arg) { 2503 id = _parse_integer(arg); 2504 /* coverity[unsigned_compare] */ 2505 SAT_CTF_ID_CHECK_RETURN(id); 2506 SAT_IF_ERROR_RETURN(bcm_sat_ctf_trap_remove(unit, id)); 2507 } else { 2508 cli_out("Remove all trap...\n"); 2509 SAT_IF_ERROR_RETURN(bcm_sat_ctf_trap_remove_all(unit)); 2510 } 2511 } 2512 #endif 2513 else if (parse_cmp("Data2Session", arg, 0)) { 2514 return sat_ctf_trap_data2session(unit, a); 2515 } else { 2516 return CMD_NFND; 2517 } 2518 2519 return CMD_OK; 2520 } 2521 2522 STATIC cmd_result_t 2523 cmd_sat_ctf_binlimit(int unit, args_t *a) 2524 { 2525 char *arg = NULL; 2526 int max_cnt = 9; 2527 int cnt, index, pos = 0, arg_bin_len = max_cnt*6; 2528 char *arg_bins = NULL; 2529 int32 bins[9]; 2530 parse_table_t pt; 2531 bcm_sat_ctf_bin_limit_t config[9]; 2532 2533 arg = ARG_GET(a); 2534 if (!arg) { 2535 return CMD_USAGE; 2536 } else if (parse_cmp("SHOW", arg, 0)) { 2537 for (index = 0; index < max_cnt; index++) { 2538 bcm_sat_ctf_bin_limit_t_init(&config[index]); 2539 } 2540 SAT_IF_ERROR_RETURN(bcm_sat_ctf_bin_limit_get(unit, max_cnt, 2541 config, &cnt)); 2542 cli_out("Hardware bins:\n\t"); 2543 for (index = 0; index < cnt; index++) { 2544 cli_out("%d, ", config[index].bin_limit); 2545 } 2546 cli_out("\n"); 2547 } else if (parse_cmp("Set", arg, 0)) { 2548 if (!(arg_bins = sal_alloc(arg_bin_len, "sat_bin"))) { 2549 return CMD_FAIL; 2550 } 2551 sal_memset(arg_bins, 0, arg_bin_len); 2552 for (index = 0; index < max_cnt; index++) { 2553 cnt = sal_sprintf(arg_bins + pos, "%d,", (index + 1) * 100); 2554 pos += cnt; 2555 } 2556 parse_table_init(unit, &pt); 2557 parse_table_add(&pt, "Bins", PQ_DFL|PQ_MALLOC|PQ_STRING, NULL, 2558 &arg_bins, NULL); 2559 if (!ARG_CNT(a)) { /* Display settings */ 2560 cli_out("Current settings:\n"); 2561 parse_eq_format(&pt); 2562 parse_arg_eq_done(&pt); 2563 return CMD_OK; 2564 } 2565 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 2566 cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(a), ARG_CUR(a)); 2567 parse_arg_eq_done(&pt); 2568 return CMD_FAIL; 2569 } 2570 sal_memset(bins, 0, sizeof(bins)); 2571 cnt = _list_to_data_array(arg_bins, max_cnt, bins); 2572 parse_arg_eq_done(&pt);/* Do not do this before arg_bins is parsed. */ 2573 for (index = 0; index < max_cnt; index++) { 2574 bcm_sat_ctf_bin_limit_t_init(&config[index]); 2575 } 2576 for (index = 0; index < cnt; index++) { 2577 config[index].bin_select = index; 2578 config[index].bin_limit = bins[index]; 2579 } 2580 SAT_IF_ERROR_RETURN(bcm_sat_ctf_bin_limit_set(unit, cnt, config)); 2581 } else { 2582 return CMD_NFND; 2583 } 2584 2585 return CMD_OK; 2586 } 2587 2588 STATIC cmd_result_t 2589 cmd_sat_ctf_avail(int unit, args_t *a) 2590 { 2591 char *arg = NULL; 2592 uint32 arg_cnt = 10, arg_thresh = 100; 2593 parse_table_t pt; 2594 bcm_sat_ctf_t id; 2595 cmd_result_t retCode; 2596 bcm_sat_ctf_availability_config_t config; 2597 2598 SAT_ARG_NUMB_GET(a, arg, id); 2599 SAT_CTF_ID_CHECK_RETURN(id); 2600 parse_table_init(unit, &pt); 2601 parse_table_add(&pt, "Noofslot", PQ_DFL|PQ_INT, NULL, 2602 &arg_cnt, NULL); 2603 parse_table_add(&pt, "Thresholdperslot", PQ_DFL|PQ_INT, NULL, 2604 &arg_thresh, NULL); 2605 if (!parseEndOk(a, &pt, &retCode)) { 2606 return retCode; 2607 } 2608 bcm_sat_ctf_availability_config_t_init(&config); 2609 config.switch_state_num_of_slots = arg_cnt; 2610 config.switch_state_threshold_per_slot = arg_thresh; 2611 SAT_IF_ERROR_RETURN(bcm_sat_ctf_availability_config_set(unit, id, &config)); 2612 2613 return CMD_OK; 2614 } 2615 2616 STATIC cmd_result_t 2617 cmd_sat_ctf_report(int unit, args_t *a) 2618 { 2619 char *arg = NULL; 2620 uint32 arg_ratio = 1, arg_seq = 0, arg_delay = 0; 2621 parse_table_t pt; 2622 bcm_sat_ctf_t id; 2623 cmd_result_t retCode; 2624 bcm_sat_ctf_report_config_t config; 2625 2626 SAT_ARG_NUMB_GET(a, arg, id); 2627 SAT_CTF_ID_CHECK_RETURN(id); 2628 parse_table_init(unit, &pt); 2629 parse_table_add(&pt, "samplePercent", PQ_DFL|PQ_INT, NULL, 2630 &arg_ratio, NULL); 2631 parse_table_add(&pt, "addSeqnum", PQ_DFL|PQ_BOOL, NULL, 2632 &arg_seq, NULL); 2633 parse_table_add(&pt, "addDelay", PQ_DFL|PQ_BOOL, NULL, 2634 &arg_delay, NULL); 2635 if (!parseEndOk(a, &pt, &retCode)) { 2636 return retCode; 2637 } 2638 bcm_sat_ctf_report_config_t_init(&config); 2639 config.report_sampling_percent = arg_ratio; 2640 if (arg_seq) { 2641 config.flags |= BCM_SAT_CTF_REPORT_ADD_SEQ_NUM; 2642 } else { 2643 config.flags &= ~BCM_SAT_CTF_REPORT_ADD_SEQ_NUM; 2644 } 2645 if (arg_delay) { 2646 config.flags |= BCM_SAT_CTF_REPORT_ADD_DELAY; 2647 } else { 2648 config.flags &= ~BCM_SAT_CTF_REPORT_ADD_DELAY; 2649 } 2650 SAT_IF_ERROR_RETURN(bcm_sat_ctf_reports_config_set(unit, id, &config)); 2651 2652 return CMD_OK; 2653 } 2654 2655 STATIC cmd_result_t 2656 cmd_sat_ctf_stat(int unit, args_t *a) 2657 { 2658 char *arg = NULL; 2659 uint32 arg_global = 0, arg_delay = 50, arg_step = 10, arg_update = 0; 2660 uint32 arg_clear = 0, flags = 0, traverse = 0; 2661 parse_table_t pt; 2662 bcm_sat_ctf_t id = 0; 2663 cmd_result_t retCode; 2664 bcm_sat_ctf_stat_config_t config; 2665 bcm_sat_ctf_stat_t stat; 2666 2667 arg = ARG_GET(a); 2668 if (!arg) { 2669 return CMD_USAGE; 2670 } else if (parse_cmp("Set", arg, 0)) { 2671 SAT_ARG_NUMB_GET(a, arg, id); 2672 SAT_CTF_ID_CHECK_RETURN(id); 2673 parse_table_init(unit, &pt); 2674 parse_table_add(&pt, "useGlobalbin", PQ_DFL|PQ_BOOL, NULL, 2675 &arg_global, NULL); 2676 parse_table_add(&pt, "binMinDelay", PQ_DFL|PQ_INT, NULL, 2677 &arg_delay, NULL); 2678 parse_table_add(&pt, "binStep", PQ_DFL|PQ_INT, NULL, 2679 &arg_step, NULL); 2680 parse_table_add(&pt, "updateCntInUnavail", PQ_DFL|PQ_BOOL, NULL, 2681 &arg_update, NULL); 2682 if (!parseEndOk(a, &pt, &retCode)) { 2683 return retCode; 2684 } 2685 bcm_sat_ctf_stat_config_t_init(&config); 2686 config.use_global_bin_config = arg_global; 2687 config.bin_min_delay = arg_delay; 2688 config.bin_step = arg_step; 2689 config.update_counters_in_unvavail_state = arg_update; 2690 SAT_IF_ERROR_RETURN(bcm_sat_ctf_stat_config_set(unit, id, &config)); 2691 } else if (parse_cmp("SHOW", arg, 0)) { 2692 arg = ARG_GET(a); 2693 if (arg == NULL) { /* w/o ID, w/o CLR */ 2694 traverse = 1; 2695 } else { 2696 if (sal_strchr(arg, '=')) { /* w/o ID, with CLR */ 2697 traverse = 1; 2698 ARG_PREV(a); 2699 } else { /* with ID */ 2700 id = _parse_integer(arg); 2701 SAT_CTF_ID_CHECK_RETURN(id); 2702 traverse = 0; 2703 } 2704 parse_table_init(unit, &pt); 2705 parse_table_add(&pt, "Clronread", PQ_DFL|PQ_BOOL, NULL, 2706 &arg_clear, NULL); 2707 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 2708 cli_out("%s: Error: Unknown option: %s\n", 2709 ARG_CMD(a), ARG_CUR(a)); 2710 parse_arg_eq_done(&pt); 2711 return CMD_FAIL; 2712 } 2713 parse_arg_eq_done(&pt); 2714 } 2715 bcm_sat_ctf_stat_t_init(&stat); 2716 if (!arg_clear) { 2717 flags |= BCM_SAT_CTF_STAT_DO_NOT_CLR_ON_READ; 2718 } else { 2719 flags &= ~BCM_SAT_CTF_STAT_DO_NOT_CLR_ON_READ; 2720 } 2721 if (traverse) { 2722 return bcm_sat_ctf_traverse(unit, sat_ctf_show, (void *)&flags); 2723 } else { 2724 return sat_ctf_show(unit, id, (void *)&flags); 2725 } 2726 } else { 2727 return CMD_NFND; 2728 } 2729 2730 return CMD_OK; 2731 } 2732 2733 #if defined(BCM_ESW_SUPPORT) 2734 #define SAT_ENDPOINT_ID_CHECK_RETURN(id) \ 2735 do { \ 2736 if (id < 0) { \ 2737 cli_out("Invalid ENDPOINT ID\n"); \ 2738 return CMD_FAIL; \ 2739 } \ 2740 } while (0) 2741 2742 STATIC void 2743 sat_endpoint_info_t_init(bcm_sat_endpoint_info_t *info) 2744 { 2745 bcm_mac_t dmac_def = {0, 0, 0, 0, 0, 0x1}; 2746 bcm_mac_t smac_def = {0, 0, 0, 0, 0, 0x2}; 2747 uint32 src_port_def = 1, dst_port_def = 5; 2748 bcm_gport_t src_gport_def, dst_gport_def; 2749 2750 if (!info) { 2751 return; 2752 } 2753 BCM_GPORT_LOCAL_SET(src_gport_def, src_port_def); 2754 BCM_GPORT_LOCAL_SET(dst_gport_def, dst_port_def); 2755 sal_memset(info, 0, sizeof(bcm_sat_endpoint_info_t)); 2756 info->flags |= BCM_SAT_ENDPOINT_DOWNMEP; 2757 sal_memcpy(info->dst_mac_address, dmac_def, sizeof(dmac_def)); 2758 sal_memcpy(info->src_mac_address, smac_def, sizeof(smac_def)); 2759 info->outer_vlan = 1; 2760 info->inner_vlan = 1; 2761 info->src_gport = src_gport_def; 2762 info->ether_type = 0x8902; 2763 info->action_flags |= BCM_SAT_ACTION_FWD_ACTION_LLF; 2764 info->dest_gport = dst_gport_def; 2765 info->timestamp_format = bcmSATTimestampFormatIEEE1588v1; 2766 info->session_id = 1; 2767 } 2768 2769 STATIC cmd_result_t 2770 sat_endpoint_show(int unit, bcm_sat_endpoint_info_t *info, void *cookie) 2771 { 2772 if (!info) { 2773 return CMD_FAIL; 2774 } 2775 2776 cli_out("ENDPOINT %d:\n", info->ep_id); 2777 cli_out("\tSource Port : %d", BCM_GPORT_LOCAL_GET(info->src_gport)); 2778 cli_out("\t\t\tDest Port : %d\n", BCM_GPORT_LOCAL_GET(info->dest_gport)); 2779 cli_out("\tSource MAC : %02x:%02x:%02x:%02x:%02x:%02x", 2780 info->src_mac_address[0], info->src_mac_address[1], 2781 info->src_mac_address[2], info->src_mac_address[3], 2782 info->src_mac_address[4], info->src_mac_address[5]); 2783 cli_out("\tDest MAC : %02x:%02x:%02x:%02x:%02x:%02x\n", 2784 info->dst_mac_address[0], info->dst_mac_address[1], 2785 info->dst_mac_address[2], info->dst_mac_address[3], 2786 info->dst_mac_address[4], info->dst_mac_address[5]); 2787 cli_out("\tOuter VLAN : %u", info->outer_vlan); 2788 cli_out("\t\t\tInner VLAN : %u\n", info->inner_vlan); 2789 cli_out("\tEthertype : 0x%04x\n", info->ether_type); 2790 cli_out("\tPacket Pri : %u\n", info->pkt_pri); 2791 cli_out("\tTimestamp Format: %s\n", 2792 info->timestamp_format? "NTP":"IEEE1588v1"); 2793 cli_out("\tSession ID : %u\n", info->session_id); 2794 cli_out("\tFlags : "); 2795 cli_out("%s", (info->flags & BCM_SAT_ENDPOINT_UPMEP)? "UPMEP, ":""); 2796 cli_out("%s", (info->flags & BCM_SAT_ENDPOINT_DOWNMEP)? "DOWNMEP, ":""); 2797 cli_out("%s", (info->flags & BCM_SAT_ENDPOINT_MATCH_INNER_VLAN)? \ 2798 "MATCH_INNER_VLAN, ":""); 2799 cli_out("%s", (info->flags & BCM_SAT_ENDPOINT_MATCH_OUTER_VLAN)? \ 2800 "MATCH_OUTER_VLAN, ":""); 2801 cli_out("\n\tActions : "); 2802 cli_out("%s", (info->action_flags & BCM_SAT_ACTION_FWD_ACTION_DROP)? \ 2803 "DROP, ":""); 2804 cli_out("%s", (info->action_flags & BCM_SAT_ACTION_FWD_ACTION_REDIRECT)? \ 2805 "REDIRECT, ":""); 2806 cli_out("%s", (info->action_flags & BCM_SAT_ACTION_FWD_ACTION_LLF)? \ 2807 "LLF, ":""); 2808 cli_out("%s", (info->action_flags & BCM_SAT_ACTION_COPY_TO_CPU)? \ 2809 "Copy-to-CPU, ":""); 2810 cli_out("%s", (info->action_flags & BCM_SAT_ACTION_SAMPLE_TIMESTAMP)? \ 2811 "TIMESTAMP, ":""); 2812 cli_out("\n"); 2813 2814 return CMD_OK; 2815 } 2816 2817 STATIC cmd_result_t 2818 cmd_sat_endpoint_show(int unit, args_t *a) 2819 { 2820 char *arg = NULL; 2821 uint32 index; 2822 uint32 flag[] = {BCM_SAT_ENDPOINT_UPMEP, BCM_SAT_ENDPOINT_DOWNMEP}; 2823 bcm_sat_endpoint_t id; 2824 bcm_sat_endpoint_info_t info; 2825 int rv; 2826 2827 arg = ARG_GET(a); 2828 if (arg) { 2829 id = _parse_integer(arg); 2830 SAT_ENDPOINT_ID_CHECK_RETURN(id); 2831 for (index = 0; index < COUNTOF(flag); index++) { 2832 sal_memset(&info, 0, sizeof(bcm_sat_endpoint_info_t)); 2833 rv = bcm_sat_endpoint_get(unit, id, flag[index], &info); 2834 if (rv != BCM_E_NOT_FOUND) { 2835 (void)sat_endpoint_show(unit, &info, NULL); 2836 } 2837 } 2838 } else { 2839 for (index = 0; index < COUNTOF(flag); index++) { 2840 (void)bcm_sat_endpoint_traverse(unit, flag[index], 2841 sat_endpoint_show, NULL); 2842 } 2843 } 2844 2845 return CMD_OK; 2846 } 2847 2848 STATIC cmd_result_t 2849 cmd_sat_endpoint_destroy(int unit, args_t *a) 2850 { 2851 char *arg = NULL; 2852 uint32 arg_down = 1; 2853 uint32 flag = BCM_SAT_ENDPOINT_DOWNMEP, destroy_all = 0; 2854 parse_table_t pt; 2855 bcm_sat_endpoint_t id = 0; 2856 2857 arg = ARG_GET(a); 2858 if (arg == NULL) { /* All downMEP */ 2859 destroy_all = 1; 2860 } else { 2861 if (sal_strchr(arg, '=')) { /* w/o ID, with option */ 2862 destroy_all = 1; 2863 ARG_PREV(a); 2864 } else { /* with ID */ 2865 destroy_all = 0; 2866 id = _parse_integer(arg); 2867 SAT_ENDPOINT_ID_CHECK_RETURN(id); 2868 } 2869 parse_table_init(unit, &pt); 2870 parse_table_add(&pt, "isDowN", PQ_DFL|PQ_BOOL, NULL, 2871 &arg_down, NULL); 2872 if (parse_arg_eq(a, &pt) < 0 || ARG_CNT(a) > 0) { 2873 cli_out("%s: Error: Unknown option: %s\n", ARG_CMD(a), ARG_CUR(a)); 2874 parse_arg_eq_done(&pt); 2875 return CMD_FAIL; 2876 } 2877 parse_arg_eq_done(&pt); 2878 } 2879 flag = (arg_down)? BCM_SAT_ENDPOINT_DOWNMEP:BCM_SAT_ENDPOINT_UPMEP; 2880 2881 if (destroy_all) { 2882 cli_out("Destroy all ENDPOINT (%s)...\n", (arg_down)? "DOWN":"UP"); 2883 SAT_IF_ERROR_RETURN(bcm_sat_endpoint_destroy_all(unit, flag)); 2884 } else { 2885 cli_out("Destroy ENDPOINT %u (%s)...\n", id, (arg_down)? "DOWN":"UP"); 2886 SAT_IF_ERROR_RETURN(bcm_sat_endpoint_destroy(unit, id, flag)); 2887 } 2888 2889 return CMD_OK; 2890 } 2891 2892 STATIC cmd_result_t 2893 cmd_sat_endpoint_create(int unit, args_t *a) 2894 { 2895 char *arg = NULL; 2896 uint32 arg_down, arg_match_ov, arg_match_iv; 2897 uint32 arg_drop, arg_redirect, arg_llf, arg_to_cpu; 2898 uint32 arg_stamp; 2899 soc_port_t arg_src_port, arg_dst_port; 2900 parse_table_t pt; 2901 bcm_sat_endpoint_info_t config; 2902 cmd_result_t retCode; 2903 2904 sat_endpoint_info_t_init(&config); 2905 arg_down = config.flags & BCM_SAT_ENDPOINT_DOWNMEP; 2906 arg_match_ov = config.flags & BCM_SAT_ENDPOINT_MATCH_OUTER_VLAN; 2907 arg_match_iv = config.flags & BCM_SAT_ENDPOINT_MATCH_INNER_VLAN; 2908 arg_drop = config.action_flags & BCM_SAT_ACTION_FWD_ACTION_DROP; 2909 arg_redirect = config.action_flags & BCM_SAT_ACTION_FWD_ACTION_REDIRECT; 2910 arg_llf = config.action_flags & BCM_SAT_ACTION_FWD_ACTION_LLF; 2911 arg_to_cpu = config.action_flags & BCM_SAT_ACTION_COPY_TO_CPU; 2912 arg_stamp = config.action_flags & BCM_SAT_ACTION_SAMPLE_TIMESTAMP; 2913 arg_src_port = BCM_GPORT_LOCAL_GET(config.src_gport); 2914 arg_dst_port = BCM_GPORT_LOCAL_GET(config.dest_gport); 2915 parse_table_init(unit, &pt); 2916 parse_table_add(&pt, "isDowN", PQ_DFL|PQ_BOOL, NULL, 2917 &arg_down, NULL); 2918 parse_table_add(&pt, "MatchOuterVlan", PQ_DFL|PQ_BOOL, NULL, 2919 &arg_match_ov, NULL); 2920 parse_table_add(&pt, "MatchInnerVlan", PQ_DFL|PQ_BOOL, NULL, 2921 &arg_match_iv, NULL); 2922 parse_table_add(&pt, "DMac", PQ_DFL|PQ_MAC, NULL, 2923 &config.dst_mac_address, NULL); 2924 parse_table_add(&pt, "SMac", PQ_DFL|PQ_MAC, NULL, 2925 &config.src_mac_address, NULL); 2926 parse_table_add(&pt, "OuterVlan", PQ_DFL|PQ_INT16, NULL, 2927 &config.outer_vlan, NULL); 2928 parse_table_add(&pt, "InnerVlan", PQ_DFL|PQ_INT16, NULL, 2929 &config.inner_vlan, NULL); 2930 parse_table_add(&pt, "SrcPort", PQ_DFL|PQ_PORT, NULL, 2931 &arg_src_port, NULL); 2932 parse_table_add(&pt, "ETHertype", PQ_DFL|PQ_HEX, NULL, 2933 &config.ether_type, NULL); 2934 parse_table_add(&pt, "Drop", PQ_DFL|PQ_BOOL, NULL, 2935 &arg_drop, NULL); 2936 parse_table_add(&pt, "Redirect", PQ_DFL|PQ_BOOL, NULL, 2937 &arg_redirect, NULL); 2938 parse_table_add(&pt, "LLF", PQ_DFL|PQ_BOOL, NULL, 2939 &arg_llf, NULL); 2940 parse_table_add(&pt, "CopytoCpu", PQ_DFL|PQ_BOOL, NULL, 2941 &arg_to_cpu, NULL); 2942 parse_table_add(&pt, "timeStamp", PQ_DFL|PQ_BOOL, NULL, 2943 &arg_stamp, NULL); 2944 parse_table_add(&pt, "pktPri", PQ_DFL|PQ_INT8, NULL, 2945 &config.pkt_pri, NULL); 2946 parse_table_add(&pt, "DestPort", PQ_DFL|PQ_PORT, NULL, 2947 &arg_dst_port, NULL); 2948 parse_table_add(&pt, "timeStampFormat", PQ_DFL|PQ_INT, NULL, 2949 &config.timestamp_format, NULL); 2950 parse_table_add(&pt, "sessionId", PQ_DFL|PQ_INT16, NULL, 2951 &config.session_id, NULL); 2952 arg = ARG_GET(a); 2953 if (arg == NULL) { /* w/o ID, w/o option */ 2954 cli_out("Current settings:\n"); 2955 parse_eq_format(&pt); 2956 parse_arg_eq_done(&pt); 2957 return CMD_OK; 2958 } else { 2959 if (sal_strchr(arg, '=')) { /* w/o ID, with option */ 2960 config.flags &= ~BCM_SAT_ENDPOINT_WITH_ID; 2961 ARG_PREV(a); 2962 } else { /* with ID */ 2963 config.ep_id = _parse_integer(arg); 2964 config.flags |= BCM_SAT_ENDPOINT_WITH_ID; 2965 } 2966 2967 if (!parseEndOk(a, &pt, &retCode)) { 2968 return retCode; 2969 } 2970 SAT_ENDPOINT_ID_CHECK_RETURN(config.ep_id); 2971 } 2972 2973 if (arg_down) { 2974 config.flags &= ~BCM_SAT_ENDPOINT_UPMEP; 2975 config.flags |= BCM_SAT_ENDPOINT_DOWNMEP; 2976 } else { 2977 config.flags |= BCM_SAT_ENDPOINT_UPMEP; 2978 config.flags &= ~BCM_SAT_ENDPOINT_DOWNMEP; 2979 } 2980 if (arg_match_ov) { 2981 config.flags |= BCM_SAT_ENDPOINT_MATCH_OUTER_VLAN; 2982 } else { 2983 config.flags &= ~BCM_SAT_ENDPOINT_MATCH_OUTER_VLAN; 2984 } 2985 if (arg_match_iv) { 2986 config.flags |= BCM_SAT_ENDPOINT_MATCH_INNER_VLAN; 2987 } else { 2988 config.flags &= ~BCM_SAT_ENDPOINT_MATCH_INNER_VLAN; 2989 } 2990 if (arg_drop) { 2991 config.action_flags |= BCM_SAT_ACTION_FWD_ACTION_DROP; 2992 } else { 2993 config.action_flags &= ~BCM_SAT_ACTION_FWD_ACTION_DROP; 2994 } 2995 if (arg_redirect) { 2996 config.action_flags |= BCM_SAT_ACTION_FWD_ACTION_REDIRECT; 2997 } else { 2998 config.action_flags &= ~BCM_SAT_ACTION_FWD_ACTION_REDIRECT; 2999 } 3000 if (arg_llf) { 3001 config.action_flags |= BCM_SAT_ACTION_FWD_ACTION_LLF; 3002 } else { 3003 config.action_flags &= ~BCM_SAT_ACTION_FWD_ACTION_LLF; 3004 } 3005 if (arg_to_cpu) { 3006 config.action_flags |= BCM_SAT_ACTION_COPY_TO_CPU; 3007 } else { 3008 config.action_flags &= ~BCM_SAT_ACTION_COPY_TO_CPU; 3009 } 3010 if (arg_stamp) { 3011 config.action_flags |= BCM_SAT_ACTION_SAMPLE_TIMESTAMP; 3012 } else { 3013 config.action_flags &= ~BCM_SAT_ACTION_SAMPLE_TIMESTAMP; 3014 } 3015 BCM_GPORT_LOCAL_SET(config.src_gport, arg_src_port); 3016 BCM_GPORT_LOCAL_SET(config.dest_gport, arg_dst_port); 3017 SAT_IF_ERROR_RETURN(bcm_sat_endpoint_create(unit, &config)); 3018 if (!(config.flags & BCM_SAT_ENDPOINT_WITH_ID)) { 3019 cli_out("ENDPOINT ID: %d\n", config.ep_id); 3020 } 3021 3022 return CMD_OK; 3023 } 3024 3025 STATIC cmd_result_t 3026 cmd_sat_endpoint_replace(int unit, args_t *a) 3027 { 3028 char *arg = NULL; 3029 uint32 arg_down, arg_match_ov, arg_match_iv; 3030 uint32 arg_drop, arg_redirect, arg_llf, arg_to_cpu; 3031 uint32 arg_stamp; 3032 soc_port_t arg_src_port, arg_dst_port; 3033 parse_table_t pt; 3034 bcm_sat_endpoint_info_t config; 3035 cmd_result_t retCode; 3036 3037 sat_endpoint_info_t_init(&config); 3038 SAT_ARG_NUMB_GET(a, arg, config.ep_id); 3039 config.flags |= BCM_SAT_ENDPOINT_REPLACE; 3040 config.flags |= BCM_SAT_ENDPOINT_WITH_ID; 3041 3042 arg_down = config.flags & BCM_SAT_ENDPOINT_DOWNMEP; 3043 arg_match_ov = config.flags & BCM_SAT_ENDPOINT_MATCH_OUTER_VLAN; 3044 arg_match_iv = config.flags & BCM_SAT_ENDPOINT_MATCH_INNER_VLAN; 3045 arg_drop = config.action_flags & BCM_SAT_ACTION_FWD_ACTION_DROP; 3046 arg_redirect = config.action_flags & BCM_SAT_ACTION_FWD_ACTION_REDIRECT; 3047 arg_llf = config.action_flags & BCM_SAT_ACTION_FWD_ACTION_LLF; 3048 arg_to_cpu = config.action_flags & BCM_SAT_ACTION_COPY_TO_CPU; 3049 arg_stamp = config.action_flags & BCM_SAT_ACTION_SAMPLE_TIMESTAMP; 3050 arg_src_port = BCM_GPORT_LOCAL_GET(config.src_gport); 3051 arg_dst_port = BCM_GPORT_LOCAL_GET(config.dest_gport); 3052 parse_table_init(unit, &pt); 3053 parse_table_add(&pt, "isDowN", PQ_DFL|PQ_BOOL, NULL, 3054 &arg_down, NULL); 3055 parse_table_add(&pt, "MatchOuterVlan", PQ_DFL|PQ_BOOL, NULL, 3056 &arg_match_ov, NULL); 3057 parse_table_add(&pt, "MatchInnerVlan", PQ_DFL|PQ_BOOL, NULL, 3058 &arg_match_iv, NULL); 3059 parse_table_add(&pt, "DMac", PQ_DFL|PQ_MAC, NULL, 3060 &config.dst_mac_address, NULL); 3061 parse_table_add(&pt, "SMac", PQ_DFL|PQ_MAC, NULL, 3062 &config.src_mac_address, NULL); 3063 parse_table_add(&pt, "OuterVlan", PQ_DFL|PQ_INT16, NULL, 3064 &config.outer_vlan, NULL); 3065 parse_table_add(&pt, "InnerVlan", PQ_DFL|PQ_INT16, NULL, 3066 &config.inner_vlan, NULL); 3067 parse_table_add(&pt, "SrcPort", PQ_DFL|PQ_PORT, NULL, 3068 &arg_src_port, NULL); 3069 parse_table_add(&pt, "ETHertype", PQ_DFL|PQ_HEX, NULL, 3070 &config.ether_type, NULL); 3071 parse_table_add(&pt, "Drop", PQ_DFL|PQ_BOOL, NULL, 3072 &arg_drop, NULL); 3073 parse_table_add(&pt, "Redirect", PQ_DFL|PQ_BOOL, NULL, 3074 &arg_redirect, NULL); 3075 parse_table_add(&pt, "LLF", PQ_DFL|PQ_BOOL, NULL, 3076 &arg_llf, NULL); 3077 parse_table_add(&pt, "CopytoCpu", PQ_DFL|PQ_BOOL, NULL, 3078 &arg_to_cpu, NULL); 3079 parse_table_add(&pt, "timeStamp", PQ_DFL|PQ_BOOL, NULL, 3080 &arg_stamp, NULL); 3081 parse_table_add(&pt, "pktPri", PQ_DFL|PQ_INT8, NULL, 3082 &config.pkt_pri, NULL); 3083 parse_table_add(&pt, "DestPort", PQ_DFL|PQ_PORT, NULL, 3084 &arg_dst_port, NULL); 3085 parse_table_add(&pt, "timeStampFormat", PQ_DFL|PQ_INT, NULL, 3086 &config.timestamp_format, NULL); 3087 parse_table_add(&pt, "sessionId", PQ_DFL|PQ_INT16, NULL, 3088 &config.session_id, NULL); 3089 if (!parseEndOk(a, &pt, &retCode)) { 3090 return retCode; 3091 } 3092 3093 if (arg_down) { 3094 config.flags &= ~BCM_SAT_ENDPOINT_UPMEP; 3095 config.flags |= BCM_SAT_ENDPOINT_DOWNMEP; 3096 } else { 3097 config.flags |= BCM_SAT_ENDPOINT_UPMEP; 3098 config.flags &= ~BCM_SAT_ENDPOINT_DOWNMEP; 3099 } 3100 if (arg_match_ov) { 3101 config.flags |= BCM_SAT_ENDPOINT_MATCH_OUTER_VLAN; 3102 } else { 3103 config.flags &= ~BCM_SAT_ENDPOINT_MATCH_OUTER_VLAN; 3104 } 3105 if (arg_match_iv) { 3106 config.flags |= BCM_SAT_ENDPOINT_MATCH_INNER_VLAN; 3107 } else { 3108 config.flags &= ~BCM_SAT_ENDPOINT_MATCH_INNER_VLAN; 3109 } 3110 if (arg_drop) { 3111 config.action_flags |= BCM_SAT_ACTION_FWD_ACTION_DROP; 3112 } else { 3113 config.action_flags &= ~BCM_SAT_ACTION_FWD_ACTION_DROP; 3114 } 3115 if (arg_redirect) { 3116 config.action_flags |= BCM_SAT_ACTION_FWD_ACTION_REDIRECT; 3117 } else { 3118 config.action_flags &= ~BCM_SAT_ACTION_FWD_ACTION_REDIRECT; 3119 } 3120 if (arg_llf) { 3121 config.action_flags |= BCM_SAT_ACTION_FWD_ACTION_LLF; 3122 } else { 3123 config.action_flags &= ~BCM_SAT_ACTION_FWD_ACTION_LLF; 3124 } 3125 if (arg_to_cpu) { 3126 config.action_flags |= BCM_SAT_ACTION_COPY_TO_CPU; 3127 } else { 3128 config.action_flags &= ~BCM_SAT_ACTION_COPY_TO_CPU; 3129 } 3130 if (arg_stamp) { 3131 config.action_flags |= BCM_SAT_ACTION_SAMPLE_TIMESTAMP; 3132 } else { 3133 config.action_flags &= ~BCM_SAT_ACTION_SAMPLE_TIMESTAMP; 3134 } 3135 BCM_GPORT_LOCAL_SET(config.src_gport, arg_src_port); 3136 BCM_GPORT_LOCAL_SET(config.dest_gport, arg_dst_port); 3137 SAT_IF_ERROR_RETURN(bcm_sat_endpoint_create(unit, &config)); 3138 3139 return CMD_OK; 3140 } 3141 #endif /* BCM_ESW_SUPPORT */ 3142 3143 STATIC cmd_result_t 3144 cmd_sat_global(int unit, args_t *a) 3145 { 3146 cmd_result_t retCode; 3147 char *arg = NULL; 3148 parse_table_t pt; 3149 bcm_sat_timestamp_format_t arg_format = bcmSATTimestampFormatIEEE1588v1; 3150 int arg_reverse = 0, arg_invert = 0, arg_reset = 0, arg_nxor = 0; 3151 bcm_sat_config_t conf; 3152 3153 arg = ARG_GET(a); 3154 if (!arg) { 3155 return CMD_USAGE; 3156 } else if (parse_cmp("Set", arg, 0)) { 3157 parse_table_init(unit, &pt); 3158 parse_table_add(&pt, "timestampFormat", PQ_DFL|PQ_INT, NULL, 3159 &arg_format, NULL); 3160 parse_table_add(&pt, "crcReversedData", PQ_DFL|PQ_BOOL, NULL, 3161 &arg_reverse, NULL); 3162 parse_table_add(&pt, "crcInvert", PQ_DFL|PQ_BOOL, NULL, 3163 &arg_invert, NULL); 3164 parse_table_add(&pt, "crcHighReset", PQ_DFL|PQ_BOOL, NULL, 3165 &arg_reset, NULL); 3166 parse_table_add(&pt, "prbsUseNxor", PQ_DFL|PQ_BOOL, NULL, 3167 &arg_nxor, NULL); 3168 if (!parseEndOk(a, &pt, &retCode)) { 3169 return retCode; 3170 } 3171 3172 bcm_sat_config_t_init(&conf); 3173 conf.timestamp_format = arg_format; 3174 conf.config_flags |= (arg_reverse)? BCM_SAT_CONFIG_CRC_REVERSED_DATA:0; 3175 conf.config_flags |= (arg_invert)? BCM_SAT_CONFIG_CRC_INVERT:0; 3176 conf.config_flags |= (arg_reset)? BCM_SAT_CONFIG_CRC_HIGH_RESET:0; 3177 conf.config_flags |= (arg_nxor)? BCM_SAT_CONFIG_PRBS_USE_NXOR:0; 3178 SAT_IF_ERROR_RETURN(bcm_sat_config_set(unit, &conf)); 3179 } else if (parse_cmp("SHOW", arg, 0)) { 3180 bcm_sat_config_t_init(&conf); 3181 SAT_IF_ERROR_RETURN(bcm_sat_config_get(unit, &conf)); 3182 cli_out("Hardware settings:\n\t"); 3183 cli_out("stamp format: %s\n\t", 3184 (conf.timestamp_format == bcmSATTimestampFormatIEEE1588v1)? \ 3185 "IEEE1588v1":"NTP"); 3186 cli_out("flags : %s%s%s%s\n", 3187 (conf.config_flags & BCM_SAT_CONFIG_CRC_REVERSED_DATA)? \ 3188 "CRC_REVERSED, ":"", 3189 (conf.config_flags & BCM_SAT_CONFIG_CRC_INVERT)? \ 3190 "CRC_INVERT, ":"", 3191 (conf.config_flags & BCM_SAT_CONFIG_CRC_HIGH_RESET)? \ 3192 "CRC_HIGH_RESET, ":"", 3193 (conf.config_flags & BCM_SAT_CONFIG_PRBS_USE_NXOR)? \ 3194 "PRBS_USE_NXOR, ":""); 3195 } else { 3196 return CMD_NFND; 3197 } 3198 3199 return CMD_OK; 3200 } 3201 3202 STATIC sat_subcommand_t _sat_gtf_subcommands[] = { 3203 {"SHOW", cmd_sat_gtf_show, SAT_GTF_SHOW_USAGE}, 3204 {"Create", cmd_sat_gtf_create, SAT_GTF_CREATE_USAGE}, 3205 {"Destroy", cmd_sat_gtf_destroy, SAT_GTF_DESTROY_USAGE}, 3206 {"START", cmd_sat_gtf_start, SAT_GTF_START_USAGE}, 3207 {"STOP", cmd_sat_gtf_stop, SAT_GTF_STOP_USAGE}, 3208 {"STat", cmd_sat_gtf_stat, SAT_GTF_STAT_USAGE}, 3209 {"Bandwidth", cmd_sat_gtf_bandwidth, SAT_GTF_BANDWIDTH_USAGE}, 3210 {"Ratepattern", cmd_sat_gtf_ratepattern, SAT_GTF_RATEPATTERN_USAGE}, 3211 {"Packetconfig", cmd_sat_gtf_packet, SAT_GTF_PACKETCONFIG_USAGE}, 3212 {0}, 3213 }; 3214 STATIC sat_subcommand_t _sat_ctf_subcommands[] = { 3215 {"Create", cmd_sat_ctf_create, SAT_CTF_CREATE_USAGE}, 3216 {"Destroy", cmd_sat_ctf_destroy, SAT_CTF_DESTROY_USAGE}, 3217 {"Packetconfig", cmd_sat_ctf_packet, SAT_CTF_PACKETCONFIG_USAGE}, 3218 {"Identifier", cmd_sat_ctf_identifer, SAT_CTF_IDENTIFER_USAGE}, 3219 {"Trap", cmd_sat_ctf_trap, SAT_CTF_TRAP_USAGE}, 3220 {"Binlimit", cmd_sat_ctf_binlimit, SAT_CTF_BINLIMIT_USAGE}, 3221 {"Availability", cmd_sat_ctf_avail, SAT_CTF_AVAILABILITY_USAGE}, 3222 {"Report", cmd_sat_ctf_report, SAT_CTF_REPORT_USAGE}, 3223 {"Stat", cmd_sat_ctf_stat, SAT_CTF_STAT_USAGE}, 3224 {0}, 3225 }; 3226 3227 STATIC cmd_result_t 3228 cmd_sat_gtf(int unit, args_t *a) 3229 { 3230 return sat_subcommand_exec(unit, a, _sat_gtf_subcommands); 3231 } 3232 3233 STATIC cmd_result_t 3234 cmd_sat_ctf(int unit, args_t *a) 3235 { 3236 return sat_subcommand_exec(unit, a, _sat_ctf_subcommands); 3237 } 3238 3239 #if defined(BCM_ESW_SUPPORT) 3240 STATIC sat_subcommand_t _sat_ep_subcommands[] = { 3241 {"SHOW", cmd_sat_endpoint_show, SAT_EP_SHOW_USAGE}, 3242 {"Destroy", cmd_sat_endpoint_destroy, SAT_EP_DESTROY_USAGE}, 3243 {"Create", cmd_sat_endpoint_create, SAT_EP_CREATE_USAGE}, 3244 {"Replace", cmd_sat_endpoint_replace, SAT_EP_REPLACE_USAGE}, 3245 {0}, 3246 }; 3247 3248 STATIC cmd_result_t 3249 cmd_sat_endpoint(int unit, args_t *a) 3250 { 3251 return sat_subcommand_exec(unit, a, _sat_ep_subcommands); 3252 } 3253 #endif /* BCM_ESW_SUPPORT */ 3254 3255 STATIC sat_subcommand_t _sat_subcommands[] = { 3256 {"CONFig", cmd_sat_global, SAT_GLOBAL_CONFIGURE_USAGE}, 3257 {"Gtf", cmd_sat_gtf, SAT_GTF_CONFIGURE_USAGE}, 3258 {"Ctf", cmd_sat_ctf, SAT_CTF_CONFIGURE_USAGE}, 3259 #if defined(BCM_ESW_SUPPORT) 3260 {"Endpoint", cmd_sat_endpoint, SAT_ENDPOINT_CONFIGURE_USAGE}, 3261 #endif /* BCM_ESW_SUPPORT */ 3262 {0}, 3263 }; 3264 3265 cmd_result_t 3266 cmd_sat(int unit, args_t *a) 3267 { 3268 return sat_subcommand_exec(unit, a, _sat_subcommands); 3269 } 3270 3271 #endif /* BCM_SAT_SUPPORT */