net: ipv6: more places need LOOPBACK_IFINDEX for flowi6_iif

To properly match iif in ip rules we have to provide
LOOPBACK_IFINDEX in flowi6_iif, not 0. Some ip6mr_fib_lookup
and fib6_rule_lookup callers need such fix.

Signed-off-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Julian Anastasov 2014-04-28 10:51:56 +03:00 committed by David S. Miller
parent 8c2eab9097
commit e374c618b1
3 changed files with 4 additions and 1 deletions

View File

@ -1633,7 +1633,7 @@ struct sock *mroute6_socket(struct net *net, struct sk_buff *skb)
{ {
struct mr6_table *mrt; struct mr6_table *mrt;
struct flowi6 fl6 = { struct flowi6 fl6 = {
.flowi6_iif = skb->skb_iif, .flowi6_iif = skb->skb_iif ? : LOOPBACK_IFINDEX,
.flowi6_oif = skb->dev->ifindex, .flowi6_oif = skb->dev->ifindex,
.flowi6_mark = skb->mark, .flowi6_mark = skb->mark,
}; };

View File

@ -33,6 +33,7 @@ static bool rpfilter_lookup_reverse6(const struct sk_buff *skb,
struct ipv6hdr *iph = ipv6_hdr(skb); struct ipv6hdr *iph = ipv6_hdr(skb);
bool ret = false; bool ret = false;
struct flowi6 fl6 = { struct flowi6 fl6 = {
.flowi6_iif = LOOPBACK_IFINDEX,
.flowlabel = (* (__be32 *) iph) & IPV6_FLOWINFO_MASK, .flowlabel = (* (__be32 *) iph) & IPV6_FLOWINFO_MASK,
.flowi6_proto = iph->nexthdr, .flowi6_proto = iph->nexthdr,
.daddr = iph->saddr, .daddr = iph->saddr,

View File

@ -1273,6 +1273,7 @@ void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark)
struct flowi6 fl6; struct flowi6 fl6;
memset(&fl6, 0, sizeof(fl6)); memset(&fl6, 0, sizeof(fl6));
fl6.flowi6_iif = LOOPBACK_IFINDEX;
fl6.flowi6_oif = oif; fl6.flowi6_oif = oif;
fl6.flowi6_mark = mark; fl6.flowi6_mark = mark;
fl6.daddr = iph->daddr; fl6.daddr = iph->daddr;
@ -1294,6 +1295,7 @@ void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif,
struct flowi6 fl6; struct flowi6 fl6;
memset(&fl6, 0, sizeof(fl6)); memset(&fl6, 0, sizeof(fl6));
fl6.flowi6_iif = LOOPBACK_IFINDEX;
fl6.flowi6_oif = oif; fl6.flowi6_oif = oif;
fl6.flowi6_mark = mark; fl6.flowi6_mark = mark;
fl6.daddr = msg->dest; fl6.daddr = msg->dest;