diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/sock.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 7626b6aacd68..43ca2c995393 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -276,6 +276,8 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
276 | { | 276 | { |
277 | int err = 0; | 277 | int err = 0; |
278 | int skb_len; | 278 | int skb_len; |
279 | unsigned long flags; | ||
280 | struct sk_buff_head *list = &sk->sk_receive_queue; | ||
279 | 281 | ||
280 | /* Cast sk->rcvbuf to unsigned... It's pointless, but reduces | 282 | /* Cast sk->rcvbuf to unsigned... It's pointless, but reduces |
281 | number of warnings when compiling with -W --ANK | 283 | number of warnings when compiling with -W --ANK |
@@ -305,7 +307,10 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
305 | */ | 307 | */ |
306 | skb_len = skb->len; | 308 | skb_len = skb->len; |
307 | 309 | ||
308 | skb_queue_tail(&sk->sk_receive_queue, skb); | 310 | spin_lock_irqsave(&list->lock, flags); |
311 | skb->dropcount = atomic_read(&sk->sk_drops); | ||
312 | __skb_queue_tail(list, skb); | ||
313 | spin_unlock_irqrestore(&list->lock, flags); | ||
309 | 314 | ||
310 | if (!sock_flag(sk, SOCK_DEAD)) | 315 | if (!sock_flag(sk, SOCK_DEAD)) |
311 | sk->sk_data_ready(sk, skb_len); | 316 | sk->sk_data_ready(sk, skb_len); |
@@ -702,6 +707,12 @@ set_rcvbuf: | |||
702 | 707 | ||
703 | /* We implement the SO_SNDLOWAT etc to | 708 | /* We implement the SO_SNDLOWAT etc to |
704 | not be settable (1003.1g 5.3) */ | 709 | not be settable (1003.1g 5.3) */ |
710 | case SO_RXQ_OVFL: | ||
711 | if (valbool) | ||
712 | sock_set_flag(sk, SOCK_RXQ_OVFL); | ||
713 | else | ||
714 | sock_reset_flag(sk, SOCK_RXQ_OVFL); | ||
715 | break; | ||
705 | default: | 716 | default: |
706 | ret = -ENOPROTOOPT; | 717 | ret = -ENOPROTOOPT; |
707 | break; | 718 | break; |
@@ -901,6 +912,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
901 | v.val = sk->sk_mark; | 912 | v.val = sk->sk_mark; |
902 | break; | 913 | break; |
903 | 914 | ||
915 | case SO_RXQ_OVFL: | ||
916 | v.val = !!sock_flag(sk, SOCK_RXQ_OVFL); | ||
917 | break; | ||
918 | |||
904 | default: | 919 | default: |
905 | return -ENOPROTOOPT; | 920 | return -ENOPROTOOPT; |
906 | } | 921 | } |