diff options
Diffstat (limited to 'net/ipv4/route.c')
| -rw-r--r-- | net/ipv4/route.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 25071b48921c..4c011ec69ed4 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1597,6 +1597,7 @@ static int __mkroute_input(struct sk_buff *skb, | |||
| 1597 | rth->rt_gateway = 0; | 1597 | rth->rt_gateway = 0; |
| 1598 | rth->rt_uses_gateway = 0; | 1598 | rth->rt_uses_gateway = 0; |
| 1599 | INIT_LIST_HEAD(&rth->rt_uncached); | 1599 | INIT_LIST_HEAD(&rth->rt_uncached); |
| 1600 | RT_CACHE_STAT_INC(in_slow_tot); | ||
| 1600 | 1601 | ||
| 1601 | rth->dst.input = ip_forward; | 1602 | rth->dst.input = ip_forward; |
| 1602 | rth->dst.output = ip_output; | 1603 | rth->dst.output = ip_output; |
| @@ -1695,10 +1696,11 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
| 1695 | fl4.daddr = daddr; | 1696 | fl4.daddr = daddr; |
| 1696 | fl4.saddr = saddr; | 1697 | fl4.saddr = saddr; |
| 1697 | err = fib_lookup(net, &fl4, &res); | 1698 | err = fib_lookup(net, &fl4, &res); |
| 1698 | if (err != 0) | 1699 | if (err != 0) { |
| 1700 | if (!IN_DEV_FORWARD(in_dev)) | ||
| 1701 | err = -EHOSTUNREACH; | ||
| 1699 | goto no_route; | 1702 | goto no_route; |
| 1700 | 1703 | } | |
| 1701 | RT_CACHE_STAT_INC(in_slow_tot); | ||
| 1702 | 1704 | ||
| 1703 | if (res.type == RTN_BROADCAST) | 1705 | if (res.type == RTN_BROADCAST) |
| 1704 | goto brd_input; | 1706 | goto brd_input; |
| @@ -1712,8 +1714,10 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, | |||
| 1712 | goto local_input; | 1714 | goto local_input; |
| 1713 | } | 1715 | } |
| 1714 | 1716 | ||
| 1715 | if (!IN_DEV_FORWARD(in_dev)) | 1717 | if (!IN_DEV_FORWARD(in_dev)) { |
| 1718 | err = -EHOSTUNREACH; | ||
| 1716 | goto no_route; | 1719 | goto no_route; |
| 1720 | } | ||
| 1717 | if (res.type != RTN_UNICAST) | 1721 | if (res.type != RTN_UNICAST) |
| 1718 | goto martian_destination; | 1722 | goto martian_destination; |
| 1719 | 1723 | ||
| @@ -1768,6 +1772,7 @@ local_input: | |||
| 1768 | rth->rt_gateway = 0; | 1772 | rth->rt_gateway = 0; |
| 1769 | rth->rt_uses_gateway = 0; | 1773 | rth->rt_uses_gateway = 0; |
| 1770 | INIT_LIST_HEAD(&rth->rt_uncached); | 1774 | INIT_LIST_HEAD(&rth->rt_uncached); |
| 1775 | RT_CACHE_STAT_INC(in_slow_tot); | ||
| 1771 | if (res.type == RTN_UNREACHABLE) { | 1776 | if (res.type == RTN_UNREACHABLE) { |
| 1772 | rth->dst.input= ip_error; | 1777 | rth->dst.input= ip_error; |
| 1773 | rth->dst.error= -err; | 1778 | rth->dst.error= -err; |
