#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;
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);