diff options
Diffstat (limited to 'net/ipv4/ip_gre.c')
-rw-r--r-- | net/ipv4/ip_gre.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 8eec78f53f9e..5b1481be0282 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 | -------------------- |
@@ -226,12 +220,14 @@ static void gre_err(struct sk_buff *skb, u32 info) | |||
226 | * by themselves??? | 220 | * by themselves??? |
227 | */ | 221 | */ |
228 | 222 | ||
223 | const struct iphdr *iph = (struct iphdr *)skb->data; | ||
229 | const int type = icmp_hdr(skb)->type; | 224 | const int type = icmp_hdr(skb)->type; |
230 | const int code = icmp_hdr(skb)->code; | 225 | const int code = icmp_hdr(skb)->code; |
231 | struct tnl_ptk_info tpi; | 226 | struct tnl_ptk_info tpi; |
232 | bool csum_err = false; | 227 | bool csum_err = false; |
233 | 228 | ||
234 | if (gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP)) < 0) { | 229 | if (gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP), |
230 | iph->ihl * 4) < 0) { | ||
235 | if (!csum_err) /* ignore csum errors. */ | 231 | if (!csum_err) /* ignore csum errors. */ |
236 | return; | 232 | return; |
237 | } | 233 | } |
@@ -347,7 +343,7 @@ static int gre_rcv(struct sk_buff *skb) | |||
347 | } | 343 | } |
348 | #endif | 344 | #endif |
349 | 345 | ||
350 | hdr_len = gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP)); | 346 | hdr_len = gre_parse_header(skb, &tpi, &csum_err, htons(ETH_P_IP), 0); |
351 | if (hdr_len < 0) | 347 | if (hdr_len < 0) |
352 | goto drop; | 348 | goto drop; |
353 | 349 | ||
@@ -1154,6 +1150,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name, | |||
1154 | { | 1150 | { |
1155 | struct nlattr *tb[IFLA_MAX + 1]; | 1151 | struct nlattr *tb[IFLA_MAX + 1]; |
1156 | struct net_device *dev; | 1152 | struct net_device *dev; |
1153 | LIST_HEAD(list_kill); | ||
1157 | struct ip_tunnel *t; | 1154 | struct ip_tunnel *t; |
1158 | int err; | 1155 | int err; |
1159 | 1156 | ||
@@ -1169,8 +1166,10 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name, | |||
1169 | t->collect_md = true; | 1166 | t->collect_md = true; |
1170 | 1167 | ||
1171 | err = ipgre_newlink(net, dev, tb, NULL); | 1168 | err = ipgre_newlink(net, dev, tb, NULL); |
1172 | if (err < 0) | 1169 | if (err < 0) { |
1173 | goto out; | 1170 | free_netdev(dev); |
1171 | return ERR_PTR(err); | ||
1172 | } | ||
1174 | 1173 | ||
1175 | /* openvswitch users expect packet sizes to be unrestricted, | 1174 | /* openvswitch users expect packet sizes to be unrestricted, |
1176 | * so set the largest MTU we can. | 1175 | * so set the largest MTU we can. |
@@ -1179,9 +1178,14 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name, | |||
1179 | if (err) | 1178 | if (err) |
1180 | goto out; | 1179 | goto out; |
1181 | 1180 | ||
1181 | err = rtnl_configure_link(dev, NULL); | ||
1182 | if (err < 0) | ||
1183 | goto out; | ||
1184 | |||
1182 | return dev; | 1185 | return dev; |
1183 | out: | 1186 | out: |
1184 | free_netdev(dev); | 1187 | ip_tunnel_dellink(dev, &list_kill); |
1188 | unregister_netdevice_many(&list_kill); | ||
1185 | return ERR_PTR(err); | 1189 | return ERR_PTR(err); |
1186 | } | 1190 | } |
1187 | EXPORT_SYMBOL_GPL(gretap_fb_dev_create); | 1191 | EXPORT_SYMBOL_GPL(gretap_fb_dev_create); |