aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Herbert <tom@herbertland.com>2016-04-05 11:22:55 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-07 16:53:29 -0400
commit4a0090a98e5f6e7813d807c883abf362df4b0507 (patch)
treee6f64048d197492da632967143a943298f71e0ec
parentd92283e338f6d6503b7417536bf3478f466cbc01 (diff)
geneve: change to use UDP socket GRO
Adapt geneve_gro_receive, geneve_gro_complete to take a socket argument. Set these functions in tunnel_config. Don't set udp_offloads any more. Signed-off-by: Tom Herbert <tom@herbertland.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/geneve.c28
1 files changed, 8 insertions, 20 deletions
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index bc168894bda3..a9fbf17eb256 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -87,7 +87,6 @@ struct geneve_sock {
87 struct socket *sock; 87 struct socket *sock;
88 struct rcu_head rcu; 88 struct rcu_head rcu;
89 int refcnt; 89 int refcnt;
90 struct udp_offload udp_offloads;
91 struct hlist_head vni_list[VNI_HASH_SIZE]; 90 struct hlist_head vni_list[VNI_HASH_SIZE];
92 u32 flags; 91 u32 flags;
93}; 92};
@@ -409,14 +408,6 @@ static void geneve_notify_add_rx_port(struct geneve_sock *gs)
409 struct net *net = sock_net(sk); 408 struct net *net = sock_net(sk);
410 sa_family_t sa_family = geneve_get_sk_family(gs); 409 sa_family_t sa_family = geneve_get_sk_family(gs);
411 __be16 port = inet_sk(sk)->inet_sport; 410 __be16 port = inet_sk(sk)->inet_sport;
412 int err;
413
414 if (sa_family == AF_INET) {
415 err = udp_add_offload(sock_net(sk), &gs->udp_offloads);
416 if (err)
417 pr_warn("geneve: udp_add_offload failed with status %d\n",
418 err);
419 }
420 411
421 rcu_read_lock(); 412 rcu_read_lock();
422 for_each_netdev_rcu(net, dev) { 413 for_each_netdev_rcu(net, dev) {
@@ -432,9 +423,9 @@ static int geneve_hlen(struct genevehdr *gh)
432 return sizeof(*gh) + gh->opt_len * 4; 423 return sizeof(*gh) + gh->opt_len * 4;
433} 424}
434 425
435static struct sk_buff **geneve_gro_receive(struct sk_buff **head, 426static struct sk_buff **geneve_gro_receive(struct sock *sk,
436 struct sk_buff *skb, 427 struct sk_buff **head,
437 struct udp_offload *uoff) 428 struct sk_buff *skb)
438{ 429{
439 struct sk_buff *p, **pp = NULL; 430 struct sk_buff *p, **pp = NULL;
440 struct genevehdr *gh, *gh2; 431 struct genevehdr *gh, *gh2;
@@ -495,8 +486,8 @@ out:
495 return pp; 486 return pp;
496} 487}
497 488
498static int geneve_gro_complete(struct sk_buff *skb, int nhoff, 489static int geneve_gro_complete(struct sock *sk, struct sk_buff *skb,
499 struct udp_offload *uoff) 490 int nhoff)
500{ 491{
501 struct genevehdr *gh; 492 struct genevehdr *gh;
502 struct packet_offload *ptype; 493 struct packet_offload *ptype;
@@ -545,14 +536,14 @@ static struct geneve_sock *geneve_socket_create(struct net *net, __be16 port,
545 INIT_HLIST_HEAD(&gs->vni_list[h]); 536 INIT_HLIST_HEAD(&gs->vni_list[h]);
546 537
547 /* Initialize the geneve udp offloads structure */ 538 /* Initialize the geneve udp offloads structure */
548 gs->udp_offloads.port = port;
549 gs->udp_offloads.callbacks.gro_receive = geneve_gro_receive;
550 gs->udp_offloads.callbacks.gro_complete = geneve_gro_complete;
551 geneve_notify_add_rx_port(gs); 539 geneve_notify_add_rx_port(gs);
552 540
553 /* Mark socket as an encapsulation socket */ 541 /* Mark socket as an encapsulation socket */
542 memset(&tunnel_cfg, 0, sizeof(tunnel_cfg));
554 tunnel_cfg.sk_user_data = gs; 543 tunnel_cfg.sk_user_data = gs;
555 tunnel_cfg.encap_type = 1; 544 tunnel_cfg.encap_type = 1;
545 tunnel_cfg.gro_receive = geneve_gro_receive;
546 tunnel_cfg.gro_complete = geneve_gro_complete;
556 tunnel_cfg.encap_rcv = geneve_udp_encap_recv; 547 tunnel_cfg.encap_rcv = geneve_udp_encap_recv;
557 tunnel_cfg.encap_destroy = NULL; 548 tunnel_cfg.encap_destroy = NULL;
558 setup_udp_tunnel_sock(net, sock, &tunnel_cfg); 549 setup_udp_tunnel_sock(net, sock, &tunnel_cfg);
@@ -576,9 +567,6 @@ static void geneve_notify_del_rx_port(struct geneve_sock *gs)
576 } 567 }
577 568
578 rcu_read_unlock(); 569 rcu_read_unlock();
579
580 if (sa_family == AF_INET)
581 udp_del_offload(&gs->udp_offloads);
582} 570}
583 571
584static void __geneve_sock_release(struct geneve_sock *gs) 572static void __geneve_sock_release(struct geneve_sock *gs)