aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/ip_gre.c13
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
1320static void ipgre_dev_free(struct net_device *dev) 1319static 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