X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fnat%2Fnat_reass.h;h=11f9db5a252065b5f67639348099d539b20911f2;hb=3535501b19aec95dfd32870c784f841f57b5c045;hp=ae14a9604aac51638e583ff6e877687f76689fe3;hpb=efcd1e9e1d7dda4e4ea3db5750925cd8f6894f4d;p=vpp.git diff --git a/src/plugins/nat/nat_reass.h b/src/plugins/nat/nat_reass.h index ae14a9604aa..11f9db5a252 100644 --- a/src/plugins/nat/nat_reass.h +++ b/src/plugins/nat/nat_reass.h @@ -30,6 +30,10 @@ #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.