@@ -1791,15 +1791,19 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
if (ipv4_is_lbcast(daddr) || (saddr == 0 && daddr == 0))
goto brd_input;
- if (ipv4_is_zeronet(daddr))
- goto martian_destination;
+ if (ipv4_is_zeronet(daddr)) {
+ ip_handle_martian_dest(dev, in_dev, daddr, saddr);
+ goto out;
+ }
/* Following code try to avoid calling IN_DEV_NET_ROUTE_LOCALNET(),
* and call it once if daddr or/and saddr are loopback addresses
*/
if (ipv4_is_loopback(daddr)) {
- if (!IN_DEV_NET_ROUTE_LOCALNET(in_dev, net))
- goto martian_destination;
+ if (!IN_DEV_NET_ROUTE_LOCALNET(in_dev, net)) {
+ ip_handle_martian_dest(dev, in_dev, daddr, saddr);
+ goto out;
+ }
} else if (ipv4_is_loopback(saddr)) {
if (!IN_DEV_NET_ROUTE_LOCALNET(in_dev, net)) {
ip_handle_martian_source(dev, in_dev, skb, daddr, saddr);
@@ -1841,8 +1845,11 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
err = -EHOSTUNREACH;
goto no_route;
}
- if (res.type != RTN_UNICAST)
- goto martian_destination;
+ if (res.type != RTN_UNICAST) {
+ err = -EINVAL;
+ ip_handle_martian_dest(dev, in_dev, daddr, saddr);
+ goto out;
+ }
err = ip_mkroute_input(skb, &res, &fl4, in_dev, daddr, saddr, tos);
out: return err;
@@ -1876,11 +1883,6 @@ out: return err;
res.fi = NULL;
res.table = NULL;
goto local_input;
-
-martian_destination:
- err = -EINVAL;
- ip_handle_martian_dest(dev, in_dev, daddr, saddr);
- goto out;
}
int ip_route_input_noref(struct sk_buff *skb, __be32 daddr, __be32 saddr,
Move call to ip_handle_martian_dest to various jump sites. The function only increments a counter and possibly does additional logging if CONFIG_IP_ROUTE_VERBOSE is enabled. Signed-off-by: David Ahern <dsa@cumulusnetworks.com> --- net/ipv4/route.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)