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