just started looking at this set. Compiler notes one problem: On 9/24/18 10:13 AM, Mike Manning wrote: > @@ -2146,6 +2157,7 @@ static void ip6_mr_forward(struct net *net, struct > mr_table *mrt, > > int ip6_mr_input(struct sk_buff *skb) > { > + struct rtable *rt = skb_rtable(skb);
The above change is not needed. $ make -j 24 -s /home/dsa/kernel-2.git/net/ipv6/ip6mr.c: In function ‘ip6_mr_input’: /home/dsa/kernel-2.git/net/ipv6/ip6mr.c:2160:17: warning: unused variable ‘rt’ [-Wunused-variable] struct rtable *rt = skb_rtable(skb); > struct mfc6_cache *cache; > struct net *net = dev_net(skb->dev); > struct mr_table *mrt; > @@ -2154,6 +2166,19 @@ int ip6_mr_input(struct sk_buff *skb) > .flowi6_mark = skb->mark, > }; > int err; > + struct net_device *dev; > + > + /* skb->dev passed in is the master dev for vrfs. > + * Get the proper interface that does have a vif associated with it. > + */ > + dev = skb->dev; > + if (netif_is_l3_master(skb->dev)) { > + dev = dev_get_by_index_rcu(net, IPCB(skb)->iif); > + if (!dev) { > + kfree_skb(skb); > + return -ENODEV; > + } > + } > > err = ip6mr_fib_lookup(net, &fl6, &mrt); > if (err < 0) { > @@ -2165,7 +2190,7 @@ int ip6_mr_input(struct sk_buff *skb) > cache = ip6mr_cache_find(mrt, > &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr); > if (!cache) { > - int vif = ip6mr_find_vif(mrt, skb->dev); > + int vif = ip6mr_find_vif(mrt, dev); > > if (vif >= 0) > cache = ip6mr_cache_find_any(mrt, > @@ -2179,9 +2204,9 @@ int ip6_mr_input(struct sk_buff *skb) > if (!cache) { > int vif; > > - vif = ip6mr_find_vif(mrt, skb->dev); > + vif = ip6mr_find_vif(mrt, dev); > if (vif >= 0) { > - int err = ip6mr_cache_unresolved(mrt, vif, skb); > + int err = ip6mr_cache_unresolved(mrt, vif, skb, dev); > read_unlock(&mrt_lock); > > return err; > @@ -2191,7 +2216,7 @@ int ip6_mr_input(struct sk_buff *skb) > return -ENODEV; > } > > - ip6_mr_forward(net, mrt, skb, cache); > + ip6_mr_forward(net, mrt, dev, skb, cache); > > read_unlock(&mrt_lock); >