diff options
Diffstat (limited to 'net/ipv4/ipmr.c')
| -rw-r--r-- | net/ipv4/ipmr.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 757f25eb9b4b..179fcab866fc 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -442,8 +442,10 @@ static netdev_tx_t reg_vif_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 442 | int err; | 442 | int err; |
| 443 | 443 | ||
| 444 | err = ipmr_fib_lookup(net, &fl, &mrt); | 444 | err = ipmr_fib_lookup(net, &fl, &mrt); |
| 445 | if (err < 0) | 445 | if (err < 0) { |
| 446 | kfree_skb(skb); | ||
| 446 | return err; | 447 | return err; |
| 448 | } | ||
| 447 | 449 | ||
| 448 | read_lock(&mrt_lock); | 450 | read_lock(&mrt_lock); |
| 449 | dev->stats.tx_bytes += skb->len; | 451 | dev->stats.tx_bytes += skb->len; |
| @@ -1553,9 +1555,9 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt, | |||
| 1553 | goto out_free; | 1555 | goto out_free; |
| 1554 | } | 1556 | } |
| 1555 | 1557 | ||
| 1556 | dev = rt->u.dst.dev; | 1558 | dev = rt->dst.dev; |
| 1557 | 1559 | ||
| 1558 | if (skb->len+encap > dst_mtu(&rt->u.dst) && (ntohs(iph->frag_off) & IP_DF)) { | 1560 | if (skb->len+encap > dst_mtu(&rt->dst) && (ntohs(iph->frag_off) & IP_DF)) { |
| 1559 | /* Do not fragment multicasts. Alas, IPv4 does not | 1561 | /* Do not fragment multicasts. Alas, IPv4 does not |
| 1560 | allow to send ICMP, so that packets will disappear | 1562 | allow to send ICMP, so that packets will disappear |
| 1561 | to blackhole. | 1563 | to blackhole. |
| @@ -1566,7 +1568,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt, | |||
| 1566 | goto out_free; | 1568 | goto out_free; |
| 1567 | } | 1569 | } |
| 1568 | 1570 | ||
| 1569 | encap += LL_RESERVED_SPACE(dev) + rt->u.dst.header_len; | 1571 | encap += LL_RESERVED_SPACE(dev) + rt->dst.header_len; |
| 1570 | 1572 | ||
| 1571 | if (skb_cow(skb, encap)) { | 1573 | if (skb_cow(skb, encap)) { |
| 1572 | ip_rt_put(rt); | 1574 | ip_rt_put(rt); |
| @@ -1577,7 +1579,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt, | |||
| 1577 | vif->bytes_out += skb->len; | 1579 | vif->bytes_out += skb->len; |
| 1578 | 1580 | ||
| 1579 | skb_dst_drop(skb); | 1581 | skb_dst_drop(skb); |
| 1580 | skb_dst_set(skb, &rt->u.dst); | 1582 | skb_dst_set(skb, &rt->dst); |
| 1581 | ip_decrease_ttl(ip_hdr(skb)); | 1583 | ip_decrease_ttl(ip_hdr(skb)); |
| 1582 | 1584 | ||
| 1583 | /* FIXME: forward and output firewalls used to be called here. | 1585 | /* FIXME: forward and output firewalls used to be called here. |
| @@ -1728,8 +1730,10 @@ int ip_mr_input(struct sk_buff *skb) | |||
| 1728 | goto dont_forward; | 1730 | goto dont_forward; |
| 1729 | 1731 | ||
| 1730 | err = ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt); | 1732 | err = ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt); |
| 1731 | if (err < 0) | 1733 | if (err < 0) { |
| 1734 | kfree_skb(skb); | ||
| 1732 | return err; | 1735 | return err; |
| 1736 | } | ||
| 1733 | 1737 | ||
| 1734 | if (!local) { | 1738 | if (!local) { |
| 1735 | if (IPCB(skb)->opt.router_alert) { | 1739 | if (IPCB(skb)->opt.router_alert) { |
