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; |