Introdução aos anéis de rede
Visão geral do NET_RING
Um NET_RING é um buffer circular de dados de rede que é compartilhado entre o NetAdapterCx e um driver cliente. Cada fila de pacotes em um driver de cliente tem dois anéis: um anel de pacote para descritores de pacote principal e um anel de fragmento para os descritores de fragmento de cada pacote.
Para obter mais informações sobre descritores de pacote, consulte Descritores e extensões de pacote.
Cada descritor de núcleo no anel de pacote tem índices no anel de fragmento para localizar os descritores de fragmento desse pacote. Outra estrutura de dados, a NET_RING_COLLECTION, agrupa o anel de pacote e o anel de fragmento para uma determinada fila de pacotes, conforme mostrado no diagrama a seguir.
Cada fila de pacotes tem sua própria estrutura NET_RING_COLLECTION e, consequentemente, seu próprio anel de pacotes, anel de fragmento e descritores nesses anéis. Portanto, a operação de transferência de dados de rede de cada fila de pacotes é completamente independente. Para saber mais sobre filas de pacotes, consulte Transmitir e receber filas.
Propriedade do elemento NET_RING
Cada elemento em um NET_RING pertence ao driver cliente ou ao NetAdapterCx. A propriedade é controlada por três índices, que marcam seções do NET_RING. Esses índices são descritas na tabela a seguir. O ato de mover esses índices é descrito pela semântica de pós e drenagem.
Nome do índice NET_RING | Descrição | Necessário para transferir dados de rede | Modificação de |
---|---|---|---|
BeginIndex | O início do intervalo de elementos no NET_RING que o driver do cliente NIC possui. BeginIndex também é o início da subseção de drenagem do NET_RING. Quando BeginIndex é incrementado, o driver drena os elementos do anel e transfere a propriedade deles para o sistema operacional. | Yes | Driver do cliente NIC |
NextIndex | O início da subseção de lançamento do NET_RING. O NextIndex divide a seção do anel que o driver do cliente possui nas subseções de lançamento e drenagem. Quando o NextIndex é incrementado, o driver lança os buffers no hardware e transfere os buffers para a seção de drenagem do anel. | Não | Driver do cliente NIC |
EndIndex | O fim do intervalo de elementos no NET_RING que o driver do cliente NIC possui. Os drivers de cliente possuem elementos até EndIndex - 1, inclusive. | Yes | NetAdapterCx |
A manipulação desses índices durante o retorno de chamada EvtPacketQueueAdvance de uma fila de pacotes é a maneira como os drivers de cliente transferem dados de rede entre o sistema e o hardware da placa de adaptador de rede (NIC).
Os drivers de cliente possuem todos os elementos de BeginIndex a EndIndex - 1, inclusive. Por exemplo, se BeginIndex for 2 e EndIndex for 5, o driver cliente possuirá três elementos: os elementos com valores de índice 2, 3 e 4.
Se BeginIndex for igual a EndIndex, o driver de cliente não possuirá nenhum elemento.
O NetAdapterCx lança elementos no buffer de anel incrementando EndIndex. Um driver de cliente drena os buffers e retorna a propriedade dos elementos avançando BeginIndex.
O NextIndex é opcional para uso de drivers de cliente e é fornecido para conveniência na separação das subseções de lançamento e drenagem da seção do driver de cliente do anel.
Os elementos com valores de índice entre NextIndex e EndIndex - 1, inclusive, pertencem ao cliente, mas ainda não foram lançados no hardware. Se NextIndex for igual a BeginIndex, o driver de cliente não terá nenhum buffer concluído para transferir para o sistema operacional. Se NextIndex for igual a EndIndex, o driver de cliente não terá nenhum buffer para lançar no hardware.
Como o anel líquido é circular, os valores de índice envolvem o final do buffer e voltam ao início. O NetAdapterCx manipula automaticamente encapsulando os valores de índice ao redor do anel quando o driver do cliente chama o método apropriado.
Para obter informações específicas sobre como gerenciar os elementos em anéis de rede, consulte Gerenciamento de elementos de anéis de rede.
Enviar e receber dados de rede com anéis de rede
Consulte os tópicos a seguir para obter mais informações e exemplos de código sobre como enviar e receber dados de rede em anéis de rede.