- if (PREDICT_TRUE (proto0 == NAT_PROTOCOL_TCP))
- {
- if (!vnet_buffer (b0)->ip.reass.is_non_first_fragment)
- {
- new_port0 = udp0->src_port = s0->out2in.port;
- sum0 = tcp0->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->dst_address.as_u32,
- s0->ext_host_addr.as_u32,
- ip4_header_t, dst_address);
- sum0 =
- ip_csum_update (sum0,
- vnet_buffer (b0)->ip.
- reass.l4_dst_port, s0->ext_host_port,
- ip4_header_t, length);
- tcp0->dst_port = s0->ext_host_port;
- ip0->dst_address.as_u32 = s0->ext_host_addr.as_u32;
- }
- mss_clamping (sm->mss_clamping, tcp0, &sum0);
- tcp0->checksum = ip_csum_fold (sum0);
- }
- tcp_packets++;
- if (nat44_set_tcp_session_state_i2o
- (sm, now, s0, b0, thread_index))
- goto trace0;
- }
- else if (!vnet_buffer (b0)->ip.reass.is_non_first_fragment
- && udp0->checksum)