aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/ndisc.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv6/ndisc.c')
-rw-r--r--net/ipv6/ndisc.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 2342545a5ee..0e49c9db3c9 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -511,7 +511,7 @@ void ndisc_send_skb(struct sk_buff *skb,
511 const struct in6_addr *saddr, 511 const struct in6_addr *saddr,
512 struct icmp6hdr *icmp6h) 512 struct icmp6hdr *icmp6h)
513{ 513{
514 struct flowi fl; 514 struct flowi6 fl6;
515 struct dst_entry *dst; 515 struct dst_entry *dst;
516 struct net *net = dev_net(dev); 516 struct net *net = dev_net(dev);
517 struct sock *sk = net->ipv6.ndisc_sk; 517 struct sock *sk = net->ipv6.ndisc_sk;
@@ -521,7 +521,7 @@ void ndisc_send_skb(struct sk_buff *skb,
521 521
522 type = icmp6h->icmp6_type; 522 type = icmp6h->icmp6_type;
523 523
524 icmpv6_flow_init(sk, &fl, type, saddr, daddr, dev->ifindex); 524 icmpv6_flow_init(sk, &fl6, type, saddr, daddr, dev->ifindex);
525 525
526 dst = icmp6_dst_alloc(dev, neigh, daddr); 526 dst = icmp6_dst_alloc(dev, neigh, daddr);
527 if (!dst) { 527 if (!dst) {
@@ -529,8 +529,8 @@ void ndisc_send_skb(struct sk_buff *skb,
529 return; 529 return;
530 } 530 }
531 531
532 err = xfrm_lookup(net, &dst, &fl, NULL, 0); 532 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
533 if (err < 0) { 533 if (IS_ERR(dst)) {
534 kfree_skb(skb); 534 kfree_skb(skb);
535 return; 535 return;
536 } 536 }
@@ -1515,7 +1515,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
1515 struct rt6_info *rt; 1515 struct rt6_info *rt;
1516 struct dst_entry *dst; 1516 struct dst_entry *dst;
1517 struct inet6_dev *idev; 1517 struct inet6_dev *idev;
1518 struct flowi fl; 1518 struct flowi6 fl6;
1519 u8 *opt; 1519 u8 *opt;
1520 int rd_len; 1520 int rd_len;
1521 int err; 1521 int err;
@@ -1535,15 +1535,15 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
1535 return; 1535 return;
1536 } 1536 }
1537 1537
1538 icmpv6_flow_init(sk, &fl, NDISC_REDIRECT, 1538 icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
1539 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex); 1539 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex);
1540 1540
1541 dst = ip6_route_output(net, NULL, &fl); 1541 dst = ip6_route_output(net, NULL, &fl6);
1542 if (dst == NULL) 1542 if (dst == NULL)
1543 return; 1543 return;
1544 1544
1545 err = xfrm_lookup(net, &dst, &fl, NULL, 0); 1545 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
1546 if (err) 1546 if (IS_ERR(dst))
1547 return; 1547 return;
1548 1548
1549 rt = (struct rt6_info *) dst; 1549 rt = (struct rt6_info *) dst;
@@ -1553,7 +1553,9 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
1553 "ICMPv6 Redirect: destination is not a neighbour.\n"); 1553 "ICMPv6 Redirect: destination is not a neighbour.\n");
1554 goto release; 1554 goto release;
1555 } 1555 }
1556 if (!xrlim_allow(dst, 1*HZ)) 1556 if (!rt->rt6i_peer)
1557 rt6_bind_peer(rt, 1);
1558 if (inet_peer_xrlim_allow(rt->rt6i_peer, 1*HZ))
1557 goto release; 1559 goto release;
1558 1560
1559 if (dev->addr_len) { 1561 if (dev->addr_len) {