#include <nat/nat_syslog.h>
#include <nat/nat_ha.h>
-#define foreach_nat_out2in_ed_error \
-_(UNSUPPORTED_PROTOCOL, "unsupported protocol") \
-_(OUT2IN_PACKETS, "good out2in packets processed") \
-_(OUT_OF_PORTS, "out of ports") \
-_(BAD_ICMP_TYPE, "unsupported ICMP type") \
-_(NO_TRANSLATION, "no translation") \
-_(MAX_SESSIONS_EXCEEDED, "maximum sessions exceeded") \
-_(DROP_FRAGMENT, "drop fragment") \
-_(MAX_REASS, "maximum reassemblies exceeded") \
-_(MAX_FRAG, "maximum fragments per reassembly exceeded")\
-_(NON_SYN, "non-SYN packet try to create session") \
-_(TCP_PACKETS, "TCP packets") \
-_(UDP_PACKETS, "UDP packets") \
-_(ICMP_PACKETS, "ICMP packets") \
-_(OTHER_PACKETS, "other protocol packets") \
-_(FRAGMENTS, "fragments") \
-_(CACHED_FRAGMENTS, "cached fragments") \
-_(PROCESSED_FRAGMENTS, "processed fragments")
-
-typedef enum
-{
-#define _(sym,str) NAT_OUT2IN_ED_ERROR_##sym,
- foreach_nat_out2in_ed_error
-#undef _
- NAT_OUT2IN_ED_N_ERROR,
-} nat_out2in_ed_error_t;
-
static char *nat_out2in_ed_error_strings[] = {
#define _(sym,string) string,
foreach_nat_out2in_ed_error
ed_kv.key[0] = ed_key.as_u64[0];
ed_kv.key[1] = ed_key.as_u64[1];
if (clib_bihash_add_del_16_8 (&tsm->in2out_ed, &ed_kv, 0))
- nat_log_warn ("in2out_ed key del failed");
+ nat_elog_warn ("in2out_ed key del failed");
if (snat_is_unk_proto_session (s))
goto delete;
if (PREDICT_FALSE (maximum_sessions_exceeded (sm, thread_index)))
{
b->error = node->errors[NAT_OUT2IN_ED_ERROR_MAX_SESSIONS_EXCEEDED];
- nat_log_notice ("maximum sessions exceeded");
+ nat_elog_notice ("maximum sessions exceeded");
return 0;
}
u = nat_user_get_or_create (sm, &l_key.addr, l_key.fib_index, thread_index);
if (!u)
{
- nat_log_warn ("create NAT user failed");
+ nat_elog_warn ("create NAT user failed");
return 0;
}
if (!s)
{
nat44_delete_user_with_no_session (sm, u, thread_index);
- nat_log_warn ("create NAT session failed");
+ nat_elog_warn ("create NAT session failed");
return 0;
}
if (clib_bihash_add_or_overwrite_stale_16_8 (&tsm->out2in_ed, &kv,
nat44_o2i_ed_is_idle_session_cb,
&ctx))
- nat_log_notice ("out2in-ed key add failed");
+ nat_elog_notice ("out2in-ed key add failed");
if (twice_nat == TWICE_NAT || (twice_nat == TWICE_NAT_SELF &&
ip->src_address.as_u32 == l_key.addr.as_u32))
b->error = node->errors[NAT_OUT2IN_ED_ERROR_OUT_OF_PORTS];
nat44_delete_session (sm, s, thread_index);
if (clib_bihash_add_del_16_8 (&tsm->out2in_ed, &kv, 0))
- nat_log_notice ("out2in-ed key del failed");
+ nat_elog_notice ("out2in-ed key del failed");
return 0;
}
s->ext_host_nat_addr.as_u32 = eh_key.addr.as_u32;
if (clib_bihash_add_or_overwrite_stale_16_8 (&tsm->in2out_ed, &kv,
nat44_i2o_ed_is_idle_session_cb,
&ctx))
- nat_log_notice ("in2out-ed key add failed");
+ nat_elog_notice ("in2out-ed key add failed");
snat_ipfix_logging_nat44_ses_create (thread_index,
s->in2out.addr.as_u32,
return s;
}
-static_always_inline int
-icmp_get_ed_key (ip4_header_t * ip0, nat_ed_ses_key_t * p_key0)
-{
- icmp46_header_t *icmp0;
- nat_ed_ses_key_t key0;
- icmp_echo_header_t *echo0, *inner_echo0 = 0;
- ip4_header_t *inner_ip0;
- void *l4_header = 0;
- icmp46_header_t *inner_icmp0;
-
- icmp0 = (icmp46_header_t *) ip4_next_header (ip0);
- echo0 = (icmp_echo_header_t *) (icmp0 + 1);
-
- if (!icmp_is_error_message (icmp0))
- {
- key0.proto = IP_PROTOCOL_ICMP;
- key0.l_addr = ip0->dst_address;
- key0.r_addr = ip0->src_address;
- key0.l_port = echo0->identifier;
- key0.r_port = 0;
- }
- else
- {
- inner_ip0 = (ip4_header_t *) (echo0 + 1);
- l4_header = ip4_next_header (inner_ip0);
- key0.proto = inner_ip0->protocol;
- key0.l_addr = inner_ip0->src_address;
- key0.r_addr = inner_ip0->dst_address;
- switch (ip_proto_to_snat_proto (inner_ip0->protocol))
- {
- case SNAT_PROTOCOL_ICMP:
- inner_icmp0 = (icmp46_header_t *) l4_header;
- inner_echo0 = (icmp_echo_header_t *) (inner_icmp0 + 1);
- key0.l_port = inner_echo0->identifier;
- key0.r_port = 0;
- break;
- case SNAT_PROTOCOL_UDP:
- case SNAT_PROTOCOL_TCP:
- key0.l_port = ((tcp_udp_header_t *) l4_header)->src_port;
- key0.r_port = ((tcp_udp_header_t *) l4_header)->dst_port;
- break;
- default:
- return -1;
- }
- }
- *p_key0 = key0;
- return 0;
-}
-
static int
next_src_nat (snat_main_t * sm, ip4_header_t * ip, u8 proto, u16 src_port,
u16 dst_port, u32 thread_index, u32 rx_fib_index)
if (ip->protocol == IP_PROTOCOL_ICMP)
{
- if (icmp_get_ed_key (ip, &key))
+ if (get_icmp_o2i_ed_key (ip, &key))
return;
}
else if (ip->protocol == IP_PROTOCOL_UDP || ip->protocol == IP_PROTOCOL_TCP)
thread_index);
if (!u)
{
- nat_log_warn ("create NAT user failed");
+ nat_elog_warn ("create NAT user failed");
return;
}
if (!s)
{
nat44_delete_user_with_no_session (sm, u, thread_index);
- nat_log_warn ("create NAT session failed");
+ nat_elog_warn ("create NAT session failed");
return;
}
kv.value = s - tsm->sessions;
if (clib_bihash_add_del_16_8 (&tsm->in2out_ed, &kv, 1))
- nat_log_notice ("in2out_ed key add failed");
+ nat_elog_notice ("in2out_ed key add failed");
}
if (ip->protocol == IP_PROTOCOL_TCP)
ip4_header_t ip_wkr = {
.src_address = ip->dst_address,
};
- u32 thread_index = sm->worker_in2out_cb (&ip_wkr, rx_fib_index);
+ u32 thread_index = sm->worker_in2out_cb (&ip_wkr, rx_fib_index, 0);
create_bypass_for_fwd (sm, ip, rx_fib_index, thread_index);
}
sw_if_index = vnet_buffer (b)->sw_if_index[VLIB_RX];
rx_fib_index = ip4_fib_table_get_index_for_sw_if_index (sw_if_index);
- if (icmp_get_ed_key (ip, &key))
+ if (get_icmp_o2i_ed_key (ip, &key))
{
b->error = node->errors[NAT_OUT2IN_ED_ERROR_UNSUPPORTED_PROTOCOL];
next = NAT44_ED_OUT2IN_NEXT_DROP;
if (PREDICT_FALSE (maximum_sessions_exceeded (sm, thread_index)))
{
b->error = node->errors[NAT_OUT2IN_ED_ERROR_MAX_SESSIONS_EXCEEDED];
- nat_log_notice ("maximum sessions exceeded");
+ nat_elog_notice ("maximum sessions exceeded");
return 0;
}
thread_index);
if (!u)
{
- nat_log_warn ("create NAT user failed");
+ nat_elog_warn ("create NAT user failed");
return 0;
}
if (!s)
{
nat44_delete_user_with_no_session (sm, u, thread_index);
- nat_log_warn ("create NAT session failed");
+ nat_elog_warn ("create NAT session failed");
return 0;
}
/* Add to lookup tables */
s_kv.value = s - tsm->sessions;
if (clib_bihash_add_del_16_8 (&tsm->out2in_ed, &s_kv, 1))
- nat_log_notice ("out2in key add failed");
+ nat_elog_notice ("out2in key add failed");
make_ed_kv (&s_kv, &ip->dst_address, &ip->src_address, ip->protocol,
m->fib_index, 0, 0);
s_kv.value = s - tsm->sessions;
if (clib_bihash_add_del_16_8 (&tsm->in2out_ed, &s_kv, 1))
- nat_log_notice ("in2out key add failed");
+ nat_elog_notice ("in2out key add failed");
}
/* Update IP checksum */
{
next0 = NAT44_ED_OUT2IN_NEXT_DROP;
b0->error = node->errors[NAT_OUT2IN_ED_ERROR_MAX_REASS];
- nat_log_notice ("maximum reassemblies exceeded");
+ nat_elog_notice ("maximum reassemblies exceeded");
goto trace0;
}
(thread_index, reass0, bi0, &fragments_to_drop))
{
b0->error = node->errors[NAT_OUT2IN_ED_ERROR_MAX_FRAG];
- nat_log_notice
+ nat_elog_notice
("maximum fragments per reassembly exceeded");
next0 = NAT44_ED_OUT2IN_NEXT_DROP;
goto trace0;