[ofw] [PATCH] Remove ATS dependency from ND proxy

Fab Tillier ftillier at windows.microsoft.com
Tue Jul 8 16:23:57 PDT 2008


This patch removes ATS queries from the ND proxy, with the anticipation that all address translation will be done by the caller (via the IBAT library).

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

diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\al\kernel\al_ndi_cm.c trunk\core\al\kernel\al_ndi_cm.c
--- old\core\al\kernel\al_ndi_cm.c      Tue Jul 08 16:16:13 2008
+++ trunk\core\al\kernel\al_ndi_cm.c    Tue Jul 08 16:20:42 2008
@@ -103,7 +103,6 @@ static char * State2String(ndi_cm_state_
        switch (state)
        {
                case NDI_CM_IDLE                                        : return "NDI_CM_IDLE";
-               case NDI_CM_CONNECTING_ATS_SENT         : return "NDI_CM_CONNECTING_ATS_SENT";
                case NDI_CM_CONNECTING_QPR_SENT         : return "NDI_CM_CONNECTING_QPR_SENT";
                case NDI_CM_CONNECTING_REQ_SENT         : return "NDI_CM_CONNECTING_REQ_SENT";
                case NDI_CM_CONNECTING_REP_SENT         : return "NDI_CM_CONNECTING_REP_SENT";
@@ -280,10 +279,6 @@ static NTSTATUS __ndi_insert_irp_ex(
        AL_ENTER( AL_DBG_NDI );
        switch( (ULONG_PTR)Context )
        {
-       case NDI_CM_CONNECTING_ATS_SENT:
-               status = __ndi_ats_query( pIrp );
-               break;
-
        case NDI_CM_CONNECTING_QPR_SENT:
                status = __ndi_pr_query( pIrp );
                break;
@@ -424,10 +419,10 @@ static VOID __ndi_complete_cancelled_irp
        {
        case UAL_NDI_REQ_CM:
                __ndi_acquire_lock( Csq, &irql );
-                               /*
+               /*
                 * Note that al_cancel_sa_req is synchronized with any potential
                 * SA callback by the CSQ lock.
-                                */
+                */
 #pragma warning( disable:4305 )
                h_query = InterlockedExchangePointer( &h_qp->p_irp_queue->h_query, NULL );
 #pragma warning( default:4305 )
@@ -536,7 +531,7 @@ ndi_qp_destroy(
                        __ndi_complete_cancelled_irp( &h_qp->p_irp_queue->csq, Irp );
                }
                while( Irp = IoCsqRemoveNextIrp(
-            &h_qp->p_irp_queue->csq, (VOID*)(ULONG_PTR)UAL_NDI_NOTIFY_DREQ ) )
+                       &h_qp->p_irp_queue->csq, (VOID*)(ULONG_PTR)UAL_NDI_NOTIFY_DREQ ) )
                {
                        AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_NDI,
                                ("h_qp %#I64x, uhdl %#I64x, ref_cnt %d\n",
@@ -901,13 +896,13 @@ __ndi_cm_handler(
                                        cid, h_al, h_qp, new_cid ) );
                                __ndi_proc_drep( h_qp );
                                break;
-
+
                        case CM_RTU_ATTR_ID:
                                AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_NDI,
                                        ("RTU received for CEP with cid %d, h_al %p, context %p, new_cid %d.\n",
                                        cid, h_al, h_qp, new_cid ) );
                                break;
-
+
                        default:
                                AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
                                        ("Unhandled MAD attr ID %d for CEP with cid %d, h_al %p, context %p, new_cid %d .\n",
@@ -985,7 +980,7 @@ __ndi_send_req(

        AL_ENTER( AL_DBG_NDI );

-    p_irp->Tail.Overlay.DriverContext[1] = NULL;
+       p_irp->Tail.Overlay.DriverContext[1] = NULL;

        if( h_qp->p_irp_queue->state != NDI_CM_CONNECTING_QPR_SENT )
        {
@@ -1107,9 +1102,9 @@ __ndi_pr_query_cb(
                        case IB_MAD_STATUS_BUSY:
                        case IB_SA_MAD_STATUS_NO_RESOURCES:
                                status = STATUS_TIMEOUT;
-                       break;
+                               break;

-               default:
+                       default:
                                status = STATUS_INVALID_PARAMETER_1 +
                                        (p_query_rec->p_result_mad->p_mad_buf->status & 0xFF);
                                break;
@@ -1185,12 +1180,12 @@ __ndi_pr_query(

        AL_ENTER( AL_DBG_NDI );

-       if ( h_qp->p_irp_queue->state != NDI_CM_CONNECTING_ATS_SENT )
+       if ( h_qp->p_irp_queue->state != NDI_CM_IDLE )
        {
                AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
                        ("STATUS_CONNECTION_ACTIVE: h_qp %#I64x, uhdl %#I64x, ref_cnt %d\n",
                        (uint64_t)h_qp, h_qp->obj.hdl, h_qp->obj.ref_cnt ) );
-               return STATUS_CONNECTION_ABORTED;
+               return STATUS_CONNECTION_ACTIVE;
        }

        query_req.query_type = IB_QUERY_PATH_REC_BY_GIDS;
@@ -1221,199 +1216,29 @@ __ndi_pr_query(
 }


-static void AL_API
-__ndi_ats_query_cb(
-       IN                              ib_query_rec_t                          *p_query_rec )
-{
-       cl_ioctl_handle_t p_irp;
-       ib_service_record_t *service_record;
-       ib_qp_handle_t h_qp = (ib_qp_handle_t)p_query_rec->query_context;
-       ual_ndi_req_cm_ioctl_in_t *p_req;
-       KIRQL irql;
-       NTSTATUS status;
-
-       AL_ENTER( AL_DBG_NDI );
-
-       AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
-               ("status is %d, count is %d, context %p\n", p_query_rec->status,
-               p_query_rec->result_cnt, p_query_rec->query_context) );
-
-       p_irp = IoCsqRemoveNextIrp( &h_qp->p_irp_queue->csq, (VOID*)(ULONG_PTR)UAL_NDI_REQ_CM );
-       if( p_irp == NULL )
-       {
-               goto exit;
-       }
-
-#pragma warning( disable:4305 )
-       InterlockedExchangePointer( &h_qp->p_irp_queue->h_query, NULL );
-#pragma warning( default:4305 )
-
-       if( p_query_rec->status != IB_SUCCESS || !p_query_rec->result_cnt )
-       {
-               __ndi_acquire_lock( &h_qp->p_irp_queue->csq, &irql );
-               if( h_qp->p_irp_queue->state != NDI_CM_INVALID )
-                       h_qp->p_irp_queue->state = NDI_CM_IDLE;
-               __ndi_release_lock( &h_qp->p_irp_queue->csq, irql );
-
-               if( p_query_rec->status == IB_TIMEOUT )
-               {
-                       __ndi_complete_irp( h_qp, p_irp, STATUS_TIMEOUT );
-               }
-               else
-               {
-                       __ndi_complete_irp( h_qp, p_irp, STATUS_HOST_UNREACHABLE );
-               }
-
-               goto exit;              /* ATS request failed */
-       }
-
-       /* send Path Request */
-       service_record = ib_get_query_svc_rec( p_query_rec->p_result_mad, 0 );
-       p_req = (ual_ndi_req_cm_ioctl_in_t*)cl_ioctl_in_buf( p_irp );
-       p_req->gids.src_gid.unicast.prefix = service_record->service_gid.unicast.prefix;
-       p_req->gids.src_gid.unicast.interface_id = p_req->guid;
-       p_req->gids.dest_gid = service_record->service_gid;
-       status = IoCsqInsertIrpEx(
-               &h_qp->p_irp_queue->csq,
-               p_irp,
-               NULL,
-               (VOID*)(ULONG_PTR)NDI_CM_CONNECTING_QPR_SENT
-               );
-       if( status != STATUS_SUCCESS )
-       {
-               __ndi_complete_irp( h_qp, p_irp, status );
-       }
-       else
-       {
-               /*
-                * Release the previous reference because IoCsqInsertIrpEx
-                * took a new one.
-                */
-               deref_al_obj( &h_qp->obj ); /* Release IRP reference. */
-       }
-
-exit:
-       if( p_query_rec->p_result_mad )
-               ib_put_mad( p_query_rec->p_result_mad );
-
-       deref_al_obj( &h_qp->obj );     /* release ATS query reference */
-       AL_EXIT( AL_DBG_NDI );
-}
-
-/*
- * Send asynchronous query to the SA for an ATS record.
- *
- * Called from the __ndi_insert_irp_ex function, so the CSQ lock is held.
- */
-NTSTATUS
-__ndi_ats_query(
-       IN              IRP*                                                            p_irp
-       )
-{
-       ib_user_query_t user_query;
-       ib_service_record_t service_record;
-       ib_query_req_t query_req;
-       ib_api_status_t status;
-       ual_ndi_req_cm_ioctl_in_t *p_req =
-               (ual_ndi_req_cm_ioctl_in_t*)cl_ioctl_in_buf( p_irp );
-       ib_qp_handle_t h_qp = (ib_qp_handle_t)p_irp->Tail.Overlay.DriverContext[0];
-
-       AL_ENTER( AL_DBG_NDI );
-
-       if ( h_qp->p_irp_queue->state != NDI_CM_IDLE )
-       {
-               AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,
-                       ("STATUS_CONNECTION_ACTIVE: h_qp %#I64x, uhdl %#I64x, ref_cnt %d\n",
-                       (uint64_t)h_qp, h_qp->obj.hdl, h_qp->obj.ref_cnt ) );
-               return STATUS_CONNECTION_ACTIVE;
-       }
-
-       query_req.query_type = IB_QUERY_USER_DEFINED;
-       query_req.p_query_input = &user_query;
-       query_req.port_guid = p_req->guid;
-       query_req.timeout_ms = g_sa_timeout;
-       query_req.retry_cnt = g_sa_retries;
-       query_req.flags = 0;    /* IB_FLAGS_SYNC */
-       query_req.query_context = h_qp;
-       query_req.pfn_query_cb = __ndi_ats_query_cb;
-
-       /* TODO: which method one is correct? */
-       user_query.method = IB_MAD_METHOD_GETTABLE;
-       //user_query.method = IB_MAD_METHOD_GET;
-       user_query.attr_id = IB_MAD_ATTR_SERVICE_RECORD;
-       user_query.attr_size = sizeof(ib_service_record_t);
-       user_query.comp_mask =
-               IB_SR_COMPMASK_SPKEY |
-               IB_SR_COMPMASK_SLEASE |
-               IB_SR_COMPMASK_SNAME |
-               IB_SR_COMPMASK_SDATA8_12 |
-               IB_SR_COMPMASK_SDATA8_13 | IB_SR_COMPMASK_SDATA8_14 | IB_SR_COMPMASK_SDATA8_15;
-
-       user_query.p_attr = &service_record;
-
-       memset( &service_record, 0, sizeof(service_record) );
-       service_record.service_pkey = cl_hton16( IB_DEFAULT_PKEY );
-       service_record.service_data8[12] = (uint8_t) (p_req->pdata.dst_ip_addr[3] >> 0);
-       service_record.service_data8[13] = (uint8_t) (p_req->pdata.dst_ip_addr[3] >> 8);
-       service_record.service_data8[14] = (uint8_t) (p_req->pdata.dst_ip_addr[3] >> 16);
-       service_record.service_data8[15] = (uint8_t) (p_req->pdata.dst_ip_addr[3] >> 24);
-       service_record.service_lease = 0xFFFFFFFF;
-       strcpy( (void*)service_record.service_name, ATS_NAME );
-
-       AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_NDI,
-               ("ATS:: MAD: method %#x, attr_id %#hx, Service: comp_mask %#I64x, IP %d.%d.%d.%d \n",
-               user_query.method,
-               CL_NTOH16(user_query.attr_id),
-               user_query.comp_mask,
-               service_record.service_data8[12],
-               service_record.service_data8[13],
-               service_record.service_data8[14],
-               service_record.service_data8[15]
-               ) );
-
-       AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_NDI,
-               ("h_qp %#I64x, uhdl %#I64x, ref_cnt %d\n",
-               (uint64_t)h_qp, h_qp->obj.hdl, h_qp->obj.ref_cnt ) );
-
-       ref_al_obj( &h_qp->obj );               /* take ATS query reference */
-
-       /* query SA */
-       status = ib_query( qp_get_al( h_qp ), &query_req, &h_qp->p_irp_queue->h_query );
-       if( status != IB_SUCCESS )
-       {
-               AL_PRINT_EXIT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, ("ib_query failed (%d)\n", status) );
-               deref_al_obj( &h_qp->obj );     /* release ATS query reference */
-               return STATUS_UNSUCCESSFUL;
-       }
-
-       AL_EXIT( AL_DBG_NDI );
-       return STATUS_SUCCESS;
-}
-
-
 NTSTATUS
 ndi_req_cm(
        IN              ib_qp_handle_t  const                           h_qp,
-       IN              IRP                                                     *p_irp
+       IN              IRP                                                                     *p_irp
        )
 {
-       NTSTATUS nt_status;
+       NTSTATUS status;

        AL_ENTER( AL_DBG_NDI );

        p_irp->Tail.Overlay.DriverContext[0] = (ib_qp_t*)h_qp;

-       nt_status = IoCsqInsertIrpEx(
+       status = IoCsqInsertIrpEx(
                &h_qp->p_irp_queue->csq,
                p_irp,
                NULL,
-               (VOID*)(ULONG_PTR)NDI_CM_CONNECTING_ATS_SENT
+               (VOID*)(ULONG_PTR)NDI_CM_CONNECTING_QPR_SENT
                );
-       if( nt_status == STATUS_SUCCESS )
-               nt_status = STATUS_PENDING;
+       if( status == STATUS_SUCCESS )
+               status = STATUS_PENDING;

        AL_EXIT( AL_DBG_NDI );
-       return nt_status;
+       return status;
 }


diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\al\kernel\al_ndi_cm.h trunk\core\al\kernel\al_ndi_cm.h
--- old\core\al\kernel\al_ndi_cm.h      Tue Jul 08 16:16:13 2008
+++ trunk\core\al\kernel\al_ndi_cm.h    Tue Jul 08 16:20:42 2008
@@ -64,7 +64,6 @@
 typedef enum _ndi_cm_state
 {
        NDI_CM_IDLE,
-       NDI_CM_CONNECTING_ATS_SENT, // ATS = Address Translation Service
        NDI_CM_CONNECTING_QPR_SENT, // QPR = Query path record
        NDI_CM_CONNECTING_REQ_SENT,
        NDI_CM_CONNECTING_REP_SENT,
diff -up -r -X trunk\docs\dontdiff.txt -I \$Id: old\core\al\kernel\al_proxy_ndi.c trunk\core\al\kernel\al_proxy_ndi.c
--- old\core\al\kernel\al_proxy_ndi.c   Tue Jul 08 16:16:13 2008
+++ trunk\core\al\kernel\al_proxy_ndi.c Tue Jul 08 16:20:42 2008
@@ -349,7 +349,7 @@ __ndi_req_cm(
                cl_status = CL_INVALID_PARAMETER;
                goto err;
        }
-
+
        /* perform the ioctl */
        cl_status = ndi_req_cm( h_qp, h_ioctl );

-------------- next part --------------
A non-text attachment was scrubbed...
Name: nd_no_ats.patch
Type: application/octet-stream
Size: 10601 bytes
Desc: nd_no_ats.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20080708/1f4be82b/attachment.obj>


More information about the ofw mailing list