*/
extern vlib_combined_counter_main_t cnat_translation_counters;
+
/**
* Data used to track an EP in the FIB
*/
/**
* Allows to disable if not resolved yet
*/
- u8 is_active;
+ u8 ct_flags; /* cnat_trk_flag_t */
} cnat_ep_trk_t;
typedef enum cnat_translation_flag_t_
{
+ /* Do allocate a source port */
CNAT_TRANSLATION_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_TRANSLATION_STACKED = (1 << 1),
} cnat_translation_flag_t;
typedef enum
CNAT_ADDR_N_RESOLUTIONS,
} cnat_addr_resol_type_t;
+typedef enum __attribute__ ((__packed__))
+{
+ CNAT_LB_DEFAULT,
+ CNAT_LB_MAGLEV,
+} cnat_lb_type_t;
+
/**
* Entry used to account for a translation's backend
* waiting for address resolution
*/
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
*/
* Translation flags
*/
u8 flags;
+
+ /**
+ * Type of load balancing
+ */
+ cnat_lb_type_t lb_type;
+
+ union
+ {
+ u32 *lb_maglev;
+ };
} cnat_translation_t;
extern cnat_translation_t *cnat_translation_pool;
*
* @return the ID of the translation. used to delete and gather stats
*/
-extern u32 cnat_translation_update (cnat_endpoint_t * vip,
+extern u32 cnat_translation_update (cnat_endpoint_t *vip,
ip_protocol_t ip_proto,
- cnat_endpoint_tuple_t *
- backends, u8 flags);
+ cnat_endpoint_tuple_t *backends, u8 flags,
+ cnat_lb_type_t lb_type);
/**
* Delete a translation
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
*/
u64 key;
int rv;
- key = (proto << 24) | port;
+ key = ((u64) proto << 24) | port;
key = key << 32 | (u32) cti;
bkey.key = key;