public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] IB/cma: Resolve AF_IB UDP support
@ 2015-05-18 22:14 Matthew Finlay
       [not found] ` <AMSPR05MB4552E08900C6BCAC4FC106CA9C40-Vl31pUvGNwHn4lDZKhRW0Wu6+pknBqLbXA4E9RH9d+qIuWR1G4zioA@public.gmane.org>
  0 siblings, 1 reply; 3+ messages in thread
From: Matthew Finlay @ 2015-05-18 22:14 UTC (permalink / raw)
  To: Doug Ledford,
	Hefty, Sean (sean.hefty-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org)
  Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org

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-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org>
Signed-off-by: Matt Finlay <matt-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
---
drivers/infiniband/core/cma.c | 32 +++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)

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;
 	}
 


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

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* RE: [PATCH] IB/cma: Resolve AF_IB UDP support
       [not found] ` <AMSPR05MB4552E08900C6BCAC4FC106CA9C40-Vl31pUvGNwHn4lDZKhRW0Wu6+pknBqLbXA4E9RH9d+qIuWR1G4zioA@public.gmane.org>
@ 2015-05-19  0:24   ` Hefty, Sean
       [not found]     ` <1828884A29C6694DAF28B7E6B8A82373A8FDCBAC-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  0 siblings, 1 reply; 3+ messages in thread
From: Hefty, Sean @ 2015-05-19  0:24 UTC (permalink / raw)
  To: Matthew Finlay, Doug Ledford
  Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org

The patch format went wonky.

> -----Original Message-----
> From: Matthew Finlay [mailto:Matt-goXnUAHYgFxWk0Htik3J/w@public.gmane.org]
> Sent: Monday, May 18, 2015 3:14 PM
> To: Doug Ledford; Hefty, Sean
> Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> Subject: [PATCH] IB/cma: Resolve AF_IB UDP support
> 
> 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-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org>
> Signed-off-by: Matt Finlay <matt-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
> ---
> drivers/infiniband/core/cma.c | 32 +++++++++++++++++++++-----------
> 1 file changed, 21 insertions(+), 11 deletions(-)
> 
> 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;
>  }
> 
> 
> 

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] IB/cma: Resolve AF_IB UDP support
       [not found]     ` <1828884A29C6694DAF28B7E6B8A82373A8FDCBAC-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2015-05-19  1:18       ` Matthew Finlay
  0 siblings, 0 replies; 3+ messages in thread
From: Matthew Finlay @ 2015-05-19  1:18 UTC (permalink / raw)
  To: Hefty, Sean, Doug Ledford
  Cc: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org

>The patch format went wonky.

Sorry, I thought I had all of the kinks worked out.  Ill resolve and
resubmit.

Thanks,
-matt


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-05-19  1:18 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-18 22:14 [PATCH] IB/cma: Resolve AF_IB UDP support Matthew Finlay
     [not found] ` <AMSPR05MB4552E08900C6BCAC4FC106CA9C40-Vl31pUvGNwHn4lDZKhRW0Wu6+pknBqLbXA4E9RH9d+qIuWR1G4zioA@public.gmane.org>
2015-05-19  0:24   ` Hefty, Sean
     [not found]     ` <1828884A29C6694DAF28B7E6B8A82373A8FDCBAC-P5GAC/sN6hkd3b2yrw5b5LfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-05-19  1:18       ` Matthew Finlay

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox