@@ -1782,10 +1782,12 @@ static void ip_handle_martian_source(struct net_device *dev,
1782
1782
}
1783
1783
1784
1784
/* called in rcu_read_lock() section */
1785
- static int __mkroute_input (struct sk_buff * skb , const struct fib_result * res ,
1786
- struct in_device * in_dev , __be32 daddr ,
1787
- __be32 saddr , dscp_t dscp )
1785
+ static enum skb_drop_reason
1786
+ __mkroute_input (struct sk_buff * skb , const struct fib_result * res ,
1787
+ struct in_device * in_dev , __be32 daddr ,
1788
+ __be32 saddr , dscp_t dscp )
1788
1789
{
1790
+ enum skb_drop_reason reason = SKB_DROP_REASON_NOT_SPECIFIED ;
1789
1791
struct fib_nh_common * nhc = FIB_RES_NHC (* res );
1790
1792
struct net_device * dev = nhc -> nhc_dev ;
1791
1793
struct fib_nh_exception * fnhe ;
@@ -1799,13 +1801,13 @@ static int __mkroute_input(struct sk_buff *skb, const struct fib_result *res,
1799
1801
out_dev = __in_dev_get_rcu (dev );
1800
1802
if (!out_dev ) {
1801
1803
net_crit_ratelimited ("Bug in ip_route_input_slow(). Please report.\n" );
1802
- return - EINVAL ;
1804
+ return reason ;
1803
1805
}
1804
1806
1805
1807
err = fib_validate_source (skb , saddr , daddr , dscp , FIB_RES_OIF (* res ),
1806
1808
in_dev -> dev , in_dev , & itag );
1807
1809
if (err < 0 ) {
1808
- err = - EINVAL ;
1810
+ reason = - err ;
1809
1811
ip_handle_martian_source (in_dev -> dev , in_dev , skb , daddr ,
1810
1812
saddr );
1811
1813
@@ -1833,7 +1835,7 @@ static int __mkroute_input(struct sk_buff *skb, const struct fib_result *res,
1833
1835
*/
1834
1836
if (out_dev == in_dev &&
1835
1837
IN_DEV_PROXY_ARP_PVLAN (in_dev ) == 0 ) {
1836
- err = - EINVAL ;
1838
+ reason = SKB_DROP_REASON_ARP_PVLAN_DISABLE ;
1837
1839
goto cleanup ;
1838
1840
}
1839
1841
}
@@ -1856,7 +1858,7 @@ static int __mkroute_input(struct sk_buff *skb, const struct fib_result *res,
1856
1858
rth = rt_dst_alloc (out_dev -> dev , 0 , res -> type ,
1857
1859
IN_DEV_ORCONF (out_dev , NOXFRM ));
1858
1860
if (!rth ) {
1859
- err = - ENOBUFS ;
1861
+ reason = SKB_DROP_REASON_NOMEM ;
1860
1862
goto cleanup ;
1861
1863
}
1862
1864
@@ -1870,9 +1872,9 @@ static int __mkroute_input(struct sk_buff *skb, const struct fib_result *res,
1870
1872
lwtunnel_set_redirect (& rth -> dst );
1871
1873
skb_dst_set (skb , & rth -> dst );
1872
1874
out :
1873
- err = 0 ;
1874
- cleanup :
1875
- return err ;
1875
+ reason = SKB_NOT_DROPPED_YET ;
1876
+ cleanup :
1877
+ return reason ;
1876
1878
}
1877
1879
1878
1880
#ifdef CONFIG_IP_ROUTE_MULTIPATH
@@ -2130,9 +2132,10 @@ int fib_multipath_hash(const struct net *net, const struct flowi4 *fl4,
2130
2132
}
2131
2133
#endif /* CONFIG_IP_ROUTE_MULTIPATH */
2132
2134
2133
- static int ip_mkroute_input (struct sk_buff * skb , struct fib_result * res ,
2134
- struct in_device * in_dev , __be32 daddr ,
2135
- __be32 saddr , dscp_t dscp , struct flow_keys * hkeys )
2135
+ static enum skb_drop_reason
2136
+ ip_mkroute_input (struct sk_buff * skb , struct fib_result * res ,
2137
+ struct in_device * in_dev , __be32 daddr ,
2138
+ __be32 saddr , dscp_t dscp , struct flow_keys * hkeys )
2136
2139
{
2137
2140
#ifdef CONFIG_IP_ROUTE_MULTIPATH
2138
2141
if (res -> fi && fib_info_num_path (res -> fi ) > 1 ) {
@@ -2346,9 +2349,8 @@ ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
2346
2349
}
2347
2350
2348
2351
make_route :
2349
- err = ip_mkroute_input (skb , res , in_dev , daddr , saddr , dscp , flkeys );
2350
- if (!err )
2351
- reason = SKB_NOT_DROPPED_YET ;
2352
+ reason = ip_mkroute_input (skb , res , in_dev , daddr , saddr , dscp ,
2353
+ flkeys );
2352
2354
2353
2355
out :
2354
2356
return reason ;
0 commit comments