nat: fix byte order error. 59/37559/6
authorHuawei LI <lihuawei_zzu@163.com>
Sat, 29 Oct 2022 13:20:07 +0000 (21:20 +0800)
committerOle Tr�an <otroan@employees.org>
Mon, 7 Nov 2022 07:58:55 +0000 (07:58 +0000)
fix byte order error about the struct snat_address_t's member net.
for example configurations:
  set interface ip table loop1 1
  set interface ip addr loop1 10.10.10.2/24
  nat44 add address 10.10.10.2 tenant-vrf 1
the snat address's net should be "as_u8 = {0xa, 0xa, 0xa, 0x0}",
but now it's "as_u8 = {0x0, 0xa, 0xa, 0x2}" because of missing
transition of byte order about the member net of snat_address_t.
(gdb) p/x *snat_main->addresses
$3 = {addr = {data = {0xa, 0xa, 0xa, 0x2}, data_u32 = 0x20a0a0a,
      as_u8 = {0xa, 0xa, 0xa, 0x2}, as_u16 = {0xa0a, 0x20a},
      as_u32 = 0x20a0a0a}, net = {data = {0x0, 0xa, 0xa, 0x2},
      data_u32 = 0x20a0a00, as_u8 = {0x0, 0xa, 0xa, 0x2},
      as_u16 = {0xa00, 0x20a}, as_u32 = 0x20a0a00},
      sw_if_index = 0x3, fib_index = 0x1,addr_len = 0x18}
(gdb)

Type: fix

Signed-off-by: Huawei LI <lihuawei_zzu@163.com>
Change-Id: I4f25f0639ae90a7f2e8715b44f825571283d994d

src/plugins/nat/nat44-ed/nat44_ed.c

index 2e4c791..ed93f6c 100644 (file)
@@ -286,8 +286,7 @@ nat44_ed_resolve_nat_addr_len (snat_address_t *ap,
        {
          ap->addr_len = ia->address_length;
          ap->sw_if_index = i->sw_if_index;
-         ap->net.as_u32 = (ap->addr.as_u32 >> (32 - ap->addr_len))
-                          << (32 - ap->addr_len);
+         ap->net.as_u32 = ap->addr.as_u32 & ip4_main.fib_masks[ap->addr_len];
 
          nat_log_debug ("pool addr %U binds to -> sw_if_idx: %u net: %U/%u",
                         format_ip4_address, &ap->addr, ap->sw_if_index,
@@ -334,8 +333,7 @@ nat44_ed_bind_if_addr_to_nat_addr (u32 sw_if_index)
        {
          ap->addr_len = ia->address_length;
          ap->sw_if_index = sw_if_index;
-         ap->net.as_u32 = (ap->addr.as_u32 >> (32 - ap->addr_len))
-                          << (32 - ap->addr_len);
+         ap->net.as_u32 = ap->addr.as_u32 & ip4_main.fib_masks[ap->addr_len];
 
          nat_log_debug ("pool addr %U binds to -> sw_if_idx: %u net: %U/%u",
                         format_ip4_address, &ap->addr, ap->sw_if_index,
@@ -3434,8 +3432,8 @@ nat44_ed_add_del_interface_address_cb (ip4_main_t *im, uword opaque,
                    {
                      ap->addr_len = address_length;
                      ap->sw_if_index = sw_if_index;
-                     ap->net.as_u32 = (ap->addr.as_u32 >> (32 - ap->addr_len))
-                                      << (32 - ap->addr_len);
+                     ap->net.as_u32 =
+                       ap->addr.as_u32 & ip4_main.fib_masks[ap->addr_len];
 
                      nat_log_debug (
                        "pool addr %U binds to -> sw_if_idx: %u net: %U/%u",