[erlang-questions] : gen_sctp:connect/5 change

Raimo Niskanen <>
Thu Apr 3 10:38:45 CEST 2008

On Wed, Apr 02, 2008 at 09:23:19PM -0400, Serge Aleynikov wrote:
> It was implemented this way to make the returning signature of this 
> function similar to gen_tcp:connect/3:
> 	{ok, Assoc} | {error, Reason}

Ok, but making it similar to gen_tcp:connect/3 is not essential.

> Additionally, inet_sctp does additional analysis of the 
> #sctp_assoc_change{} record to "filter out" false negative response 
> (i.e. only #sctp_assoc_change{state=comm_up} is considered successful) 
> and transform it to the {ok, ...} | {error, ...} form.  Note that {ok, 
> #sctp_assoc_change{}} and {error, #sctp_assoc_change{}} are both valid 
> responses.

And so is {error,econnrefused} with a subsequent
#sctp_assoc_change{state=comm_lost} received message.

> If this error analysis is to be done by the user of gen_sctp, this 
> wouldn't be quite obvious and may cause unnecessary confusion.

Valid point.

> Finally, since this Assoc record is used in the gen_sctp:send/4 call, it 
> was convenient to use it in this way for writing synchronous code:
> 	{ok, Assoc} = gen_sctp:connect(Sock, Host, Port, []),
> 	gen_sctp:send(Sock, Assoc, 0, <<"Test">>).

Yes, it is convenient.

> I also agree that having optional non-blocking connect in active mode 
> would indeed come in handy.

No objection.

But..(speculating, not tested).. for the current gen_sctp:connect/5;
if an association comes in on a (passive) listen socket just while 
connect/5 is called - it internally calls recv/2 and may receive
the unrelated #sctp_assoc_change{} for another IP:Port,
and regard this as an internal error (it assumes the
first message has to be the one it is waiting for).
I do not know how to work around this bug, if it exists.
One ugly way would to return all received unrelated events
with the {ok,...} or {error,...} value (shrug!).

The code for active mode I have now does
receive {sctp,S,IP,Port,,..} if the socket is in active mode
so it is a selective receive, which would work better in this
scenario of competing incoming/outgoing #sctp_assoc_change{},
but this keeps the connect blocking. An option for non-blocking
connect is missing, or if the socket is active the connect
should be non-blocking and the caller should handle
the comm_up message...

And, if the user sets a too short timeout in connect/5 the
#sctp_assoc_change{state=comm_up} may arrive just after
the timeout. For passive mode this will not be noticed
until recv/2 is called (much) later. For active mode
the comm_up message arrives instantly in the inbox.
A well written caller would have to be ready for
these late messages anyway.

So, there are subtle semantic differences between 
connect/5 in passive vs active mode. And making connect/5
always non-blocking would remove the differences but
force the caller to handle the comm_up event the
right way... Which is the least bad alternative...?

1) There is probably a problem with the current
   passive connect/5 that may be solved by making
   it non-blocking but that will be unconvenient.
   There might be other ways to solve that problem
   and maybe ther is no problem.
2) Should connect/5 for active socket be non-blocking
   or not, or selectable. If connect/5 for passive
   socket is made non-blocking it should be the
   same for active socket.

> Serge
> Raimo Niskanen wrote:
> > Hi list!
> > 
> > I am in the process of fixing active mode for gen_sctp, and up
> > comes a question about why connect/5 returns {ok,Assoc} instead
> > of just ok. The connect/5 code does an implicit recv/2 to get
> > an #sctp_assoc_change{} message to return.
> > 
> > A change to connect/5 not returning the #sctp_assoc_change{}
> > message, letting the user explicitly call recv/2 or in 
> > active mode receive the #sctp_assoc_change{} would simplify
> > the connect/5 code and perhaps make gen_sctp more SCTP.
> > But would connect/5 become much less usable?
> > 
> > gen_sctp is still in beta state. If a change is appropriate,
> > it should be made as soon as possible.
> > 
> > Nevertheless, these changes will not make it into R12B-2.
> > 
> _______________________________________________
> erlang-questions mailing list
> http://www.erlang.org/mailman/listinfo/erlang-questions


/ Raimo Niskanen, Erlang/OTP, Ericsson AB

More information about the erlang-questions mailing list