Files
vpp/src/plugins/cnat/cnat_translation.h
T
hedi bouattour 589fe7ca61 cnat: add flow hash config to cnat translation
Type: feature

this patch adds a hash config field to cnat translation
to use it in load balancing instead of always using default one

Change-Id: I5b79642ca8b365b5dcc06664f6c100a9d3830a29
Signed-off-by: hedi bouattour <hedibouattour2010@gmail.com>
2023-10-06 18:18:00 +00:00

284 lines
5.8 KiB
C

/*
* Copyright (c) 2020 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CNAT_TRANSLATION_H__
#define __CNAT_TRANSLATION_H__
#include <cnat/cnat_types.h>
#include <vnet/ip/ip_types.h>
#include <vppinfra/bihash_8_8.h>
/**
* Counters for each translation
*/
extern vlib_combined_counter_main_t cnat_translation_counters;
/**
* Data used to track an EP in the FIB
*/
typedef struct cnat_ep_trk_t_
{
/**
* The EP being tracked
*/
cnat_endpoint_t ct_ep[VLIB_N_DIR];
/**
* The FIB entry for the EP
*/
fib_node_index_t ct_fei;
/**
* The sibling on the entry's child list
*/
u32 ct_sibling;
/**
* The forwarding contributed by the entry
*/
dpo_id_t ct_dpo;
/**
* Allows to disable if not resolved yet
*/
u8 ct_flags; /* cnat_trk_flag_t */
} cnat_ep_trk_t;
typedef enum cnat_translation_flag_t_
{
/* Do allocate a source port */
CNAT_TR_FLAG_ALLOCATE_PORT = (1 << 0),
/* Has this translation been satcked ?
* this allow not being called twice when
* with more then FIB_PATH_LIST_POPULAR backends */
CNAT_TR_FLAG_STACKED = (1 << 1),
/* Do not create a return session */
CNAT_TR_FLAG_NO_RETURN_SESSION = (1 << 2),
} __clib_packed cnat_translation_flag_t;
typedef enum
{
CNAT_RESOLV_ADDR_ANY,
CNAT_RESOLV_ADDR_BACKEND,
CNAT_RESOLV_ADDR_SNAT,
CNAT_RESOLV_ADDR_TRANSLATION,
CNAT_ADDR_N_RESOLUTIONS,
} cnat_addr_resol_type_t;
typedef enum
{
CNAT_LB_DEFAULT,
CNAT_LB_MAGLEV,
} __clib_packed cnat_lb_type_t;
/**
* Entry used to account for a translation's backend
* waiting for address resolution
*/
typedef struct addr_resolution_t_
{
/**
* The interface index to resolve
*/
u32 sw_if_index;
/**
* ip4 or ip6 resolution
*/
ip_address_family_t af;
/**
* The cnat_addr_resolution_t
*/
cnat_addr_resol_type_t type;
/**
* Translation index
*/
index_t cti;
/**
* Callback data
*/
u64 opaque;
} addr_resolution_t;
/**
* A Translation represents the translation of a VEP to one of a set
* of real server addresses
*/
typedef struct cnat_translation_t_
{
/**
* Linkage into the FIB graph
*/
fib_node_t ct_node;
/**
* The LB used to forward to the backends
*/
dpo_id_t ct_lb;
/**
* The Virtual end point
*/
cnat_endpoint_t ct_vip;
/**
* The vector of tracked back-ends
*/
cnat_ep_trk_t *ct_paths;
/**
* The vector of active tracked back-ends
*/
cnat_ep_trk_t *ct_active_paths;
/**
* The ip protocol for the translation
*/
ip_protocol_t ct_proto;
/**
* The client object this translation belongs on
* INDEX_INVALID if vip is unresolved
*/
index_t ct_cci;
/**
* Own index (if copied for trace)
*/
index_t index;
/**
* Translation flags
*/
cnat_translation_flag_t flags;
/**
* Type of load balancing
*/
cnat_lb_type_t lb_type;
/**
* Type of flow hash config
*/
flow_hash_config_t fhc;
union
{
u32 *lb_maglev;
};
} cnat_translation_t;
extern cnat_translation_t *cnat_translation_pool;
extern u8 *format_cnat_translation (u8 * s, va_list * args);
/**
* create or update a translation
*
* @param vip The Virtual Endpoint
* @param ip_proto The ip protocol to translate
* @param backends the backends to choose from
*
* @return the ID of the translation. used to delete and gather stats
*/
extern u32 cnat_translation_update (cnat_endpoint_t *vip,
ip_protocol_t ip_proto,
cnat_endpoint_tuple_t *backends, u8 flags,
cnat_lb_type_t lb_type,
flow_hash_config_t fhc);
/**
* Delete a translation
*
* @param id the ID as returned from the create
*/
extern int cnat_translation_delete (u32 id);
/**
* Callback function invoked during a walk of all translations
*/
typedef walk_rc_t (*cnat_translation_walk_cb_t) (index_t index, void *ctx);
/**
* Walk/visit each of the translations
*/
extern void cnat_translation_walk (cnat_translation_walk_cb_t cb, void *ctx);
/**
* Purge all the trahslations
*/
extern int cnat_translation_purge (void);
/**
* Add an address resolution request
*/
extern void cnat_translation_watch_addr (index_t cti, u64 opaque,
cnat_endpoint_t * ep,
cnat_addr_resol_type_t type);
/**
* Cleanup matching addr resolution requests
*/
extern void cnat_translation_unwatch_addr (u32 cti,
cnat_addr_resol_type_t type);
/**
* Register a call back for endpoint->address resolution
*/
typedef void (*cnat_if_addr_add_cb_t) (addr_resolution_t *ar,
ip_address_t *address, u8 is_del);
extern void cnat_translation_register_addr_add_cb (cnat_addr_resol_type_t typ,
cnat_if_addr_add_cb_t fn);
/*
* Data plane functions
*/
extern clib_bihash_8_8_t cnat_translation_db;
static_always_inline cnat_translation_t *
cnat_translation_get (index_t cti)
{
return (pool_elt_at_index (cnat_translation_pool, cti));
}
static_always_inline cnat_translation_t *
cnat_find_translation (index_t cti, u16 port, ip_protocol_t proto)
{
clib_bihash_kv_8_8_t bkey, bvalue;
u64 key;
int rv;
key = ((u64) proto << 24) | port;
key = key << 32 | (u32) cti;
bkey.key = key;
rv = clib_bihash_search_inline_2_8_8 (&cnat_translation_db, &bkey, &bvalue);
if (!rv)
return (pool_elt_at_index (cnat_translation_pool, bvalue.value));
return (NULL);
}
/*
* fd.io coding-style-patch-verification: ON
*
* Local Variables:
* eval: (c-set-style "gnu")
* End:
*/
#endif