ib/cm: fix handling of REJ in REQ_RCVD state
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 13 Jan 2010 19:33:56 +0000 (19:33 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 13 Jan 2010 19:33:56 +0000 (19:33 +0000)
If a REJ is received immediately after receiving a REQ,
then a callback can be queued to the user for the REJ before
the user has had a chance to see or process the REQ.  The
result is that the user will not have had a chance to set
any context associated with the REQ, which can lead to a
crash processing the REJ.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2661 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

core/al/kernel/al_cm_cep.c

index 4987207..86c5412 100644 (file)
@@ -938,7 +938,6 @@ __process_rej(
                }\r
 \r
                /* Fall through */\r
-       case CEP_STATE_REQ_RCVD:\r
        case CEP_STATE_REP_RCVD:\r
        case CEP_STATE_REQ_MRA_SENT:\r
        case CEP_STATE_REP_MRA_SENT:\r
@@ -955,6 +954,13 @@ __process_rej(
                p_cep->state = CEP_STATE_IDLE;\r
                break;\r
 \r
+       case CEP_STATE_REQ_RCVD:\r
+               __remove_cep( p_cep );\r
+               p_cep->state = CEP_STATE_IDLE;\r
+               ib_put_mad( p_mad );\r
+               AL_EXIT( AL_DBG_CM );\r
+               return IB_NO_MATCH;\r
+\r
        case CEP_STATE_ESTABLISHED:\r
        case CEP_STATE_LAP_RCVD:\r
        case CEP_STATE_LAP_SENT:\r