range.h (6298B)
1 /* 2 * 3 * 4 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 5 * 6 * Copyright 2007-2020 Broadcom Inc. All rights reserved. 7 * 8 */ 9 10 #ifndef __BCM_RANGE_H__ 11 #define __BCM_RANGE_H__ 12 13 #include <bcm/types.h> 14 #include <shared/switch.h> 15 16 /* Range checker Types. */ 17 typedef enum bcm_range_type_e { 18 bcmRangeTypeL4SrcPort = 0, /* Check L4 Source port range. */ 19 bcmRangeTypeL4DstPort = 1, /* Check L4 Destination port range. */ 20 bcmRangeTypeOuterVlan = 2, /* Check Outer Vlan range. */ 21 bcmRangeTypePacketLength = 3, /* Check IP payload length range. */ 22 bcmRangeTypeUdf = 4, /* Check Udf range. */ 23 bcmRangeTypeVfi = 5, /* Check VFI range. */ 24 bcmRangeTypeIcmpTypeCode = 6, /* Check ICMP Type Code range. */ 25 bcmRangeTypeCount = 7 /* Always last. Not a usable value. */ 26 } bcm_range_type_t; 27 28 #define BCM_RANGE_TYPE \ 29 { \ 30 "L4SrcPort", \ 31 "L4DstPort", \ 32 "OuterVlan", \ 33 "PacketLength", \ 34 "Udf", \ 35 "Vfi", \ 36 "IcmpTypeCode" \ 37 } 38 39 /* bcm_range_oper_mode_e */ 40 typedef enum bcm_range_oper_mode_e { 41 bcmRangeOperModeGlobal = 0, /* Range Checkers Operate in Global Mode 42 Value. i.e. for a given packet on any 43 port from any pipe will have the same 44 range check Result. */ 45 bcmRangeOperModePipeLocal = 1, /* Range Checkers Operate in Per Pipe Mode 46 Value. i.e. for a given packet on ports 47 from different pipes can have the 48 different range check Result. */ 49 bcmRangeOperModeCount = 2 /* Always last. Not a usable value. */ 50 } bcm_range_oper_mode_t; 51 52 #define BCM_RANGE_OPER_MODE \ 53 { \ 54 "Global", \ 55 "PipeLocal", \ 56 "Count" \ 57 } 58 59 /* Opaque handle to a range. */ 60 typedef uint32 bcm_range_t; 61 62 /* 63 * Range configuration structure used to create a range with specific 64 * attributes. 65 */ 66 typedef struct bcm_range_config_s { 67 bcm_range_t rid; /* Range Check Id */ 68 bcm_range_type_t rtype; /* Range Check Type(bcmRangeTypeXXX) */ 69 uint32 min; /* Lower limit of Range inclusive. */ 70 uint32 max; /* Upper limit of Range inclusive. */ 71 uint8 offset; /* Offset (in bits) for mask to apply before range 72 check comparison. */ 73 uint8 width; /* Width(in bits) from offset specified for mask to 74 apply before range check comparison. */ 75 bcm_udf_id_t udf_id; /* UDF id created using bcm_udf_create API. */ 76 bcm_pbmp_t ports; /* Port bitmap to decide XGS pipe */ 77 } bcm_range_config_t; 78 79 /* 80 * Range Module Flags. These flags can be passed to bcm_range_create API 81 * via flags parameter. 82 */ 83 #define BCM_RANGE_CREATE_WITH_ID (1 << 0) 84 85 /* 86 * To initialize all members in bcm_range_config_t structure to default 87 * values. 88 */ 89 extern void bcm_range_config_t_init( 90 bcm_range_config_t *range_cfg); 91 92 #ifndef BCM_HIDE_DISPATCHABLE 93 94 /* Create a Range checker */ 95 extern int bcm_range_create( 96 int unit, 97 int flags, 98 bcm_range_config_t *range_cfg); 99 100 /* Fetches the Range object created in the system */ 101 extern int bcm_range_get( 102 int unit, 103 bcm_range_config_t *range_cfg); 104 105 /* Destroy the range object */ 106 extern int bcm_range_destroy( 107 int unit, 108 bcm_range_t rid); 109 110 /* Set Operational mode for Range Module */ 111 extern int bcm_range_oper_mode_set( 112 int unit, 113 bcm_range_oper_mode_t oper_mode); 114 115 /* Get Operational mode of Range module */ 116 extern int bcm_range_oper_mode_get( 117 int unit, 118 bcm_range_oper_mode_t *oper_mode); 119 120 #endif /* BCM_HIDE_DISPATCHABLE */ 121 122 /* 123 * Device Range Id's traverse callback function. Customer Applications 124 * can create function of this prototype and pass that function pointer 125 * to bcm_range_travers API, so that for every valid range id , function 126 * pointer will be called with some meta data 127 */ 128 typedef int (*bcm_range_traverse_cb)( 129 int unit, 130 bcm_range_config_t *range_cfg, 131 void *user_data); 132 133 #ifndef BCM_HIDE_DISPATCHABLE 134 135 /* 136 * Traverse all the valid range id's in the system, calling a specified 137 * callback function for each one 138 */ 139 extern int bcm_range_traverse( 140 int unit, 141 bcm_range_traverse_cb callback, 142 void *user_data); 143 144 #endif /* BCM_HIDE_DISPATCHABLE */ 145 146 #define BCM_RANGE_ID_MAX ((64 * _SHR_SWITCH_MAX_PIPES) - 1) 147 148 /* Bitmap of Range IDs. */ 149 typedef struct bcm_range_id_bmp_s { 150 SHR_BITDCL w[_SHR_BITDCLSIZE(BCM_RANGE_ID_MAX)]; 151 } bcm_range_id_bmp_t; 152 153 /* Range group configuration structure. */ 154 typedef struct bcm_range_group_config_s { 155 uint16 flags; /* To hold any specific flags. */ 156 bcm_pbmp_t ports; /* Port bitmap for particular pipe 157 instance. */ 158 bcm_range_id_bmp_t range_bmp; /* Bitmap to hold Range IDs. */ 159 uint32 range_group_id; /* Range Group Identifier */ 160 } bcm_range_group_config_t; 161 162 #define BCM_RANGE_ID_BMP_ADD(range_bmp, range_id) SHR_BITSET(((range_bmp).w), (range_id)) 163 164 #define BCM_RANGE_ID_BMP_REMOVE(range_bmp, range_id) SHR_BITCLR(((range_bmp).w), (range_id)) 165 166 #define BCM_RANGE_ID_BMP_TEST(range_bmp, range_id) SHR_BITGET(((range_bmp).w), (range_id)) 167 168 #ifndef BCM_HIDE_DISPATCHABLE 169 170 /* Create a Range checker Group */ 171 extern int bcm_range_group_create( 172 int unit, 173 bcm_range_group_config_t *range_group_config); 174 175 /* Delete a Range checker Group */ 176 extern int bcm_range_group_delete( 177 int unit, 178 bcm_range_group_config_t *range_group_config); 179 180 /* Update a Range checker Group's configuration. */ 181 extern int bcm_range_group_update( 182 int unit, 183 bcm_range_group_config_t *range_group_config); 184 185 /* Get/Fetch a Range checker Group */ 186 extern int bcm_range_group_get( 187 int unit, 188 bcm_range_group_config_t *range_group_config); 189 190 #endif /* BCM_HIDE_DISPATCHABLE */ 191 192 /* 193 * Initialize all members in bcm_range_group_config_t structure to 194 * default values. 195 */ 196 extern void bcm_range_group_config_t_init( 197 bcm_range_group_config_t *range_group_config); 198 199 #endif /* __BCM_RANGE_H__ */