[ofw] [PATCHv2] ND Provider: fix service ID byte ordering

Fab Tillier ftillier at microsoft.com
Tue Feb 15 15:26:27 PST 2011


Galina caught an issue and reported it to me offlist: the ND provider itself needs some tweaks for this to work, because the connector logic was passing the port number down to the kernel drivers in host order.  Additionally, the listen path was not swapping the SID to network order.

In this patch, I added helper routines in ib_types.h to format and decode a RDMA_CM service ID, and use those helper routines throughout the ND provider for consistency.

Signed-off-by: Fab Tillier <ftillier at microsoft.com>

Index: ulp/nd/user/NdConnector.cpp
===================================================================
--- ulp/nd/user/NdConnector.cpp	(revision 3095)
+++ ulp/nd/user/NdConnector.cpp	(working copy)
@@ -306,7 +306,7 @@ HRESULT CConnector::Connect(
     {
         m_LocalPort = LocalPort;
     }
-    ioctl.pdata.src_port = _byteswap_ushort( m_LocalPort );
+    ioctl.pdata.src_port = m_LocalPort;
 
     // Resolve the GIDs.
    HRESULT hr = IBAT::Resolve(
Index: ulp/nd/user/NdListen.cpp
===================================================================
--- ulp/nd/user/NdListen.cpp	(revision 3095)
+++ ulp/nd/user/NdListen.cpp	(working copy)
@@ -187,8 +187,7 @@ HRESULT GetPdataForActive(
         ual_cep_listen_ioctl_t listen;
         listen.cid = 0;
 
-        listen.cep_listen.svc_id = 
-            0x0000000001000000 | Protocol << 16 | Port;
+        listen.cep_listen.svc_id = ib_cm_rdma_sid( Protocol, Port );
 
         listen.cep_listen.port_guid = m_pParent->m_PortGuid;
 
@@ -244,7 +243,9 @@ HRESULT GetPdataForActive(
         ND_PRINT( TRACE_LEVEL_INFORMATION, ND_DBG_NDI,
             ("Created listen CEP with cid %d \n", m_cid ) );
 
-        // TODO: Come up with something better for port number.
+        //
+        // The following port calculation must match what is done in the kernel.
+        //
         if( Port == 0 )
             Port = (USHORT)m_cid | (USHORT)(m_cid >> 16);
 
Index: core/al/kernel/al_cm_cep.c
===================================================================
--- core/al/kernel/al_cm_cep.c	(revision 3095)
+++ core/al/kernel/al_cm_cep.c	(working copy)
@@ -3390,7 +3390,7 @@ __cep_queue_mad(
 	// TODO: Remove - manage above core kernel CM code
 	/* NDI connection request case */
 	if ( p_cep->state == CEP_STATE_LISTEN &&
-		(p_cep->sid & ~0x0ffffffI64) == IB_REQ_CM_RDMA_SID_PREFIX )
+		(p_cep->sid & IB_REQ_CM_RDMA_SID_PREFIX_MASK) == IB_REQ_CM_RDMA_SID_PREFIX )
 	{ /* Try to complete pending IRP, if any */
 		mad_cm_req_t* p_req = (mad_cm_req_t*)ib_get_mad_buf( p_mad );
 		ib_cm_rdma_req_t *p_rdma_req = (ib_cm_rdma_req_t *)p_req->pdata;
@@ -3401,7 +3401,7 @@ __cep_queue_mad(
 			 (p_rdma_req->ipv != 0x40 && p_rdma_req->ipv != 0x60) )
 		{
 			AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, 
-				("NDI connection req is rejected: maj_min_ver %d, ipv %#x \n", 
+				("RDMA CM connection req is rejected: maj_min_ver %d, ipv %#x \n", 
 				p_rdma_req->maj_min_ver, p_rdma_req->ipv ) );
 			return IB_UNSUPPORTED;
 		}
Index: core/al/kernel/al_ndi_cm.c
===================================================================
--- core/al/kernel/al_ndi_cm.c	(revision 3095)
+++ core/al/kernel/al_ndi_cm.c	(working copy)
@@ -1061,6 +1061,7 @@ nd_cm_handler(
 	AL_EXIT( AL_DBG_NDI );
 }
 
+
 static void
 __ndi_fill_cm_req(
 	IN		net32_t								qpn,
@@ -1072,7 +1073,7 @@ __ndi_fill_cm_req(
 
 	memset( p_cm_req, 0, sizeof(*p_cm_req) );
 
-	p_cm_req->service_id = IB_REQ_CM_RDMA_SID_PREFIX | (p_req->prot << 16) | p_req->dst_port;
+	p_cm_req->service_id = ib_cm_rdma_sid( p_req->prot, p_req->dst_port );
 	p_cm_req->p_primary_path = p_path_rec;
 
 	p_cm_req->qpn = qpn;
@@ -1922,9 +1923,12 @@ ndi_listen_cm(
 	p_csq->state = NDI_CM_LISTEN;
 	__ndi_release_lock( &p_csq->csq, irql );
 
-	if( (p_listen->svc_id & 0xFFFF) == 0 )
+	if( ib_cm_rdma_sid_port( p_listen->svc_id ) == 0 )
 	{
-		p_listen->svc_id |= (USHORT)cid | (USHORT)(cid >> 16);
+		p_listen->svc_id = ib_cm_rdma_sid(
+			ib_cm_rdma_sid_protocol( p_listen->svc_id ),
+			(USHORT)cid | (USHORT)(cid >> 16)
+			);
 	}
 
 	ib_status = al_cep_listen( h_al, cid, p_listen );
Index: inc/iba/ib_types.h
===================================================================
--- inc/iba/ib_types.h	(revision 3095)
+++ inc/iba/ib_types.h	(working copy)
@@ -12472,10 +12472,34 @@ typedef struct _ib_time_stamp {
 *	ib_cc_mad_t
 *********/
 
-#define IB_REQ_CM_RDMA_SID_PREFIX			0x0000000001000000
+#define IB_REQ_CM_RDMA_SID_PREFIX			CL_NTOH64( 0x0000000001000000I64 )
+#define IB_REQ_CM_RDMA_SID_PREFIX_MASK		CL_NTOH64( 0xFFFFFFFFFF000000I64 )
 #define IB_REQ_CM_RDMA_PDATA_SIZE			56
 #define IB_REQ_CM_RDMA_MAJOR_VERSION		0
 #define IB_REQ_CM_RDMA_MINOR_VERSION		0
+
+AL_INLINE net64_t AL_API
+ib_cm_rdma_sid(
+	IN				uint8_t						protocol,
+	IN				net16_t						port )
+{
+	return IB_REQ_CM_RDMA_SID_PREFIX | ((UINT64)protocol) << 40 | ((UINT64)port) << 48;
+}
+
+AL_INLINE net16_t AL_API
+ib_cm_rdma_sid_port(
+	IN				net64_t						sid )
+{
+	return (net16_t)(sid >> 48);
+}
+
+AL_INLINE uint8_t AL_API
+ib_cm_rdma_sid_protocol(
+	IN				net64_t						sid )
+{
+	return (uint8_t)(sid >> 40);
+}
+
 
 
 /****s* Access Layer/ib_cm_rep_t
Index: inc/iba/ib_al_ioctl.h
===================================================================
--- inc/iba/ib_al_ioctl.h	(revision 3095)
+++ inc/iba/ib_al_ioctl.h	(working copy)
@@ -3479,7 +3479,7 @@ typedef struct _ual_ndi_req_cm_ioctl_in
 	uint64_t					h_qp;
 	net64_t						guid;
 	net32_t						cid;
-	uint16_t					dst_port;
+	net16_t						dst_port;
 	uint8_t						resp_res;
 	uint8_t						init_depth;
 	uint8_t						prot;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nd_sid.2.patch
Type: application/octet-stream
Size: 5216 bytes
Desc: nd_sid.2.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20110215/a9085203/attachment.obj>


More information about the ofw mailing list