ipv4: Fix "Set rt->rt_iif more sanely on output routes."
Commit 1018b5c016
("Set rt->rt_iif more
sanely on output routes.") breaks rt_is_{output,input}_route.
This became the cause to return "IP_PKTINFO's ->ipi_ifindex == 0".
To fix it, this does:
1) Add "int rt_route_iif;" to struct rtable
2) For input routes, always set rt_route_iif to same value as rt_iif
3) For output routes, always set rt_route_iif to zero. Set rt_iif
as it is done currently.
4) Change rt_is_{output,input}_route() to test rt_route_iif
Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
9b57e1a79e
commit
1b86a58f9d
@@ -64,6 +64,7 @@ struct rtable {
|
|||||||
|
|
||||||
__be32 rt_dst; /* Path destination */
|
__be32 rt_dst; /* Path destination */
|
||||||
__be32 rt_src; /* Path source */
|
__be32 rt_src; /* Path source */
|
||||||
|
int rt_route_iif;
|
||||||
int rt_iif;
|
int rt_iif;
|
||||||
int rt_oif;
|
int rt_oif;
|
||||||
__u32 rt_mark;
|
__u32 rt_mark;
|
||||||
@@ -80,12 +81,12 @@ struct rtable {
|
|||||||
|
|
||||||
static inline bool rt_is_input_route(struct rtable *rt)
|
static inline bool rt_is_input_route(struct rtable *rt)
|
||||||
{
|
{
|
||||||
return rt->rt_iif != 0;
|
return rt->rt_route_iif != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool rt_is_output_route(struct rtable *rt)
|
static inline bool rt_is_output_route(struct rtable *rt)
|
||||||
{
|
{
|
||||||
return rt->rt_iif == 0;
|
return rt->rt_route_iif == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ip_rt_acct {
|
struct ip_rt_acct {
|
||||||
|
@@ -1891,6 +1891,7 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
|||||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||||
rth->dst.tclassid = itag;
|
rth->dst.tclassid = itag;
|
||||||
#endif
|
#endif
|
||||||
|
rth->rt_route_iif = dev->ifindex;
|
||||||
rth->rt_iif = dev->ifindex;
|
rth->rt_iif = dev->ifindex;
|
||||||
rth->dst.dev = init_net.loopback_dev;
|
rth->dst.dev = init_net.loopback_dev;
|
||||||
dev_hold(rth->dst.dev);
|
dev_hold(rth->dst.dev);
|
||||||
@@ -2026,6 +2027,7 @@ static int __mkroute_input(struct sk_buff *skb,
|
|||||||
rth->rt_key_src = saddr;
|
rth->rt_key_src = saddr;
|
||||||
rth->rt_src = saddr;
|
rth->rt_src = saddr;
|
||||||
rth->rt_gateway = daddr;
|
rth->rt_gateway = daddr;
|
||||||
|
rth->rt_route_iif = in_dev->dev->ifindex;
|
||||||
rth->rt_iif = in_dev->dev->ifindex;
|
rth->rt_iif = in_dev->dev->ifindex;
|
||||||
rth->dst.dev = (out_dev)->dev;
|
rth->dst.dev = (out_dev)->dev;
|
||||||
dev_hold(rth->dst.dev);
|
dev_hold(rth->dst.dev);
|
||||||
@@ -2202,6 +2204,7 @@ local_input:
|
|||||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||||
rth->dst.tclassid = itag;
|
rth->dst.tclassid = itag;
|
||||||
#endif
|
#endif
|
||||||
|
rth->rt_route_iif = dev->ifindex;
|
||||||
rth->rt_iif = dev->ifindex;
|
rth->rt_iif = dev->ifindex;
|
||||||
rth->dst.dev = net->loopback_dev;
|
rth->dst.dev = net->loopback_dev;
|
||||||
dev_hold(rth->dst.dev);
|
dev_hold(rth->dst.dev);
|
||||||
@@ -2401,7 +2404,8 @@ static struct rtable *__mkroute_output(const struct fib_result *res,
|
|||||||
rth->rt_mark = oldflp4->flowi4_mark;
|
rth->rt_mark = oldflp4->flowi4_mark;
|
||||||
rth->rt_dst = fl4->daddr;
|
rth->rt_dst = fl4->daddr;
|
||||||
rth->rt_src = fl4->saddr;
|
rth->rt_src = fl4->saddr;
|
||||||
rth->rt_iif = 0;
|
rth->rt_route_iif = 0;
|
||||||
|
rth->rt_iif = oldflp4->flowi4_oif ? : dev_out->ifindex;
|
||||||
/* get references to the devices that are to be hold by the routing
|
/* get references to the devices that are to be hold by the routing
|
||||||
cache entry */
|
cache entry */
|
||||||
rth->dst.dev = dev_out;
|
rth->dst.dev = dev_out;
|
||||||
@@ -2716,6 +2720,7 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
|
|||||||
rt->rt_key_dst = ort->rt_key_dst;
|
rt->rt_key_dst = ort->rt_key_dst;
|
||||||
rt->rt_key_src = ort->rt_key_src;
|
rt->rt_key_src = ort->rt_key_src;
|
||||||
rt->rt_tos = ort->rt_tos;
|
rt->rt_tos = ort->rt_tos;
|
||||||
|
rt->rt_route_iif = ort->rt_route_iif;
|
||||||
rt->rt_iif = ort->rt_iif;
|
rt->rt_iif = ort->rt_iif;
|
||||||
rt->rt_oif = ort->rt_oif;
|
rt->rt_oif = ort->rt_oif;
|
||||||
rt->rt_mark = ort->rt_mark;
|
rt->rt_mark = ort->rt_mark;
|
||||||
@@ -2725,7 +2730,6 @@ struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_or
|
|||||||
rt->rt_type = ort->rt_type;
|
rt->rt_type = ort->rt_type;
|
||||||
rt->rt_dst = ort->rt_dst;
|
rt->rt_dst = ort->rt_dst;
|
||||||
rt->rt_src = ort->rt_src;
|
rt->rt_src = ort->rt_src;
|
||||||
rt->rt_iif = ort->rt_iif;
|
|
||||||
rt->rt_gateway = ort->rt_gateway;
|
rt->rt_gateway = ort->rt_gateway;
|
||||||
rt->rt_spec_dst = ort->rt_spec_dst;
|
rt->rt_spec_dst = ort->rt_spec_dst;
|
||||||
rt->peer = ort->peer;
|
rt->peer = ort->peer;
|
||||||
|
@@ -74,6 +74,7 @@ static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev,
|
|||||||
rt->rt_key_dst = fl4->daddr;
|
rt->rt_key_dst = fl4->daddr;
|
||||||
rt->rt_key_src = fl4->saddr;
|
rt->rt_key_src = fl4->saddr;
|
||||||
rt->rt_tos = fl4->flowi4_tos;
|
rt->rt_tos = fl4->flowi4_tos;
|
||||||
|
rt->rt_route_iif = fl4->flowi4_iif;
|
||||||
rt->rt_iif = fl4->flowi4_iif;
|
rt->rt_iif = fl4->flowi4_iif;
|
||||||
rt->rt_oif = fl4->flowi4_oif;
|
rt->rt_oif = fl4->flowi4_oif;
|
||||||
rt->rt_mark = fl4->flowi4_mark;
|
rt->rt_mark = fl4->flowi4_mark;
|
||||||
|
Reference in New Issue
Block a user