- if (PREDICT_TRUE (proto1 == SNAT_PROTOCOL_TCP))
- {
- if (!vnet_buffer (b1)->ip.reass.is_non_first_fragment)
- {
- new_port1 = udp1->dst_port = s1->in2out.port;
-
- sum1 = tcp1->checksum;
- sum1 =
- ip_csum_update (sum1, old_addr1, new_addr1, ip4_header_t,
- dst_address);
- sum1 =
- ip_csum_update (sum1, old_port1, new_port1, ip4_header_t,
- length);
- if (is_twice_nat_session (s1))
- {
- sum1 = ip_csum_update (sum1, ip1->src_address.as_u32,
- s1->ext_host_nat_addr.as_u32,
- ip4_header_t, dst_address);
- sum1 =
- ip_csum_update (sum1,
- vnet_buffer (b1)->ip.
- reass.l4_src_port,
- s1->ext_host_nat_port, ip4_header_t,
- length);
- tcp1->src_port = s1->ext_host_nat_port;
- ip1->src_address.as_u32 = s1->ext_host_nat_addr.as_u32;
- }
- tcp1->checksum = ip_csum_fold (sum1);
- }
- tcp_packets++;
- if (nat44_set_tcp_session_state_o2i
- (sm, s1, vnet_buffer (b1)->ip.reass.icmp_type_or_tcp_flags,
- vnet_buffer (b1)->ip.reass.tcp_ack_number,
- vnet_buffer (b1)->ip.reass.tcp_seq_number, thread_index))
- goto trace01;
- }
- else if (!vnet_buffer (b1)->ip.reass.is_non_first_fragment
- && udp1->checksum)
- {
- new_port1 = udp1->dst_port = s1->in2out.port;
- sum1 = udp1->checksum;
- sum1 = ip_csum_update (sum1, old_addr1, new_addr1, ip4_header_t,
- dst_address);
- sum1 = ip_csum_update (sum1, old_port1, new_port1, ip4_header_t,
- length);
- if (PREDICT_FALSE (is_twice_nat_session (s1)))
- {
- sum1 = ip_csum_update (sum1, ip1->src_address.as_u32,
- s1->ext_host_nat_addr.as_u32,
- ip4_header_t, dst_address);
- sum1 =
- ip_csum_update (sum1,
- vnet_buffer (b1)->ip.reass.l4_src_port,
- s1->ext_host_nat_port, ip4_header_t,
- length);
- udp1->src_port = s1->ext_host_nat_port;
- ip1->src_address.as_u32 = s1->ext_host_nat_addr.as_u32;
- }
- udp1->checksum = ip_csum_fold (sum1);
- udp_packets++;
- }
- else
- {
- if (!vnet_buffer (b1)->ip.reass.is_non_first_fragment)
- {
- if (PREDICT_FALSE (is_twice_nat_session (s1)))
- {
- udp1->dst_port = s1->in2out.port;
- if (is_twice_nat_session (s1))
- {
- udp1->src_port = s1->ext_host_nat_port;
- ip1->src_address.as_u32 =
- s1->ext_host_nat_addr.as_u32;
- }
- udp1->checksum = 0;
- }
- }
- udp_packets++;
- }
+ while (n_left_from > 0)
+ {
+ vlib_buffer_t *b0;
+ u32 sw_if_index0, rx_fib_index0, proto0, old_addr0, new_addr0;
+ u16 old_port0, new_port0;
+ ip4_header_t *ip0;
+ udp_header_t *udp0;
+ tcp_header_t *tcp0;
+ icmp46_header_t *icmp0;
+ snat_session_t *s0 = 0;
+ clib_bihash_kv_16_8_t kv0, value0;
+ ip_csum_t sum0;
+ lb_nat_type_t lb_nat0;
+ twice_nat_type_t twice_nat0;
+ u8 identity_nat0;
+ ip4_address_t sm_addr;
+ u16 sm_port;
+ u32 sm_fib_index;
+
+ b0 = *b;
+ next[0] = vnet_buffer2 (b0)->nat.arc_next;
+
+ vnet_buffer (b0)->snat.flags = 0;
+ ip0 = vlib_buffer_get_current (b0);
+
+ sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
+ rx_fib_index0 =
+ fib_table_get_index_for_sw_if_index (FIB_PROTOCOL_IP4, sw_if_index0);
+
+ if (PREDICT_FALSE (ip0->ttl == 1))
+ {
+ vnet_buffer (b0)->sw_if_index[VLIB_TX] = (u32) ~ 0;
+ icmp4_error_set_vnet_buffer (b0, ICMP4_time_exceeded,
+ ICMP4_time_exceeded_ttl_exceeded_in_transit,
+ 0);
+ next[0] = NAT_NEXT_ICMP_ERROR;
+ goto trace0;
+ }