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

ft_group.h (31194B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  *
      7  * File:        ft_group.h
      8  * Purpose:     Function declarations for flowtracker group.
      9  */
     10 
     11 #ifndef _BCM_INT_FT_GROUP_H_
     12 #define _BCM_INT_FT_GROUP_H_
     13 
     14 #include <soc/defs.h>
     15 #include <sal/core/libc.h>
     16 #include <shared/bsl.h>
     17 
     18 #if defined(BCM_FLOWTRACKER_SUPPORT)
     19 
     20 #include <shared/bsl.h>
     21 #include <soc/helix5.h>
     22 #include <soc/drv.h>
     23 #include <bcm/error.h>
     24 #include <soc/debug.h>
     25 #include <soc/mem.h>
     26 #include <soc/profile_mem.h>
     27 #include <soc/mspi.h>
     28 #include <soc/format.h>
     29 #include <bcm/module.h>
     30 #include <soc/scache.h>
     31 #include <bcm_int/esw/trx.h>
     32 #include <bcm/flowtracker.h>
     33 #include <bcm_int/esw/flowtracker/ft_alu.h>
     34 #include <bcm_int/esw/flowtracker/ft_export.h>
     35 
     36 
     37 
     38 #define BCMI_CLEANUP_IF_ERROR(rv)      \
     39             do {                       \
     40                 if (BCM_FAILURE(rv)) { \
     41                     goto cleanup;      \
     42                 }                      \
     43             } while(0);
     44 
     45 #define BCMI_CLEANUP1_IF_ERROR(rv)     \
     46             do {                       \
     47                 if (BCM_FAILURE(rv)) { \
     48                     goto cleanup1;     \
     49                 }                      \
     50             } while(0);
     51 
     52 
     53 /*|*****************************************************|
     54   |*****************************************************|
     55   |       TCP Flags - Extraction control                |
     56   |                                                     |
     57   | This information is present in FTFP                 |
     58   |*****************************************************|
     59   |*****************************************************|*/
     60 
     61 /*
     62  * Typedef:
     63  *      _field_ft_tracking_alu_data_info_t
     64  *
     65  * Purpose:
     66  *       ALU Data related tracking information.
     67  */
     68 typedef enum bcmi_ft_tcp_flags_e {
     69 
     70     bcmiFtTcpFlagsSYN = 0,
     71     bcmiFtTcpFlagsACK = 1,
     72     bcmiFtTcpFlagsRST = 2,
     73     bcmiFtTcpFlagsPSH = 3,
     74     bcmiFtTcpFlagsFIN = 4,
     75     bcmiFtTcpFlagsURG = 5,
     76     bcmiFtTcpFlagsECE = 6,
     77     bcmiFtTcpFlagsCWR = 7
     78 } bcmi_ft_tcp_flags_t;
     79 
     80 
     81 /* Internal group tracking param type. */
     82 typedef enum bcmi_ft_group_param_type_e {
     83     bcmiFtGroupParamTypeTracking=0,
     84     bcmiFtGroupParamTypeFlowchecker=1,
     85     bcmiFtGroupParamTypeCollectorCopy=2,
     86     bcmiFtGroupParamTypeMeter=3,
     87     bcmiFtGroupParamTypeTsNewLearn=4,
     88     bcmiFtGroupParamTypeTsFlowStart=5,
     89     bcmiFtGroupParamTypeTsFlowEnd=6,
     90     bcmiFtGroupParamTypeTsCheckEvent1=7,
     91     bcmiFtGroupParamTypeTsCheckEvent2=8
     92 } bcmi_ft_group_param_type_t;
     93 
     94 
     95 typedef struct bcmi_ft_alu_data_info_s {
     96     uint16 param;
     97 
     98     int offset;
     99 
    100     int width;
    101 
    102 } bcmi_ft_alu_data_info_t;
    103 
    104 typedef struct bcmi_ft_state_transtion_s {
    105     int tcp_flags[2]; /* For now only 2. SYN+ACK*/
    106     int current_state;
    107     int next_state;
    108     int new_flow;
    109     int bidirectional;
    110     int ts_trigger;
    111 } bcmi_ft_state_transtion_t;
    112 
    113 /* Timestamp related base structure. */
    114 typedef struct bcmi_ft_group_ts_s {
    115     bcm_flowtracker_tracking_param_type_t ts_param;
    116     uint32 flag_id;
    117     int ts_trigger_bit_sel;
    118     soc_field_t ts_field;
    119 } bcmi_ft_group_ts_t;
    120 
    121 /* Max 4 timestamps allowed in one group. */
    122 #define BCMI_FT_GROUP_MAX_TS           4
    123 #define BCMI_FT_GROUP_MAX_TS_TYPE      5
    124 
    125 /* Internal Group Flags to manage run time timestamps. */
    126 #define BCMI_FT_GROUP_TS_NEW_LEARN                 (1<<0)
    127 #define BCMI_FT_GROUP_TS_FLOW_START                (1<<1)
    128 #define BCMI_FT_GROUP_TS_FLOW_END                  (1<<2)
    129 #define BCMI_FT_GROUP_TS_CHECK_EVENT1              (1<<3)
    130 #define BCMI_FT_GROUP_TS_CHECK_EVENT2              (1<<4)
    131 
    132 extern bcmi_ft_group_ts_t bcmi_ft_group_ts_info[BCMI_FT_GROUP_MAX_TS_TYPE];
    133 
    134 /* Tracking param trigger type.*/
    135 #define BCMI_FT_TS_TYPE_TP                         (1<<0)
    136 
    137 /* Flow check trigger type. */
    138 #define BCMI_FT_TS_TYPE_FC                         (1<<1)
    139 
    140 extern int
    141 bcmi_ft_group_ts_triggers_set(
    142         int unit,
    143         bcm_flowtracker_group_t id,
    144         uint32 check_flags,
    145         int trigger_type,
    146         bcmi_flowtracker_check_set_t reset);
    147 
    148 extern int
    149 bcmi_ft_group_check_ts_set(
    150         int unit,
    151         bcm_flowtracker_group_t id,
    152         bcm_flowtracker_check_t flowchecker_id,
    153         bcmi_flowtracker_check_set_t reset);
    154 
    155 extern bcmi_ft_group_param_type_t
    156 bcmi_ft_group_get_ts_type(
    157         int unit,
    158         bcm_flowtracker_group_t id,
    159         soc_field_t fid);
    160 
    161 extern bcm_flowtracker_tracking_param_type_t
    162 bcmi_ft_group_get_tracking_param(
    163         int unit,
    164         bcmi_ft_group_param_type_t pram_type);
    165 
    166 extern int
    167 bcmi_ft_group_timestamp_set(
    168         int unit,
    169         bcm_flowtracker_group_t id);
    170 
    171 
    172 /* Groups internal Declarations. */
    173 typedef struct bcmi_ft_group_config_s {
    174     /* User tracking params. */
    175     int num_tracking_params;
    176     bcm_flowtracker_tracking_param_info_t *list_of_tracking_params;
    177 
    178     /* Ordered tracking params. */
    179     int num_ordered_template_params;
    180     bcm_flowtracker_tracking_param_info_t *list_of_ordered_template_params;
    181 
    182     /* Group Class. */
    183     uint32 class_id;
    184 
    185 } bcmi_ft_group_config_t;
    186 
    187 
    188 /* Hardware extractor info. used by FTFP. extrators for group key and data. */
    189 #if 0
    190 typedef struct bcmi_ft_hw_extractor_info_s {
    191     int part;
    192     int level;
    193     int gran;
    194     int extraction_num;
    195 } bcmi_ft_hw_extractor_info_t;
    196 #endif
    197 
    198 typedef enum bcmi_ft_group_key_data_mode_s {
    199     bcmiFtGroupModeSingle = 0,
    200     bcmiFtGroupModeDouble = 1
    201 } bcmi_ft_group_key_data_mode_t;
    202 
    203 
    204 typedef uint32 bcmi_ft_hw_extractor_info_t;
    205 
    206 /* extraction info. */
    207 typedef struct bcmi_ft_group_extractor_info_s {
    208     bcmi_ft_group_key_data_mode_t ft_key_mode;
    209     bcmi_ft_group_key_data_mode_t ft_data_mode;
    210     int num_ft_key;
    211     bcmi_ft_hw_extractor_info_t *ft_key;
    212     int num_ft_data;
    213     bcmi_ft_hw_extractor_info_t *ft_data;
    214 
    215 } bcmi_ft_group_extractor_info_t;
    216 
    217 
    218 /* Structure to maintain session profiles. */
    219 /* Populated and used by FTFP sub-module. */
    220 typedef struct bcmi_ft_session_profiles_s {
    221     /* Session Key Profile Index. */
    222     uint32 session_key_profile_idx;
    223 
    224     /* Session Data Profile index. */
    225     uint32 session_data_profile_idx;
    226 
    227     /* Session Alu Data Profile index. */
    228     uint32 alu_data_profile_idx;
    229 } bcmi_ft_session_profiles_t;
    230 
    231 
    232 typedef struct bcmi_ft_group_ftfp_data_s {
    233     bcm_flowtracker_direction_t direction;
    234     int flowtrack;
    235     int new_learn;
    236     uint32 session_key_type;
    237     /* Session key mode. */
    238     bcmi_ft_group_key_data_mode_t session_key_mode;
    239     /* FTFP profile information. */
    240     bcmi_ft_session_profiles_t profiles;
    241 
    242 } bcmi_ft_group_ftfp_data_t;
    243 
    244 
    245 typedef struct bcmi_ft_group_extraction_info_s {
    246     int num_data_info;
    247     /* Inforamtion needed for ALU allocation scheme. */
    248     bcmi_ft_group_alu_info_t *ft_data_info;
    249 
    250     /* session Key information for the FT. */
    251     int num_key_info;
    252     bcmi_ft_group_alu_info_t *ft_key_info;
    253 
    254     /* Hardware extractor inforamtion needed for FT. */
    255     bcmi_ft_group_extractor_info_t ft_ext_info;
    256 
    257 } bcmi_ft_group_extraction_info_t;
    258 
    259 
    260 /* template info linked list. */
    261 typedef struct bcmi_ft_group_template_info_s {
    262 
    263     /* alu/load flags. */
    264     uint32 flags;
    265 
    266     /* Container offset from start of Session Data PDD */
    267     int cont_offset;
    268 
    269     /* Data shift from start of Container */
    270     int data_shift;
    271 
    272     /* Width of Container */
    273     int cont_width;
    274 
    275     /* Tracking param Type */
    276     bcmi_ft_group_param_type_t param_type;
    277 
    278     /* Tracking param */
    279     bcm_flowtracker_tracking_param_type_t param;
    280 
    281     /* Flowtracker Check */
    282     bcm_flowtracker_check_t check_id;
    283 
    284     /* Index in ALU/Load Engine */
    285     int index;
    286 
    287     /* Hw Engine */
    288     bcmi_ft_alu_load_type_t type;
    289 
    290 } bcmi_ft_group_template_info_t;
    291 
    292 /* The linked list used to form export template */
    293 typedef struct bcmi_ft_group_template_list_s {
    294     bcmi_ft_group_template_info_t info;
    295     struct bcmi_ft_group_template_list_s *next;
    296 }bcmi_ft_group_template_list_t;
    297 
    298 
    299 #if 0
    300 typedef struct bcmi_ft_flowchecker_list_s {
    301     bcm_flowtracker_check_t flowchecker_id;
    302     struct bcmi_ft_flowchecker_list_s *next;
    303 } bcmi_ft_flowchecker_list_t;
    304 #endif
    305 
    306 typedef struct bcmi_ft_group_meter_s {
    307     uint32 sw_ckbits_sec;
    308     uint32 sw_ckbits_burst;
    309 } bcmi_ft_group_meter_t;
    310 
    311 typedef struct bcmi_ft_group_info_s {
    312     bcmi_ft_group_config_t group_config;
    313     bcmi_ft_group_meter_t meter_info;
    314     bcmi_ft_flowchecker_list_t *head;
    315     bcm_flowtracker_collector_t  collector_id;
    316     bcm_flowtracker_export_template_t template_id;
    317     bcmi_ft_group_extraction_info_t group_ext_info;
    318 
    319     /* flags */
    320     uint32 flags;
    321 
    322     /* Total number of ftfp entries pointing to this group. */
    323     uint32 num_ftfp_entries;
    324 
    325     /* FTFP data in group state. */
    326     bcmi_ft_group_ftfp_data_t ftfp_data;
    327 
    328     /* We will have a pdd profile entry here. */
    329     bsd_policy_action_profile_entry_t pdd_entry;
    330 
    331     /* ALU-32 MEM allocation bitmap. */
    332     uint32 ALU32_MEM_USE[TOTAL_GROUP_ALU32_MEM];
    333 
    334     /* ALU-16 MEM allocation bitmap. */
    335     uint32 ALU16_MEM_USE[TOTAL_GROUP_ALU16_MEM];
    336 
    337     /* List for template information. */
    338     bcmi_ft_group_template_list_t *template_head;
    339 
    340     /* Timestamps triggers on this group.*/
    341     uint32 ts_triggers;
    342 
    343     /* Validation status. */
    344     int validated;
    345 } bcmi_ft_group_sw_info_t;
    346 
    347 
    348 
    349 /* Extractor information. */
    350 typedef struct bcmi_ft_group_element_extraction_info_s {
    351     int location;
    352     uint32 length;
    353     int is_alu_type;
    354     bcm_flowtracker_check_t flow_checker_id;
    355     bcm_flowtracker_tracking_param_type_t inforamation_element_id;
    356     int location_of_update_element;
    357     bcm_flowtracker_check_operation_t update_operation;
    358 } bcmi_ft_group_element_extraction_info_t;
    359 
    360 
    361 
    362 typedef struct bcmi_ft_group_bitmap_s {
    363     SHR_BITDCL *ft_group_bitmap;
    364 } bcmi_ft_group_bitmap_t;
    365 
    366 extern bcmi_ft_group_sw_info_t **bcmi_ft_group_sw_state[BCM_MAX_NUM_UNITS];
    367 
    368 
    369 #define BCMI_FT_GROUP_BITMAP(unit)    (bcmi_ft_group_bitmap[unit].ft_group_bitmap)
    370 #define BCMI_FT_GROUP(unit, id)       (bcmi_ft_group_sw_state[unit][id])
    371 
    372 #define BCMI_FT_GROUP_CONFIG(unit, id)  \
    373             ((BCMI_FT_GROUP(unit, id))->group_config)
    374 
    375 #define BCMI_FT_GROUP_IS_BUSY(unit, id)  \
    376             ((BCMI_FT_GROUP(unit, id))->num_ftfp_entries != 0)
    377 
    378 #define BCMI_FT_GROUP_IS_VALIDATED(unit, id)  \
    379             ((BCMI_FT_GROUP(unit, id))->validated)
    380 
    381 #define BCMI_FT_GROUP_FTFP_DATA(unit, id) \
    382             ((BCMI_FT_GROUP(unit, id))->ftfp_data)
    383 
    384 #define BCMI_FT_GROUP_TRACK_PARAM(unit, id)  \
    385             (((BCMI_FT_GROUP(unit, id))->group_config).list_of_tracking_params)
    386 
    387 #define BCMI_FT_GROUP_TRACK_PARAM_NUM(unit, id)  \
    388             (((BCMI_FT_GROUP(unit, id))->group_config).num_tracking_params)
    389 
    390 #define BCMI_FT_GROUP_ORDERED_TRACK_PARAM_NUM(unit, id)  \
    391             (((BCMI_FT_GROUP(unit, id))->group_config).num_ordered_template_params)
    392 
    393 #define BCMI_FT_GROUP_ORDERED_TRACK_PARAM(unit, id)  \
    394             (((BCMI_FT_GROUP(unit, id))->group_config).list_of_ordered_template_params)
    395 
    396 #define BCMI_FT_GROUP_CHECK_LIST(unit, id)  \
    397             ((BCMI_FT_GROUP(unit, id))->head)
    398 
    399 #define BCMI_FT_GROUP_EXT_INFO(unit, id)  \
    400             ((BCMI_FT_GROUP(unit, id))->group_ext_info)
    401 
    402 #define BCMI_FT_GROUP_EXT_DATA_INFO(unit, id)  \
    403             (((BCMI_FT_GROUP(unit, id))->group_ext_info).ft_data_info)
    404 
    405 #define BCMI_FT_GROUP_EXT_KEY_INFO(unit, id)  \
    406             (((BCMI_FT_GROUP(unit, id))->group_ext_info).ft_key_info)
    407 
    408 #define BCMI_FT_GROUP_EXT_HW_INFO(unit, id)  \
    409             (((BCMI_FT_GROUP(unit, id))->group_ext_info).ft_ext_info)
    410 
    411 #define BCMI_FT_GROUP_FLOWCHECKER_HEAD(unit, id)  \
    412             (BCMI_FT_GROUP(unit, id)->head)
    413 
    414 #define BCMI_FT_GROUP_METER_INFO(unit, id)  \
    415             (BCMI_FT_GROUP(unit, id)->meter_info)
    416 
    417 #define BCMI_FT_GROUP_ALU32_MEM_USE(unit, id) \
    418             (BCMI_FT_GROUP(unit, id)->ALU32_MEM_USE)
    419 
    420 #define BCMI_FT_GROUP_ALU16_MEM_USE(unit, id) \
    421             (BCMI_FT_GROUP(unit, id)->ALU16_MEM_USE)
    422 
    423 #define BCMI_FT_GROUP_ALU32_MEM_USE_GET(unit, id, mem_idx) \
    424             (BCMI_FT_GROUP(unit, id)->ALU32_MEM_USE[mem_idx])
    425 
    426 #define BCMI_FT_GROUP_ALU16_MEM_USE_GET(unit, id, mem_idx) \
    427             (BCMI_FT_GROUP(unit, id)->ALU16_MEM_USE[mem_idx])
    428 
    429 #define BCMI_FT_GROUP_TS_TRIGGERS(unit, id) \
    430             (BCMI_FT_GROUP(unit, id)->ts_triggers)
    431 
    432 #define BCMI_FT_GROUP_EXT_DATA_OR_TS_TRIGGERS_SET(unit, id) \
    433             ((BCMI_FT_GROUP_EXT_DATA_INFO(unit, id) != NULL) || \
    434              (BCMI_FT_GROUP_TS_TRIGGERS(unit, id) != 0))
    435 
    436 typedef enum bcmi_ft_group_param_e {
    437     bcmiFtGroupParamFtfpEntryNum,
    438     bcmiFtGroupParamCount
    439 } bcmi_ft_group_params_t;
    440 
    441 
    442 typedef enum bcmi_ft_group_params_operation_e {
    443     bcmiFtGroupParamsOprInc,
    444     bcmiFtGroupParamsOprDec,
    445     bcmiFtGroupParamsOprUpdate,
    446     bcmiFtGroupParamOprCount
    447 } bcmi_ft_group_params_operation_t;
    448 
    449 
    450 
    451 /* MAximum 4 groups can be flushed one time.*/
    452 #define BCMI_FT_GROUP_FLUSH_MAX_SCALE             4
    453 
    454 typedef struct bcmi_ft_group_flushinfo_s {
    455     uint32 group_valid;
    456     bcm_flowtracker_group_t group_id;
    457 } bcmi_ft_group_flush_info_t;
    458 
    459 
    460 
    461 int
    462 bcmi_ft_group_is_invalid(int unit, bcm_flowtracker_group_t group_index);
    463 
    464 int
    465 bcmi_ft_group_collector_is_valid(int unit, bcm_flowtracker_group_t id);
    466 
    467 int
    468 bcmi_ft_flowchecker_is_invalid(int unit, int flowchecker_id);
    469 
    470 int
    471 bcmi_ft_group_entry_add_check(int unit, bcm_flowtracker_group_t id);
    472 
    473 int
    474 bcmi_ft_group_export_checks_validate(int unit,
    475     bcm_flowtracker_group_t id,
    476     int num_in_export_elements,
    477     bcm_flowtracker_export_element_info_t *in_export_elements);
    478 
    479 /* Options for bcmi_ft_group_check_validate */
    480 #define BCMI_FT_GROUP_CHECK_MATCH_GROUP      (1 << 0)
    481 #define BCMI_FT_GROUP_CHECK_MATCH_PRIMARY    (1 << 1)
    482 int
    483 bcmi_ft_group_check_validate(int unit,
    484     uint32 options,
    485     bcm_flowtracker_group_t id,
    486     bcm_flowtracker_check_t check_id);
    487 
    488 /* Group Creation/Deletion Methods. */
    489 extern int
    490 bcmi_ft_group_create(
    491     int unit,
    492     uint32 options,
    493     bcm_flowtracker_group_t *id,
    494     bcm_flowtracker_group_info_t *flow_group_info);
    495 
    496 
    497 extern int
    498 bcmi_ft_group_get(
    499         int unit,
    500         bcm_flowtracker_group_t id,
    501         bcm_flowtracker_group_info_t *flow_group_info);
    502 
    503 extern int
    504 bcmi_ft_group_clear(
    505         int unit,
    506         bcm_flowtracker_group_t id);
    507 
    508 extern int
    509 bcmi_ft_group_destroy(
    510         int unit,
    511         bcm_flowtracker_group_t id);
    512 
    513 extern int
    514 bcmi_ft_group_get_all(
    515         int unit,
    516         int max_size,
    517         bcm_flowtracker_group_t *idz,
    518         int *list_size);
    519 
    520 extern int
    521 bcmi_ft_group_entry_update(
    522         int unit,
    523         bcm_flowtracker_group_t group_id,
    524         bcm_flowtracker_group_info_t *flow_group_info,
    525         int create);
    526 
    527 /* Init Routines. */
    528 extern int
    529 bcmi_ft_group_state_init(int unit);
    530 
    531 extern void
    532 bcmi_ft_group_state_clear(int unit);
    533 
    534 extern int
    535 bcmi_ft_group_profile_init(int unit);
    536 
    537 extern int
    538 bcmi_ft_flowchecker_init(int unit);
    539 
    540 extern void
    541 bcmi_ft_flowchecker_cleanup(int unit);
    542 
    543 extern void
    544 bcmi_ft_group_state_clear(int unit);
    545 
    546 
    547 extern int
    548 bcmi_ft_init(int unit);
    549 
    550 extern int
    551 bcmi_ft_cleanup(int unit);
    552 
    553 /*|*****************************************************|
    554   |*****************************************************|
    555   |             Start -  FTFP utility Methods.          |
    556   |*****************************************************|
    557   |*****************************************************|*/
    558 int
    559 bcmi_ft_group_extraction_alu_info_set(
    560               int unit,
    561               bcm_flowtracker_group_t id,
    562               int key_or_data,
    563               int num_alu_info,
    564               bcmi_ft_group_alu_info_t *alu_info);
    565 
    566 
    567 int
    568 bcmi_ft_group_extraction_alu_info_get(
    569               int unit,
    570               bcm_flowtracker_group_t id,
    571               int key_or_data,
    572               int max_alu_info,
    573               bcmi_ft_group_alu_info_t *alu_info,
    574               int *num_alu_info);
    575 
    576 
    577 int
    578 bcmi_ft_group_extraction_hw_info_set(
    579               int unit,
    580               bcm_flowtracker_group_t id,
    581               int key_or_data,
    582               int num_elements,
    583               bcmi_ft_hw_extractor_info_t *elements);
    584 
    585 
    586 int
    587 bcmi_ft_group_extraction_hw_info_get(
    588               int unit,
    589               int key_or_data,
    590               bcm_flowtracker_group_t id,
    591               int max_elements,
    592               bcmi_ft_hw_extractor_info_t *elements,
    593               int *num_elements);
    594 
    595 int
    596 bcmi_ft_group_extraction_mode_set(
    597               int unit,
    598               int key_or_data,
    599               bcm_flowtracker_group_t id,
    600               bcmi_ft_group_key_data_mode_t mode);
    601 
    602 int
    603 bcmi_ft_group_extraction_mode_get(
    604               int unit,
    605               int key_or_data,
    606               bcm_flowtracker_group_t id,
    607               bcmi_ft_group_key_data_mode_t *mode);
    608 
    609 
    610 int
    611 bcmi_ft_group_session_key_type_set(
    612               int unit,
    613               bcm_flowtracker_group_t id,
    614               uint32 key_type);
    615 
    616 int
    617 bcmi_ft_group_session_key_type_get(
    618               int unit,
    619               bcm_flowtracker_group_t id,
    620               uint32 *key_type);
    621 
    622 
    623 int
    624 bcmi_ft_group_ftfp_profiles_get(
    625               int unit,
    626               bcm_flowtracker_group_t id,
    627               bcmi_ft_session_profiles_t *profile_info);
    628 
    629 int
    630 bcmi_ft_group_ftfp_profiles_set(
    631               int unit,
    632               bcm_flowtracker_group_t id,
    633               bcmi_ft_session_profiles_t *profile_info);
    634 
    635 int
    636 bcmi_ft_group_ftfp_data_get(
    637               int unit,
    638               bcm_flowtracker_group_t id,
    639               bcmi_ft_group_ftfp_data_t *data);
    640 
    641 int
    642 bcmi_ft_group_param_retrieve(int unit,
    643               bcm_flowtracker_group_t id,
    644               bcmi_ft_group_params_t param,
    645               int *arg);
    646 
    647 int
    648 bcmi_ft_group_param_update(int unit,
    649               bcm_flowtracker_group_t id,
    650               bcmi_ft_group_params_t param,
    651               bcmi_ft_group_params_operation_t opr,
    652               int arg);
    653 
    654 /*|*****************************************************|
    655   |*****************************************************|
    656   |            End  -  FTFP utility Methods.            |
    657   |*****************************************************|
    658   |*****************************************************|*/
    659 
    660 
    661 
    662 /* Flow check utilities. */
    663 
    664 
    665 /* Flowtracker Index generation. */
    666 #define  BCM_FT_IDX_TYPE_CHECK               1
    667 #define  BCM_FT_IDX_TYPE_2ND_CHECK           2
    668 #define  BCM_FT_IDX_TYPE_SHIFT               26
    669 #define  BCM_FT_IDX_MASK                     0x3ffffff
    670 
    671 
    672 #define BCMI_FT_FLOWCHECKER_INDEX_SET(index, type) \
    673             ((type << BCM_FT_IDX_TYPE_SHIFT) | \
    674                 (index))
    675 
    676 #define BCMI_FT_FLOWCHECKER_INDEX_GET(index) \
    677             ((index) & BCM_FT_IDX_MASK)
    678 
    679 #define BCMI_FT_IDX_IS_CHECK(index) \
    680             ((((index) >> BCM_FT_IDX_TYPE_SHIFT) == BCM_FT_IDX_TYPE_CHECK) || \
    681              (((index) >> BCM_FT_IDX_TYPE_SHIFT) == BCM_FT_IDX_TYPE_2ND_CHECK))
    682 
    683 #define BCMI_FT_IDX_IS_PRIMARY_CHECK(index) \
    684              (((index) >> BCM_FT_IDX_TYPE_SHIFT) == BCM_FT_IDX_TYPE_CHECK)
    685 
    686 #define BCMI_FT_IDX_IS_2ND_CHECK(index) \
    687              (((index) >> BCM_FT_IDX_TYPE_SHIFT) == BCM_FT_IDX_TYPE_2ND_CHECK)
    688 
    689 
    690 /* Create Flow check and return software ID. */
    691 int
    692 bcmi_ft_check_create(
    693     int unit,
    694     uint32 options,
    695     bcm_flowtracker_check_info_t check_info,
    696     bcm_flowtracker_check_t *check_id);
    697 
    698 /* Destroy flow check corresponding to this software ID. */
    699 int
    700 bcmi_ft_check_destroy(
    701     int unit,
    702     bcm_flowtracker_check_t check_id);
    703 
    704 /* Destroy all flow checks not linked to any group. */
    705 int
    706 bcmi_ft_check_destroy_all(int unit);
    707 
    708 /* Get information of flow check. */
    709 int
    710 bcmi_ft_check_get(
    711     int unit,
    712     bcm_flowtracker_check_t check_id,
    713     bcm_flowtracker_check_info_t *check_info);
    714 
    715 /* Routine to traverse through all the flowcheckers. */
    716 int
    717 bcmi_ft_check_traverse(
    718             int unit,
    719             bcm_flowtracker_check_traverse_cb cb,
    720             void *user_data);
    721 
    722 
    723 extern int
    724 bcmi_ft_group_flow_limit_get(
    725         int unit,
    726         bcm_flowtracker_group_t id,
    727         uint32 *flow_limit);
    728 
    729 extern int
    730 bcmi_ft_group_flow_limit_set(
    731         int unit,
    732         bcm_flowtracker_group_t id,
    733         uint32 flow_limit);
    734 
    735 
    736 
    737 extern int
    738 bcmi_ft_group_age_out_get(
    739         int unit,
    740         bcm_flowtracker_group_t id,
    741         uint32 *aging_interval_ms);
    742 
    743 extern int
    744 bcmi_ft_group_age_out_set(
    745         int unit,
    746         bcm_flowtracker_group_t id,
    747         uint32 aging_interval_ms);
    748 
    749 extern int
    750 bcmi_ft_group_age_export_trigger_set(
    751         int unit,
    752         bcm_flowtracker_group_t id,
    753         uint32 enable);
    754 
    755 extern int
    756 bcmi_ft_group_age_export_trigger_get(
    757         int unit,
    758         bcm_flowtracker_group_t id,
    759         uint32 *enable);
    760 
    761 int
    762 bcmi_ft_group_profiles_destroy(
    763         int unit,
    764          bcm_flowtracker_group_t id);
    765 
    766 extern int
    767 bcmi_ft_group_hw_install(int unit, bcm_flowtracker_group_t id);
    768 
    769 extern int
    770 bcmi_ft_group_hw_uninstall(int unit, bcm_flowtracker_group_t id);
    771 
    772 
    773 extern int
    774 bcmi_ft_flowchecker_get(
    775             int unit,
    776             bcm_flowtracker_check_t flowchecker_id,
    777             bcmi_flowtracker_flowchecker_info_t *flow_check_info);
    778 
    779 /* PDD profile methods. */
    780 int
    781 bcmi_ft_group_pdd_policy_profile_add(
    782         int unit,
    783         bcm_flowtracker_group_t id);
    784 
    785 int
    786 bcmi_ft_group_pdd_policy_profile_delete(
    787         int unit,
    788         bcm_flowtracker_group_t id);
    789 
    790 int
    791 bcmi_ft_group_pdd_to_pde_coversion(
    792         int unit,
    793         bcm_flowtracker_group_t id,
    794         bsc_dt_pde_profile_entry_t *pde_entry);
    795 
    796 int
    797 bcmi_ft_group_ft_mode_update(
    798     int unit,
    799     bcm_flowtracker_group_t id);
    800 
    801 
    802 int
    803 bcmi_ft_group_meter_profile_set(
    804     int unit,
    805     bcm_flowtracker_group_t id,
    806     bcm_flowtracker_meter_info_t info);
    807 
    808 int
    809 bcmi_ft_group_meter_profile_get(
    810     int unit,
    811     bcm_flowtracker_group_t id,
    812     bcm_flowtracker_meter_info_t *info);
    813 
    814 
    815 int
    816 bcmi_ft_group_collector_copy_set(
    817     int unit,
    818     bcm_flowtracker_group_t id,
    819     bcm_flowtracker_collector_copy_info_t info);
    820 
    821 int
    822 bcmi_ft_group_collector_copy_get(
    823     int unit,
    824     bcm_flowtracker_group_t id,
    825     bcm_flowtracker_collector_copy_info_t *info);
    826 
    827 /* Export Triggers. */
    828 int
    829 bcmi_ft_group_export_trigger_get(
    830         int unit,
    831         bcm_flowtracker_group_t id,
    832         bcm_flowtracker_export_trigger_info_t *export_trigger_info);
    833 int
    834 bcmi_ft_group_export_trigger_set(
    835         int unit,
    836         bcm_flowtracker_group_t id,
    837         bcm_flowtracker_export_trigger_info_t *export_trigger_info);
    838 
    839 /* CPU notifications. */
    840 int
    841 bcmi_ft_group_cpu_notification_trigger_set(
    842         int unit,
    843         bcm_flowtracker_group_t id,
    844         bcm_flowtracker_cpu_notification_info_t *notifications);
    845 
    846 
    847 int
    848 bcmi_ft_group_cpu_notification_trigger_get(
    849         int unit,
    850         bcm_flowtracker_group_t id,
    851         bcm_flowtracker_cpu_notification_info_t *notifications);
    852 
    853 /* Group Tracking Params. */
    854 extern int
    855 bcmi_ft_group_param_element_validate (
    856     int unit,
    857     bcm_flowtracker_group_t flow_group_id,
    858     int num_tracking_elements,
    859     bcm_flowtracker_tracking_param_info_t *list_of_tracking_elements);
    860 
    861 extern int bcmi_ft_group_tracking_param_set(
    862     int unit,
    863     bcm_flowtracker_group_t id,
    864     int num_tracking_elements,
    865     bcm_flowtracker_tracking_param_info_t *list_of_tracking_elements);
    866 
    867 extern int
    868 bcmi_ft_group_tracking_param_get(
    869         int unit,
    870         bcm_flowtracker_group_t id,
    871         int max_size,
    872         bcm_flowtracker_tracking_param_info_t *list_of_tracking_elements,
    873         int *num_tracking_elements);
    874 
    875 extern int
    876 bcmi_ft_check_action_info_set(
    877     int unit,
    878     bcm_flowtracker_check_t check_id,
    879     bcm_flowtracker_check_action_info_t info);
    880 
    881 extern int
    882 bcmi_ft_check_action_info_get(
    883     int unit,
    884     bcm_flowtracker_check_t check_id,
    885     bcm_flowtracker_check_action_info_t *info);
    886 
    887 
    888 extern int
    889 bcmi_ft_check_export_info_get(
    890     int unit,
    891     bcm_flowtracker_check_t check_id,
    892     bcm_flowtracker_check_export_info_t *info);
    893 
    894 extern int
    895 bcmi_ft_check_export_info_set(
    896     int unit,
    897     bcm_flowtracker_check_t check_id,
    898     bcm_flowtracker_check_export_info_t info);
    899 
    900 extern int
    901 bcmi_ft_group_flowchecker_add(
    902         int unit,
    903         bcm_flowtracker_group_t id,
    904         bcm_flowtracker_check_t flowchecker_id);
    905 
    906 
    907 extern int
    908 bcmi_ft_group_flowchecker_delete(
    909         int unit,
    910         bcm_flowtracker_group_t id,
    911         bcm_flowtracker_check_t flowchecker_id);
    912 
    913 extern int
    914 bcmi_flowtracker_check_get_all(
    915     int unit,
    916     bcm_flowtracker_group_t group_id,
    917     int skip_non_primary,
    918     int max_checks,
    919     bcm_flowtracker_check_t *list_of_check_ids,
    920     int *num_checks);
    921 
    922 /* Template list Addition and delettion. */
    923 extern int
    924 bcmi_ft_group_template_list_add(
    925         int unit,
    926         bcmi_ft_group_template_list_t **head,
    927         int start,
    928         int length,
    929         bcmi_ft_group_param_type_t type,
    930         bcmi_ft_group_alu_info_t *info);
    931 
    932 
    933 void
    934 bcmi_ft_group_template_list_delete_all(
    935         int unit,
    936         bcmi_ft_group_template_list_t **head);
    937 
    938 int
    939 bcmi_ft_group_template_data_create(
    940         int unit,
    941         bcm_flowtracker_group_t id,
    942         int *load16_indexes,
    943         int *load8_indexes);
    944 
    945 
    946 int
    947 bcmi_ft_group_flush_set(
    948         int unit,
    949         uint32 flags,
    950         int num_groups,
    951         bcm_flowtracker_group_t *idz);
    952 
    953 int
    954 bcmi_flowtracker_group_control_get(
    955         int unit,
    956         bcm_flowtracker_group_t id,
    957         bcm_flowtracker_group_control_type_t type,
    958         int *arg);
    959 
    960 
    961 int
    962 bcmi_flowtracker_group_control_set(
    963         int unit,
    964         bcm_flowtracker_group_t id,
    965         bcm_flowtracker_group_control_type_t type,
    966         int arg);
    967 
    968 
    969 int
    970 bcmi_ft_group_stat_set(
    971         int unit,
    972         bcm_flowtracker_group_t id,
    973         bcm_flowtracker_group_stat_t *group_stats);
    974 
    975 
    976 int
    977 bcmi_ft_group_stat_get(
    978         int unit,
    979         bcm_flowtracker_group_t id,
    980         bcm_flowtracker_group_stat_t *group_stats);
    981 
    982 /* Number of tracking params for normalization */
    983 #define BCMI_FT_GROUP_NORM_TRACKING_PARAMS   12
    984 
    985 int
    986 bcmi_ft_group_norm_tracking_params_info_get(
    987     int unit,
    988     bcm_flowtracker_group_t id,
    989     bcm_flowtracker_tracking_param_info_t **norm_tracking_params_info);
    990 
    991 /*|*****************************************************|
    992   |*****************************************************|
    993   |           Start  -  Warmboot Methods.               |
    994   |*****************************************************|
    995   |*****************************************************|*/
    996 
    997 /* Recover PDD entry for group. */
    998 int
    999 bcmi_ft_pdd_policy_profile_recover(
   1000               int unit, bcm_flowtracker_group_t id);
   1001 
   1002 /* Recover group profiles. */
   1003 int
   1004 bcmi_ft_group_profile_recover(
   1005               int unit, bcm_flowtracker_group_t id);
   1006 
   1007 int
   1008 bcmi_ft_group_alu_load_wb_recover(
   1009               int unit, bcm_flowtracker_group_t id,
   1010               bcmi_ft_group_alu_info_t *info,
   1011               int *load16_indexes,
   1012               int *load8_indexes,
   1013               bcmi_ft_alu_load_type_t alu_load_type);
   1014 
   1015 int
   1016 bcmi_ft_recover(int unit);
   1017 
   1018 
   1019 int
   1020 bcmi_ft_group_sw_reinstall(int unit, bcm_flowtracker_group_t id);
   1021 
   1022 int
   1023 bcmi_ft_sync(int unit);
   1024 
   1025 
   1026 void
   1027 bcmi_ft_wb_alloc_size(int unit, int *size);
   1028 
   1029 int
   1030 bcmi_ft_warn_boot_alloc(int unit);
   1031 
   1032 
   1033 int bcmi_ft_warm_boot_alloc(int unit);
   1034 
   1035 /* ESW Layer menthods. */
   1036 extern int
   1037 bcm_esw_flowtracker_sync(
   1038     int unit);
   1039 
   1040 
   1041 extern int
   1042 bcmi_esw_ft_group_hw_install(
   1043     int unit,
   1044     bcm_flowtracker_group_t id);
   1045 
   1046 extern int
   1047 bcmi_esw_ft_group_hw_uninstall(
   1048     int unit,
   1049     bcm_flowtracker_group_t id);
   1050 
   1051 extern int
   1052 bcmi_esw_ft_group_extraction_mode_set(
   1053               int unit,
   1054               int key_or_data,
   1055               bcm_flowtracker_group_t id,
   1056               bcmi_ft_group_key_data_mode_t mode);
   1057 
   1058 extern int
   1059 bcmi_ft_group_extraction_mode_get(
   1060               int unit,
   1061               int key_or_data,
   1062               bcm_flowtracker_group_t id,
   1063               bcmi_ft_group_key_data_mode_t *mode);
   1064 
   1065 
   1066 int
   1067 bcmi_esw_ft_group_extraction_hw_info_set(
   1068               int unit,
   1069               bcm_flowtracker_group_t id,
   1070               int key_or_data,
   1071               int num_elements,
   1072               bcmi_ft_hw_extractor_info_t *elements);
   1073 
   1074 extern int
   1075 bcmi_esw_ft_group_extraction_hw_info_get(
   1076               int unit,
   1077               int key_or_data,
   1078               bcm_flowtracker_group_t id,
   1079               int max_elements,
   1080               bcmi_ft_hw_extractor_info_t *elements,
   1081               int *num_elements);
   1082 
   1083 
   1084 extern int
   1085 bcmi_esw_ft_group_extraction_alu_info_set(
   1086               int unit,
   1087               bcm_flowtracker_group_t id,
   1088               int key_or_data,
   1089               int num_alu_info,
   1090               bcmi_ft_group_alu_info_t *alu_info);
   1091 
   1092 extern int
   1093 bcmi_esw_ft_group_extraction_alu_info_get(
   1094               int unit,
   1095               bcm_flowtracker_group_t id,
   1096               int key_or_data,
   1097               int max_alu_info,
   1098               bcmi_ft_group_alu_info_t *alu_info,
   1099               int *num_alu_info);
   1100 
   1101 extern int
   1102 bcmi_esw_ft_group_param_retrieve(int unit,
   1103                         bcm_flowtracker_group_t id,
   1104                         bcmi_ft_group_params_t param,
   1105                         int *arg);
   1106 
   1107 extern int
   1108 bcmi_esw_ft_group_param_update(int unit,
   1109                            bcm_flowtracker_group_t id,
   1110                            bcmi_ft_group_params_t param,
   1111                            bcmi_ft_group_params_operation_t opr,
   1112                            int arg);
   1113 
   1114 extern int
   1115 bcm_esw_flowtracker_group_stat_set(int unit,
   1116                 bcm_flowtracker_group_t id,
   1117                 bcm_flowtracker_group_stat_t *group_stat);
   1118 
   1119 /*|*****************************************************|
   1120   |*****************************************************|
   1121   |             END  -  Warmboot Methods.               |
   1122   |*****************************************************|
   1123   |*****************************************************|*/
   1124 
   1125 
   1126 /* Utility Macros. */
   1127 #define CLEANUP_ON_ERROR(rv) \
   1128     do { \
   1129 	    if (BCM_FAILURE(rv)) { \
   1130 		    goto cleanup; \
   1131 	    } \
   1132 	} while(0); \
   1133 
   1134 /* Dump Routine. */
   1135 extern void bcmi_esw_flowtracker_sw_dump(int unit);
   1136 
   1137 extern void
   1138 bcmi_ft_state_dump(int unit);
   1139 
   1140 
   1141 
   1142 /* Diag functions. */
   1143 extern int
   1144 bcmi_ft_table_insert(
   1145     int unit,
   1146     bcm_ip_t dip,
   1147     bcm_ip_t sip,
   1148     uint16 l4destport,
   1149     uint16 l4srcport,
   1150     uint8 proto);
   1151 
   1152 
   1153 extern int
   1154 bcmi_ft_table_lookup(
   1155     int unit,
   1156     bcm_flowtracker_group_t id,
   1157     bcm_ip_t dip,
   1158     bcm_ip_t sip,
   1159     uint16 l4destport,
   1160     uint16 l4srcport,
   1161     uint8 proto,
   1162     int *index);
   1163 
   1164 
   1165 extern int
   1166 bcmi_ft_group_element_print(
   1167     int unit,
   1168     bcm_flowtracker_tracking_param_type_t element);
   1169 
   1170 extern int
   1171 bcmi_ft_group_state_dump(
   1172     int unit,
   1173     bcm_flowtracker_group_t id);
   1174 
   1175 extern int
   1176 bcmi_ft_group_session_data_dump(
   1177     int unit,
   1178     bcm_flowtracker_group_t id,
   1179     int index);
   1180 
   1181 extern int
   1182 bcmi_ft_alu32_dump(
   1183     int unit,
   1184     int global_index);
   1185 
   1186 extern int
   1187 bcmi_ft_alu16_dump(
   1188     int unit,
   1189     int global_index);
   1190 
   1191 /* Load trigger set methods. */
   1192 int
   1193 bcmi_ft_group_alu16_trigger_set(
   1194     int unit,
   1195     int mem_idx,
   1196     int index,
   1197     bcm_flowtracker_direction_t direction);
   1198 
   1199 int
   1200 bcmi_ft_group_alu32_trigger_set(
   1201     int unit,
   1202     int mem_idx,
   1203     int index,
   1204     bcm_flowtracker_direction_t direction);
   1205 int
   1206 bcmi_ft_group_load8_trigger_set(
   1207     int unit,
   1208     int mem_idx,
   1209     int index,
   1210     bcm_flowtracker_direction_t direction);
   1211 
   1212 int
   1213 bcmi_ft_group_load16_trigger_set(
   1214     int unit,
   1215     int mem_idx,
   1216     int index,
   1217     bcm_flowtracker_direction_t direction);
   1218 
   1219 
   1220 #endif /* BCM_FLOWTRACKER_SUPPORT */
   1221 
   1222 #endif /* _BCM_INT_FT_GROUP_H_ */
   1223 
   1224