|
@@ -240,6 +240,7 @@ struct sock_common {
|
|
|
* @sk_wq: sock wait queue and async head
|
|
|
* @sk_rx_dst: receive input route used by early demux
|
|
|
* @sk_dst_cache: destination cache
|
|
|
+ * @sk_dst_pending_confirm: need to confirm neighbour
|
|
|
* @sk_policy: flow policy
|
|
|
* @sk_receive_queue: incoming packets
|
|
|
* @sk_wmem_alloc: transmit queue bytes committed
|
|
@@ -393,6 +394,8 @@ struct sock {
|
|
|
struct sk_buff_head sk_write_queue;
|
|
|
__s32 sk_peek_off;
|
|
|
int sk_write_pending;
|
|
|
+ __u32 sk_dst_pending_confirm;
|
|
|
+ /* Note: 32bit hole on 64bit arches */
|
|
|
long sk_sndtimeo;
|
|
|
struct timer_list sk_timer;
|
|
|
__u32 sk_priority;
|
|
@@ -1764,6 +1767,7 @@ static inline void dst_negative_advice(struct sock *sk)
|
|
|
if (ndst != dst) {
|
|
|
rcu_assign_pointer(sk->sk_dst_cache, ndst);
|
|
|
sk_tx_queue_clear(sk);
|
|
|
+ sk->sk_dst_pending_confirm = 0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1774,6 +1778,7 @@ __sk_dst_set(struct sock *sk, struct dst_entry *dst)
|
|
|
struct dst_entry *old_dst;
|
|
|
|
|
|
sk_tx_queue_clear(sk);
|
|
|
+ sk->sk_dst_pending_confirm = 0;
|
|
|
/*
|
|
|
* This can be called while sk is owned by the caller only,
|
|
|
* with no state that can be checked in a rcu_dereference_check() cond
|
|
@@ -1789,6 +1794,7 @@ sk_dst_set(struct sock *sk, struct dst_entry *dst)
|
|
|
struct dst_entry *old_dst;
|
|
|
|
|
|
sk_tx_queue_clear(sk);
|
|
|
+ sk->sk_dst_pending_confirm = 0;
|
|
|
old_dst = xchg((__force struct dst_entry **)&sk->sk_dst_cache, dst);
|
|
|
dst_release(old_dst);
|
|
|
}
|
|
@@ -1809,6 +1815,12 @@ struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie);
|
|
|
|
|
|
struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie);
|
|
|
|
|
|
+static inline void sk_dst_confirm(struct sock *sk)
|
|
|
+{
|
|
|
+ if (!sk->sk_dst_pending_confirm)
|
|
|
+ sk->sk_dst_pending_confirm = 1;
|
|
|
+}
|
|
|
+
|
|
|
bool sk_mc_loop(struct sock *sk);
|
|
|
|
|
|
static inline bool sk_can_gso(const struct sock *sk)
|