aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Suryaputra <ssuryaextr@gmail.com>2018-06-01 00:05:21 -0400
committerDavid S. Miller <davem@davemloft.net>2018-06-04 10:16:45 -0400
commit2f17becfbea5e9a0529b51da7345783e96e69516 (patch)
treeb13547b70ef8bf299cd075b8e335bebb16dcb342
parentcfed0a2c98d798bed970fd450eb4d7854705b3e1 (diff)
vrf: check the original netdevice for generating redirect
Use the right device to determine if redirect should be sent especially when using vrf. Same as well as when sending the redirect. Signed-off-by: Stephen Suryaputra <ssuryaextr@gmail.com> Acked-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/ipv6/ip6_output.c3
-rw-r--r--net/ipv6/ndisc.c6
2 files changed, 8 insertions, 1 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 60b0d1652448..021e5aef6ba3 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -482,7 +482,8 @@ int ip6_forward(struct sk_buff *skb)
482 send redirects to source routed frames. 482 send redirects to source routed frames.
483 We don't send redirects to frames decapsulated from IPsec. 483 We don't send redirects to frames decapsulated from IPsec.
484 */ 484 */
485 if (skb->dev == dst->dev && opt->srcrt == 0 && !skb_sec_path(skb)) { 485 if (IP6CB(skb)->iif == dst->dev->ifindex &&
486 opt->srcrt == 0 && !skb_sec_path(skb)) {
486 struct in6_addr *target = NULL; 487 struct in6_addr *target = NULL;
487 struct inet_peer *peer; 488 struct inet_peer *peer;
488 struct rt6_info *rt; 489 struct rt6_info *rt;
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 9ac5366064e3..e640d2f3c55c 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -1578,6 +1578,12 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
1578 ops_data_buf[NDISC_OPS_REDIRECT_DATA_SPACE], *ops_data = NULL; 1578 ops_data_buf[NDISC_OPS_REDIRECT_DATA_SPACE], *ops_data = NULL;
1579 bool ret; 1579 bool ret;
1580 1580
1581 if (netif_is_l3_master(skb->dev)) {
1582 dev = __dev_get_by_index(dev_net(skb->dev), IPCB(skb)->iif);
1583 if (!dev)
1584 return;
1585 }
1586
1581 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) { 1587 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1582 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n", 1588 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1583 dev->name); 1589 dev->name);