diff options
author | Tom Herbert <tom@herbertland.com> | 2016-04-05 11:22:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-07 16:53:29 -0400 |
commit | 4a0090a98e5f6e7813d807c883abf362df4b0507 (patch) | |
tree | e6f64048d197492da632967143a943298f71e0ec | |
parent | d92283e338f6d6503b7417536bf3478f466cbc01 (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.c | 28 |
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 | ||
435 | static struct sk_buff **geneve_gro_receive(struct sk_buff **head, | 426 | static 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 | ||
498 | static int geneve_gro_complete(struct sk_buff *skb, int nhoff, | 489 | static 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 | ||
584 | static void __geneve_sock_release(struct geneve_sock *gs) | 572 | static void __geneve_sock_release(struct geneve_sock *gs) |