diff options
Diffstat (limited to 'net/ipv4/ipip.c')
-rw-r--r-- | net/ipv4/ipip.c | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index bfc17c5914e7..378b20b7ca6e 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -276,11 +276,6 @@ static struct ip_tunnel * ipip_tunnel_locate(struct net *net, | |||
276 | 276 | ||
277 | dev_net_set(dev, net); | 277 | dev_net_set(dev, net); |
278 | 278 | ||
279 | if (strchr(name, '%')) { | ||
280 | if (dev_alloc_name(dev, name) < 0) | ||
281 | goto failed_free; | ||
282 | } | ||
283 | |||
284 | nt = netdev_priv(dev); | 279 | nt = netdev_priv(dev); |
285 | nt->parms = *parms; | 280 | nt->parms = *parms; |
286 | 281 | ||
@@ -319,7 +314,7 @@ static int ipip_err(struct sk_buff *skb, u32 info) | |||
319 | 8 bytes of packet payload. It means, that precise relaying of | 314 | 8 bytes of packet payload. It means, that precise relaying of |
320 | ICMP in the real Internet is absolutely infeasible. | 315 | ICMP in the real Internet is absolutely infeasible. |
321 | */ | 316 | */ |
322 | struct iphdr *iph = (struct iphdr *)skb->data; | 317 | const struct iphdr *iph = (const struct iphdr *)skb->data; |
323 | const int type = icmp_hdr(skb)->type; | 318 | const int type = icmp_hdr(skb)->type; |
324 | const int code = icmp_hdr(skb)->code; | 319 | const int code = icmp_hdr(skb)->code; |
325 | struct ip_tunnel *t; | 320 | struct ip_tunnel *t; |
@@ -433,15 +428,16 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
433 | { | 428 | { |
434 | struct ip_tunnel *tunnel = netdev_priv(dev); | 429 | struct ip_tunnel *tunnel = netdev_priv(dev); |
435 | struct pcpu_tstats *tstats; | 430 | struct pcpu_tstats *tstats; |
436 | struct iphdr *tiph = &tunnel->parms.iph; | 431 | const struct iphdr *tiph = &tunnel->parms.iph; |
437 | u8 tos = tunnel->parms.iph.tos; | 432 | u8 tos = tunnel->parms.iph.tos; |
438 | __be16 df = tiph->frag_off; | 433 | __be16 df = tiph->frag_off; |
439 | struct rtable *rt; /* Route to the other host */ | 434 | struct rtable *rt; /* Route to the other host */ |
440 | struct net_device *tdev; /* Device to other host */ | 435 | struct net_device *tdev; /* Device to other host */ |
441 | struct iphdr *old_iph = ip_hdr(skb); | 436 | const struct iphdr *old_iph = ip_hdr(skb); |
442 | struct iphdr *iph; /* Our new IP header */ | 437 | struct iphdr *iph; /* Our new IP header */ |
443 | unsigned int max_headroom; /* The extra header space needed */ | 438 | unsigned int max_headroom; /* The extra header space needed */ |
444 | __be32 dst = tiph->daddr; | 439 | __be32 dst = tiph->daddr; |
440 | struct flowi4 fl4; | ||
445 | int mtu; | 441 | int mtu; |
446 | 442 | ||
447 | if (skb->protocol != htons(ETH_P_IP)) | 443 | if (skb->protocol != htons(ETH_P_IP)) |
@@ -460,7 +456,7 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
460 | goto tx_error_icmp; | 456 | goto tx_error_icmp; |
461 | } | 457 | } |
462 | 458 | ||
463 | rt = ip_route_output_ports(dev_net(dev), NULL, | 459 | rt = ip_route_output_ports(dev_net(dev), &fl4, NULL, |
464 | dst, tiph->saddr, | 460 | dst, tiph->saddr, |
465 | 0, 0, | 461 | 0, 0, |
466 | IPPROTO_IPIP, RT_TOS(tos), | 462 | IPPROTO_IPIP, RT_TOS(tos), |
@@ -549,8 +545,8 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
549 | iph->frag_off = df; | 545 | iph->frag_off = df; |
550 | iph->protocol = IPPROTO_IPIP; | 546 | iph->protocol = IPPROTO_IPIP; |
551 | iph->tos = INET_ECN_encapsulate(tos, old_iph->tos); | 547 | iph->tos = INET_ECN_encapsulate(tos, old_iph->tos); |
552 | iph->daddr = rt->rt_dst; | 548 | iph->daddr = fl4.daddr; |
553 | iph->saddr = rt->rt_src; | 549 | iph->saddr = fl4.saddr; |
554 | 550 | ||
555 | if ((iph->ttl = tiph->ttl) == 0) | 551 | if ((iph->ttl = tiph->ttl) == 0) |
556 | iph->ttl = old_iph->ttl; | 552 | iph->ttl = old_iph->ttl; |
@@ -572,19 +568,21 @@ static void ipip_tunnel_bind_dev(struct net_device *dev) | |||
572 | { | 568 | { |
573 | struct net_device *tdev = NULL; | 569 | struct net_device *tdev = NULL; |
574 | struct ip_tunnel *tunnel; | 570 | struct ip_tunnel *tunnel; |
575 | struct iphdr *iph; | 571 | const struct iphdr *iph; |
576 | 572 | ||
577 | tunnel = netdev_priv(dev); | 573 | tunnel = netdev_priv(dev); |
578 | iph = &tunnel->parms.iph; | 574 | iph = &tunnel->parms.iph; |
579 | 575 | ||
580 | if (iph->daddr) { | 576 | if (iph->daddr) { |
581 | struct rtable *rt = ip_route_output_ports(dev_net(dev), NULL, | 577 | struct rtable *rt; |
582 | iph->daddr, iph->saddr, | 578 | struct flowi4 fl4; |
583 | 0, 0, | 579 | |
584 | IPPROTO_IPIP, | 580 | rt = ip_route_output_ports(dev_net(dev), &fl4, NULL, |
585 | RT_TOS(iph->tos), | 581 | iph->daddr, iph->saddr, |
586 | tunnel->parms.link); | 582 | 0, 0, |
587 | 583 | IPPROTO_IPIP, | |
584 | RT_TOS(iph->tos), | ||
585 | tunnel->parms.link); | ||
588 | if (!IS_ERR(rt)) { | 586 | if (!IS_ERR(rt)) { |
589 | tdev = rt->dst.dev; | 587 | tdev = rt->dst.dev; |
590 | ip_rt_put(rt); | 588 | ip_rt_put(rt); |