Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2018 Vladimir Medvedkin <medvedkinv@gmail.com> 3 : : * Copyright(c) 2019 Intel Corporation 4 : : */ 5 : : 6 : : #ifndef _RTE_RIB_H_ 7 : : #define _RTE_RIB_H_ 8 : : 9 : : /** 10 : : * @file 11 : : * 12 : : * RTE RIB library. 13 : : * 14 : : * Level compressed tree implementation for IPv4 Longest Prefix Match 15 : : */ 16 : : 17 : : #include <stdlib.h> 18 : : #include <stdint.h> 19 : : 20 : : 21 : : #ifdef __cplusplus 22 : : extern "C" { 23 : : #endif 24 : : 25 : : /** 26 : : * rte_rib_get_nxt() flags 27 : : */ 28 : : enum { 29 : : /** flag to get all subroutes in a RIB tree */ 30 : : RTE_RIB_GET_NXT_ALL, 31 : : /** flag to get first matched subroutes in a RIB tree */ 32 : : RTE_RIB_GET_NXT_COVER 33 : : }; 34 : : 35 : : struct rte_rib; 36 : : struct rte_rib_node; 37 : : 38 : : /** RIB configuration structure */ 39 : : struct rte_rib_conf { 40 : : /** 41 : : * Size of extension block inside rte_rib_node. 42 : : * This space could be used to store additional user 43 : : * defined data. 44 : : */ 45 : : size_t ext_sz; 46 : : /* size of rte_rib_node's pool */ 47 : : int max_nodes; 48 : : }; 49 : : 50 : : /** 51 : : * Get an IPv4 mask from prefix length 52 : : * It is caller responsibility to make sure depth is not bigger than 32 53 : : * 54 : : * @param depth 55 : : * prefix length 56 : : * @return 57 : : * IPv4 mask 58 : : */ 59 : : static inline uint32_t 60 : : rte_rib_depth_to_mask(uint8_t depth) 61 : : { 62 [ + - + + : 54813 : return (uint32_t)(UINT64_MAX << (32 - depth)); + - + - + + + + ] 63 : : } 64 : : 65 : : /** 66 : : * Lookup an IP into the RIB structure 67 : : * 68 : : * @param rib 69 : : * RIB object handle 70 : : * @param ip 71 : : * IP to be looked up in the RIB 72 : : * @return 73 : : * pointer to struct rte_rib_node on success 74 : : * NULL otherwise 75 : : */ 76 : : struct rte_rib_node * 77 : : rte_rib_lookup(struct rte_rib *rib, uint32_t ip); 78 : : 79 : : /** 80 : : * Lookup less specific route into the RIB structure 81 : : * 82 : : * @param ent 83 : : * Pointer to struct rte_rib_node that represents target route 84 : : * @return 85 : : * pointer to struct rte_rib_node that represents 86 : : * less specific route on success 87 : : * NULL otherwise 88 : : */ 89 : : struct rte_rib_node * 90 : : rte_rib_lookup_parent(struct rte_rib_node *ent); 91 : : 92 : : /** 93 : : * Lookup prefix into the RIB structure 94 : : * 95 : : * @param rib 96 : : * RIB object handle 97 : : * @param ip 98 : : * net to be looked up in the RIB 99 : : * @param depth 100 : : * prefix length 101 : : * @return 102 : : * pointer to struct rte_rib_node on success 103 : : * NULL otherwise 104 : : */ 105 : : struct rte_rib_node * 106 : : rte_rib_lookup_exact(struct rte_rib *rib, uint32_t ip, uint8_t depth); 107 : : 108 : : /** 109 : : * Retrieve next more specific prefix from the RIB 110 : : * that is covered by ip/depth supernet in an ascending order 111 : : * 112 : : * @param rib 113 : : * RIB object handle 114 : : * @param ip 115 : : * net address of supernet prefix that covers returned more specific prefixes 116 : : * @param depth 117 : : * supernet prefix length 118 : : * @param last 119 : : * pointer to the last returned prefix to get next prefix 120 : : * or 121 : : * NULL to get first more specific prefix 122 : : * @param flag 123 : : * -RTE_RIB_GET_NXT_ALL 124 : : * get all prefixes from subtrie 125 : : * -RTE_RIB_GET_NXT_COVER 126 : : * get only first more specific prefix even if it have more specifics 127 : : * @return 128 : : * pointer to the next more specific prefix 129 : : * NULL if there is no prefixes left 130 : : */ 131 : : struct rte_rib_node * 132 : : rte_rib_get_nxt(struct rte_rib *rib, uint32_t ip, uint8_t depth, 133 : : struct rte_rib_node *last, int flag); 134 : : 135 : : /** 136 : : * Remove prefix from the RIB 137 : : * 138 : : * @param rib 139 : : * RIB object handle 140 : : * @param ip 141 : : * net to be removed from the RIB 142 : : * @param depth 143 : : * prefix length 144 : : */ 145 : : void 146 : : rte_rib_remove(struct rte_rib *rib, uint32_t ip, uint8_t depth); 147 : : 148 : : /** 149 : : * Insert prefix into the RIB 150 : : * 151 : : * @param rib 152 : : * RIB object handle 153 : : * @param ip 154 : : * net to be inserted to the RIB 155 : : * @param depth 156 : : * prefix length 157 : : * @return 158 : : * pointer to new rte_rib_node on success 159 : : * NULL otherwise 160 : : */ 161 : : struct rte_rib_node * 162 : : rte_rib_insert(struct rte_rib *rib, uint32_t ip, uint8_t depth); 163 : : 164 : : /** 165 : : * Get an ip from rte_rib_node 166 : : * 167 : : * @param node 168 : : * pointer to the rib node 169 : : * @param ip 170 : : * pointer to the ip to save 171 : : * @return 172 : : * 0 on success. 173 : : * -1 on failure with rte_errno indicating reason for failure. 174 : : */ 175 : : int 176 : : rte_rib_get_ip(const struct rte_rib_node *node, uint32_t *ip); 177 : : 178 : : /** 179 : : * Get a depth from rte_rib_node 180 : : * 181 : : * @param node 182 : : * pointer to the rib node 183 : : * @param depth 184 : : * pointer to the depth to save 185 : : * @return 186 : : * 0 on success. 187 : : * -1 on failure with rte_errno indicating reason for failure. 188 : : */ 189 : : int 190 : : rte_rib_get_depth(const struct rte_rib_node *node, uint8_t *depth); 191 : : 192 : : /** 193 : : * Get ext field from the rib node 194 : : * It is caller responsibility to make sure there are necessary space 195 : : * for the ext field inside rib node. 196 : : * 197 : : * @param node 198 : : * pointer to the rib node 199 : : * @return 200 : : * pointer to the ext 201 : : */ 202 : : void * 203 : : rte_rib_get_ext(struct rte_rib_node *node); 204 : : 205 : : /** 206 : : * Get nexthop from the rib node 207 : : * 208 : : * @param node 209 : : * pointer to the rib node 210 : : * @param nh 211 : : * pointer to the nexthop to save 212 : : * @return 213 : : * 0 on success. 214 : : * -1 on failure with rte_errno indicating reason for failure. 215 : : */ 216 : : int 217 : : rte_rib_get_nh(const struct rte_rib_node *node, uint64_t *nh); 218 : : 219 : : /** 220 : : * Set nexthop into the rib node 221 : : * 222 : : * @param node 223 : : * pointer to the rib node 224 : : * @param nh 225 : : * nexthop value to set to the rib node 226 : : * @return 227 : : * 0 on success. 228 : : * -1 on failure with rte_errno indicating reason for failure. 229 : : */ 230 : : int 231 : : rte_rib_set_nh(struct rte_rib_node *node, uint64_t nh); 232 : : 233 : : /** 234 : : * Create RIB 235 : : * 236 : : * @param name 237 : : * RIB name 238 : : * @param socket_id 239 : : * NUMA socket ID for RIB table memory allocation 240 : : * @param conf 241 : : * Structure containing the configuration 242 : : * @return 243 : : * Handle to RIB object on success 244 : : * NULL otherwise with rte_errno indicating reason for failure. 245 : : */ 246 : : struct rte_rib * 247 : : rte_rib_create(const char *name, int socket_id, 248 : : const struct rte_rib_conf *conf); 249 : : 250 : : /** 251 : : * Find an existing RIB object and return a pointer to it. 252 : : * 253 : : * @param name 254 : : * Name of the rib object as passed to rte_rib_create() 255 : : * @return 256 : : * Pointer to RIB object on success 257 : : * NULL otherwise with rte_errno indicating reason for failure. 258 : : */ 259 : : struct rte_rib * 260 : : rte_rib_find_existing(const char *name); 261 : : 262 : : /** 263 : : * Free an RIB object. 264 : : * 265 : : * @param rib 266 : : * RIB object handle created with rte_rib_create(). 267 : : * If rib is NULL, no operation is performed. 268 : : */ 269 : : void 270 : : rte_rib_free(struct rte_rib *rib); 271 : : 272 : : #ifdef __cplusplus 273 : : } 274 : : #endif 275 : : 276 : : #endif /* _RTE_RIB_H_ */