SNMP_MIB_ITEM("TCPBacklogDrop", LINUX_MIB_TCPBACKLOGDROP),
        SNMP_MIB_ITEM("TCPMinTTLDrop", LINUX_MIB_TCPMINTTLDROP),
        SNMP_MIB_ITEM("TCPDeferAcceptDrop", LINUX_MIB_TCPDEFERACCEPTDROP),
+       SNMP_MIB_ITEM("IPReversePathFilter", LINUX_MIB_IPRPFILTER),
        SNMP_MIB_SENTINEL
 };
 
 
        __be32 spec_dst;
        struct in_device *in_dev = in_dev_get(dev);
        u32 itag = 0;
+       int err;
 
        /* Primary sanity checks. */
 
                if (!ipv4_is_local_multicast(daddr))
                        goto e_inval;
                spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
-       } else if (fib_validate_source(saddr, 0, tos, 0,
-                                       dev, &spec_dst, &itag, 0) < 0)
-               goto e_inval;
-
+       } else {
+               err = fib_validate_source(saddr, 0, tos, 0, dev, &spec_dst,
+                                         &itag, 0);
+               if (err < 0)
+                       goto e_err;
+       }
        rth = dst_alloc(&ipv4_dst_ops);
        if (!rth)
                goto e_nobufs;
        return -ENOBUFS;
 
 e_inval:
+       err = -EINVAL;
+e_err:
        in_dev_put(in_dev);
-       return -EINVAL;
+       return err;
 }
 
 
                ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr,
                                         saddr);
 
-               err = -EINVAL;
                goto cleanup;
        }
 
                goto brd_input;
 
        if (res.type == RTN_LOCAL) {
-               int result;
-               result = fib_validate_source(saddr, daddr, tos,
+               err = fib_validate_source(saddr, daddr, tos,
                                             net->loopback_dev->ifindex,
                                             dev, &spec_dst, &itag, skb->mark);
-               if (result < 0)
-                       goto martian_source;
-               if (result)
+               if (err < 0)
+                       goto martian_source_keep_err;
+               if (err)
                        flags |= RTCF_DIRECTSRC;
                spec_dst = daddr;
                goto local_input;
                err = fib_validate_source(saddr, 0, tos, 0, dev, &spec_dst,
                                          &itag, skb->mark);
                if (err < 0)
-                       goto martian_source;
+                       goto martian_source_keep_err;
                if (err)
                        flags |= RTCF_DIRECTSRC;
        }
        goto done;
 
 martian_source:
+       err = -EINVAL;
+martian_source_keep_err:
        ip_handle_martian_source(dev, in_dev, skb, daddr, saddr);
-       goto e_inval;
+       goto done;
 }
 
 int ip_route_input_common(struct sk_buff *skb, __be32 daddr, __be32 saddr,