aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/ip_gre.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/ip_gre.c')
-rw-r--r--net/ipv4/ip_gre.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 4d2025f7ec57..1d000af7f561 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -49,12 +49,6 @@
49#include <net/gre.h> 49#include <net/gre.h>
50#include <net/dst_metadata.h> 50#include <net/dst_metadata.h>
51 51
52#if IS_ENABLED(CONFIG_IPV6)
53#include <net/ipv6.h>
54#include <net/ip6_fib.h>
55#include <net/ip6_route.h>
56#endif
57
58/* 52/*
59 Problems & solutions 53 Problems & solutions
60 -------------------- 54 --------------------
@@ -217,12 +211,14 @@ static void gre_err(struct sk_buff *skb, u32 info)
217 * by themselves??? 211 * by themselves???
218 */ 212 */
219 213
214 const struct iphdr *iph = (struct iphdr *)skb->data;
220 const int type = icmp_hdr(skb)->type; 215 const int type = icmp_hdr(skb)->type;
221 const int code = icmp_hdr(skb)->code; 216 const int code = icmp_hdr(skb)->code;
222 struct tnl_ptk_info tpi; 217 struct tnl_ptk_info tpi;
223 bool csum_err = false; 218 bool csum_err = false;
224 219
225 if (gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP)) < 0) { 220 if (gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP),
221 iph->ihl * 4) < 0) {
226 if (!csum_err) /* ignore csum errors. */ 222 if (!csum_err) /* ignore csum errors. */
227 return; 223 return;
228 } 224 }
@@ -338,7 +334,7 @@ static int gre_rcv(struct sk_buff *skb)
338 } 334 }
339#endif 335#endif
340 336
341 hdr_len = gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP)); 337 hdr_len = gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP), 0);
342 if (hdr_len < 0) 338 if (hdr_len < 0)
343 goto drop; 339 goto drop;
344 340
@@ -1121,6 +1117,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
1121{ 1117{
1122 struct nlattr *tb[IFLA_MAX + 1]; 1118 struct nlattr *tb[IFLA_MAX + 1];
1123 struct net_device *dev; 1119 struct net_device *dev;
1120 LIST_HEAD(list_kill);
1124 struct ip_tunnel *t; 1121 struct ip_tunnel *t;
1125 int err; 1122 int err;
1126 1123
@@ -1136,8 +1133,10 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
1136 t->collect_md = true; 1133 t->collect_md = true;
1137 1134
1138 err = ipgre_newlink(net, dev, tb, NULL); 1135 err = ipgre_newlink(net, dev, tb, NULL);
1139 if (err < 0) 1136 if (err < 0) {
1140 goto out; 1137 free_netdev(dev);
1138 return ERR_PTR(err);
1139 }
1141 1140
1142 /* openvswitch users expect packet sizes to be unrestricted, 1141 /* openvswitch users expect packet sizes to be unrestricted,
1143 * so set the largest MTU we can. 1142 * so set the largest MTU we can.
@@ -1146,9 +1145,14 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
1146 if (err) 1145 if (err)
1147 goto out; 1146 goto out;
1148 1147
1148 err = rtnl_configure_link(dev, NULL);
1149 if (err < 0)
1150 goto out;
1151
1149 return dev; 1152 return dev;
1150out: 1153out:
1151 free_netdev(dev); 1154 ip_tunnel_dellink(dev, &list_kill);
1155 unregister_netdevice_many(&list_kill);
1152 return ERR_PTR(err); 1156 return ERR_PTR(err);
1153} 1157}
1154EXPORT_SYMBOL_GPL(gretap_fb_dev_create); 1158EXPORT_SYMBOL_GPL(gretap_fb_dev_create);