abf: add feature.yaml
[vpp.git] / src / plugins / nat / nat_reass.h
index ae14a96..11f9db5 100644 (file)
 #define NAT_MAX_FRAG_DEFAULT 5
 #define NAT_REASS_HT_LOAD_FACTOR (0.75)
 
+#define NAT_REASS_FLAG_MAX_FRAG_DROP 1
+#define NAT_REASS_FLAG_CLASSIFY_ED_CONTINUE 2
+#define NAT_REASS_FLAG_ED_DONT_TRANSLATE 4
+
 typedef struct
 {
   union
@@ -47,15 +51,25 @@ typedef struct
   };
 } nat_reass_ip4_key_t;
 
+enum
+{
+  NAT_REASS_IP4_CLASSIFY_NONE,
+  NAT_REASS_IP4_CLASSIFY_NEXT_IN2OUT,
+  NAT_REASS_IP4_CLASSIFY_NEXT_OUT2IN
+};
+
 /* *INDENT-OFF* */
 typedef CLIB_PACKED(struct
 {
   nat_reass_ip4_key_t key;
   u32 lru_list_index;
   u32 sess_index;
+  u32 thread_index;
   f64 last_heard;
   u32 frags_per_reass_list_head_index;
   u8 frag_n;
+  u8 flags;
+  u8 classify_next;
 }) nat_reass_ip4_t;
 /* *INDENT-ON* */
 
@@ -85,6 +99,7 @@ typedef CLIB_PACKED(struct
   f64 last_heard;
   u32 frags_per_reass_list_head_index;
   u8 frag_n;
+  u8 flags;
 }) nat_reass_ip6_t;
 /* *INDENT-ON* */
 
@@ -184,6 +199,33 @@ u8 nat_reass_is_drop_frag (u8 is_ip6);
  */
 clib_error_t *nat_reass_init (vlib_main_t * vm);
 
+/**
+ * @brief Find reassembly.
+ *
+ * @param src Source IPv4 address.
+ * @param dst Destination IPv4 address.
+ * @param frag_id Fragment ID.
+ * @param proto L4 protocol.
+ *
+ * @returns Reassembly data or 0 if not found.
+ */
+nat_reass_ip4_t *nat_ip4_reass_find (ip4_address_t src,
+                                    ip4_address_t dst,
+                                    u16 frag_id, u8 proto);
+
+/**
+ * @brief Create reassembly.
+ *
+ * @param src Source IPv4 address.
+ * @param dst Destination IPv4 address.
+ * @param frag_id Fragment ID.
+ * @param proto L4 protocol.
+ *
+ * @returns Reassembly data or 0 on failure.
+ */
+nat_reass_ip4_t *nat_ip4_reass_create (ip4_address_t src, ip4_address_t dst,
+                                      u16 frag_id, u8 proto);
+
 /**
  * @brief Find or create reassembly.
  *
@@ -201,15 +243,18 @@ nat_reass_ip4_t *nat_ip4_reass_find_or_create (ip4_address_t src,
                                               u16 frag_id, u8 proto,
                                               u8 reset_timeout,
                                               u32 ** bi_to_drop);
+
 /**
  * @brief Cache fragment.
  *
  * @param reass Reassembly data.
  * @param bi Buffer index.
+ * @param bi_to_drop Fragments to drop.
  *
  * @returns 0 on success, non-zero value otherwise.
  */
-int nat_ip4_reass_add_fragment (nat_reass_ip4_t * reass, u32 bi);
+int nat_ip4_reass_add_fragment (u32 thread_index, nat_reass_ip4_t * reass,
+                               u32 bi, u32 ** bi_to_drop);
 
 /**
  * @brief Get cached fragments.
@@ -255,10 +300,12 @@ nat_reass_ip6_t *nat_ip6_reass_find_or_create (ip6_address_t src,
  *
  * @param reass Reassembly data.
  * @param bi Buffer index.
+ * @param bi_to_drop Fragments to drop.
  *
  * @returns 0 on success, non-zero value otherwise.
  */
-int nat_ip6_reass_add_fragment (nat_reass_ip6_t * reass, u32 bi);
+int nat_ip6_reass_add_fragment (u32 thread_index, nat_reass_ip6_t * reass,
+                               u32 bi, u32 ** bi_to_drop);
 
 /**
  * @brief Get cached fragments.