diff options
author | tuexen <tuexen@FreeBSD.org> | 2011-09-14 19:10:13 +0000 |
---|---|---|
committer | tuexen <tuexen@FreeBSD.org> | 2011-09-14 19:10:13 +0000 |
commit | 0e8ff918fb8c9f8e97cce19735ec7f77110d134c (patch) | |
tree | e37ede04ab1f8fd299aa01da6472fbfad8f5ec22 /sys/netinet/sctp_usrreq.c | |
parent | 79dd2afc0bac76768a48b949de5750372af85472 (diff) | |
download | FreeBSD-src-0e8ff918fb8c9f8e97cce19735ec7f77110d134c.zip FreeBSD-src-0e8ff918fb8c9f8e97cce19735ec7f77110d134c.tar.gz |
Ensure that 1-to-1 style SCTP sockets can only be connected once.
Allow implicit setup also for 1-to-1 style sockets as described
in the latest version of the socket API ID.
Approved by: re
MFC after: 1 month
Diffstat (limited to 'sys/netinet/sctp_usrreq.c')
-rw-r--r-- | sys/netinet/sctp_usrreq.c | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index d52df50..cd69a45 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -1541,6 +1541,11 @@ sctp_do_connect_x(struct socket *so, struct sctp_inpcb *inp, void *optval, /* Gak! no memory */ goto out_now; } + if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { + stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; + /* Set the connected flag so we can queue data */ + soisconnecting(so); + } SCTP_SET_STATE(&stcb->asoc, SCTP_STATE_COOKIE_WAIT); /* move to second address */ switch (sa->sa_family) { @@ -5772,15 +5777,6 @@ sctp_connect(struct socket *so, struct sockaddr *addr, struct thread *p) if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) { stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_CONNECTED; /* Set the connected flag so we can queue data */ - SOCKBUF_LOCK(&so->so_rcv); - so->so_rcv.sb_state &= ~SBS_CANTRCVMORE; - SOCKBUF_UNLOCK(&so->so_rcv); - SOCKBUF_LOCK(&so->so_snd); - so->so_snd.sb_state &= ~SBS_CANTSENDMORE; - SOCKBUF_UNLOCK(&so->so_snd); - SOCK_LOCK(so); - so->so_state &= ~SS_ISDISCONNECTING; - SOCK_UNLOCK(so); soisconnecting(so); } SCTP_SET_STATE(&stcb->asoc, SCTP_STATE_COOKIE_WAIT); |