#define SNAT_FLAG_HAIRPINNING (1 << 0)
/* NAT44 API Configuration flags */
-#define foreach_nat44_config_flag \
- _(0x00, IS_ENDPOINT_INDEPENDENT) \
- _(0x01, IS_ENDPOINT_DEPENDENT) \
- _(0x02, IS_STATIC_MAPPING_ONLY) \
- _(0x04, IS_CONNECTION_TRACKING) \
- _(0x08, IS_OUT2IN_DPO)
+#define foreach_nat44_config_flag \
+ _ (0x00, IS_ENDPOINT_INDEPENDENT) \
+ _ (0x01, IS_ENDPOINT_DEPENDENT) \
+ _ (0x02, IS_STATIC_MAPPING_ONLY) \
+ _ (0x04, IS_CONNECTION_TRACKING)
typedef enum nat44_config_flags_t_
{
#define NAT_INTERFACE_FLAG_IS_OUTSIDE 2
/* Static mapping flags */
-#define NAT_STATIC_MAPPING_FLAG_ADDR_ONLY 1
-#define NAT_STATIC_MAPPING_FLAG_OUT2IN_ONLY 2
-#define NAT_STATIC_MAPPING_FLAG_IDENTITY_NAT 4
-#define NAT_STATIC_MAPPING_FLAG_LB 8
-#define NAT_STATIC_MAPPING_FLAG_EXACT_ADDRESS 16
+#define NAT_SM_FLAG_SELF_TWICE_NAT (1 << 1)
+#define NAT_SM_FLAG_TWICE_NAT (1 << 2)
+#define NAT_SM_FLAG_IDENTITY_NAT (1 << 3)
+#define NAT_SM_FLAG_ADDR_ONLY (1 << 4)
+#define NAT_SM_FLAG_EXACT_ADDRESS (1 << 5)
+#define NAT_SM_FLAG_OUT2IN_ONLY (1 << 6)
+#define NAT_SM_FLAG_LB (1 << 7)
+#define NAT_SM_FLAG_SWITCH_ADDRESS (1 << 8)
typedef CLIB_PACKED(struct
{
u16 local_port;
/* external port */
u16 external_port;
- /* is twice-nat */
- twice_nat_type_t twice_nat;
/* local FIB table */
u32 vrf_id;
u32 fib_index;
@param i NAT interface
@return 1 if inside interface
*/
-#define nat_interface_is_inside(i) i->flags & NAT_INTERFACE_FLAG_IS_INSIDE
+#define nat_interface_is_inside(i) (i->flags & NAT_INTERFACE_FLAG_IS_INSIDE)
/** \brief Check if NAT interface is outside.
@param i NAT interface
@return 1 if outside interface
*/
-#define nat_interface_is_outside(i) i->flags & NAT_INTERFACE_FLAG_IS_OUTSIDE
+#define nat_interface_is_outside(i) (i->flags & NAT_INTERFACE_FLAG_IS_OUTSIDE)
/** \brief Check if NAT44 endpoint-dependent TCP session is closed.
@param s NAT session
@return 1 if session is closed
*/
-#define nat44_is_ses_closed(s) s->state == 0xf
-
-/** \brief Check if NAT static mapping is address only (1:1NAT).
- @param sm NAT static mapping
- @return 1 if 1:1NAT, 0 if 1:1NAPT
-*/
-#define is_addr_only_static_mapping(sm) (sm->flags & NAT_STATIC_MAPPING_FLAG_ADDR_ONLY)
-
-/** \brief Check if NAT static mapping match only out2in direction.
- @param sm NAT static mapping
- @return 1 if rule match only out2in direction
-*/
-#define is_out2in_only_static_mapping(sm) (sm->flags & NAT_STATIC_MAPPING_FLAG_OUT2IN_ONLY)
-
-/** \brief Check if NAT static mapping is identity NAT.
- @param sm NAT static mapping
- @return 1 if identity NAT
-*/
-#define is_identity_static_mapping(sm) (sm->flags & NAT_STATIC_MAPPING_FLAG_IDENTITY_NAT)
-
-/** \brief Check if NAT static mapping is load-balancing.
- @param sm NAT static mapping
- @return 1 if load-balancing
-*/
-#define is_lb_static_mapping(sm) (sm->flags & NAT_STATIC_MAPPING_FLAG_LB)
-
-/** \brief Check if exact pool address should be used.
- @param s SNAT session
- @return 1 if exact pool address or 0
-*/
-#define is_exact_address(s) (s->flags & NAT_STATIC_MAPPING_FLAG_EXACT_ADDRESS)
+#define nat44_is_ses_closed(s) (s->state == 0xf)
/** \brief Check if client initiating TCP connection (received SYN from client)
@param t TCP header
return (f & TCP_FLAG_SYN) && !(f & TCP_FLAG_ACK);
}
+always_inline bool
+is_sm_addr_only (u32 f)
+{
+ return (f & NAT_SM_FLAG_ADDR_ONLY);
+}
+
+always_inline bool
+is_sm_out2in_only (u32 f)
+{
+ return (f & NAT_SM_FLAG_OUT2IN_ONLY);
+}
+
+always_inline bool
+is_sm_identity_nat (u32 f)
+{
+ return (f & NAT_SM_FLAG_IDENTITY_NAT);
+}
+
+always_inline bool
+is_sm_lb (u32 f)
+{
+ return (f & NAT_SM_FLAG_LB);
+}
+
+always_inline bool
+is_sm_exact_address (u32 f)
+{
+ return (f & NAT_SM_FLAG_EXACT_ADDRESS);
+}
+
+always_inline bool
+is_sm_self_twice_nat (u32 f)
+{
+ return (f & NAT_SM_FLAG_SELF_TWICE_NAT);
+}
+
+always_inline bool
+is_sm_twice_nat (u32 f)
+{
+ return (f & NAT_SM_FLAG_TWICE_NAT);
+}
+
+always_inline bool
+is_sm_switch_address (u32 f)
+{
+ return (f & NAT_SM_FLAG_SWITCH_ADDRESS);
+}
+
/* logging */
#define nat_log_err(...) \
vlib_log(VLIB_LOG_LEVEL_ERR, snat_main.log_class, __VA_ARGS__)
#define nat_log_debug(...)\
vlib_log(VLIB_LOG_LEVEL_DEBUG, snat_main.log_class, __VA_ARGS__)
-/**
- * @brief Enable NAT44 plugin
- *
- * @param c nat44_config_t
- *
- * @return 0 on success, non-zero value otherwise
- */
-int nat44_plugin_enable (nat44_config_t c);
-
-/**
- * @brief Disable NAT44 plugin
- *
- * @return 0 on success, non-zero value otherwise
- */
-int nat44_plugin_disable ();
-
-/**
- * @brief Add external address to NAT44 pool
- *
- * @param sm snat global configuration data
- * @param addr IPv4 address
- * @param vrf_id VRF id of tenant, ~0 means independent of VRF
- * @param twice_nat 1 if twice NAT address
- *
- * @return 0 on success, non-zero value otherwise
- */
-int snat_add_address (snat_main_t * sm, ip4_address_t * addr, u32 vrf_id,
- u8 twice_nat);
+clib_error_t *nat44_api_hookup (vlib_main_t *vm);
-/**
- * @brief Delete external address from NAT44 pool
- *
- * @param sm snat global configuration data
- * @param addr IPv4 address
- * @param delete_sm 1 if delete static mapping using address
- * @param twice_nat 1 if twice NAT address
- *
- * @return 0 on success, non-zero value otherwise
- */
-int snat_del_address (snat_main_t * sm, ip4_address_t addr, u8 delete_sm,
- u8 twice_nat);
+int snat_set_workers (uword *bitmap);
-/**
- * @brief Add/delete external address to FIB DPO (out2in DPO mode)
- *
- * @param addr IPv4 address
- * @param is_add 1 = add, 0 = delete
- *
- * @return 0 on success, non-zero value otherwise
- */
-void nat44_add_del_address_dpo (ip4_address_t addr, u8 is_add);
+int nat44_plugin_enable (nat44_config_t c);
+int nat44_plugin_disable ();
-/**
- * @brief Add/delete NAT44 static mapping
- *
- * @param l_addr local IPv4 address
- * @param e_addr external IPv4 address
- * @param l_port local port number
- * @param e_port external port number
- * @param vrf_id local VRF ID
- * @param addr_only 1 = 1:1NAT, 0 = 1:1NAPT
- * @param sw_if_index use interface address as external IPv4 address
- * @param proto L4 protocol
- * @param is_add 1 = add, 0 = delete
- * @param twice_nat twice-nat mode
- * @param out2in_only if 1 rule match only out2in direction
- * @param tag opaque string tag
- * @param identity_nat identity NAT
- * @param pool_addr pool IPv4 address
- * @param exact 1 = exact pool address
- *
- * @return 0 on success, non-zero value otherwise
- */
-int snat_add_static_mapping (ip4_address_t l_addr, ip4_address_t e_addr,
- u16 l_port, u16 e_port, u32 vrf_id,
- int addr_only, u32 sw_if_index,
- nat_protocol_t proto, int is_add,
- twice_nat_type_t twice_nat, u8 out2in_only,
- u8 * tag, u8 identity_nat,
- ip4_address_t pool_addr, int exact);
+int nat44_ed_add_interface (u32 sw_if_index, u8 is_inside);
+int nat44_ed_del_interface (u32 sw_if_index, u8 is_inside);
+int nat44_ed_add_output_interface (u32 sw_if_index);
+int nat44_ed_del_output_interface (u32 sw_if_index);
-/**
- * @brief Add/delete static mapping with load-balancing (multiple backends)
- *
- * @param e_addr external IPv4 address
- * @param e_port external port number
- * @param proto L4 protocol
- * @param locals list of local backends
- * @param is_add 1 = add, 0 = delete
- * @param twice_nat twice-nat mode
- * @param out2in_only if 1 rule match only out2in direction
- * @param tag opaque string tag
- * @param affinity 0 = disabled, otherwise client IP affinity sticky time
- *
- * @return 0 on success, non-zero value otherwise
- */
-int nat44_add_del_lb_static_mapping (ip4_address_t e_addr, u16 e_port,
- nat_protocol_t proto,
- nat44_lb_addr_port_t * locals, u8 is_add,
- twice_nat_type_t twice_nat,
- u8 out2in_only, u8 * tag, u32 affinity);
+int nat44_ed_add_address (ip4_address_t *addr, u32 vrf_id, u8 twice_nat);
+int nat44_ed_del_address (ip4_address_t addr, u8 delete_sm, u8 twice_nat);
+int nat44_ed_add_interface_address (u32 sw_if_index, u8 twice_nat);
+int nat44_ed_del_interface_address (u32 sw_if_index, u8 twice_nat);
-int nat44_lb_static_mapping_add_del_local (ip4_address_t e_addr, u16 e_port,
- ip4_address_t l_addr, u16 l_port,
- nat_protocol_t proto, u32 vrf_id,
- u8 probability, u8 is_add);
+int nat44_ed_add_static_mapping (ip4_address_t l_addr, ip4_address_t e_addr,
+ u16 l_port, u16 e_port, nat_protocol_t proto,
+ u32 vrf_id, u32 sw_if_index, u32 flags,
+ ip4_address_t pool_addr, u8 *tag);
-clib_error_t *nat44_api_hookup (vlib_main_t * vm);
+int nat44_ed_del_static_mapping (ip4_address_t l_addr, ip4_address_t e_addr,
+ u16 l_port, u16 e_port, nat_protocol_t proto,
+ u32 vrf_id, u32 sw_if_index, u32 flags);
-/**
- * @brief Set NAT plugin workers
- *
- * @param bitmap NAT workers bitmap
- *
- * @return 0 on success, non-zero value otherwise
- */
-int snat_set_workers (uword * bitmap);
+int nat44_ed_add_lb_static_mapping (ip4_address_t e_addr, u16 e_port,
+ nat_protocol_t proto,
+ nat44_lb_addr_port_t *locals, u32 flags,
+ u8 *tag, u32 affinity);
-int nat44_ed_add_interface (u32 sw_if_index, u8 is_inside);
-int nat44_ed_del_interface (u32 sw_if_index, u8 is_inside);
-int nat44_ed_add_output_interface (u32 sw_if_index);
-int nat44_ed_del_output_interface (u32 sw_if_index);
+int nat44_ed_del_lb_static_mapping (ip4_address_t e_addr, u16 e_port,
+ nat_protocol_t proto, u32 flags);
-/**
- * @brief Add/delete NAT44 pool address from specific interface
- *
- * @param sw_if_index software index of the interface
- * @param is_del 1 = delete, 0 = add
- * @param twice_nat 1 = twice NAT address for external hosts
- *
- * @return 0 on success, non-zero value otherwise
- */
-int snat_add_interface_address (snat_main_t * sm, u32 sw_if_index, int is_del,
- u8 twice_nat);
+int nat44_ed_add_del_lb_static_mapping_local (ip4_address_t e_addr, u16 e_port,
+ ip4_address_t l_addr, u16 l_port,
+ nat_protocol_t proto, u32 vrf_id,
+ u8 probability, u8 is_add);
/**
* @brief Delete NAT44 endpoint-dependent session
*
* @return 0 on success, non-zero value otherwise
*/
-int nat44_del_ed_session (snat_main_t * sm, ip4_address_t * addr, u16 port,
- ip4_address_t * eh_addr, u16 eh_port, u8 proto,
+int nat44_ed_del_session (snat_main_t *sm, ip4_address_t *addr, u16 port,
+ ip4_address_t *eh_addr, u16 eh_port, u8 proto,
u32 vrf_id, int is_in);
/**
void snat_add_del_addr_to_fib (ip4_address_t * addr,
u8 p_len, u32 sw_if_index, int is_add);
-#if 0
-void
-nat_ha_sadd_ed_cb (ip4_address_t * in_addr, u16 in_port,
- ip4_address_t * out_addr, u16 out_port,
- ip4_address_t * eh_addr, u16 eh_port,
- ip4_address_t * ehn_addr, u16 ehn_port, u8 proto,
- u32 fib_index, u16 flags, u32 thread_index);
-
-void
-nat_ha_sdel_ed_cb (ip4_address_t * out_addr, u16 out_port,
- ip4_address_t * eh_addr, u16 eh_port, u8 proto,
- u32 fib_index, u32 ti);
-
-void
-nat_ha_sref_ed_cb (ip4_address_t * out_addr, u16 out_port,
- ip4_address_t * eh_addr, u16 eh_port, u8 proto,
- u32 fib_index, u32 total_pkts, u64 total_bytes,
- u32 thread_index);
-#endif
-
-int nat_set_outside_address_and_port (snat_address_t *addresses,
- u32 thread_index, ip4_address_t addr,
- u16 port, nat_protocol_t protocol);
-
/*
* Why is this here? Because we don't need to touch this layer to
* simply reply to an icmp. We need to change id to a unique