+ vlib_increment_simple_counter (&sm->counters.slowpath.out2in_ed.tcp,
+ thread_index, sw_if_index0, 1);
+ if (nat44_set_tcp_session_state_o2i
+ (sm, now, s0, vnet_buffer (b0)->ip.reass.icmp_type_or_tcp_flags,
+ vnet_buffer (b0)->ip.reass.tcp_ack_number,
+ vnet_buffer (b0)->ip.reass.tcp_seq_number, thread_index))
+ goto trace0;
+ }
+ else if (!vnet_buffer (b0)->ip.reass.is_non_first_fragment
+ && udp0->checksum)
+ {
+ new_port0 = udp0->dst_port = s0->in2out.port;
+ sum0 = udp0->checksum;
+ sum0 = ip_csum_update (sum0, old_addr0, new_addr0, ip4_header_t,
+ dst_address);
+ sum0 = ip_csum_update (sum0, old_port0, new_port0, ip4_header_t,
+ length);
+ if (PREDICT_FALSE (is_twice_nat_session (s0)))
+ {
+ sum0 = ip_csum_update (sum0, ip0->src_address.as_u32,
+ s0->ext_host_nat_addr.as_u32,
+ ip4_header_t, dst_address);
+ sum0 =
+ ip_csum_update (sum0,
+ vnet_buffer (b0)->ip.reass.l4_src_port,
+ s0->ext_host_nat_port, ip4_header_t, length);
+ udp0->src_port = s0->ext_host_nat_port;
+ ip0->src_address.as_u32 = s0->ext_host_nat_addr.as_u32;
+ }
+ udp0->checksum = ip_csum_fold (sum0);
+ vlib_increment_simple_counter (&sm->counters.slowpath.out2in_ed.udp,
+ thread_index, sw_if_index0, 1);
+ }
+ else
+ {
+ if (!vnet_buffer (b0)->ip.reass.is_non_first_fragment)