]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ip6_gre: Factor out common ip6gre tunnel match into helper
authorYue Haibing <yuehaibing@huawei.com>
Sat, 19 Jul 2025 08:15:51 +0000 (16:15 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 22 Jul 2025 10:15:26 +0000 (12:15 +0200)
Extract common ip6gre tunnel match from ip6gre_tunnel_lookup() into new
helper function ip6gre_tunnel_match() to reduce code duplication.

No functional change intended.

Signed-off-by: Yue Haibing <yuehaibing@huawei.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250719081551.963670-1-yuehaibing@huawei.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/ipv6/ip6_gre.c

index a1210fd6404ee3de8f626bbb27ffcaf48a7b3d9e..74d49dd6124d0fbe2f78dac170c3016ed5169fba 100644 (file)
@@ -111,8 +111,32 @@ static u32 HASH_ADDR(const struct in6_addr *addr)
 #define tunnels_l      tunnels[1]
 #define tunnels_wc     tunnels[0]
 
-/* Given src, dst and key, find appropriate for input tunnel. */
+static bool ip6gre_tunnel_match(struct ip6_tnl *t, int dev_type, int link,
+                               int *cand_score, struct ip6_tnl **ret)
+{
+       int score = 0;
+
+       if (t->dev->type != ARPHRD_IP6GRE &&
+           t->dev->type != dev_type)
+               return false;
+
+       if (t->parms.link != link)
+               score |= 1;
+       if (t->dev->type != dev_type)
+               score |= 2;
+       if (score == 0) {
+               *ret = t;
+               return true;
+       }
+
+       if (score < *cand_score) {
+               *ret = t;
+               *cand_score = score;
+       }
+       return false;
+}
 
+/* Given src, dst and key, find appropriate for input tunnel. */
 static struct ip6_tnl *ip6gre_tunnel_lookup(struct net_device *dev,
                const struct in6_addr *remote, const struct in6_addr *local,
                __be32 key, __be16 gre_proto)
@@ -127,8 +151,8 @@ static struct ip6_tnl *ip6gre_tunnel_lookup(struct net_device *dev,
                        gre_proto == htons(ETH_P_ERSPAN) ||
                        gre_proto == htons(ETH_P_ERSPAN2)) ?
                       ARPHRD_ETHER : ARPHRD_IP6GRE;
-       int score, cand_score = 4;
        struct net_device *ndev;
+       int cand_score = 4;
 
        for_each_ip_tunnel_rcu(t, ign->tunnels_r_l[h0 ^ h1]) {
                if (!ipv6_addr_equal(local, &t->parms.laddr) ||
@@ -137,22 +161,8 @@ static struct ip6_tnl *ip6gre_tunnel_lookup(struct net_device *dev,
                    !(t->dev->flags & IFF_UP))
                        continue;
 
-               if (t->dev->type != ARPHRD_IP6GRE &&
-                   t->dev->type != dev_type)
-                       continue;
-
-               score = 0;
-               if (t->parms.link != link)
-                       score |= 1;
-               if (t->dev->type != dev_type)
-                       score |= 2;
-               if (score == 0)
-                       return t;
-
-               if (score < cand_score) {
-                       cand = t;
-                       cand_score = score;
-               }
+               if (ip6gre_tunnel_match(t, dev_type, link, &cand_score, &cand))
+                       return cand;
        }
 
        for_each_ip_tunnel_rcu(t, ign->tunnels_r[h0 ^ h1]) {
@@ -161,22 +171,8 @@ static struct ip6_tnl *ip6gre_tunnel_lookup(struct net_device *dev,
                    !(t->dev->flags & IFF_UP))
                        continue;
 
-               if (t->dev->type != ARPHRD_IP6GRE &&
-                   t->dev->type != dev_type)
-                       continue;
-
-               score = 0;
-               if (t->parms.link != link)
-                       score |= 1;
-               if (t->dev->type != dev_type)
-                       score |= 2;
-               if (score == 0)
-                       return t;
-
-               if (score < cand_score) {
-                       cand = t;
-                       cand_score = score;
-               }
+               if (ip6gre_tunnel_match(t, dev_type, link, &cand_score, &cand))
+                       return cand;
        }
 
        for_each_ip_tunnel_rcu(t, ign->tunnels_l[h1]) {
@@ -187,22 +183,8 @@ static struct ip6_tnl *ip6gre_tunnel_lookup(struct net_device *dev,
                    !(t->dev->flags & IFF_UP))
                        continue;
 
-               if (t->dev->type != ARPHRD_IP6GRE &&
-                   t->dev->type != dev_type)
-                       continue;
-
-               score = 0;
-               if (t->parms.link != link)
-                       score |= 1;
-               if (t->dev->type != dev_type)
-                       score |= 2;
-               if (score == 0)
-                       return t;
-
-               if (score < cand_score) {
-                       cand = t;
-                       cand_score = score;
-               }
+               if (ip6gre_tunnel_match(t, dev_type, link, &cand_score, &cand))
+                       return cand;
        }
 
        for_each_ip_tunnel_rcu(t, ign->tunnels_wc[h1]) {
@@ -210,22 +192,8 @@ static struct ip6_tnl *ip6gre_tunnel_lookup(struct net_device *dev,
                    !(t->dev->flags & IFF_UP))
                        continue;
 
-               if (t->dev->type != ARPHRD_IP6GRE &&
-                   t->dev->type != dev_type)
-                       continue;
-
-               score = 0;
-               if (t->parms.link != link)
-                       score |= 1;
-               if (t->dev->type != dev_type)
-                       score |= 2;
-               if (score == 0)
-                       return t;
-
-               if (score < cand_score) {
-                       cand = t;
-                       cand_score = score;
-               }
+               if (ip6gre_tunnel_match(t, dev_type, link, &cand_score, &cand))
+                       return cand;
        }
 
        if (cand)