This section presents an overview of the Remote NDIS requirements on the communication channel and lower-layer drivers that are used to communicate between the host and the Remote NDIS device. Device state transitions and major operations such as initialization, halt and reset are also described in this section.
The control channel must be reliable and ensure sequenced delivery. It is used for all communication except for the transmission of network data packets. All required control messages, except REMOTE_NDIS_HALT_MSG and REMOTE_NDIS_INDICATE_STATUS_MSG, are request and response exchanges initiated by the host. The device must respond within the time-out period as specified for each bus.
The data channel is used exclusively for the transmission of network data packets. It may consist of multiple subchannels (for example, for varying quality of service) as defined for the appropriate bus.
Initialization and Teardown
The control and data channels are initialized and set up as specified for the appropriate bus. The host sends a REMOTE_NDIS_INITIALIZE_MSG message to the Remote NDIS device. The Remote NDIS device provides information about its type (connectionless or connection-oriented), supported medium, and version in the response message REMOTE_NDIS_INITIALIZE_CMPLT.
Either the host or the Remote NDIS device can tear down the communication channel through the REMOTE_NDIS_HALT_MSG message. All outstanding requests and packets are discarded on receipt of this message.
Device State Definitions
Following bus-level initialization, the device is said to be in the RNDIS-uninitialized state. Upon receiving a REMOTE_NDIS_INITIALIZE_MSG and responding with a REMOTE_NDIS_INITIALIZE_CMPLT with a status of RNDIS_STATUS_SUCCESS, the device enters the RNDIS-initialized state.
Upon receiving REMOTE_NDIS_SET_MSG specifying a nonzero filter value for OID_GEN_CURRENT_PACKET_FILTER, the device enters the RNDIS-data-initialized state.
When in the state RNDIS-data-initialized, reception of a REMOTE_NDIS_SET_MSG specifying a zero filter value for OID_GEN_CURRENT_PACKET_FILTER forces the device back to the RNDIS-initialized state.
Reception of REMOTE_NDIS_HALT_MSG or a bus-level disconnect or hard-reset at any time forces the device to the RNDIS-uninitialized state.
At any time that the device is in the RNDIS-initialized or RNDIS-data-initialized state, the host computer may terminate the Remote NDIS functionality of the device by sending REMOTE_NDIS_HALT_MSG to the device.
Resetting the Communication Channel
The communication channel is reset when an error, such as message time-out, occurs. The host may initiate a reset at any time when the device is in the RNDIS-initialized state by sending the message REMOTE_NDIS_RESET_MSG to the device and the device must send a response message when it has completed the reset. For example, the host may initiate a reset when an error, such as a message time-out, has occurred.
Note that this is a soft reset in the sense that any handles (for example, VCs for connection-oriented devices) continue to be valid after the reset. The Remote NDIS device discards all outstanding requests and packets as part of the reset process. The remote device might reset some of its hardware components, but keeps the communication channel intact.
If the Remote NDIS device performs a reboot, this event is equivalent to "Remove" followed by "Add" Plug and Play events. The host NDIS miniport driver will be halted and removed, and a new instance will be added and started. All bus-level and Remote NDIS initialization will be re-executed. A Remote NDIS device may reboot itself in the event of a critical device failure.
The Remote NDIS device may need to exercise flow control to prevent the host from overflowing its data buffers with packets. Any flow control provisions or requirements are bus specific.
Numeric Byte Ordering
All numeric values in Remote NDIS messages must be coded in little-endian format (least significant byte first).
NDIS Message Encapsulation
There is no Remote NDIS specification for the way NDIS messages are encapsulated in native bus messages or primitives.