Reject a REQ containing invalid GID(s) with appropriate reason codes
instead of IB_CM_CONSUMER_REJ.

Signed-off-by: Arne Redlich <[EMAIL PROTECTED]>

Index: infiniband/core/cm.c
===================================================================
--- infiniband/core/cm.c        (revision 8556)
+++ infiniband/core/cm.c        (working copy)
@@ -1337,7 +1337,7 @@ static int cm_req_handler(struct cm_work
        struct ib_cm_id *cm_id;
        struct cm_id_private *cm_id_priv, *listen_cm_id_priv;
        struct cm_req_msg *req_msg;
-       int ret;
+       int ret, reject;
 
        req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad;
 
@@ -1354,6 +1354,7 @@ static int cm_req_handler(struct cm_work
                                                            id.local_id);
        if (IS_ERR(cm_id_priv->timewait_info)) {
                ret = PTR_ERR(cm_id_priv->timewait_info);
+               reject = 1;
                goto error1;
        }
        cm_id_priv->timewait_info->work.remote_id = req_msg->local_comm_id;
@@ -1363,6 +1364,7 @@ static int cm_req_handler(struct cm_work
        listen_cm_id_priv = cm_match_req(work, cm_id_priv);
        if (!listen_cm_id_priv) {
                ret = -EINVAL;
+               reject = 0;
                goto error2;
        }
 
@@ -1373,12 +1375,21 @@ static int cm_req_handler(struct cm_work
 
        cm_format_paths_from_req(req_msg, &work->path[0], &work->path[1]);
        ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
-       if (ret)
+       if (ret) {
+               cm_issue_rej(work->port, work->mad_recv_wc, IB_CM_INVALID_GID,
+                            CM_MSG_RESPONSE_REQ, NULL, 0);
+               reject = 0;
                goto error3;
+       }
        if (req_msg->alt_local_lid) {
                ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av);
-               if (ret)
+               if (ret) {
+                       cm_issue_rej(work->port, work->mad_recv_wc,
+                                    IB_CM_INVALID_ALT_GID, CM_MSG_RESPONSE_REQ,
+                                    NULL, 0);
+                       reject = 0;
                        goto error3;
+               }
        }
        cm_id_priv->tid = req_msg->hdr.tid;
        cm_id_priv->timeout_ms = cm_convert_to_ms(
@@ -1405,7 +1416,7 @@ error3:   atomic_dec(&cm_id_priv->refcount
        cm_cleanup_timewait(cm_id_priv->timewait_info);
 error2:        kfree(cm_id_priv->timewait_info);
        cm_id_priv->timewait_info = NULL;
-error1:        ib_destroy_cm_id(&cm_id_priv->id);
+error1:        cm_destroy_id(&cm_id_priv->id, reject);
        return ret;
 }
 



_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to