diff options
author | Julian Anastasov <ja@ssi.bg> | 2017-02-06 16:14:16 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-02-07 13:07:47 -0500 |
commit | 0dec879f636f11b0ffda1cb5fd96a1754c59ead3 (patch) | |
tree | fcc479052e78ceb30f8f3b95a881cf986f0564dd /net/ipv6/ip6_output.c | |
parent | 63fca65d08632fbec9d9b655f671cf08aa1aeeb8 (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.c | 6 |
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 | */ |