aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/ip6_output.c
diff options
context:
space:
mode:
authorJulian Anastasov <ja@ssi.bg>2017-02-06 16:14:16 -0500
committerDavid S. Miller <davem@davemloft.net>2017-02-07 13:07:47 -0500
commit0dec879f636f11b0ffda1cb5fd96a1754c59ead3 (patch)
treefcc479052e78ceb30f8f3b95a881cf986f0564dd /net/ipv6/ip6_output.c
parent63fca65d08632fbec9d9b655f671cf08aa1aeeb8 (diff)
net: use dst_confirm_neigh for UDP, RAW, ICMP, L2TP
When same struct dst_entry can be used for many different neighbours we can not use it for pending confirmations. The datagram protocols can use MSG_CONFIRM to confirm the neighbour. When used with MSG_PROBE we do not reach the code where neighbour is confirmed, so we have to do the same slow lookup by using the dst_confirm_neigh() helper. When MSG_PROBE is not used, ip_append_data/ip6_append_data will set the skb flag dst_pending_confirm. Reported-by: YueHaibing <yuehaibing@huawei.com> Fixes: 5110effee8fd ("net: Do delayed neigh confirmation.") Fixes: f2bb4bedf35d ("ipv4: Cache output routes in fib_info nexthops.") Signed-off-by: Julian Anastasov <ja@ssi.bg> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ip6_output.c')
-rw-r--r--net/ipv6/ip6_output.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 14d99fbf102e..d299040613a0 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1145,6 +1145,9 @@ static inline int ip6_ufo_append_data(struct sock *sk,
1145 skb->protocol = htons(ETH_P_IPV6); 1145 skb->protocol = htons(ETH_P_IPV6);
1146 skb->csum = 0; 1146 skb->csum = 0;
1147 1147
1148 if (flags & MSG_CONFIRM)
1149 skb_set_dst_pending_confirm(skb, 1);
1150
1148 __skb_queue_tail(queue, skb); 1151 __skb_queue_tail(queue, skb);
1149 } else if (skb_is_gso(skb)) { 1152 } else if (skb_is_gso(skb)) {
1150 goto append; 1153 goto append;
@@ -1517,6 +1520,9 @@ alloc_new_skb:
1517 exthdrlen = 0; 1520 exthdrlen = 0;
1518 dst_exthdrlen = 0; 1521 dst_exthdrlen = 0;
1519 1522
1523 if ((flags & MSG_CONFIRM) && !skb_prev)
1524 skb_set_dst_pending_confirm(skb, 1);
1525
1520 /* 1526 /*
1521 * Put the packet on the pending queue 1527 * Put the packet on the pending queue
1522 */ 1528 */