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] -=-=-=-=-=-=-=-=-=-=-=-