Hello,

Looking to understand the behavior of NAT in deterministic mode. The issue is, 
while in2out translations work fine and sessions are being created 
successfully, frames are getting dropped in out2in direction though a session 
is present for translation. Following are configurations :


DBGvpp# show interface address

GigabitEthernet5/0/0 (up):

  L3 20.20.20.15/24

GigabitEthernet5/0/1 (up):

  L3 10.10.10.15/24

TenGigabitEthernet3/0/0 (dn):

TenGigabitEthernet3/0/1 (up):

  L3 40.40.40.15/24

local0 (dn):

DBGvpp# show nat44 interfaces
NAT44 interfaces:
GigabitEthernet5/0/0 in
GigabitEthernet5/0/1 out
TenGigabitEthernet3/0/1 in

DBGvpp# show nat44 deterministic mappings
NAT44 deterministic mappings:
in 20.20.20.2/32 out 10.10.10.15/32
  outside address sharing ratio: 1
  number of ports per inside host: 64512
  sessions number: 0
in 40.40.40.2/32 out 10.10.10.15/32
  outside address sharing ratio: 1
  number of ports per inside host: 64512
  sessions number: 0

in2out works fine for both the mappings. Here are the created sessions:
DBGvpp# show nat44 deterministic sessions
NAT44 deterministic sessions:
  in 20.20.20.2:700 out 10.10.10.15:1724 external host 10.10.10.2:600 state: 
udp-active expire: 13344
  in 40.40.40.2:800 out 10.10.10.15:1824 external host 10.10.10.2:600 state: 
udp-active expire: 13368

In the out2in direction, frame with dst-port : 1724 gets successfully NAT’ed 
but the frame with dst-port : 1824 gets dropped with error “No translation” 
when there is a session already present (second session above). Is this an 
expected behavior with deterministic NAT ? Can we map multiple 
internal-src-ip-addresses to one external-src-ip-address ?

It looks like, from the code, only the first mapping entry is being matched all 
the time when the external-src-ip-address is same for the configured mapping 
entries above.

always_inline snat_det_map_t *
snat_det_map_by_out (snat_main_t * sm, ip4_address_t * out_addr)
{
  snat_det_map_t *dm;

  /* *INDENT-OFF* */
  pool_foreach (dm, sm->det_maps,
  ({
    if (is_addr_in_net(out_addr, &dm->out_addr, dm->out_plen))
      return dm;
  }));
  /* *INDENT-ON* */
  return 0;
}

The above function is called from snat_det_out2in_node. Only the out_addr is 
being checked while looking for the matching mapping entry. This may result in 
the first added mapping entry to be matched all the time in the case where  
dm->out_addr is same for both the mapping entries, right ? Looks like we need 
more checks to identify the session correctly.

Here is the node trace for out2in processing:

Packet 3



03:09:18:893987: dpdk-input

  GigabitEthernet5/0/1 rx queue 0

  buffer 0x9b3a8: current data 0, length 508, buffer-pool 0, ref-count 1, 
totlen-nifb 0, trace handle 0x2

                  ext-hdr-valid

                  l4-cksum-computed l4-cksum-correct

  PKT MBUF: port 3, nb_segs 1, pkt_len 508

    buf_len 2176, data_len 508, ol_flags 0x180, data_off 128, phys_addr 
0x26cea80

    packet_type 0x211 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0

    rss 0x0 fdir.hi 0x0 fdir.lo 0x0

    Packet Offload Flags

      PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid

      PKT_RX_L4_CKSUM_GOOD (0x0100) L4 cksum of RX pkt. is valid

    Packet Types

      RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet

      RTE_PTYPE_L3_IPV4 (0x0010) IPv4 packet without extension headers

      RTE_PTYPE_L4_UDP (0x0200) UDP packet

  IP4: 00:00:00:1a:9a:7e -> 0c:c4:7a:c2:f6:f5

  UDP: 10.10.10.2 -> 10.10.10.15

    tos 0x00, ttl 64, length 494, checksum 0x50db

    fragment id 0x0000

  UDP: 600 -> 1724

    length 474, checksum 0x3786

03:09:18:894003: ethernet-input

  frame: flags 0x3, hw-if-index 4, sw-if-index 4

  IP4: 00:00:00:1a:9a:7e -> 0c:c4:7a:c2:f6:f5

03:09:18:894016: ip4-input-no-checksum

  UDP: 10.10.10.2 -> 10.10.10.15

    tos 0x00, ttl 64, length 494, checksum 0x50db

    fragment id 0x0000

  UDP: 600 -> 1724

    length 474, checksum 0x3786

03:09:18:894023: nat44-det-out2in

  NAT_DET_OUT2IN: sw_if_index 4, next index 1, session index 0

03:09:22:826468: ip4-lookup

  fib 0 dpo-idx 3 flow hash: 0x00000000

  UDP: 10.10.10.2 -> 20.20.20.2

    tos 0x00, ttl 64, length 494, checksum 0x3cde

    fragment id 0x0000

  UDP: 600 -> 700

    length 474, checksum 0x0000

03:09:22:826487: ip4-rewrite

  tx_sw_if_index 3 dpo-idx 3 : ipv4 via 20.20.20.2 GigabitEthernet5/0/0: 
mtu:9000 0000001a9a7c0cc47ac2f6f40800 flow hash: 0x00000000

  00000000: 0000001a9a7c0cc47ac2f6f40800450001ee000000003f113dde0a0a0a021414

  00000020: 1402025802bc01da0000000102030405060708090a0b0c0d0e0f1011

03:09:22:826497: GigabitEthernet5/0/0-output

  GigabitEthernet5/0/0 l4-cksum-computed l4-cksum-correct l2_hdr_offset_valid 
l3_hdr_offset_valid

  IP4: 0c:c4:7a:c2:f6:f4 -> 00:00:00:1a:9a:7c

  UDP: 10.10.10.2 -> 20.20.20.2

    tos 0x00, ttl 63, length 494, checksum 0x3dde

    fragment id 0x0000

  UDP: 600 -> 700

    length 474, checksum 0x0000

03:09:22:826520: GigabitEthernet5/0/0-tx

  GigabitEthernet5/0/0 tx queue 0

  buffer 0x9b3a8: current data 0, length 508, buffer-pool 0, ref-count 1, 
totlen-nifb 0, trace handle 0x2

                  ext-hdr-valid

                  l4-cksum-computed l4-cksum-correct l2-hdr-offset 0 
l3-hdr-offset 14

  PKT MBUF: port 3, nb_segs 1, pkt_len 508

    buf_len 2176, data_len 508, ol_flags 0x180, data_off 128, phys_addr 
0x26cea80

    packet_type 0x211 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0

    rss 0x0 fdir.hi 0x0 fdir.lo 0x0

    Packet Offload Flags

      PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid

      PKT_RX_L4_CKSUM_GOOD (0x0100) L4 cksum of RX pkt. is valid

    Packet Types

      RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet

      RTE_PTYPE_L3_IPV4 (0x0010) IPv4 packet without extension headers

      RTE_PTYPE_L4_UDP (0x0200) UDP packet

  IP4: 0c:c4:7a:c2:f6:f4 -> 00:00:00:1a:9a:7c

  UDP: 10.10.10.2 -> 20.20.20.2

    tos 0x00, ttl 63, length 494, checksum 0x3dde

    fragment id 0x0000

  UDP: 600 -> 700

    length 474, checksum 0x0000



Packet 4



03:09:31:598786: dpdk-input

  GigabitEthernet5/0/1 rx queue 0

  buffer 0x9b381: current data 0, length 508, buffer-pool 0, ref-count 1, 
totlen-nifb 0, trace handle 0x3

                  ext-hdr-valid

                  l4-cksum-computed l4-cksum-correct

  PKT MBUF: port 3, nb_segs 1, pkt_len 508

    buf_len 2176, data_len 508, ol_flags 0x180, data_off 128, phys_addr 
0x26ce0c0

    packet_type 0x211 l2_len 0 l3_len 0 outer_l2_len 0 outer_l3_len 0

    rss 0x0 fdir.hi 0x0 fdir.lo 0x0

    Packet Offload Flags

      PKT_RX_IP_CKSUM_GOOD (0x0080) IP cksum of RX pkt. is valid

      PKT_RX_L4_CKSUM_GOOD (0x0100) L4 cksum of RX pkt. is valid

    Packet Types

      RTE_PTYPE_L2_ETHER (0x0001) Ethernet packet

      RTE_PTYPE_L3_IPV4 (0x0010) IPv4 packet without extension headers

      RTE_PTYPE_L4_UDP (0x0200) UDP packet

  IP4: 00:00:00:1a:9a:7e -> 0c:c4:7a:c2:f6:f5

  UDP: 10.10.10.2 -> 10.10.10.15

    tos 0x00, ttl 64, length 494, checksum 0x50db

    fragment id 0x0000

  UDP: 600 -> 1824

    length 474, checksum 0x3722

03:09:31:598804: ethernet-input

  frame: flags 0x3, hw-if-index 4, sw-if-index 4

  IP4: 00:00:00:1a:9a:7e -> 0c:c4:7a:c2:f6:f5

03:09:31:598815: ip4-input-no-checksum

  UDP: 10.10.10.2 -> 10.10.10.15

    tos 0x00, ttl 64, length 494, checksum 0x50db

    fragment id 0x0000

  UDP: 600 -> 1824

    length 474, checksum 0x3722

03:09:31:598822: nat44-det-out2in

  NAT_DET_OUT2IN: sw_if_index 4, next index 0, session index -1

03:09:35:076675: error-drop

  rx:GigabitEthernet5/0/1

03:09:35:076687: drop

  nat44-det-out2in: No translation

Thanks,
Vijay
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#15919): https://lists.fd.io/g/vpp-dev/message/15919
Mute This Topic: https://lists.fd.io/mt/72625921/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to