diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c index 7e8c3023842e..4f841eced028 100644 --- a/drivers/net/geneve.c +++ b/drivers/net/geneve.c @@ -1040,35 +1040,41 @@ static void geneve_sock_release(struct geneve_dev *geneve) #endif } -static struct geneve_sock *geneve_find_sock(struct geneve_net *gn, - sa_family_t family, - __be16 dst_port, - bool gro_hint) +static struct geneve_sock *geneve_find_sock(struct net *net, + struct geneve_dev *geneve, bool ipv6) { + struct geneve_net *gn = net_generic(net, geneve_net_id); + struct ip_tunnel_info *info = &geneve->cfg.info; + sa_family_t family = ipv6 ? AF_INET6 : AF_INET; + bool gro_hint = geneve->cfg.gro_hint; + __be16 dst_port = info->key.tp_dst; struct geneve_sock *gs; list_for_each_entry(gs, &gn->sock_list, list) { - if (inet_sk(gs->sk)->inet_sport == dst_port && - geneve_get_sk_family(gs) == family && - gs->gro_hint == gro_hint) { - return gs; - } + if (inet_sk(gs->sk)->inet_sport != dst_port) + continue; + + if (geneve_get_sk_family(gs) != family) + continue; + + if (gs->gro_hint != gro_hint) + continue; + + return gs; } + return NULL; } static int geneve_sock_add(struct geneve_dev *geneve, bool ipv6) { struct net *net = geneve->net; - struct geneve_net *gn = net_generic(net, geneve_net_id); - bool gro_hint = geneve->cfg.gro_hint; struct geneve_dev_node *node; struct geneve_sock *gs; __u8 vni[3]; __u32 hash; - gs = geneve_find_sock(gn, ipv6 ? AF_INET6 : AF_INET, - geneve->cfg.info.key.tp_dst, gro_hint); + gs = geneve_find_sock(net, geneve, ipv6); if (gs) { gs->refcnt++; goto out; @@ -1080,7 +1086,7 @@ static int geneve_sock_add(struct geneve_dev *geneve, bool ipv6) out: gs->collect_md = geneve->cfg.collect_md; - gs->gro_hint = gro_hint; + gs->gro_hint = geneve->cfg.gro_hint; #if IS_ENABLED(CONFIG_IPV6) if (ipv6) { rcu_assign_pointer(geneve->sock6, gs);