diff options
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r-- | net/ipv4/udp.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 8fef859db35d..666b963496ff 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -1217,6 +1217,7 @@ int udp_disconnect(struct sock *sk, int flags) | |||
1217 | sk->sk_state = TCP_CLOSE; | 1217 | sk->sk_state = TCP_CLOSE; |
1218 | inet->inet_daddr = 0; | 1218 | inet->inet_daddr = 0; |
1219 | inet->inet_dport = 0; | 1219 | inet->inet_dport = 0; |
1220 | inet_rps_save_rxhash(sk, 0); | ||
1220 | sk->sk_bound_dev_if = 0; | 1221 | sk->sk_bound_dev_if = 0; |
1221 | if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK)) | 1222 | if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK)) |
1222 | inet_reset_saddr(sk); | 1223 | inet_reset_saddr(sk); |
@@ -1258,8 +1259,12 @@ EXPORT_SYMBOL(udp_lib_unhash); | |||
1258 | 1259 | ||
1259 | static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | 1260 | static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) |
1260 | { | 1261 | { |
1261 | int rc = sock_queue_rcv_skb(sk, skb); | 1262 | int rc; |
1263 | |||
1264 | if (inet_sk(sk)->inet_daddr) | ||
1265 | inet_rps_save_rxhash(sk, skb->rxhash); | ||
1262 | 1266 | ||
1267 | rc = sock_queue_rcv_skb(sk, skb); | ||
1263 | if (rc < 0) { | 1268 | if (rc < 0) { |
1264 | int is_udplite = IS_UDPLITE(sk); | 1269 | int is_udplite = IS_UDPLITE(sk); |
1265 | 1270 | ||