datagram: Factor out sk queue referencing
[pandora-kernel.git] / net / core / datagram.c
1 /*
2  *      SUCS NET3:
3  *
4  *      Generic datagram handling routines. These are generic for all
5  *      protocols. Possibly a generic IP version on top of these would
6  *      make sense. Not tonight however 8-).
7  *      This is used because UDP, RAW, PACKET, DDP, IPX, AX.25 and
8  *      NetROM layer all have identical poll code and mostly
9  *      identical recvmsg() code. So we share it here. The poll was
10  *      shared before but buried in udp.c so I moved it.
11  *
12  *      Authors:        Alan Cox <alan@lxorguk.ukuu.org.uk>. (datagram_poll() from old
13  *                                                   udp.c code)
14  *
15  *      Fixes:
16  *              Alan Cox        :       NULL return from skb_peek_copy()
17  *                                      understood
18  *              Alan Cox        :       Rewrote skb_read_datagram to avoid the
19  *                                      skb_peek_copy stuff.
20  *              Alan Cox        :       Added support for SOCK_SEQPACKET.
21  *                                      IPX can no longer use the SO_TYPE hack
22  *                                      but AX.25 now works right, and SPX is
23  *                                      feasible.
24  *              Alan Cox        :       Fixed write poll of non IP protocol
25  *                                      crash.
26  *              Florian  La Roche:      Changed for my new skbuff handling.
27  *              Darryl Miles    :       Fixed non-blocking SOCK_SEQPACKET.
28  *              Linus Torvalds  :       BSD semantic fixes.
29  *              Alan Cox        :       Datagram iovec handling
30  *              Darryl Miles    :       Fixed non-blocking SOCK_STREAM.
31  *              Alan Cox        :       POSIXisms
32  *              Pete Wyckoff    :       Unconnected accept() fix.
33  *
34  */
35
36 #include <linux/module.h>
37 #include <linux/types.h>
38 #include <linux/kernel.h>
39 #include <asm/uaccess.h>
40 #include <asm/system.h>
41 #include <linux/mm.h>
42 #include <linux/interrupt.h>
43 #include <linux/errno.h>
44 #include <linux/sched.h>
45 #include <linux/inet.h>
46 #include <linux/netdevice.h>
47 #include <linux/rtnetlink.h>
48 #include <linux/poll.h>
49 #include <linux/highmem.h>
50 #include <linux/spinlock.h>
51 #include <linux/slab.h>
52
53 #include <net/protocol.h>
54 #include <linux/skbuff.h>
55
56 #include <net/checksum.h>
57 #include <net/sock.h>
58 #include <net/tcp_states.h>
59 #include <trace/events/skb.h>
60
61 /*
62  *      Is a socket 'connection oriented' ?
63  */
64 static inline int connection_based(struct sock *sk)
65 {
66         return sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM;
67 }
68
69 static int receiver_wake_function(wait_queue_t *wait, unsigned mode, int sync,
70                                   void *key)
71 {
72         unsigned long bits = (unsigned long)key;
73
74         /*
75          * Avoid a wakeup if event not interesting for us
76          */
77         if (bits && !(bits & (POLLIN | POLLERR)))
78                 return 0;
79         return autoremove_wake_function(wait, mode, sync, key);
80 }
81 /*
82  * Wait for a packet..
83  */
84 static int wait_for_packet(struct sock *sk, int *err, long *timeo_p)
85 {
86         int error;
87         DEFINE_WAIT_FUNC(wait, receiver_wake_function);
88
89         prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
90
91         /* Socket errors? */
92         error = sock_error(sk);
93         if (error)
94                 goto out_err;
95
96         if (!skb_queue_empty(&sk->sk_receive_queue))
97                 goto out;
98
99         /* Socket shut down? */
100         if (sk->sk_shutdown & RCV_SHUTDOWN)
101                 goto out_noerr;
102
103         /* Sequenced packets can come disconnected.
104          * If so we report the problem
105          */
106         error = -ENOTCONN;
107         if (connection_based(sk) &&
108             !(sk->sk_state == TCP_ESTABLISHED || sk->sk_state == TCP_LISTEN))
109                 goto out_err;
110
111         /* handle signals */
112         if (signal_pending(current))
113                 goto interrupted;
114
115         error = 0;
116         *timeo_p = schedule_timeout(*timeo_p);
117 out:
118         finish_wait(sk_sleep(sk), &wait);
119         return error;
120 interrupted:
121         error = sock_intr_errno(*timeo_p);
122 out_err:
123         *err = error;
124         goto out;
125 out_noerr:
126         *err = 0;
127         error = 1;
128         goto out;
129 }
130
131 /**
132  *      __skb_recv_datagram - Receive a datagram skbuff
133  *      @sk: socket
134  *      @flags: MSG_ flags
135  *      @peeked: returns non-zero if this packet has been seen before
136  *      @err: error code returned
137  *
138  *      Get a datagram skbuff, understands the peeking, nonblocking wakeups
139  *      and possible races. This replaces identical code in packet, raw and
140  *      udp, as well as the IPX AX.25 and Appletalk. It also finally fixes
141  *      the long standing peek and read race for datagram sockets. If you
142  *      alter this routine remember it must be re-entrant.
143  *
144  *      This function will lock the socket if a skb is returned, so the caller
145  *      needs to unlock the socket in that case (usually by calling
146  *      skb_free_datagram)
147  *
148  *      * It does not lock socket since today. This function is
149  *      * free of race conditions. This measure should/can improve
150  *      * significantly datagram socket latencies at high loads,
151  *      * when data copying to user space takes lots of time.
152  *      * (BTW I've just killed the last cli() in IP/IPv6/core/netlink/packet
153  *      *  8) Great win.)
154  *      *                                           --ANK (980729)
155  *
156  *      The order of the tests when we find no data waiting are specified
157  *      quite explicitly by POSIX 1003.1g, don't change them without having
158  *      the standard around please.
159  */
160 struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned flags,
161                                     int *peeked, int *err)
162 {
163         struct sk_buff *skb;
164         long timeo;
165         /*
166          * Caller is allowed not to check sk->sk_err before skb_recv_datagram()
167          */
168         int error = sock_error(sk);
169
170         if (error)
171                 goto no_packet;
172
173         timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
174
175         do {
176                 /* Again only user level code calls this function, so nothing
177                  * interrupt level will suddenly eat the receive_queue.
178                  *
179                  * Look at current nfs client by the way...
180                  * However, this function was correct in any case. 8)
181                  */
182                 unsigned long cpu_flags;
183                 struct sk_buff_head *queue = &sk->sk_receive_queue;
184
185                 spin_lock_irqsave(&queue->lock, cpu_flags);
186                 skb = skb_peek(queue);
187                 if (skb) {
188                         *peeked = skb->peeked;
189                         if (flags & MSG_PEEK) {
190                                 skb->peeked = 1;
191                                 atomic_inc(&skb->users);
192                         } else
193                                 __skb_unlink(skb, queue);
194                 }
195                 spin_unlock_irqrestore(&queue->lock, cpu_flags);
196
197                 if (skb)
198                         return skb;
199
200                 /* User doesn't want to wait */
201                 error = -EAGAIN;
202                 if (!timeo)
203                         goto no_packet;
204
205         } while (!wait_for_packet(sk, err, &timeo));
206
207         return NULL;
208
209 no_packet:
210         *err = error;
211         return NULL;
212 }
213 EXPORT_SYMBOL(__skb_recv_datagram);
214
215 struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
216                                   int noblock, int *err)
217 {
218         int peeked;
219
220         return __skb_recv_datagram(sk, flags | (noblock ? MSG_DONTWAIT : 0),
221                                    &peeked, err);
222 }
223 EXPORT_SYMBOL(skb_recv_datagram);
224
225 void skb_free_datagram(struct sock *sk, struct sk_buff *skb)
226 {
227         consume_skb(skb);
228         sk_mem_reclaim_partial(sk);
229 }
230 EXPORT_SYMBOL(skb_free_datagram);
231
232 void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb)
233 {
234         bool slow;
235
236         if (likely(atomic_read(&skb->users) == 1))
237                 smp_rmb();
238         else if (likely(!atomic_dec_and_test(&skb->users)))
239                 return;
240
241         slow = lock_sock_fast(sk);
242         skb_orphan(skb);
243         sk_mem_reclaim_partial(sk);
244         unlock_sock_fast(sk, slow);
245
246         /* skb is now orphaned, can be freed outside of locked section */
247         trace_kfree_skb(skb, skb_free_datagram_locked);
248         __kfree_skb(skb);
249 }
250 EXPORT_SYMBOL(skb_free_datagram_locked);
251
252 /**
253  *      skb_kill_datagram - Free a datagram skbuff forcibly
254  *      @sk: socket
255  *      @skb: datagram skbuff
256  *      @flags: MSG_ flags
257  *
258  *      This function frees a datagram skbuff that was received by
259  *      skb_recv_datagram.  The flags argument must match the one
260  *      used for skb_recv_datagram.
261  *
262  *      If the MSG_PEEK flag is set, and the packet is still on the
263  *      receive queue of the socket, it will be taken off the queue
264  *      before it is freed.
265  *
266  *      This function currently only disables BH when acquiring the
267  *      sk_receive_queue lock.  Therefore it must not be used in a
268  *      context where that lock is acquired in an IRQ context.
269  *
270  *      It returns 0 if the packet was removed by us.
271  */
272
273 int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, unsigned int flags)
274 {
275         int err = 0;
276
277         if (flags & MSG_PEEK) {
278                 err = -ENOENT;
279                 spin_lock_bh(&sk->sk_receive_queue.lock);
280                 if (skb == skb_peek(&sk->sk_receive_queue)) {
281                         __skb_unlink(skb, &sk->sk_receive_queue);
282                         atomic_dec(&skb->users);
283                         err = 0;
284                 }
285                 spin_unlock_bh(&sk->sk_receive_queue.lock);
286         }
287
288         kfree_skb(skb);
289         atomic_inc(&sk->sk_drops);
290         sk_mem_reclaim_partial(sk);
291
292         return err;
293 }
294 EXPORT_SYMBOL(skb_kill_datagram);
295
296 /**
297  *      skb_copy_datagram_iovec - Copy a datagram to an iovec.
298  *      @skb: buffer to copy
299  *      @offset: offset in the buffer to start copying from
300  *      @to: io vector to copy to
301  *      @len: amount of data to copy from buffer to iovec
302  *
303  *      Note: the iovec is modified during the copy.
304  */
305 int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset,
306                             struct iovec *to, int len)
307 {
308         int start = skb_headlen(skb);
309         int i, copy = start - offset;
310         struct sk_buff *frag_iter;
311
312         trace_skb_copy_datagram_iovec(skb, len);
313
314         /* Copy header. */
315         if (copy > 0) {
316                 if (copy > len)
317                         copy = len;
318                 if (memcpy_toiovec(to, skb->data + offset, copy))
319                         goto fault;
320                 if ((len -= copy) == 0)
321                         return 0;
322                 offset += copy;
323         }
324
325         /* Copy paged appendix. Hmm... why does this look so complicated? */
326         for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
327                 int end;
328                 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
329
330                 WARN_ON(start > offset + len);
331
332                 end = start + skb_frag_size(frag);
333                 if ((copy = end - offset) > 0) {
334                         int err;
335                         u8  *vaddr;
336                         struct page *page = skb_frag_page(frag);
337
338                         if (copy > len)
339                                 copy = len;
340                         vaddr = kmap(page);
341                         err = memcpy_toiovec(to, vaddr + frag->page_offset +
342                                              offset - start, copy);
343                         kunmap(page);
344                         if (err)
345                                 goto fault;
346                         if (!(len -= copy))
347                                 return 0;
348                         offset += copy;
349                 }
350                 start = end;
351         }
352
353         skb_walk_frags(skb, frag_iter) {
354                 int end;
355
356                 WARN_ON(start > offset + len);
357
358                 end = start + frag_iter->len;
359                 if ((copy = end - offset) > 0) {
360                         if (copy > len)
361                                 copy = len;
362                         if (skb_copy_datagram_iovec(frag_iter,
363                                                     offset - start,
364                                                     to, copy))
365                                 goto fault;
366                         if ((len -= copy) == 0)
367                                 return 0;
368                         offset += copy;
369                 }
370                 start = end;
371         }
372         if (!len)
373                 return 0;
374
375 fault:
376         return -EFAULT;
377 }
378 EXPORT_SYMBOL(skb_copy_datagram_iovec);
379
380 /**
381  *      skb_copy_datagram_const_iovec - Copy a datagram to an iovec.
382  *      @skb: buffer to copy
383  *      @offset: offset in the buffer to start copying from
384  *      @to: io vector to copy to
385  *      @to_offset: offset in the io vector to start copying to
386  *      @len: amount of data to copy from buffer to iovec
387  *
388  *      Returns 0 or -EFAULT.
389  *      Note: the iovec is not modified during the copy.
390  */
391 int skb_copy_datagram_const_iovec(const struct sk_buff *skb, int offset,
392                                   const struct iovec *to, int to_offset,
393                                   int len)
394 {
395         int start = skb_headlen(skb);
396         int i, copy = start - offset;
397         struct sk_buff *frag_iter;
398
399         /* Copy header. */
400         if (copy > 0) {
401                 if (copy > len)
402                         copy = len;
403                 if (memcpy_toiovecend(to, skb->data + offset, to_offset, copy))
404                         goto fault;
405                 if ((len -= copy) == 0)
406                         return 0;
407                 offset += copy;
408                 to_offset += copy;
409         }
410
411         /* Copy paged appendix. Hmm... why does this look so complicated? */
412         for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
413                 int end;
414                 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
415
416                 WARN_ON(start > offset + len);
417
418                 end = start + skb_frag_size(frag);
419                 if ((copy = end - offset) > 0) {
420                         int err;
421                         u8  *vaddr;
422                         struct page *page = skb_frag_page(frag);
423
424                         if (copy > len)
425                                 copy = len;
426                         vaddr = kmap(page);
427                         err = memcpy_toiovecend(to, vaddr + frag->page_offset +
428                                                 offset - start, to_offset, copy);
429                         kunmap(page);
430                         if (err)
431                                 goto fault;
432                         if (!(len -= copy))
433                                 return 0;
434                         offset += copy;
435                         to_offset += copy;
436                 }
437                 start = end;
438         }
439
440         skb_walk_frags(skb, frag_iter) {
441                 int end;
442
443                 WARN_ON(start > offset + len);
444
445                 end = start + frag_iter->len;
446                 if ((copy = end - offset) > 0) {
447                         if (copy > len)
448                                 copy = len;
449                         if (skb_copy_datagram_const_iovec(frag_iter,
450                                                           offset - start,
451                                                           to, to_offset,
452                                                           copy))
453                                 goto fault;
454                         if ((len -= copy) == 0)
455                                 return 0;
456                         offset += copy;
457                         to_offset += copy;
458                 }
459                 start = end;
460         }
461         if (!len)
462                 return 0;
463
464 fault:
465         return -EFAULT;
466 }
467 EXPORT_SYMBOL(skb_copy_datagram_const_iovec);
468
469 /**
470  *      skb_copy_datagram_from_iovec - Copy a datagram from an iovec.
471  *      @skb: buffer to copy
472  *      @offset: offset in the buffer to start copying to
473  *      @from: io vector to copy to
474  *      @from_offset: offset in the io vector to start copying from
475  *      @len: amount of data to copy to buffer from iovec
476  *
477  *      Returns 0 or -EFAULT.
478  *      Note: the iovec is not modified during the copy.
479  */
480 int skb_copy_datagram_from_iovec(struct sk_buff *skb, int offset,
481                                  const struct iovec *from, int from_offset,
482                                  int len)
483 {
484         int start = skb_headlen(skb);
485         int i, copy = start - offset;
486         struct sk_buff *frag_iter;
487
488         /* Copy header. */
489         if (copy > 0) {
490                 if (copy > len)
491                         copy = len;
492                 if (memcpy_fromiovecend(skb->data + offset, from, from_offset,
493                                         copy))
494                         goto fault;
495                 if ((len -= copy) == 0)
496                         return 0;
497                 offset += copy;
498                 from_offset += copy;
499         }
500
501         /* Copy paged appendix. Hmm... why does this look so complicated? */
502         for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
503                 int end;
504                 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
505
506                 WARN_ON(start > offset + len);
507
508                 end = start + skb_frag_size(frag);
509                 if ((copy = end - offset) > 0) {
510                         int err;
511                         u8  *vaddr;
512                         struct page *page = skb_frag_page(frag);
513
514                         if (copy > len)
515                                 copy = len;
516                         vaddr = kmap(page);
517                         err = memcpy_fromiovecend(vaddr + frag->page_offset +
518                                                   offset - start,
519                                                   from, from_offset, copy);
520                         kunmap(page);
521                         if (err)
522                                 goto fault;
523
524                         if (!(len -= copy))
525                                 return 0;
526                         offset += copy;
527                         from_offset += copy;
528                 }
529                 start = end;
530         }
531
532         skb_walk_frags(skb, frag_iter) {
533                 int end;
534
535                 WARN_ON(start > offset + len);
536
537                 end = start + frag_iter->len;
538                 if ((copy = end - offset) > 0) {
539                         if (copy > len)
540                                 copy = len;
541                         if (skb_copy_datagram_from_iovec(frag_iter,
542                                                          offset - start,
543                                                          from,
544                                                          from_offset,
545                                                          copy))
546                                 goto fault;
547                         if ((len -= copy) == 0)
548                                 return 0;
549                         offset += copy;
550                         from_offset += copy;
551                 }
552                 start = end;
553         }
554         if (!len)
555                 return 0;
556
557 fault:
558         return -EFAULT;
559 }
560 EXPORT_SYMBOL(skb_copy_datagram_from_iovec);
561
562 static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset,
563                                       u8 __user *to, int len,
564                                       __wsum *csump)
565 {
566         int start = skb_headlen(skb);
567         int i, copy = start - offset;
568         struct sk_buff *frag_iter;
569         int pos = 0;
570
571         /* Copy header. */
572         if (copy > 0) {
573                 int err = 0;
574                 if (copy > len)
575                         copy = len;
576                 *csump = csum_and_copy_to_user(skb->data + offset, to, copy,
577                                                *csump, &err);
578                 if (err)
579                         goto fault;
580                 if ((len -= copy) == 0)
581                         return 0;
582                 offset += copy;
583                 to += copy;
584                 pos = copy;
585         }
586
587         for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
588                 int end;
589                 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
590
591                 WARN_ON(start > offset + len);
592
593                 end = start + skb_frag_size(frag);
594                 if ((copy = end - offset) > 0) {
595                         __wsum csum2;
596                         int err = 0;
597                         u8  *vaddr;
598                         struct page *page = skb_frag_page(frag);
599
600                         if (copy > len)
601                                 copy = len;
602                         vaddr = kmap(page);
603                         csum2 = csum_and_copy_to_user(vaddr +
604                                                         frag->page_offset +
605                                                         offset - start,
606                                                       to, copy, 0, &err);
607                         kunmap(page);
608                         if (err)
609                                 goto fault;
610                         *csump = csum_block_add(*csump, csum2, pos);
611                         if (!(len -= copy))
612                                 return 0;
613                         offset += copy;
614                         to += copy;
615                         pos += copy;
616                 }
617                 start = end;
618         }
619
620         skb_walk_frags(skb, frag_iter) {
621                 int end;
622
623                 WARN_ON(start > offset + len);
624
625                 end = start + frag_iter->len;
626                 if ((copy = end - offset) > 0) {
627                         __wsum csum2 = 0;
628                         if (copy > len)
629                                 copy = len;
630                         if (skb_copy_and_csum_datagram(frag_iter,
631                                                        offset - start,
632                                                        to, copy,
633                                                        &csum2))
634                                 goto fault;
635                         *csump = csum_block_add(*csump, csum2, pos);
636                         if ((len -= copy) == 0)
637                                 return 0;
638                         offset += copy;
639                         to += copy;
640                         pos += copy;
641                 }
642                 start = end;
643         }
644         if (!len)
645                 return 0;
646
647 fault:
648         return -EFAULT;
649 }
650
651 __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len)
652 {
653         __sum16 sum;
654
655         sum = csum_fold(skb_checksum(skb, 0, len, skb->csum));
656         if (likely(!sum)) {
657                 if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
658                         netdev_rx_csum_fault(skb->dev);
659                 skb->ip_summed = CHECKSUM_UNNECESSARY;
660         }
661         return sum;
662 }
663 EXPORT_SYMBOL(__skb_checksum_complete_head);
664
665 __sum16 __skb_checksum_complete(struct sk_buff *skb)
666 {
667         return __skb_checksum_complete_head(skb, skb->len);
668 }
669 EXPORT_SYMBOL(__skb_checksum_complete);
670
671 /**
672  *      skb_copy_and_csum_datagram_iovec - Copy and checkum skb to user iovec.
673  *      @skb: skbuff
674  *      @hlen: hardware length
675  *      @iov: io vector
676  *
677  *      Caller _must_ check that skb will fit to this iovec.
678  *
679  *      Returns: 0       - success.
680  *               -EINVAL - checksum failure.
681  *               -EFAULT - fault during copy. Beware, in this case iovec
682  *                         can be modified!
683  */
684 int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb,
685                                      int hlen, struct iovec *iov)
686 {
687         __wsum csum;
688         int chunk = skb->len - hlen;
689
690         if (!chunk)
691                 return 0;
692
693         /* Skip filled elements.
694          * Pretty silly, look at memcpy_toiovec, though 8)
695          */
696         while (!iov->iov_len)
697                 iov++;
698
699         if (iov->iov_len < chunk) {
700                 if (__skb_checksum_complete(skb))
701                         goto csum_error;
702                 if (skb_copy_datagram_iovec(skb, hlen, iov, chunk))
703                         goto fault;
704         } else {
705                 csum = csum_partial(skb->data, hlen, skb->csum);
706                 if (skb_copy_and_csum_datagram(skb, hlen, iov->iov_base,
707                                                chunk, &csum))
708                         goto fault;
709                 if (csum_fold(csum))
710                         goto csum_error;
711                 if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
712                         netdev_rx_csum_fault(skb->dev);
713                 iov->iov_len -= chunk;
714                 iov->iov_base += chunk;
715         }
716         return 0;
717 csum_error:
718         return -EINVAL;
719 fault:
720         return -EFAULT;
721 }
722 EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec);
723
724 /**
725  *      datagram_poll - generic datagram poll
726  *      @file: file struct
727  *      @sock: socket
728  *      @wait: poll table
729  *
730  *      Datagram poll: Again totally generic. This also handles
731  *      sequenced packet sockets providing the socket receive queue
732  *      is only ever holding data ready to receive.
733  *
734  *      Note: when you _don't_ use this routine for this protocol,
735  *      and you use a different write policy from sock_writeable()
736  *      then please supply your own write_space callback.
737  */
738 unsigned int datagram_poll(struct file *file, struct socket *sock,
739                            poll_table *wait)
740 {
741         struct sock *sk = sock->sk;
742         unsigned int mask;
743
744         sock_poll_wait(file, sk_sleep(sk), wait);
745         mask = 0;
746
747         /* exceptional events? */
748         if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
749                 mask |= POLLERR;
750         if (sk->sk_shutdown & RCV_SHUTDOWN)
751                 mask |= POLLRDHUP | POLLIN | POLLRDNORM;
752         if (sk->sk_shutdown == SHUTDOWN_MASK)
753                 mask |= POLLHUP;
754
755         /* readable? */
756         if (!skb_queue_empty(&sk->sk_receive_queue))
757                 mask |= POLLIN | POLLRDNORM;
758
759         /* Connection-based need to check for termination and startup */
760         if (connection_based(sk)) {
761                 if (sk->sk_state == TCP_CLOSE)
762                         mask |= POLLHUP;
763                 /* connection hasn't started yet? */
764                 if (sk->sk_state == TCP_SYN_SENT)
765                         return mask;
766         }
767
768         /* writable? */
769         if (sock_writeable(sk))
770                 mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
771         else
772                 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
773
774         return mask;
775 }
776 EXPORT_SYMBOL(datagram_poll);