3.2.5.4.2 URB Completion Message

The structure and fields of the URB_COMPLETION message are specified in section 2.2.7.2.

After receiving the URB_COMPLETION message, the server MUST use the RequestId specified in the URB_COMPLETION message to find the associated information stored after sending the TRANSFER_IN_REQUEST message from the list of pending URB requests; that information is stored in the CTsUrbResult, TsUrbResult, HResult, OutputBufferSize, and OutputBuffer fields of the URB_COMPLETION message. With this information, the server completes the original request. The server MUST redirect the result contained in the URB_COMPLETION message to the actual application that made the Transfer In operation request.

The server expects one and only one URB_COMPLETION message for each TRANSFER_IN_REQUEST message it sends to the client, if the URB_COMPLETION message contains output data. If the server receives more than one URB_COMPLETION message for a TRANSFER_IN_REQUEST message, the server SHOULD terminate the dynamic virtual channel.

If the server receives an URB_COMPLETION message with an invalid RequestId, the server SHOULD terminate the dynamic virtual channel.

If the OutputBufferSize field in the URB_COMPLETION message is greater than the OutputBufferSize field in the corresponding TRANSFER_IN_REQUEST message, the server SHOULD terminate the dynamic virtual channel.