diff options
author | Eric Dumazet <edumazet@google.com> | 2012-09-26 22:48:50 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-10-01 17:01:57 -0400 |
commit | 60769a5dcd8755715c7143b4571d5c44f01796f1 (patch) | |
tree | 913951cd23fa8aaaac5de4585484becaaead41ff /net/ipv4 | |
parent | c9e6bc644e557338221e75c242ab12c275a67d1b (diff) |
ipv4: gre: add GRO capability
Add GRO capability to IPv4 GRE tunnels, using the gro_cells
infrastructure.
Tested using IPv4 and IPv6 TCP traffic inside this tunnel, and
checking GRO is building large packets.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/ip_gre.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index ef0b861ce044..b1871d993d22 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -740,8 +740,7 @@ static int ipgre_rcv(struct sk_buff *skb) | |||
740 | tstats->rx_bytes += skb->len; | 740 | tstats->rx_bytes += skb->len; |
741 | u64_stats_update_end(&tstats->syncp); | 741 | u64_stats_update_end(&tstats->syncp); |
742 | 742 | ||
743 | netif_rx(skb); | 743 | gro_cells_receive(&tunnel->gro_cells, skb); |
744 | |||
745 | return 0; | 744 | return 0; |
746 | } | 745 | } |
747 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); | 746 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); |
@@ -1319,6 +1318,9 @@ static const struct net_device_ops ipgre_netdev_ops = { | |||
1319 | 1318 | ||
1320 | static void ipgre_dev_free(struct net_device *dev) | 1319 | static void ipgre_dev_free(struct net_device *dev) |
1321 | { | 1320 | { |
1321 | struct ip_tunnel *tunnel = netdev_priv(dev); | ||
1322 | |||
1323 | gro_cells_destroy(&tunnel->gro_cells); | ||
1322 | free_percpu(dev->tstats); | 1324 | free_percpu(dev->tstats); |
1323 | free_netdev(dev); | 1325 | free_netdev(dev); |
1324 | } | 1326 | } |
@@ -1350,6 +1352,7 @@ static int ipgre_tunnel_init(struct net_device *dev) | |||
1350 | { | 1352 | { |
1351 | struct ip_tunnel *tunnel; | 1353 | struct ip_tunnel *tunnel; |
1352 | struct iphdr *iph; | 1354 | struct iphdr *iph; |
1355 | int err; | ||
1353 | 1356 | ||
1354 | tunnel = netdev_priv(dev); | 1357 | tunnel = netdev_priv(dev); |
1355 | iph = &tunnel->parms.iph; | 1358 | iph = &tunnel->parms.iph; |
@@ -1376,6 +1379,12 @@ static int ipgre_tunnel_init(struct net_device *dev) | |||
1376 | if (!dev->tstats) | 1379 | if (!dev->tstats) |
1377 | return -ENOMEM; | 1380 | return -ENOMEM; |
1378 | 1381 | ||
1382 | err = gro_cells_init(&tunnel->gro_cells, dev); | ||
1383 | if (err) { | ||
1384 | free_percpu(dev->tstats); | ||
1385 | return err; | ||
1386 | } | ||
1387 | |||
1379 | return 0; | 1388 | return 0; |
1380 | } | 1389 | } |
1381 | 1390 | ||