openbcm

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

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 */