#include <nat/nat64.h>
#include <nat/nat_reass.h>
+#include <nat/nat_inlines.h>
#include <vnet/ip/ip6_to_ip4.h>
#include <vnet/fib/fib_table.h>
u32 thread_index;
} nat64_in2out_set_ctx_t;
+static inline u8
+nat64_not_translate (u32 sw_if_index, ip6_address_t ip6_addr)
+{
+ ip6_address_t *addr;
+ ip6_main_t *im6 = &ip6_main;
+ ip_lookup_main_t *lm6 = &im6->lookup_main;
+ ip_interface_address_t *ia = 0;
+
+ /* *INDENT-OFF* */
+ foreach_ip_interface_address (lm6, ia, sw_if_index, 0,
+ ({
+ addr = ip_interface_address_get_address (lm6, ia);
+ if (0 == ip6_address_compare (addr, &ip6_addr))
+ return 1;
+ }));
+ /* *INDENT-ON* */
+
+ return 0;
+}
+
/**
* @brief Check whether is a hairpinning.
*
bibe =
nat64_db_bib_entry_create (db, &ip6->src_address, &out_addr,
- sport, clib_host_to_net_u16 (out_port),
- fib_index, proto, 0);
+ sport, out_port, fib_index, proto, 0);
if (!bibe)
return -1;
}
return -1;
}
- nat64_session_reset_timeout (ste, ctx->vm);
-
ip4->src_address.as_u32 = bibe->out_addr.as_u32;
udp->src_port = bibe->out_port;
ip_csum_t csum;
tcp_header_t *tcp = ip6_next_header (ip6);
+ nat64_tcp_session_set_state (ste, tcp, 1);
checksum = &tcp->checksum;
csum = ip_csum_sub_even (*checksum, sport);
csum = ip_csum_add_even (csum, udp->src_port);
*checksum = ip_csum_fold (csum);
}
+ nat64_session_reset_timeout (ste, ctx->vm);
+
return 0;
}
bibe =
nat64_db_bib_entry_create (db, &ip6->src_address,
- &out_addr, in_id,
- clib_host_to_net_u16 (out_id),
+ &out_addr, in_id, out_id,
fib_index, IP_PROTOCOL_ICMP, 0);
if (!bibe)
return -1;
bibe =
nat64_db_bib_entry_create (db, &ip6->src_address, &out_addr,
- sport, clib_host_to_net_u16 (out_port),
- fib_index, proto, 0);
+ sport, out_port, fib_index, proto, 0);
if (!bibe)
return -1;
}
return -1;
}
+ if (proto == IP_PROTOCOL_TCP)
+ nat64_tcp_session_set_state (ste, tcp, 1);
+
nat64_session_reset_timeout (ste, vm);
sport = udp->src_port = bibe->out_port;
nat64_in2out_next_t next_index;
u32 pkts_processed = 0;
u32 stats_node_index;
- u32 thread_index = vlib_get_thread_index ();
+ u32 thread_index = vm->thread_index;
stats_node_index =
is_slow_path ? nat64_in2out_slowpath_node.index : nat64_in2out_node.index;
u8 l4_protocol0;
u32 proto0;
nat64_in2out_set_ctx_t ctx0;
+ u32 sw_if_index0;
/* speculatively enqueue b0 to the current next frame */
bi0 = from[0];
goto trace0;
}
+ sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
+
+ if (nat64_not_translate (sw_if_index0, ip60->dst_address))
+ {
+ next0 = NAT64_IN2OUT_NEXT_IP6_LOOKUP;
+ goto trace0;
+ }
+
proto0 = ip_proto_to_snat_proto (l4_protocol0);
if (is_slow_path)
ip_csum_t csum;
tcp_header_t *tcp = (tcp_header_t *) udp;
+ nat64_tcp_session_set_state (ste, tcp, 1);
checksum = &tcp->checksum;
csum = ip_csum_sub_even (*checksum, tcp->src_port);
csum = ip_csum_sub_even (csum, ip6->src_address.as_u64[0]);
if (!bibe)
return -1;
+ if (ctx->proto == IP_PROTOCOL_TCP)
+ nat64_tcp_session_set_state (ste, tcp, 1);
+
nat64_session_reset_timeout (ste, ctx->vm);
sport = bibe->out_port;
u32 *fragments_to_drop = 0;
u32 *fragments_to_loopback = 0;
nat64_main_t *nm = &nat64_main;
- u32 thread_index = vlib_get_thread_index ();
+ u32 thread_index = vm->thread_index;
from = vlib_frame_vector_args (frame);
n_left_from = frame->n_vectors;
nat64_db_bib_entry_create (db,
&ip60->src_address,
&out_addr0, udp0->src_port,
- clib_host_to_net_u16
- (out_port0), fib_index0,
+ out_port0, fib_index0,
l4_protocol0, 0);
if (!bibe0)
{
u32 n_left_to_next_worker = 0, *to_next_worker = 0;
u32 next_worker_index = 0;
u32 current_worker_index = ~0;
- u32 thread_index = vlib_get_thread_index ();
+ u32 thread_index = vm->thread_index;
u32 fq_index;
u32 to_node_index;