Skip to content

Commit

Permalink
geneve: Remove socket and offload handlers at destruction.
Browse files Browse the repository at this point in the history
Sockets aren't currently removed from the the global list when
they are destroyed. In addition, offload handlers need to be cleaned
up as well.

Fixes: 0b5e8b8 ("net: Add Geneve tunneling protocol driver")
CC: Andy Zhou <azhou@nicira.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jesse Gross authored and David S. Miller committed Dec 18, 2014
1 parent a18e6a1 commit 7ed767f
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions net/ipv4/geneve.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,15 @@ static void geneve_notify_add_rx_port(struct geneve_sock *gs)
}
}

static void geneve_notify_del_rx_port(struct geneve_sock *gs)
{
struct sock *sk = gs->sock->sk;
sa_family_t sa_family = sk->sk_family;

if (sa_family == AF_INET)
udp_del_offload(&gs->udp_offloads);
}

/* Callback from net/ipv4/udp.c to receive packets */
static int geneve_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
{
Expand Down Expand Up @@ -312,9 +321,17 @@ EXPORT_SYMBOL_GPL(geneve_sock_add);

void geneve_sock_release(struct geneve_sock *gs)
{
struct net *net = sock_net(gs->sock->sk);
struct geneve_net *gn = net_generic(net, geneve_net_id);

if (!atomic_dec_and_test(&gs->refcnt))
return;

spin_lock(&gn->sock_lock);
hlist_del_rcu(&gs->hlist);
geneve_notify_del_rx_port(gs);
spin_unlock(&gn->sock_lock);

queue_work(geneve_wq, &gs->del_work);
}
EXPORT_SYMBOL_GPL(geneve_sock_release);
Expand Down

0 comments on commit 7ed767f

Please sign in to comment.