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

lpm.h (17315B)


      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 
      8 #ifndef _LPM_H_
      9 #define _LPM_H_
     10 #include <shared/l3.h>
     11 
     12 /* 
     13  *  Reserved VRF values 
     14  */
     15 #define SOC_L3_VRF_OVERRIDE  _SHR_L3_VRF_OVERRIDE /* Matches before vrf */
     16                                                   /* specific entries.  */
     17 #define SOC_L3_VRF_GLOBAL    _SHR_L3_VRF_GLOBAL   /* Matches after vrf  */
     18                                                   /* specific entries.  */
     19 #define SOC_L3_VRF_DEFAULT   _SHR_L3_VRF_DEFAULT  /* Default vrf id.    */ 
     20 
     21 #define SOC_APOLLO_L3_DEFIP_URPF_SIZE (0x800)
     22 #define SOC_APOLLO_B0_L3_DEFIP_URPF_SIZE (0xC00)
     23 
     24 #define SOC_LPM_LOCK(u)             soc_mem_lock(u, ((SOC_MEM_IS_VALID(u, L3_DEFIP_LEVEL1m))?L3_DEFIP_LEVEL1m:L3_DEFIPm))
     25 #define SOC_LPM_UNLOCK(u)           soc_mem_unlock(u, ((SOC_MEM_IS_VALID(u, L3_DEFIP_LEVEL1m))?L3_DEFIP_LEVEL1m:L3_DEFIPm))
     26 
     27 #define PRESERVE_HIT                TRUE 
     28 
     29 #ifdef BCM_HELIX4_SUPPORT
     30 #define FB_LPM_HASH_INDEX_NULL  (0x3FFFF)
     31 #define FB_LPM_HASH_INDEX_MASK  (0x1FFFF)
     32 #define FB_LPM_HASH_IPV6_MASK   (0x20000)
     33 #else
     34 #define FB_LPM_HASH_INDEX_NULL  (0xFFFF)
     35 #define FB_LPM_HASH_INDEX_MASK  (0x7FFF)
     36 #define FB_LPM_HASH_IPV6_MASK   (0x8000)
     37 #endif
     38 
     39 #define _SOC_HASH_L3_VRF_GLOBAL   0
     40 #define _SOC_HASH_L3_VRF_OVERRIDE 1
     41 #define _SOC_HASH_L3_VRF_DEFAULT  2
     42 #define _SOC_HASH_L3_VRF_SPECIFIC 3
     43 
     44 #ifdef BCM_FIREBOLT_SUPPORT
     45 #define IPV6_PFX_ZERO                33
     46 #define MAX_LPM_ZONE_IPV4(u)         (soc_feature(u, soc_feature_td3_lpm_ipmc_war) ? 6 : 3)
     47 #define MAX_LPM_ZONE(u)              (MAX_LPM_ZONE_IPV4(u) * 2)
     48 #define IPV4_PFX_ZERO(u)             (MAX_LPM_ZONE_IPV4(u) * (64 + 32 + 2 + 1))
     49 #define MAX_PFX_ENTRIES(u)           (2 * (IPV4_PFX_ZERO(u)))
     50 #define MAX_PFX_INDEX(u)             (MAX_PFX_ENTRIES(u) - 1)
     51 #define SOC_LPM_INIT_CHECK(u)        (soc_lpm_state[(u)] != NULL)
     52 #define SOC_LPM_STATE(u)             (soc_lpm_state[(u)])
     53 #define SOC_LPM_STATE_START(u, pfx)  (soc_lpm_state[(u)][(pfx)].start)
     54 #define SOC_LPM_STATE_END(u, pfx)    (soc_lpm_state[(u)][(pfx)].end)
     55 #define SOC_LPM_STATE_PREV(u, pfx)  (soc_lpm_state[(u)][(pfx)].prev)
     56 #define SOC_LPM_STATE_NEXT(u, pfx)  (soc_lpm_state[(u)][(pfx)].next)
     57 #define SOC_LPM_STATE_VENT(u, pfx)  (soc_lpm_state[(u)][(pfx)].vent)
     58 #define SOC_LPM_STATE_FENT(u, pfx)  (soc_lpm_state[(u)][(pfx)].fent)
     59 #define SOC_LPM_STATE_HFENT(u, pfx) (soc_lpm_state[(u)][(pfx)].hfent)
     60 #define SOC_LPM_PFX_IS_V4(u, pfx)   ((soc_feature(u, soc_feature_l3_shared_defip_table) || \
     61                                       soc_feature(u, soc_feature_l3_kt2_shared_defip_table)) ? \
     62                                      ((pfx) >= IPV4_PFX_ZERO(u) ? TRUE : FALSE) : \
     63                                      ((((pfx) % (MAX_PFX_ENTRIES(u) / MAX_LPM_ZONE(u))) < IPV6_PFX_ZERO) ?  TRUE : FALSE))
     64 #define SOC_LPM_PFX_IS_V6_64(u, pfx) ((soc_feature(u, soc_feature_l3_shared_defip_table) || \
     65                                        soc_feature(u, soc_feature_l3_kt2_shared_defip_table)) ? \
     66                                       ((pfx) < IPV4_PFX_ZERO(u)  ? TRUE : FALSE) : \
     67                                       ((((pfx) % (MAX_PFX_ENTRIES(u) / MAX_LPM_ZONE(u))) >= IPV6_PFX_ZERO) ?  TRUE : FALSE))
     68 
     69 #define SOC_LPM128_PFX_IS_V6_128(u, pfx) \
     70     ((pfx) >= (MAX_PFX_64_OFFSET + MAX_PFX_32_OFFSET) && ((pfx) < MAX_PFX128_INDEX))
     71 #define SOC_LPM128_PFX_IS_V6_64(u, pfx) \
     72     ((pfx) >= MAX_PFX_32_OFFSET && (pfx) < (MAX_PFX_64_OFFSET + MAX_PFX_32_OFFSET))
     73 #define SOC_LPM128_PFX_IS_V4(u, pfx) ((pfx) < MAX_PFX_32_OFFSET && (pfx) >= 0)
     74 #define SOC_LPM128_PFX_IS_V6(u, pfx) (!SOC_LPM128_PFX_IS_V4(u, (pfx))) && ((pfx) < MAX_PFX128_INDEX)
     75 #define SOC_LPM_STAT_INIT_CHECK(u) (soc_lpm_stat[u] != NULL) 
     76 #define SOC_LPM_V4_COUNT(u) (soc_lpm_stat[u]->used_v4_count)
     77 #define SOC_LPM_64BV6_COUNT(u) (soc_lpm_stat[u]->used_64b_count)
     78 #define SOC_LPM_128BV6_COUNT(u) (soc_lpm_stat[u]->used_128b_count)
     79 #define SOC_LPM_MAX_V4_COUNT(u) (soc_lpm_stat[u]->max_v4_count)
     80 #define SOC_LPM_MAX_64BV6_COUNT(u) (soc_lpm_stat[u]->max_64b_count)
     81 #define SOC_LPM_MAX_128BV6_COUNT(u) (soc_lpm_stat[u]->max_128b_count)
     82 #define SOC_LPM_V4_HALF_ENTRY_COUNT(u) (soc_lpm_stat[u]->half_entry_count)
     83 #define SOC_LPM_COUNT_INC(val) (val)++
     84 #define SOC_LPM_COUNT_DEC(val) (val)--
     85 #ifdef FB_LPM_DEBUG
     86 #define SOC_LPM_V4_COUNT2(u) (soc_lpm_stat[u]->used_v4_count2)
     87 #define SOC_LPM_64BV6_COUNT2(u) (soc_lpm_stat[u]->used_64b_count2)
     88 #define SOC_LPM_V4_HALF_ENTRY_COUNT2(u) (soc_lpm_stat[u]->half_entry_count2)
     89 #define SOC_LPM_V4_COUNT1(u) (soc_lpm_stat[u]->used_v4_count1)
     90 #define SOC_LPM_64BV6_COUNT1(u) (soc_lpm_stat[u]->used_64b_count1)
     91 #define SOC_LPM_V4_HALF_ENTRY_COUNT1(u) (soc_lpm_stat[u]->half_entry_count1)
     92 #endif
     93 
     94 #define SOC_EXT_LPM_STAT_INIT_CHECK(u) (soc_ext_lpm_stat[u] != NULL)
     95 #define SOC_EXT_LPM_V4_COUNT(u) (soc_ext_lpm_stat[u]->used_v4_count)
     96 #define SOC_EXT_LPM_64BV6_COUNT(u) (soc_ext_lpm_stat[u]->used_64b_count)
     97 #define SOC_EXT_LPM_128BV6_COUNT(u) (soc_ext_lpm_stat[u]->used_128b_count)
     98 #define SOC_EXT_LPM_MAX_V4_COUNT(u) (soc_ext_lpm_stat[u]->max_v4_count)
     99 #define SOC_EXT_LPM_MAX_64BV6_COUNT(u) (soc_ext_lpm_stat[u]->max_64b_count)
    100 #define SOC_EXT_LPM_MAX_128BV6_COUNT(u) (soc_ext_lpm_stat[u]->max_128b_count)
    101 #define SOC_EXT_LPM_COUNT_INC(val) (val)++
    102 #define SOC_EXT_LPM_COUNT_DEC(val) (val)--
    103 
    104 typedef struct soc_lpm_stat_s {
    105     uint16 used_v4_count;
    106     uint16 used_64b_count;
    107     uint16 used_128b_count;
    108     uint16 max_v4_count;
    109     uint16 max_64b_count;
    110     uint16 max_128b_count;
    111     uint16 half_entry_count;
    112 #ifdef FB_LPM_DEBUG
    113     uint16 used_v4_count2;
    114     uint16 used_64b_count2;
    115     uint16 used_128b_count2;
    116     uint16 half_entry_count2;
    117     uint16 used_v4_count1;
    118     uint16 used_64b_count1;
    119     uint16 used_128b_count1;
    120     uint16 half_entry_count1;
    121 #endif
    122 } soc_lpm_stat_t;
    123 typedef soc_lpm_stat_t *soc_lpm_stat_p;
    124 
    125 typedef struct soc_lpm_state_s {
    126     int start;   /* start index for this prefix length */
    127     int end;     /* End index for this prefix length */
    128     int prev;    /* Previous (Lo to Hi) prefix length with non zero entry count*/
    129     int next;    /* Next (Hi to Lo) prefix length with non zero entry count */
    130     int vent;    /* valid entries */
    131     int fent;    /* free entries */
    132     uint8 hfent; /* Indicates Half free entry available for v4 entries. */
    133 } soc_lpm_state_t;
    134 typedef  soc_lpm_state_t *soc_lpm_state_p;
    135 
    136 typedef struct soc_ext_lpm_stat_s {
    137     uint16 used_v4_count;
    138     uint16 used_64b_count;
    139     uint16 used_128b_count;
    140     uint16 max_v4_count;
    141     uint16 max_64b_count;
    142     uint16 max_128b_count;
    143 } soc_ext_lpm_stat_t;
    144 typedef soc_ext_lpm_stat_t *soc_ext_lpm_stat_p;
    145 
    146 /*
    147  * The idea of these offsets is to create unique space for each prefix type
    148  * The precedence is as follows
    149  * 128BV6 > 64B V6 > V4 irrespective of whether the entry is public or private
    150  * i.e any prefix of V4 is lesser than min prefix of 64B V6 and any prefix of
    151  * 64B V6 is lesser than 128B V6 from software perspective 
    152  */
    153 #if defined(BCM_TRIDENT3_SUPPORT)
    154 #define MAX_PFX_128_OFFSET              (6 * 129)
    155 #define MAX_PFX_64_OFFSET               (6 * 65)
    156 #define MAX_PFX_32_OFFSET               (6 * 33)
    157 #else
    158 #define MAX_PFX_128_OFFSET              (3 * 129)
    159 #define MAX_PFX_64_OFFSET               (3 * 65)
    160 #define MAX_PFX_32_OFFSET               (3 * 33)
    161 #endif
    162 #define MAX_PFX128_ENTRIES              (MAX_PFX_128_OFFSET + \
    163                                          MAX_PFX_64_OFFSET + \
    164                                          MAX_PFX_32_OFFSET + 2)
    165 #define MAX_PFX128_INDEX                (MAX_PFX128_ENTRIES - 1)
    166 #define SOC_LPM128_STATE_TABLE(u)       (soc_lpm128_state_table[u])
    167 #define SOC_LPM128_STATE_TABLE_INIT_CHECK(u) \
    168         (soc_lpm128_state_table[(u)] != NULL)
    169 #define SOC_LPM128_STATE_TABLE_TOTAL_COUNT(u) \
    170         (soc_lpm128_state_table[u]->total_count)
    171 
    172 #define SOC_LPM128_INIT_CHECK(u)        \
    173         (soc_lpm128_state_table[(u)]->soc_lpm_state != NULL)
    174 #define SOC_LPM128_STATE(u)             \
    175         (soc_lpm128_state_table[(u)]->soc_lpm_state)
    176 #define SOC_LPM128_STATE_START1(u, lpm_state, pfx) (lpm_state[pfx].start1)
    177 #define SOC_LPM128_STATE_START2(u, lpm_state, pfx) (lpm_state[pfx].start2)
    178 #define SOC_LPM128_STATE_END1(u, lpm_state, pfx) (lpm_state[pfx].end1)
    179 #define SOC_LPM128_STATE_END2(u, lpm_state, pfx) (lpm_state[pfx].end2)
    180 #define SOC_LPM128_STATE_PREV(u, lpm_state, pfx) (lpm_state[pfx].prev)
    181 #define SOC_LPM128_STATE_NEXT(u, lpm_state, pfx) (lpm_state[pfx].next)
    182 #define SOC_LPM128_STATE_VENT(u, lpm_state, pfx) (lpm_state[pfx].vent)
    183 #define SOC_LPM128_STATE_FENT(u, lpm_state, pfx) (lpm_state[pfx].fent)
    184 #define SOC_LPM128_STATE_HFENT(u, lpm_state, pfx) (lpm_state[pfx].hfent)
    185 
    186 #define SOC_LPM128_UNRESERVED_INIT_CHECK(u)        \
    187         (soc_lpm128_state_table[(u)]->soc_lpm_unreserved_state != NULL)
    188 #define SOC_LPM128_UNRESERVED_STATE(u)             \
    189         (soc_lpm128_state_table[(u)]->soc_lpm_unreserved_state)
    190 
    191 #define SOC_LPM128_INDEX_TO_PFX_GROUP_TABLE(u) \
    192         soc_lpm128_index_to_pfx_group[u]
    193 #define SOC_LPM128_INDEX_TO_PFX_GROUP(u, index) \
    194         soc_lpm128_index_to_pfx_group[u][index]
    195 
    196 #define SOC_LPM128_STAT_V4_COUNT(u) \
    197         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_v4_count)
    198 #define SOC_LPM128_STAT_64BV6_COUNT(u) \
    199         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_64b_count)
    200 #define SOC_LPM128_STAT_128BV6_COUNT(u) \
    201         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_128b_count)
    202 #define SOC_LPM128_STAT_MAX_V4_COUNT(u) \
    203         (soc_lpm128_state_table[(u)]->soc_lpm_stat.max_v4_count)
    204 #define SOC_LPM128_STAT_MAX_64BV6_COUNT(u) \
    205         (soc_lpm128_state_table[(u)]->soc_lpm_stat.max_64b_count)
    206 #define SOC_LPM128_STAT_MAX_128BV6_COUNT(u) \
    207         (soc_lpm128_state_table[(u)]->soc_lpm_stat.max_128b_count)
    208 #define SOC_LPM128_STAT_V4_HALF_ENTRY_COUNT(u) \
    209         (soc_lpm128_state_table[(u)]->soc_lpm_stat.half_entry_count)
    210 #ifdef FB_LPM_DEBUG
    211 #define SOC_LPM128_STAT_V4_COUNT2(u) \
    212         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_v4_count2)
    213 #define SOC_LPM128_STAT_64BV6_COUNT2(u) \
    214         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_64b_count2)
    215 #define SOC_LPM128_STAT_128BV6_COUNT2(u) \
    216         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_128b_count2)
    217 #define SOC_LPM128_STAT_V4_HALF_ENTRY_COUNT2(u) \
    218         (soc_lpm128_state_table[(u)]->soc_lpm_stat.half_entry_count2)
    219 #define SOC_LPM128_STAT_V4_COUNT1(u) \
    220         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_v4_count1)
    221 #define SOC_LPM128_STAT_64BV6_COUNT1(u) \
    222         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_64b_count1)
    223 #define SOC_LPM128_STAT_128BV6_COUNT1(u) \
    224         (soc_lpm128_state_table[(u)]->soc_lpm_stat.used_128b_count1)
    225 #define SOC_LPM128_STAT_V4_HALF_ENTRY_COUNT1(u) \
    226         (soc_lpm128_state_table[(u)]->soc_lpm_stat.half_entry_count1)
    227 #endif
    228 /*
    229  * This structure maintains 128B V6, 64B V6, V4 prefix groups
    230  * Ideally all entries of same length should be contigous.
    231  * But for V4, the entries may not be continous because V6 entries occupy odd
    232  * TCAM entries as well. So if the V4 prefix is not continous, start2 and end2
    233  * are used to represent this split. 
    234  * In case of V6 entries, if end1 is crossing tcam boundary, then we add offset
    235  * of tcam_depth(1024) as we start V6 entry in the odd TCAM. However start2,
    236  * end2 are not set.
    237  * fent: For V6 fent of 2 represents 2 entries end1 + 1 and end1 + 1 + 1024. 
    238  *       For V4 prefixes fent of 2 represents entries end1/end2 + 1, 
    239  *       end1/end2 + 2
    240  * vent: For V6 or V4 if we add a entry then vent will be increased by 1.
    241  */
    242 
    243 typedef struct soc_lpm128_state_s {
    244     int start1;  /* start index for this prefix length */
    245     int start2;  /* start index for this prefix length */
    246     int end1;    /* End index for this prefix length */
    247     int end2;    /* End index for this prefix length */
    248     int prev;    /* Previous (Lo to Hi) prefix length with non zero entry count*/
    249     int next;    /* Next (Hi to Lo) prefix length with non zero entry count */
    250     int vent;    /* valid entries */
    251     int fent;    /* free entries */
    252     uint8 hfent; /* Indicates Half free entry available for v4 entries. */
    253 } soc_lpm128_state_t;
    254 typedef soc_lpm128_state_t *soc_lpm128_state_p;
    255 
    256 typedef struct soc_lpm128_table_s {
    257     soc_lpm128_state_p soc_lpm_state;
    258     soc_lpm128_state_p soc_lpm_unreserved_state;
    259     uint16 total_count;
    260     soc_lpm_stat_t soc_lpm_stat;
    261 } soc_lpm128_table_t;
    262 
    263 typedef enum soc_lpm_entry_type_s {
    264     socLpmEntryTypeV4 = 0x1,
    265     socLpmEntryType64BV6 = 0x02,
    266     socLpmEntryType128BV6 = 0x04,
    267     socLpmEntryTypeLast = 0x08
    268 } soc_lpm_entry_type_t;
    269 
    270 extern soc_lpm_state_p soc_lpm_state[SOC_MAX_NUM_DEVICES];
    271 extern soc_lpm_stat_p soc_lpm_stat[SOC_MAX_NUM_DEVICES];
    272 extern soc_lpm128_table_t *soc_lpm128_state_table[SOC_MAX_NUM_DEVICES];
    273 extern soc_ext_lpm_stat_p soc_ext_lpm_stat[SOC_MAX_NUM_DEVICES];
    274 
    275 extern int soc_fb_lpm_state_config(int u, int ipv6_64_depth, int start);
    276 extern int soc_fb_lpm_init(int u);
    277 extern int soc_fb_lpm_deinit(int u);
    278 extern int soc_fb_lpm_insert(int unit, void *entry);
    279 extern int soc_fb_lpm_insert_index(int unit, void *entry, int index);
    280 extern int soc_fb_lpm_delete(int u, void *key_data);
    281 extern int soc_fb_lpm_delete_index(int u, void *key_data, int index);
    282 extern int soc_fb_lpm_match(int u, void *key_data, void *e, int *index_ptr);
    283 extern int soc_fb_lpm_ipv4_delete_index(int u, int index);
    284 extern int soc_fb_lpm_ipv6_delete_index(int u, int index);
    285 extern int soc_fb_lpm_ip4entry0_to_0(int u, void *src, void *dst, int copy_hit);
    286 extern int soc_fb_lpm_ip4entry1_to_1(int u, void *src, void *dst, int copy_hit);
    287 extern int soc_fb_lpm_ip4entry0_to_1(int u, void *src, void *dst, int copy_hit);
    288 extern int soc_fb_lpm_ip4entry1_to_0(int u, void *src, void *dst, int copy_hit);
    289 extern int soc_fb_lpm_vrf_get(int unit, void *lpm_entry, int *vrf);
    290 extern int soc_fb_lpm128_init(int u);
    291 extern int soc_fb_lpm128_deinit(int u);
    292 extern int soc_fb_get_largest_prefix(int u, int ipv6, void *e,
    293                               int *index, int *pfx_len, int* count);
    294 extern int soc_fb_lpm128_insert(int u, void *hw_entry_lwr, void *hw_entry_upr,
    295                                 int *index);
    296 extern int soc_fb_lpm128_match(int u,
    297                void *key_data,
    298                void *key_data_upr,
    299                void *e,         /* return entry data if found */
    300                void *eupr,         /* return entry data if found */
    301                int *index_ptr,
    302                int *pfx,
    303                soc_lpm_entry_type_t *type);
    304 extern int soc_fb_lpm128_delete(int u, void *key_data, void* key_data_upr);
    305 extern int soc_fb_lpm_tcam_pair_count_get(int u, int *tcam_pair_count);
    306 extern int soc_fb_lpm128_get_smallest_movable_prefix(int u, int ipv6, void *e,
    307                                                     void *eupr, int *index,
    308                                                     int *pfx_len, int *count);
    309 int soc_fb_lpm128_is_v4_64b_allowed_in_paired_tcam(int unit);
    310 int soc_fb_lpm_table_sizes_get(int unit, int *paired_table_size,
    311                                 int *defip_table_size);
    312 int soc_lpm_max_v4_route_get(int u, int *entries);
    313 int soc_lpm_max_64bv6_route_get(int u, int *entries);
    314 int soc_lpm_max_128bv6_route_get(int u, int *entries);
    315 int soc_lpm_free_v4_route_get(int u, int *entries);
    316 int soc_lpm_free_64bv6_route_get(int u, int *entries);
    317 int soc_lpm_free_128bv6_route_get(int u, int *entries);
    318 int soc_lpm_used_v4_route_get(int u, int *entries);
    319 int soc_lpm_used_64bv6_route_get(int u, int *entries);
    320 int soc_lpm_used_128bv6_route_get(int u, int *entries);
    321 int soc_fb_lpm_stat_init(int u);
    322 int soc_fb_lpm128_stat_init(int u);
    323 void soc_lpm_stat_128b_count_update(int u, int incr);
    324 int soc_lpm_reserved_route_get(int u, int *v4_entries,
    325                                int *v6_64_entries,
    326                                int *v6_128_entries);
    327 int soc_lpm_fb_urpf_entry_replicate_index_offset(int unit,
    328                                int *offset);
    329 
    330 #ifdef BCM_KATANA_SUPPORT
    331 
    332 typedef struct soc_kt_lpm_ipv6_cfg_s {
    333     uint32 sip_start_offset;
    334     uint32 dip_start_offset;
    335     uint32 depth;
    336 } soc_kt_lpm_ipv6_cfg_t;
    337 
    338 typedef struct soc_kt_lpm_info_s {
    339     soc_kt_lpm_ipv6_cfg_t ipv6_128b;
    340     soc_kt_lpm_ipv6_cfg_t ipv6_64b;
    341 } soc_kt_lpm_ipv6_info_t;
    342 
    343 extern soc_kt_lpm_ipv6_info_t *soc_kt_lpm_ipv6_info_get(int unit);
    344 #endif
    345 #ifdef BCM_WARM_BOOT_SUPPORT
    346 extern int soc_fb_lpm_reinit(int unit, int idx, uint32 *lpm_entry);
    347 extern int soc_fb_lpm_reinit_done(int unit, int ipv6);
    348 extern int soc_fb_lpm128_reinit(int unit, int idx, uint32 *lpm_entry,
    349                                 uint32 *lpm_entry_upr);
    350 extern int soc_fb_lpm128_reinit_done(int unit, int ipv6);
    351 
    352 #else
    353 #define soc_fb_lpm_reinit(u, t, s) (SOC_E_UNAVAIL)
    354 #define soc_fb_lpm_reinit_done(u, i) (SOC_E_UNAVAIL)
    355 #define soc_fb_lpm128_reinit(u, i, l, l1) (SOC_E_UNAVAIL)
    356 #define soc_fb_lpm128_reinit_done(u, i) (SOC_E_UNAVAIL)
    357 #endif /* BCM_WARM_BOOT_SUPPORT */
    358 
    359 #ifndef BCM_SW_STATE_DUMP_DISABLE
    360 extern void soc_fb_lpm_sw_dump(int unit);
    361 #endif /* BCM_SW_STATE_DUMP_DISABLE */
    362 
    363 /* Ranger2PLUS scale numbers with RPF */
    364 #define R2P_V4_MAX            512
    365 #define R2P_64V6_MAX          256
    366 #define R2P_128V6_MAX         128
    367 
    368 #endif	/* BCM_FIREBOLT_SUPPORT */
    369 
    370 #endif	/* !_LPM_H_ */