aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/socket.c
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2011-07-12 20:11:00 -0700
committerColin Cross <ccross@android.com>2011-07-12 20:11:00 -0700
commit2340c679cabc5477598ee3c9c2044ec8893d42fd (patch)
tree2cf2848bea005b9d807710f23dc5519191ca8215 /net/sctp/socket.c
parent9a489d92af45a7d7c1bba9e0803f73f95d2fd13c (diff)
parent620917de59eeb934b9f8cf35cc2d95c1ac8ed0fc (diff)
downloadkernel_samsung_tuna-2340c679cabc5477598ee3c9c2044ec8893d42fd.zip
kernel_samsung_tuna-2340c679cabc5477598ee3c9c2044ec8893d42fd.tar.gz
kernel_samsung_tuna-2340c679cabc5477598ee3c9c2044ec8893d42fd.tar.bz2
Merge commit 'v3.0-rc7' into linux-omap-3.0
Diffstat (limited to 'net/sctp/socket.c')
-rw-r--r--net/sctp/socket.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 6766913..08c6238 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -2073,10 +2073,33 @@ static int sctp_setsockopt_disable_fragments(struct sock *sk,
static int sctp_setsockopt_events(struct sock *sk, char __user *optval,
unsigned int optlen)
{
+ struct sctp_association *asoc;
+ struct sctp_ulpevent *event;
+
if (optlen > sizeof(struct sctp_event_subscribe))
return -EINVAL;
if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen))
return -EFAULT;
+
+ /*
+ * At the time when a user app subscribes to SCTP_SENDER_DRY_EVENT,
+ * if there is no data to be sent or retransmit, the stack will
+ * immediately send up this notification.
+ */
+ if (sctp_ulpevent_type_enabled(SCTP_SENDER_DRY_EVENT,
+ &sctp_sk(sk)->subscribe)) {
+ asoc = sctp_id2assoc(sk, 0);
+
+ if (asoc && sctp_outq_is_empty(&asoc->outqueue)) {
+ event = sctp_ulpevent_make_sender_dry_event(asoc,
+ GFP_ATOMIC);
+ if (!event)
+ return -ENOMEM;
+
+ sctp_ulpq_tail_event(&asoc->ulpq, event);
+ }
+ }
+
return 0;
}