diff options
| -rw-r--r-- | include/net/ip_fib.h | 3 | ||||
| -rw-r--r-- | net/ipv4/fib_frontend.c | 5 | ||||
| -rw-r--r-- | net/ipv4/route.c | 8 | 
3 files changed, 10 insertions, 6 deletions
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index ef91fe924ba4..4d22fabc7719 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -210,7 +210,8 @@ extern struct fib_table *fib_get_table(struct net *net, u32 id);  extern const struct nla_policy rtm_ipv4_policy[];  extern void		ip_fib_init(void);  extern int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, -			       struct net_device *dev, __be32 *spec_dst, u32 *itag); +			       struct net_device *dev, __be32 *spec_dst, +			       u32 *itag, u32 mark);  extern void fib_select_default(struct net *net, const struct flowi *flp,  			       struct fib_result *res); diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index e2f950592566..aa00398be80e 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -229,14 +229,17 @@ unsigned int inet_dev_addr_type(struct net *net, const struct net_device *dev,   */  int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, -			struct net_device *dev, __be32 *spec_dst, u32 *itag) +			struct net_device *dev, __be32 *spec_dst, +			u32 *itag, u32 mark)  {  	struct in_device *in_dev;  	struct flowi fl = { .nl_u = { .ip4_u =  				      { .daddr = src,  					.saddr = dst,  					.tos = tos } }, +			    .mark = mark,  			    .iif = oif }; +  	struct fib_result res;  	int no_addr, rpf;  	int ret; diff --git a/net/ipv4/route.c b/net/ipv4/route.c index bb4199252026..5b1050a5d874 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -1854,7 +1854,7 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,  			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) +					dev, &spec_dst, &itag, 0) < 0)  		goto e_inval;  	rth = dst_alloc(&ipv4_dst_ops); @@ -1967,7 +1967,7 @@ static int __mkroute_input(struct sk_buff *skb,  	err = fib_validate_source(saddr, daddr, tos, FIB_RES_OIF(*res), -				  in_dev->dev, &spec_dst, &itag); +				  in_dev->dev, &spec_dst, &itag, skb->mark);  	if (err < 0) {  		ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr,  					 saddr); @@ -2141,7 +2141,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,  		int result;  		result = fib_validate_source(saddr, daddr, tos,  					     net->loopback_dev->ifindex, -					     dev, &spec_dst, &itag); +					     dev, &spec_dst, &itag, skb->mark);  		if (result < 0)  			goto martian_source;  		if (result) @@ -2170,7 +2170,7 @@ brd_input:  		spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);  	else {  		err = fib_validate_source(saddr, 0, tos, 0, dev, &spec_dst, -					  &itag); +					  &itag, skb->mark);  		if (err < 0)  			goto martian_source;  		if (err)  | 
