ft_common.h (6978B)
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-2020 Broadcom Inc. All rights reserved. 6 * 7 * File: ft_common.h 8 * Purpose: Function declarations for common flowtracker routines. 9 */ 10 11 #ifndef _BCM_INT_FT_COMMON_H_ 12 #define _BCM_INT_FT_COMMON_H_ 13 14 #if defined(BCM_FLOWTRACKER_SUPPORT) 15 #include <bcm/flowtracker.h> 16 17 /* 18 * Donot change enum sequence. Append in last always 19 * FlowTracker types in pipeline. 20 */ 21 typedef enum bcmi_ft_type_e { 22 bcmiFtTypeNone = 0, 23 bcmiFtTypeIFT = 1, 24 bcmiFtTypeMFT = 2, 25 bcmiFtTypeEFT = 3, 26 bcmiFtTypeAIFT = 4, 27 bcmiFtTypeAMFT = 5, 28 bcmiFtTypeAEFT = 6, 29 bcmiFtTypeCount = 7 30 } bcmi_ft_type_t; 31 32 #define BCMI_FT_TYPE_STRINGS \ 33 { \ 34 "None", \ 35 "Ingress", \ 36 "Mmu", \ 37 "Egress", \ 38 "AggregateIngress", \ 39 "AggregateMmu", \ 40 "AggregateEgress", \ 41 "Count" \ 42 } 43 44 /* Flowtracker Type Flags */ 45 #define BCMI_FT_TYPE_F_IFT (1 << bcmiFtTypeIFT) 46 #define BCMI_FT_TYPE_F_MFT (1 << bcmiFtTypeMFT) 47 #define BCMI_FT_TYPE_F_EFT (1 << bcmiFtTypeEFT) 48 #define BCMI_FT_TYPE_F_AIFT (1 << bcmiFtTypeAIFT) 49 #define BCMI_FT_TYPE_F_AMFT (1 << bcmiFtTypeAMFT) 50 #define BCMI_FT_TYPE_F_AEFT (1 << bcmiFtTypeAEFT) 51 52 #define BCMI_FT_TYPE_F_MICRO (BCMI_FT_TYPE_F_IFT | \ 53 BCMI_FT_TYPE_F_MFT | \ 54 BCMI_FT_TYPE_F_EFT) 55 56 #define BCMI_FT_TYPE_F_AGG (BCMI_FT_TYPE_F_AIFT | \ 57 BCMI_FT_TYPE_F_AMFT | \ 58 BCMI_FT_TYPE_F_AEFT) 59 60 #define BCMI_FT_TYPE_F_ANY (BCMI_FT_TYPE_F_MICRO | \ 61 BCMI_FT_TYPE_F_AGG) 62 63 /* Check if only one of the ft type is set */ 64 #define BCMI_FT_TYPE_F_IS_UNIQUE(_ft_type_flags_) \ 65 (!((_ft_type_flags_) & ((_ft_type_flags_) - 1))) 66 67 /* Get ft type when only 1b is set */ 68 #define BCMI_FT_TYPE_F_UNIQUE_GET(_ft_type_flags_, _ft_type_) \ 69 do { \ 70 int idx = 0; \ 71 for (idx = 0; idx < bcmiFtTypeCount; idx++) { \ 72 if ((_ft_type_flags_) & (1 << idx)) { \ 73 (_ft_type_) = idx; \ 74 } \ 75 } \ 76 } while (0) 77 78 #define BCMI_FT_GROUP_FT_TYPE_BMP_GET(_gt_, _ft_type_bmp_) \ 79 do { \ 80 if ((_gt_) == bcmFlowtrackerGroupTypeNone) { \ 81 (_ft_type_bmp_) = BCMI_FT_TYPE_F_MICRO; \ 82 } else if ((_gt_) == bcmFlowtrackerGroupTypeAggregateIngress) { \ 83 (_ft_type_bmp_) = BCMI_FT_TYPE_F_AIFT; \ 84 } else if ((_gt_) == bcmFlowtrackerGroupTypeAggregateMmu) { \ 85 (_ft_type_bmp_) = BCMI_FT_TYPE_F_AMFT; \ 86 } else { /* bcmFlowtrackerGroupTypeAggregateEgress */ \ 87 (_ft_type_bmp_) = BCMI_FT_TYPE_F_AEFT; \ 88 } \ 89 } while(0) 90 91 #define BCMI_FT_GROUP_CHECK_FT_TYPE_GET(_gftbmp_, _cftbmp_, _fftbmp_,_fft_) \ 92 do { \ 93 _fftbmp_ = (_gftbmp_ & _cftbmp_); \ 94 if (BCMI_FT_TYPE_F_IS_UNIQUE(_fftbmp_)) { \ 95 BCMI_FT_TYPE_F_UNIQUE_GET(_fftbmp_, _fft_); \ 96 } else { \ 97 /* Could not determine ft_type for the check, Lets take \ 98 first ft_type */ \ 99 if (_fftbmp_ & BCMI_FT_TYPE_F_IFT) { \ 100 _fft_ = bcmiFtTypeIFT; \ 101 } else if (_fftbmp_ & BCMI_FT_TYPE_F_MFT) { \ 102 _fft_ = bcmiFtTypeMFT; \ 103 } else { \ 104 _fft_ = bcmiFtTypeEFT; \ 105 } \ 106 } \ 107 } while(0) 108 109 110 /* Generic memory allocation routine. */ 111 #define BCMI_FT_ALLOC(_ptr_, _size_, _descr_) \ 112 do { \ 113 int _lsize_; \ 114 _lsize_ = (_size_ ); \ 115 if (NULL == (_ptr_)) { \ 116 (_ptr_) = sal_alloc((_lsize_), (_descr_)); \ 117 } \ 118 if((_ptr_) != NULL) { \ 119 sal_memset((_ptr_), 0, (_lsize_)); \ 120 } else { \ 121 LOG_ERROR(BSL_LS_BCM_FLOWTRACKER, \ 122 (BSL_META("FT Error: Allocation" \ 123 " failure %s\n"), (_descr_))); \ 124 } \ 125 } while (0) 126 127 /* Generic memory allocation. If error, cleanup */ 128 #define BCMI_FT_ALLOC_IF_ERR_CLEANUP(_ptr_, _size_, _descr_) \ 129 do { \ 130 BCMI_FT_ALLOC(_ptr_, _size_, _descr_); \ 131 if ((_ptr_) == NULL) { \ 132 rv = BCM_E_MEMORY; \ 133 goto cleanup; \ 134 } \ 135 } while (0) 136 137 /* Generic memory free routine. */ 138 #define BCMI_FT_FREE(_ptr_) \ 139 do { \ 140 if (NULL != (_ptr_)) { \ 141 sal_free((_ptr_)); \ 142 } \ 143 (_ptr_) = NULL; \ 144 } while (0) 145 146 int 147 bcmi_ft_group_type_mem_get( 148 int unit, 149 int key_or_data, 150 bcm_flowtracker_group_type_t group_type, 151 soc_mem_t *mem); 152 153 int 154 bcmi_ft_type_support_check( 155 int unit, 156 bcmi_ft_type_t ft_type, 157 int *support); 158 159 #endif /* BCM_FLOWTRACKER_SUPPORT */ 160 #endif /* _BCM_INT_FT_COMMON_H_ */