[IBAL] Fix UAL_NDI_NOOP handling
authorleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 12 Aug 2008 08:23:29 +0000 (08:23 +0000)
committerleonidk <leonidk@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Tue, 12 Aug 2008 08:23:29 +0000 (08:23 +0000)
The NOOP IOCTL allows the ND provider to complete requests asynchronously when a synchronous operation completes in user-land.  This is used for memory registration and deregistration, as well as for connection establishment when ARP resolution is in progress (IBAT returns E_PENDING) in the NetworkDirect provider.  In the latter case, the expectation is that the IOCTL will complete asynchronously with STATUS_TIMEOUT.  However the code processes the IOCTL synchronously, so the IOCTL fails with an immediate error rather than an asynchronous error.

This patch completes the IRP so that it's completion will be reported asynchronously.

Signed-off-by: Fab Tillier <ftillier@microsoft.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@1479 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

core/al/kernel/al_proxy_ndi.c

index 9cf8444..3da4dbb 100644 (file)
@@ -614,10 +614,15 @@ ndi_ioctl(
                cl_status = __ndi_dreq_cm( p_context, h_ioctl, p_ret_bytes );\r
                break;\r
     case UAL_NDI_NOOP:\r
+        IoMarkIrpPending( h_ioctl );\r
         if( cl_ioctl_in_size( h_ioctl ) != 0 )\r
-            cl_status = STATUS_TIMEOUT;\r
+            h_ioctl->IoStatus.Status = STATUS_TIMEOUT;\r
         else\r
-            cl_status = CL_SUCCESS;\r
+            h_ioctl->IoStatus.Status = CL_SUCCESS;\r
+        h_ioctl->IoStatus.Information = 0;\r
+\r
+        IoCompleteRequest( h_ioctl, IO_NETWORK_INCREMENT );\r
+        cl_status = CL_PENDING;\r
         break;\r
        default:\r
                cl_status = CL_INVALID_PARAMETER;\r