Skip to content

Commit

Permalink
net: Remove gso_send_check as an offload callback
Browse files Browse the repository at this point in the history
The send_check logic was only interesting in cases of TCP offload and
UDP UFO where the checksum needed to be initialized to the pseudo
header checksum. Now we've moved that logic into the related
gso_segment functions so gso_send_check is no longer needed.

Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Tom Herbert authored and David S. Miller committed Sep 26, 2014
1 parent f71470b commit 53e5039
Show file tree
Hide file tree
Showing 10 changed files with 3 additions and 113 deletions.
1 change: 0 additions & 1 deletion include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -1911,7 +1911,6 @@ struct packet_type {
struct offload_callbacks {
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
netdev_features_t features);
int (*gso_send_check)(struct sk_buff *skb);
struct sk_buff **(*gro_receive)(struct sk_buff **head,
struct sk_buff *skb);
int (*gro_complete)(struct sk_buff *skb, int nhoff);
Expand Down
10 changes: 0 additions & 10 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -2422,16 +2422,6 @@ struct sk_buff *skb_mac_gso_segment(struct sk_buff *skb,
rcu_read_lock();
list_for_each_entry_rcu(ptype, &offload_base, list) {
if (ptype->type == type && ptype->callbacks.gso_segment) {
if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
int err;

err = ptype->callbacks.gso_send_check(skb);
segs = ERR_PTR(err);
if (err || skb_gso_ok(skb, features))
break;
__skb_push(skb, (skb->data -
skb_network_header(skb)));
}
segs = ptype->callbacks.gso_segment(skb, features);
break;
}
Expand Down
36 changes: 0 additions & 36 deletions net/ipv4/af_inet.c
Original file line number Diff line number Diff line change
Expand Up @@ -1197,40 +1197,6 @@ int inet_sk_rebuild_header(struct sock *sk)
}
EXPORT_SYMBOL(inet_sk_rebuild_header);

static int inet_gso_send_check(struct sk_buff *skb)
{
const struct net_offload *ops;
const struct iphdr *iph;
int proto;
int ihl;
int err = -EINVAL;

if (unlikely(!pskb_may_pull(skb, sizeof(*iph))))
goto out;

iph = ip_hdr(skb);
ihl = iph->ihl * 4;
if (ihl < sizeof(*iph))
goto out;

proto = iph->protocol;

/* Warning: after this point, iph might be no longer valid */
if (unlikely(!pskb_may_pull(skb, ihl)))
goto out;
__skb_pull(skb, ihl);

skb_reset_transport_header(skb);
err = -EPROTONOSUPPORT;

ops = rcu_dereference(inet_offloads[proto]);
if (likely(ops && ops->callbacks.gso_send_check))
err = ops->callbacks.gso_send_check(skb);

out:
return err;
}

static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{
Expand Down Expand Up @@ -1655,7 +1621,6 @@ static int ipv4_proc_init(void);
static struct packet_offload ip_packet_offload __read_mostly = {
.type = cpu_to_be16(ETH_P_IP),
.callbacks = {
.gso_send_check = inet_gso_send_check,
.gso_segment = inet_gso_segment,
.gro_receive = inet_gro_receive,
.gro_complete = inet_gro_complete,
Expand All @@ -1664,7 +1629,6 @@ static struct packet_offload ip_packet_offload __read_mostly = {

static const struct net_offload ipip_offload = {
.callbacks = {
.gso_send_check = inet_gso_send_check,
.gso_segment = inet_gso_segment,
.gro_receive = inet_gro_receive,
.gro_complete = inet_gro_complete,
Expand Down
11 changes: 3 additions & 8 deletions net/ipv4/gre_offload.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,6 @@
#include <net/protocol.h>
#include <net/gre.h>

static int gre_gso_send_check(struct sk_buff *skb)
{
if (!skb->encapsulation)
return -EINVAL;
return 0;
}

static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{
Expand All @@ -46,6 +39,9 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
SKB_GSO_IPIP)))
goto out;

if (!skb->encapsulation)
goto out;

if (unlikely(!pskb_may_pull(skb, sizeof(*greh))))
goto out;

Expand Down Expand Up @@ -256,7 +252,6 @@ static int gre_gro_complete(struct sk_buff *skb, int nhoff)

static const struct net_offload gre_offload = {
.callbacks = {
.gso_send_check = gre_gso_send_check,
.gso_segment = gre_gso_segment,
.gro_receive = gre_gro_receive,
.gro_complete = gre_gro_complete,
Expand Down
6 changes: 0 additions & 6 deletions net/ipv4/tcp_offload.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,11 +288,6 @@ int tcp_gro_complete(struct sk_buff *skb)
}
EXPORT_SYMBOL(tcp_gro_complete);

static int tcp_v4_gso_send_check(struct sk_buff *skb)
{
return 0;
}

static struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *skb)
{
/* Don't bother verifying checksum if we're going to flush anyway. */
Expand Down Expand Up @@ -320,7 +315,6 @@ static int tcp4_gro_complete(struct sk_buff *skb, int thoff)

static const struct net_offload tcpv4_offload = {
.callbacks = {
.gso_send_check = tcp_v4_gso_send_check,
.gso_segment = tcp4_gso_segment,
.gro_receive = tcp4_gro_receive,
.gro_complete = tcp4_gro_complete,
Expand Down
6 changes: 0 additions & 6 deletions net/ipv4/udp_offload.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,6 @@ struct udp_offload_priv {
struct udp_offload_priv __rcu *next;
};

static int udp4_ufo_send_check(struct sk_buff *skb)
{
return 0;
}

struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
netdev_features_t features)
{
Expand Down Expand Up @@ -346,7 +341,6 @@ static int udp4_gro_complete(struct sk_buff *skb, int nhoff)

static const struct net_offload udpv4_offload = {
.callbacks = {
.gso_send_check = udp4_ufo_send_check,
.gso_segment = udp4_ufo_fragment,
.gro_receive = udp4_gro_receive,
.gro_complete = udp4_gro_complete,
Expand Down
27 changes: 0 additions & 27 deletions net/ipv6/ip6_offload.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,31 +53,6 @@ static int ipv6_gso_pull_exthdrs(struct sk_buff *skb, int proto)
return proto;
}

static int ipv6_gso_send_check(struct sk_buff *skb)
{
const struct ipv6hdr *ipv6h;
const struct net_offload *ops;
int err = -EINVAL;

if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
goto out;

ipv6h = ipv6_hdr(skb);
__skb_pull(skb, sizeof(*ipv6h));
err = -EPROTONOSUPPORT;

ops = rcu_dereference(inet6_offloads[
ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr)]);

if (likely(ops && ops->callbacks.gso_send_check)) {
skb_reset_transport_header(skb);
err = ops->callbacks.gso_send_check(skb);
}

out:
return err;
}

static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{
Expand Down Expand Up @@ -306,7 +281,6 @@ static int ipv6_gro_complete(struct sk_buff *skb, int nhoff)
static struct packet_offload ipv6_packet_offload __read_mostly = {
.type = cpu_to_be16(ETH_P_IPV6),
.callbacks = {
.gso_send_check = ipv6_gso_send_check,
.gso_segment = ipv6_gso_segment,
.gro_receive = ipv6_gro_receive,
.gro_complete = ipv6_gro_complete,
Expand All @@ -315,7 +289,6 @@ static struct packet_offload ipv6_packet_offload __read_mostly = {

static const struct net_offload sit_offload = {
.callbacks = {
.gso_send_check = ipv6_gso_send_check,
.gso_segment = ipv6_gso_segment,
.gro_receive = ipv6_gro_receive,
.gro_complete = ipv6_gro_complete,
Expand Down
6 changes: 0 additions & 6 deletions net/ipv6/tcpv6_offload.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,6 @@
#include <net/ip6_checksum.h>
#include "ip6_offload.h"

static int tcp_v6_gso_send_check(struct sk_buff *skb)
{
return 0;
}

static struct sk_buff **tcp6_gro_receive(struct sk_buff **head,
struct sk_buff *skb)
{
Expand Down Expand Up @@ -71,7 +66,6 @@ struct sk_buff *tcp6_gso_segment(struct sk_buff *skb,
}
static const struct net_offload tcpv6_offload = {
.callbacks = {
.gso_send_check = tcp_v6_gso_send_check,
.gso_segment = tcp6_gso_segment,
.gro_receive = tcp6_gro_receive,
.gro_complete = tcp6_gro_complete,
Expand Down
6 changes: 0 additions & 6 deletions net/ipv6/udp_offload.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,6 @@
#include <net/ip6_checksum.h>
#include "ip6_offload.h"

static int udp6_ufo_send_check(struct sk_buff *skb)
{
return 0;
}

static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
netdev_features_t features)
{
Expand Down Expand Up @@ -166,7 +161,6 @@ static int udp6_gro_complete(struct sk_buff *skb, int nhoff)

static const struct net_offload udpv6_offload = {
.callbacks = {
.gso_send_check = udp6_ufo_send_check,
.gso_segment = udp6_ufo_fragment,
.gro_receive = udp6_gro_receive,
.gro_complete = udp6_gro_complete,
Expand Down
7 changes: 0 additions & 7 deletions net/mpls/mpls_gso.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,23 +65,16 @@ static struct sk_buff *mpls_gso_segment(struct sk_buff *skb,
return segs;
}

static int mpls_gso_send_check(struct sk_buff *skb)
{
return 0;
}

static struct packet_offload mpls_mc_offload = {
.type = cpu_to_be16(ETH_P_MPLS_MC),
.callbacks = {
.gso_send_check = mpls_gso_send_check,
.gso_segment = mpls_gso_segment,
},
};

static struct packet_offload mpls_uc_offload = {
.type = cpu_to_be16(ETH_P_MPLS_UC),
.callbacks = {
.gso_send_check = mpls_gso_send_check,
.gso_segment = mpls_gso_segment,
},
};
Expand Down

0 comments on commit 53e5039

Please sign in to comment.