cnat: Prepare extended snat policies
[vpp.git] / src / plugins / cnat / cnat_translation.h
index 748487a..3b6e694 100644 (file)
  */
 extern vlib_combined_counter_main_t cnat_translation_counters;
 
+typedef enum cnat_trk_flag_t_
+{
+  CNAT_TRK_ACTIVE = (1 << 0),
+  CNAT_TRK_FLAG_NO_NAT = (1 << 1),
+} cnat_trk_flag_t;
+
 /**
  * Data used to track an EP in the FIB
  */
@@ -49,13 +55,66 @@ typedef struct cnat_ep_trk_t_
    * 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_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_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 __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
+ */
+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
@@ -82,6 +141,11 @@ typedef struct cnat_translation_t_
    */
   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
    */
@@ -89,6 +153,7 @@ typedef struct cnat_translation_t_
 
   /**
    * The client object this translation belongs on
+   * INDEX_INVALID if vip is unresolved
    */
   index_t ct_cci;
 
@@ -101,6 +166,16 @@ typedef struct cnat_translation_t_
    * 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;
@@ -116,31 +191,10 @@ extern u8 *format_cnat_translation (u8 * s, va_list * args);
  *
  * @return the ID of the translation. used to delete and gather stats
  */
-extern u32 cnat_translation_update (const cnat_endpoint_t * vip,
+extern u32 cnat_translation_update (cnat_endpoint_t *vip,
                                    ip_protocol_t ip_proto,
-                                   const cnat_endpoint_tuple_t *
-                                   backends, u8 flags);
-
-/**
- * Add a translation to the bihash
- *
- * @param cci the ID of the parent client
- * @param port the translation port
- * @param proto the translation proto
- * @param cti the translation index to be used as value
- */
-extern void cnat_add_translation_to_db (index_t cci, u16 port,
-                                       ip_protocol_t proto, index_t cti);
-
-/**
- * Remove a translation from the bihash
- *
- * @param cci the ID of the parent client
- * @param port the translation port
- * @param proto the translation proto
- */
-extern void cnat_remove_translation_from_db (index_t cci, u16 port,
-                                            ip_protocol_t proto);
+                                   cnat_endpoint_tuple_t *backends, u8 flags,
+                                   cnat_lb_type_t lb_type);
 
 /**
  * Delete a translation
@@ -164,6 +218,28 @@ extern void cnat_translation_walk (cnat_translation_walk_cb_t cb, void *ctx);
  */
 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
  */
@@ -182,7 +258,7 @@ cnat_find_translation (index_t cti, u16 port, ip_protocol_t proto)
   u64 key;
   int rv;
 
-  key = (proto << 16) | port;
+  key = ((u64) proto << 24) | port;
   key = key << 32 | (u32) cti;
 
   bkey.key = key;