+int nat44_lb_static_mapping_add_del_local (ip4_address_t e_addr, u16 e_port,
+ ip4_address_t l_addr, u16 l_port,
+ snat_protocol_t proto, u32 vrf_id,
+ u8 probability, u8 is_add);
+
+clib_error_t *snat_api_init (vlib_main_t * vm, snat_main_t * sm);
+
+/**
+ * @brief Set NAT plugin workers
+ *
+ * @param bitmap NAT workers bitmap
+ *
+ * @return 0 on success, non-zero value otherwise
+ */
+int snat_set_workers (uword * bitmap);
+
+/**
+ * @brief Enable/disable NAT44 feature on the interface
+ *
+ * @param sw_if_index software index of the interface
+ * @param is_inside 1 = inside, 0 = outside
+ * @param is_del 1 = delete, 0 = add
+ *
+ * @return 0 on success, non-zero value otherwise
+ */
+int snat_interface_add_del (u32 sw_if_index, u8 is_inside, int is_del);
+
+/**
+ * @brief Enable/disable NAT44 output feature on the interface (postrouting NAT)
+ *
+ * @param sw_if_index software index of the interface
+ * @param is_inside 1 = inside, 0 = outside
+ * @param is_del 1 = delete, 0 = add
+ *
+ * @return 0 on success, non-zero value otherwise
+ */
+int snat_interface_add_del_output_feature (u32 sw_if_index, u8 is_inside,
+ int is_del);
+
+/**
+ * @brief Add/delete NAT44 pool address from specific interfce
+ *
+ * @param sw_if_index software index of the interface
+ * @param is_del 1 = delete, 0 = add
+ * @param twice_nat 1 = twice NAT address for extenal 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);
+
+/**
+ * @brief Delete NAT44 session
+ *
+ * @param addr IPv4 address
+ * @param port L4 port number
+ * @param proto L4 protocol
+ * @param vrf_id VRF ID
+ * @param is_in 1 = inside network addres and por pair, 0 = outside
+ *
+ * @return 0 on success, non-zero value otherwise
+ */
+int nat44_del_session (snat_main_t * sm, ip4_address_t * addr, u16 port,
+ snat_protocol_t proto, u32 vrf_id, int is_in);
+
+/**
+ * @brief Delete NAT44 endpoint-dependent session
+ *
+ * @param addr IPv4 address
+ * @param port L4 port number
+ * @param proto L4 protocol
+ * @param vrf_id VRF ID
+ * @param is_in 1 = inside network addres and por pair, 0 = outside
+ *
+ * @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,
+ u32 vrf_id, int is_in);
+
+/**
+ * @brief Free NAT44 session data (lookup keys, external addrres port)
+ *
+ * @param s NAT session
+ * @param thread_index thread index
+ */
+void nat_free_session_data (snat_main_t * sm, snat_session_t * s,
+ u32 thread_index);
+
+/**
+ * @brief Find or create NAT user
+ *
+ * @param addr IPv4 address
+ * @param fib_index FIB table index
+ * @param thread_index thread index
+ *
+ * @return NAT user data structure on success otherwise zero value
+ */
+snat_user_t *nat_user_get_or_create (snat_main_t * sm, ip4_address_t * addr,
+ u32 fib_index, u32 thread_index);
+
+/**
+ * @brief Allocate new NAT session or recycle last used
+ *
+ * @param u NAT user
+ * @param thread_index thread index
+ *
+ * @return session data structure on success otherwise zero value
+ */
+snat_session_t *nat_session_alloc_or_recycle (snat_main_t * sm,
+ snat_user_t * u,
+ u32 thread_index);
+
+/**
+ * @brief Allocate NAT endpoint-dependent session
+ *
+ * @param u NAT user
+ * @param thread_index thread index
+ *
+ * @return session data structure on success otherwise zero value
+ */
+snat_session_t *nat_ed_session_alloc (snat_main_t * sm, snat_user_t * u,
+ u32 thread_index, f64 now);
+
+/**
+ * @brief Set address and port assignment algorithm for MAP-E CE
+ *
+ * @param psid Port Set Identifier value
+ * @param psid_offset number of offset bits
+ * @param psid_length length of PSID
+ */
+void nat_set_alloc_addr_and_port_mape (u16 psid, u16 psid_offset,
+ u16 psid_length);
+
+/**
+ * @brief Set address and port assignment algorithm for port range
+ *
+ * @param start_port beginning of the port range
+ * @param end_port end of the port range
+ */
+void nat_set_alloc_addr_and_port_range (u16 start_port, u16 end_port);
+
+/**
+ * @brief Set address and port assignment algorithm to default/standard
+ */
+void nat_set_alloc_addr_and_port_default (void);
+
+/**
+ * @brief Free outside address and port pair
+ *
+ * @param addresses vector of outside addresses
+ * @param thread_index thread index
+ * @param k adddress, port and protocol
+ */
+void snat_free_outside_address_and_port (snat_address_t * addresses,
+ u32 thread_index,
+ snat_session_key_t * k);
+
+/**
+ * @brief Alloc outside address and port
+ *
+ * @param addresses vector of outside addresses
+ * @param fib_index FIB table index
+ * @param thread_index thread index
+ * @param k allocated address and port pair
+ * @param port_per_thread number of ports per threead
+ * @param snat_thread_index NAT thread index
+ *
+ * @return 0 on success, non-zero value otherwise
+ */
+int snat_alloc_outside_address_and_port (snat_address_t * addresses,
+ u32 fib_index,
+ u32 thread_index,
+ snat_session_key_t * k,
+ u16 port_per_thread,
+ u32 snat_thread_index);
+
+/**
+ * @brief Match NAT44 static mapping.
+ *
+ * @param match address and port to match
+ * @param mapping external/local address and port of the matched mapping
+ * @param by_external if 0 match by local address otherwise match by external
+ * address
+ * @param is_addr_only 1 if matched mapping is address only
+ * @param twice_nat matched mapping is twice NAT type
+ * @param lb 1 if matched mapping is load-balanced
+ * @param ext_host_addr external host address
+ *
+ * @returns 0 if match found otherwise 1.
+ */
+int snat_static_mapping_match (snat_main_t * sm,
+ snat_session_key_t match,
+ snat_session_key_t * mapping,
+ u8 by_external,
+ u8 * is_addr_only,
+ twice_nat_type_t * twice_nat,
+ lb_nat_type_t * lb,
+ ip4_address_t * ext_host_addr,
+ u8 * is_identity_nat);
+
+/**
+ * @brief Add/del NAT address to FIB.
+ *
+ * Add the external NAT address to the FIB as receive entries. This ensures
+ * that VPP will reply to ARP for this address and we don't need to enable
+ * proxy ARP on the outside interface.
+ *
+ * @param addr IPv4 address
+ * @param plen address prefix length
+ * @param sw_if_index software index of the outside interface
+ * @param is_add 0 = delete, 1 = add.
+ */
+void snat_add_del_addr_to_fib (ip4_address_t * addr,
+ u8 p_len, u32 sw_if_index, int is_add);
+
+
+/*
+ * 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
+ * value to NAT an echo request/reply.
+ */
+
+typedef struct