#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
};
} 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* */
f64 last_heard;
u32 frags_per_reass_list_head_index;
u8 frag_n;
+ u8 flags;
}) nat_reass_ip6_t;
/* *INDENT-ON* */
*/
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 Find or create reassembly.
*
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 (nat_reass_ip4_t * reass, u32 bi,
+ u32 ** bi_to_drop);
/**
* @brief Get cached fragments.
*
* @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 (nat_reass_ip6_t * reass, u32 bi,
+ u32 ** bi_to_drop);
/**
* @brief Get cached fragments.