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

trie_util.h (3432B)


      1 /*
      2  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      3  * 
      4  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      5  *
      6  * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
      7  * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE.
      8  * BROADCOM SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
      9  * FITNESS FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
     10  *
     11  * 
     12  *
     13  * TAPS utility defines/functions
     14  *
     15  *-----------------------------------------------------------------------------
     16  */
     17 #ifndef _ESW_TRIDENT2_TRIE_UTIL_H_
     18 #define _ESW_TRIDENT2_TRIE_UTIL_H_
     19 
     20 #ifdef ALPM_ENABLE
     21 #ifndef ALPM_IPV6_128_SUPPORT
     22 #include <sal/types.h>
     23 
     24 /* loop up key size */
     25 #define TAPS_IPV4_MAX_VRF_SIZE (16)
     26 #define TAPS_IPV4_PFX_SIZE (32)
     27 #define TAPS_IPV4_KEY_SIZE (TAPS_IPV4_MAX_VRF_SIZE + TAPS_IPV4_PFX_SIZE)
     28 #define TAPS_IPV4_KEY_SIZE_WORDS (((TAPS_IPV4_KEY_SIZE)+31)/32)
     29 
     30 #define TAPS_IPV6_MAX_VRF_SIZE (16)
     31 #define TAPS_IPV6_PFX_SIZE (128)
     32 #define TAPS_IPV6_KEY_SIZE (TAPS_IPV6_MAX_VRF_SIZE + TAPS_IPV6_PFX_SIZE)
     33 #define TAPS_IPV6_KEY_SIZE_WORDS (((TAPS_IPV6_KEY_SIZE)+31)/32)
     34 #define TAPS_MAX_KEY_SIZE       (TAPS_IPV6_KEY_SIZE)
     35 #define TAPS_MAX_KEY_SIZE_WORDS (((TAPS_MAX_KEY_SIZE)+31)/32)
     36 
     37 
     38 
     39 
     40 #define TP_MASK(len) \
     41   (((len)>=32)?0xffffFFFF:((1U<<(len))-1))
     42 
     43 #define TP_SHL(data, shift) \
     44   (((shift)>=32)?0:((data)<<(shift)))
     45 
     46 #define TP_SHR(data, shift) \
     47   (((shift)>=32)?0:((data)>>(shift)))
     48 
     49 /* get bit at bit_position from uint32 key array of maximum length of max_len 
     50  * assuming the big-endian word order. bit_pos is 0 based. for example, assuming
     51  * the max_len is 48 bits, then key[0] has bits 47-32, and key[1] has bits 31-0.
     52  * use _TAPS_GET_KEY_BIT(key, 0, 48) to get bit 0.
     53  */
     54 #define TP_BITS2IDX(bit_pos, max_len) \
     55   ((BITS2WORDS(max_len) - 1) - (bit_pos)/32)
     56 
     57 #define _TAPS_GET_KEY_BIT(key, bit_pos, max_len) \
     58   (((key)[TP_BITS2IDX(bit_pos, max_len)] & (1<<((bit_pos)%32))) >> ((bit_pos)%32))
     59 
     60 #define _TAPS_SET_KEY_BIT(key, bit_pos, max_len) \
     61   ((key)[TP_BITS2IDX(bit_pos, max_len)] |= (1<<((bit_pos)%32)))
     62 
     63 /* Get "len" number of bits start with lsb bit postion from an unsigned int array
     64  * the array is assumed to be with format described above in _TAPS_GET_KEY_BIT
     65  * NOTE: len must be <= 32 bits
     66  */
     67 #define _TAPS_GET_KEY_BITS(key, lsb, len, max_len)			  \
     68   ((TP_SHR((key)[TP_BITS2IDX(lsb, max_len)], ((lsb)%32)) |	\
     69     ((TP_BITS2IDX(lsb, max_len)<1)?0:(TP_SHL((key)[TP_BITS2IDX(lsb, max_len)-1], 32-((lsb)%32))))) & \
     70    (TP_MASK((len))))
     71 
     72 typedef struct taps_ipv4_prefix_s {
     73     uint32 length:8;
     74     uint32 vrf:16;
     75     uint32 key;
     76 } taps_ipv4_prefix_t;
     77 
     78 typedef struct taps_ipv6_prefix_s {
     79     uint32 length:8;
     80     uint32 vrf:16;
     81     uint32 key[4];
     82 } taps_ipv6_prefix_t;
     83 
     84 extern int taps_show_prefix(uint32 max_key_size, uint32 *key, uint32 length);
     85 
     86 extern int taps_key_shift(uint32 max_key_size, uint32 *key, uint32 length, int32 shift);
     87 
     88 extern int taps_key_match(uint32 max_key_size, uint32 *key1, uint32 length1,
     89 			  uint32 *key2, uint32 length2);
     90 
     91 extern int taps_get_lsb(uint32 max_mask_size, uint32 *mask, int32 *lsb);
     92 
     93 extern int taps_get_bpm_pfx(unsigned int *bpm, unsigned int key_len,
     94 			    unsigned int max_key_len, unsigned int *pfx_len);
     95 
     96 #endif /* ALPM_IPV6_128_SUPPORT */
     97 #endif /* ALPM_ENABLE */
     98 
     99 #endif /* _ESW_TRIDENT2_TRIE_UTIL_H_ */