[openib-general] Re: [PATCH 3/3] iWARP CM - iWARPConnectionManager
Steve Wise
swise at opengridcomputing.com
Wed Mar 22 12:28:59 PST 2006
On Wed, 2006-03-22 at 11:40 -0800, Sean Hefty wrote:
> >> For example, as soon as the user calls connect(), can they receive a CLOSE
> >> event, even before the connect() call returns?
> >
> >No. connect results in a CONNECT_REPLY event always. Not a CLOSE
> >event.
>
> What if the remote side sends the reply, then decides to abort or disconnect?
This would be seen by the local IWCM as CONNECT_REPLY(success) at which
point the QP is in RTS, and the cm_id is CONNECTED. Then the reception
of an abort would generate a CLOSE event to the IWCM. Or if the remote
side does an orderly shutdown, a DISCONNECT event is sent up when the
FIN arrives, and a CLOSE event is sent up when the connection shutdown
finishes.
I'm speaking here from the provider's perspective...
> I'm considering a case where multiple events may be queued. I.e. after calling
> connect(), what events can a user see without making any other calls?
>
The user, being the IWCM, will always see a CONNECT_REPLY to a connect
downcall.
> >> If so, are there any issues
> >> here? Is it possible for the user to call down to the provider, after the
> >> provider has generated a CLOSE event, resulting in accessing the wrong
> >> connection, or crashing in the provider?
> >
> >The IWCM prevents this, methinks, by failing any downcalls once the
> >cm_id is no longer in a CONNECTED state.
>
> The issue is that a state check could succeed, with the downcall pending when an
> event is received that changes the state. The downcall cannot be stopped at
> this point, and will hit the provider's code. Maybe the call/event model
> prevents this from ever being an issue?
>
I _think_ the IWCM prevents this. Tom?
> >For orderly close, the provider needs to wait until the close completes
> >or is aborted due to protocol errors. This can be implemented in many
> >ways, but blocking the caller is perhaps the simplest. Also, note, that
> >the QP needs to stay around until it transitions out of CLOSING by the
> >provider. This further complicates things and is different from IB.
>
> As long as the blocking is reasonably short, this sounds fine. I'm thinking
> more of the case where a module is trying to release its resources before being
> unloaded.
For a module unload, the connections should be aborted, not
disconnected. Aborts are quick. Disconnects can take a long time
because its end-to-end, and if connectivity is lost during this
end-to-end operation, TCP timeout mechanisms will be used to decide when
to "give up".
>
> >connect(), listen(), and when incoming iwarp connections get
> >established.
>
> I didn't consider that last case. The provider creates the context at this
> point, but when is it associated with the cm_id? On accept()?
Yes.
> How are
> additional events that are generated in this case handled, or is that even
> possible? I.e. you've notified the user of a new connection request, when the
> connection is aborted. The user hasn't called accept() or reject() yet.
>
The provider must handle this and _not_ pass any events up until the
IWCM has accepted or rejected the connection request. In the case of an
connect request upcall, followed by a connection abortion, followed by a
accept_cr downcall, the accept_cr downcall would return an error like
-ECONNRESET. OR the provider could allow the accept_cr to succeed,
which moves everything to RTS/CONNECTED, then generate a CLOSE upcall.
Either way is correct methinks. I think providers would do the former.
Steve.
More information about the general
mailing list