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 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; |
1150 | out: | 1153 | out: |
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 | } |
1154 | EXPORT_SYMBOL_GPL(gretap_fb_dev_create); | 1158 | EXPORT_SYMBOL_GPL(gretap_fb_dev_create); |