Compartir a través de


Recepción de datos de red

En la ilustración siguiente se muestra una operación de recepción básica, que implica un controlador de miniporte, NDIS y un controlador de protocolo.

Diagrama que ilustra una operación básica de recepción de red.

Los controladores de miniportar llaman a la función NdisMIndicateReceiveNetBufferLists para indicar NET_BUFFER estructuras a controladores de nivel superior. Normalmente, cada estructura de NET_BUFFER debe adjuntarse a una estructura NET_BUFFER_LIST independiente. Esto permite a los controladores de protocolo crear un subconjunto de la lista original de estructuras de NET_BUFFER_LIST y reenviarlos a distintos clientes. Algunos controladores, por ejemplo, controladores de minipuerto IEEE 802.11 nativos, pueden asociar más de una estructura NET_BUFFER a una estructura de NET_BUFFER_LIST.

Después de vincular todas las estructuras de NET_BUFFER_LIST, un controlador de minipuerto pasa un puntero a la primera estructura NET_BUFFER_LIST de la lista a la función NdisMIndicateReceiveNetBufferLists . NDIS examina las estructuras de NET_BUFFER_LIST y llama a la función ProtocolReceiveNetBufferLists de cada controlador de protocolo asociado a las estructuras de NET_BUFFER_LIST. NDIS pasa un subconjunto de la lista que incluye solo las estructuras de NET_BUFFER_LIST asociadas al enlace correcto a cada controlador de protocolo. NDIS coincide con el valor NetBufferListFrameType especificado en la estructura NET_BUFFER_LIST con el tipo de marco que registra cada controlador de protocolo.

Si se establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags que se pasa a la función ProtocolReceiveNetBufferLists del controlador de protocolo, NDIS recupera la propiedad de las estructuras de NET_BUFFER_LIST inmediatamente después de que se devuelva la llamada ProtocolReceiveNetBufferLists .

Nota Si se establece la marca NDIS_RECEIVE_FLAGS_RESOURCES, el controlador de protocolo debe conservar el conjunto original de estructuras de NET_BUFFER_LIST en la lista vinculada. Por ejemplo, cuando se establece esta marca, el controlador podría procesar las estructuras e indicarles la pila de uno en uno, pero antes de que la función devuelva, debe restaurar la lista vinculada original.

Si no se establece la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags que se pasa a la función ProtocolReceiveNetBufferLists del controlador de protocolo, el controlador de protocolo puede conservar la propiedad de las estructuras de NET_BUFFER_LIST. En este caso, el controlador de protocolo debe devolver las estructuras de NET_BUFFER_LIST mediante una llamada a la función NdisReturnNetBufferLists .

Si un controlador de minipuerto se está ejecutando poco en los recursos de recepción, puede establecer la marca NDIS_RECEIVE_FLAGS_RESOURCES en el parámetro ReceiveFlags de la llamada a NdisMIndicateReceiveNetBufferLists. En ese caso, el controlador puede reclamar la propiedad de todas las estructuras NET_BUFFER_LIST indicadas y las estructuras de NET_BUFFER incrustadas tan pronto como NdisMIndicateReceiveNetBufferLists devuelve. Indicar NET_BUFFER estructuras con el conjunto de marcas NDIS_RECEIVE_FLAGS_RESOURCES obliga a los controladores de protocolo a copiar los datos y, por tanto, deben evitarse. Un controlador de minipuerto debe detectar cuándo está a punto de salir de los recursos de recepción y realizar los pasos necesarios para evitar esta situación.

NDIS llama a la función MiniportReturnNetBufferLists del controlador de miniporte después de que el controlador de protocolo llame a NdisReturnNetBufferLists.

Nota Si un controlador de minipuerto indica una estructura NET_BUFFER_LIST con la marca NDIS_RECEIVE_FLAGS_RESOURCES establecida, eso no significa que NDIS indique la estructura NET_BUFFER_LIST al controlador de protocolo con el mismo estado. Por ejemplo, NDIS podría copiar una estructura de NET_BUFFER_LIST con la marca NDIS_RECEIVE_FLAGS_RESOURCES establecida e indicar la copia en el controlador de protocolo con la marca desactivada.

NDIS puede devolver NET_BUFFER_LIST estructuras al controlador de minipuerto en cualquier orden arbitrario y en cualquier combinación. Es decir, la lista vinculada de NET_BUFFER_LIST estructuras devueltas a un controlador de miniporte mediante una llamada a su función MiniportReturnNetBufferLists , puede tener estructuras NET_BUFFER_LIST de diferentes llamadas anteriores a NdisMIndicateReceiveNetBufferLists.

Los controladores de miniport deben establecer el miembro SourceHandle en las estructuras de NET_BUFFER_LIST en el MiniportAdapterHandle que NDIS proporcionó al controlador de minipuerto en la función MiniportInitializeEx . Los controladores de filtro deben establecer el miembro SourceHandle de cada estructura de NET_BUFFER_LIST que el controlador de filtro originó en el NdisFilterHandle del filtro que NDIS proporcionó al controlador de filtro en la función FilterAttach . Los controladores de filtro no deben modificar el miembro SourceHandle en ninguna estructura de NET_BUFFER_LIST que no se originó en el controlador de filtro.

Los controladores intermedios también establecen el miembro SourceHandle en la estructura NET_BUFFER_LIST en el valor MiniportAdapterHandle que NDIS proporcionó al controlador intermedio en la función MiniportInitializeEx . Si un controlador intermedio reenvía una indicación de recepción, el controlador debe guardar el valor SourceHandle proporcionado por el controlador subyacente antes de escribir en el miembro SourceHandle . Cuando NDIS devuelve una estructura de NET_BUFFER_LIST reenviada al controlador intermedio, el controlador intermedio debe restaurar el SourceHandle que guardó.