]> www.infradead.org Git - users/hch/misc.git/commitdiff
ipv6: sit: Add ipip6_tunnel_dst_find() for cleanup
authorYue Haibing <yuehaibing@huawei.com>
Mon, 1 Sep 2025 11:48:57 +0000 (19:48 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 4 Sep 2025 08:03:59 +0000 (10:03 +0200)
Extract the dst lookup logic from ipip6_tunnel_xmit() into new helper
ipip6_tunnel_dst_find() to reduce code duplication and enhance readability.
No functional change intended.

On a x86_64, with allmodconfig object size is also reduced:

./scripts/bloat-o-meter net/ipv6/sit.o net/ipv6/sit-new.o
add/remove: 5/3 grow/shrink: 3/4 up/down: 1841/-2275 (-434)
Function                                     old     new   delta
ipip6_tunnel_dst_find                          -    1697   +1697
__pfx_ipip6_tunnel_dst_find                    -      64     +64
__UNIQUE_ID_modinfo2094                        -      43     +43
ipip6_tunnel_xmit.isra.cold                   79      88      +9
__UNIQUE_ID_modinfo2096                       12      20      +8
__UNIQUE_ID___addressable_init_module2092       -       8      +8
__UNIQUE_ID___addressable_cleanup_module2093       -       8      +8
__func__                                      55      59      +4
__UNIQUE_ID_modinfo2097                       20      18      -2
__UNIQUE_ID___addressable_init_module2093       8       -      -8
__UNIQUE_ID___addressable_cleanup_module2094       8       -      -8
__UNIQUE_ID_modinfo2098                       18       -     -18
__UNIQUE_ID_modinfo2095                       43      12     -31
descriptor                                   112      56     -56
ipip6_tunnel_xmit.isra                      9910    7758   -2152
Total: Before=72537, After=72103, chg -0.60%

Signed-off-by: Yue Haibing <yuehaibing@huawei.com>
Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Link: https://patch.msgid.link/20250901114857.1968513-1-yuehaibing@huawei.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv6/sit.c

index 12496ba1b7d4d3cf8127fdda5c157f73f8770b48..cf37ad9686e698bf781df84f348d89ea7160ec63 100644 (file)
@@ -848,6 +848,49 @@ static inline __be32 try_6rd(struct ip_tunnel *tunnel,
        return dst;
 }
 
+static bool ipip6_tunnel_dst_find(struct sk_buff *skb, __be32 *dst,
+                                 bool is_isatap)
+{
+       const struct ipv6hdr *iph6 = ipv6_hdr(skb);
+       struct neighbour *neigh = NULL;
+       const struct in6_addr *addr6;
+       bool found = false;
+       int addr_type;
+
+       if (skb_dst(skb))
+               neigh = dst_neigh_lookup(skb_dst(skb), &iph6->daddr);
+
+       if (!neigh) {
+               net_dbg_ratelimited("nexthop == NULL\n");
+               return false;
+       }
+
+       addr6 = (const struct in6_addr *)&neigh->primary_key;
+       addr_type = ipv6_addr_type(addr6);
+
+       if (is_isatap) {
+               if ((addr_type & IPV6_ADDR_UNICAST) &&
+                   ipv6_addr_is_isatap(addr6)) {
+                       *dst = addr6->s6_addr32[3];
+                       found = true;
+               }
+       } else {
+               if (addr_type == IPV6_ADDR_ANY) {
+                       addr6 = &ipv6_hdr(skb)->daddr;
+                       addr_type = ipv6_addr_type(addr6);
+               }
+
+               if ((addr_type & IPV6_ADDR_COMPATv4) != 0) {
+                       *dst = addr6->s6_addr32[3];
+                       found = true;
+               }
+       }
+
+       neigh_release(neigh);
+
+       return found;
+}
+
 /*
  *     This function assumes it is being called from dev_queue_xmit()
  *     and that skb is filled properly by that function.
@@ -867,8 +910,6 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
        __be32 dst = tiph->daddr;
        struct flowi4 fl4;
        int    mtu;
-       const struct in6_addr *addr6;
-       int addr_type;
        u8 ttl;
        u8 protocol = IPPROTO_IPV6;
        int t_hlen = tunnel->hlen + sizeof(struct iphdr);
@@ -877,64 +918,15 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
                tos = ipv6_get_dsfield(iph6);
 
        /* ISATAP (RFC4214) - must come before 6to4 */
-       if (dev->priv_flags & IFF_ISATAP) {
-               struct neighbour *neigh = NULL;
-               bool do_tx_error = false;
-
-               if (skb_dst(skb))
-                       neigh = dst_neigh_lookup(skb_dst(skb), &iph6->daddr);
-
-               if (!neigh) {
-                       net_dbg_ratelimited("nexthop == NULL\n");
-                       goto tx_error;
-               }
-
-               addr6 = (const struct in6_addr *)&neigh->primary_key;
-               addr_type = ipv6_addr_type(addr6);
-
-               if ((addr_type & IPV6_ADDR_UNICAST) &&
-                    ipv6_addr_is_isatap(addr6))
-                       dst = addr6->s6_addr32[3];
-               else
-                       do_tx_error = true;
-
-               neigh_release(neigh);
-               if (do_tx_error)
-                       goto tx_error;
-       }
+       if ((dev->priv_flags & IFF_ISATAP) &&
+           !ipip6_tunnel_dst_find(skb, &dst, true))
+               goto tx_error;
 
        if (!dst)
                dst = try_6rd(tunnel, &iph6->daddr);
 
-       if (!dst) {
-               struct neighbour *neigh = NULL;
-               bool do_tx_error = false;
-
-               if (skb_dst(skb))
-                       neigh = dst_neigh_lookup(skb_dst(skb), &iph6->daddr);
-
-               if (!neigh) {
-                       net_dbg_ratelimited("nexthop == NULL\n");
-                       goto tx_error;
-               }
-
-               addr6 = (const struct in6_addr *)&neigh->primary_key;
-               addr_type = ipv6_addr_type(addr6);
-
-               if (addr_type == IPV6_ADDR_ANY) {
-                       addr6 = &ipv6_hdr(skb)->daddr;
-                       addr_type = ipv6_addr_type(addr6);
-               }
-
-               if ((addr_type & IPV6_ADDR_COMPATv4) != 0)
-                       dst = addr6->s6_addr32[3];
-               else
-                       do_tx_error = true;
-
-               neigh_release(neigh);
-               if (do_tx_error)
-                       goto tx_error;
-       }
+       if (!dst && !ipip6_tunnel_dst_find(skb, &dst, false))
+               goto tx_error;
 
        flowi4_init_output(&fl4, tunnel->parms.link, tunnel->fwmark,
                           tos & INET_DSCP_MASK, RT_SCOPE_UNIVERSE,