diff mbox

[RESEND] IB/cma: Resolve AF_IB UD support

Message ID 1432019508-95824-1-git-send-email-matt@mellanox.com (mailing list archive)
State Accepted
Headers show

Commit Message

Matthew Finlay May 19, 2015, 7:11 a.m. UTC
Resent due to mailer issues

Support for using UD and AF_IB is currently broken.  The IB_CM_SIDR_REQ_RECEIVED
message is not handled properly in cma_save_net_info() and we end up falling
into code that will try and process the request as ipv4/ipv6, which will end
up failing.

The resolution is to add a check for the SIDR_REQ and call cma_save_ib_info()
with a NULL path record.  Change cma_save_ib_info() to copy the src sib info 
from the listen_id when the path record is NULL.

Reported-by: Hari Shankar <Hari.Shankar@netapp.com>
Signed-off-by: Matt Finlay <matt@mellanox.com>
---
drivers/infiniband/core/cma.c | 32 +++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Hefty, Sean May 19, 2015, 5:06 p.m. UTC | #1
> Resent due to mailer issues

Next time, please put this comment under the '---', so that it doesn't end up in the patch description.

> Support for using UD and AF_IB is currently broken.  The
> IB_CM_SIDR_REQ_RECEIVED
> message is not handled properly in cma_save_net_info() and we end up
> falling
> into code that will try and process the request as ipv4/ipv6, which will
> end
> up failing.
> 
> The resolution is to add a check for the SIDR_REQ and call
> cma_save_ib_info()
> with a NULL path record.  Change cma_save_ib_info() to copy the src sib
> info
> from the listen_id when the path record is NULL.
> 
> Reported-by: Hari Shankar <Hari.Shankar@netapp.com>
> Signed-off-by: Matt Finlay <matt@mellanox.com>

Acked-by: Sean Hefty <sean.hefty@intel.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Or Gerlitz May 19, 2015, 6:23 p.m. UTC | #2
On Tue, May 19, 2015 at 8:06 PM, Hefty, Sean <sean.hefty@intel.com> wrote:
>> Resent due to mailer issues
>
> Next time, please put this comment under the '---', so that it doesn't end up in the patch description.

As long as Doug is OK to remove this manually before applying the
patch... Doug? if not, Matt, please re-send again.
--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Doug Ledford May 19, 2015, 6:29 p.m. UTC | #3
On Tue, 2015-05-19 at 21:23 +0300, Or Gerlitz wrote:
> On Tue, May 19, 2015 at 8:06 PM, Hefty, Sean <sean.hefty@intel.com> wrote:
> >> Resent due to mailer issues
> >
> > Next time, please put this comment under the '---', so that it doesn't end up in the patch description.
> 
> As long as Doug is OK to remove this manually before applying the
> patch... Doug? if not, Matt, please re-send again.

No, I don't need a resend for something little like that.  It takes more
time to grab the new patch and then copy over Sean's Acked-by: than it
does to remove that line from the commit message.
diff mbox

Patch

diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 06441a4..38ffe09 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -845,18 +845,26 @@  static void cma_save_ib_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id
 	listen_ib = (struct sockaddr_ib *) &listen_id->route.addr.src_addr;
 	ib = (struct sockaddr_ib *) &id->route.addr.src_addr;
 	ib->sib_family = listen_ib->sib_family;
-	ib->sib_pkey = path->pkey;
-	ib->sib_flowinfo = path->flow_label;
-	memcpy(&ib->sib_addr, &path->sgid, 16);
+	if (path) {
+		ib->sib_pkey = path->pkey;
+		ib->sib_flowinfo = path->flow_label;
+		memcpy(&ib->sib_addr, &path->sgid, 16);
+	} else {
+		ib->sib_pkey = listen_ib->sib_pkey;
+		ib->sib_flowinfo = listen_ib->sib_flowinfo;
+		ib->sib_addr = listen_ib->sib_addr;
+	}
 	ib->sib_sid = listen_ib->sib_sid;
 	ib->sib_sid_mask = cpu_to_be64(0xffffffffffffffffULL);
 	ib->sib_scope_id = listen_ib->sib_scope_id;
 
-	ib = (struct sockaddr_ib *) &id->route.addr.dst_addr;
-	ib->sib_family = listen_ib->sib_family;
-	ib->sib_pkey = path->pkey;
-	ib->sib_flowinfo = path->flow_label;
-	memcpy(&ib->sib_addr, &path->dgid, 16);
+	if (path) {
+		ib = (struct sockaddr_ib *) &id->route.addr.dst_addr;
+		ib->sib_family = listen_ib->sib_family;
+		ib->sib_pkey = path->pkey;
+		ib->sib_flowinfo = path->flow_label;
+		memcpy(&ib->sib_addr, &path->dgid, 16);
+	}
 }
 
 static __be16 ss_get_port(const struct sockaddr_storage *ss)
@@ -905,9 +913,11 @@  static int cma_save_net_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id
 {
 	struct cma_hdr *hdr;
 
-	if ((listen_id->route.addr.src_addr.ss_family == AF_IB) &&
-	    (ib_event->event == IB_CM_REQ_RECEIVED)) {
-		cma_save_ib_info(id, listen_id, ib_event->param.req_rcvd.primary_path);
+	if (listen_id->route.addr.src_addr.ss_family == AF_IB) {
+		if (ib_event->event == IB_CM_REQ_RECEIVED)
+			cma_save_ib_info(id, listen_id, ib_event->param.req_rcvd.primary_path);
+		else if (ib_event->event == IB_CM_SIDR_REQ_RECEIVED)
+			cma_save_ib_info(id, listen_id, NULL);
 		return 0;
 	}