Compartilhar via


MINIPORT_SEND_NET_BUFFER_LISTS função de retorno de chamada (ndis.h)

O NDIS chama a função MiniportSendNetBufferLists para transmitir dados de rede contidos em uma lista vinculada de estruturas de NET_BUFFER_LIST .

Nota Você deve declarar a função usando o tipo MINIPORT_SEND_NET_BUFFER_LISTS . Para obter mais informações, consulte a seção Exemplos a seguir.
 

Sintaxe

MINIPORT_SEND_NET_BUFFER_LISTS MiniportSendNetBufferLists;

void MiniportSendNetBufferLists(
  [in] NDIS_HANDLE MiniportAdapterContext,
  [in] PNET_BUFFER_LIST NetBufferList,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG SendFlags
)
{...}

Parâmetros

[in] MiniportAdapterContext

Um identificador para uma área de contexto que o driver de miniporto alocou em sua função MiniportInitializeEx . O driver de miniporta usa essa área de contexto para manter informações de estado sobre um adaptador.

[in] NetBufferList

Um ponteiro para a primeira estrutura NET_BUFFER_LIST em uma lista vinculada de estruturas de NET_BUFFER_LIST. Cada estrutura NET_BUFFER_LIST na lista descreve uma lista de estruturas NET_BUFFER . Cada estrutura NET_BUFFER na lista é mapeada para uma cadeia de MDLs. Os MDLs contêm os dados de rede.

[in] PortNumber

Um número de porta que identifica uma porta de adaptador de miniporta. Para atribuir um número de porta do adaptador de miniporta, chame a função NdisMAllocatePort . Um valor zero identifica a porta padrão de um adaptador de miniporta.

[in] SendFlags

Sinalizadores que definem atributos para a operação de envio. Os sinalizadores podem ser combinados com uma operação OR. Para limpar todos os sinalizadores, defina esse membro como zero. Essa função dá suporte aos seguintes sinalizadores:

NDIS_SEND_FLAGS_DISPATCH_LEVEL

Especifica que o IRQL atual está DISPATCH_LEVEL. Para obter mais informações sobre esse sinalizador, consulte Dispatch IRQL Tracking.

NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK

Especifica que o NDIS deve marcar para loopback. Por padrão, o NDIS não executa um loop de dados para o driver que enviou a solicitação de envio. Um driver de sobreposição pode substituir esse comportamento definindo esse sinalizador. Quando esse sinalizador é definido, o NDIS identifica todas as estruturas de NET_BUFFER que contêm dados que correspondem aos critérios de recebimento para a associação. O NDIS indica NET_BUFFER estruturas que correspondem aos critérios com o driver de sobreposição. Esse sinalizador não afeta a verificação de loopback ou loopback em outras associações.

Retornar valor

Nenhum

Comentários

MiniportSendNetBufferLists é uma função necessária para drivers de miniport. Quando um driver de sobreposição chama a função NdisSendNetBufferLists , o NDIS chama a função MiniportSendNetBufferLists do driver de miniporto associado.

Ao transmitir os dados de rede que o NDIS passa no parâmetro NetBufferLists , o driver de miniporto deve usar as seguintes diretrizes:

  1. A ordem das estruturas de NET_BUFFER em cada estrutura NET_BUFFER_LIST deve ser preservada.
  2. A ordem das estruturas de NET_BUFFER_LIST deverá ser preservada se elas forem transmitidas na mesma conexão.
  3. Se as estruturas NET_BUFFER_LIST forem transmitidas em conexões diferentes, elas poderão ser divididas em várias filas de transmissão se os recursos a seguir estiverem em uso. Nesse caso, a ordem das estruturas de NET_BUFFER_LIST para cada conexão deve ser preservada.
    • RSS (receive side scaling) (O valor de hash RSS na estrutura NET_BUFFER_LIST pode ser usado como um índice na tabela de indireção RSS.)
    • VMQ (Fila de Máquina Virtual) (O identificador de fila da fila de saída é definido nas informações do OOB NetBufferListFilteringInfo . Para obter mais informações, consulte Caminho de transmissão VMQ.)
    • DCB (Ponte de Data Center) do IEEE 802.1 (você pode desativar a TC (Classe de Tráfego).
    • IEEE 802.1p (você pode desativar marcas de 802,1p sem DCB.)

Os drivers de miniport aceitam todas as solicitações de envio que o NDIS faz chamando a função MiniportSendNetBufferLists . Se um driver de miniporta não puder concluir uma solicitação de envio imediatamente, o driver deverá manter a solicitação em uma fila até que possa concluir a solicitação. Enquanto uma solicitação de envio está pendente, o driver de miniporto retém a propriedade das estruturas de NET_BUFFER_LIST e todos os recursos alocados pelo protocolo associados às estruturas de NET_BUFFER_LIST.

O driver de miniporta deve chamar o Função NdisMSendNetBufferListsComplete para concluir as solicitações de envio para todas as estruturas NET_BUFFER_LIST. Para melhorar o desempenho do sistema, o driver pode criar uma lista vinculada que contém as estruturas de NET_BUFFER_LIST de várias solicitações de envio. O driver pode passar essa lista vinculada em uma única chamada para NdisMSendNetBufferListsComplete.NET_BUFFER_LIST estruturas e outros recursos associados devem ser tratados como inacessíveis pelo driver de miniport assim que o driver chamar NdisMSendNetBufferListsComplete.

A função MiniportSendNetBufferLists deve sincronizar o acesso às suas filas internas de dados de rede com outras funções MiniportXxx do driver que acessam as mesmas filas. Um driver de miniporta pode usar bloqueios de rotação para sincronizar o acesso às filas.

Os drivers de protocolo são responsáveis por determinar quais dados de rede são necessários, com base no tipo médio selecionado pelo driver de miniporto associado. No entanto, um driver de protocolo pode fornecer dados de rede que especificam pacotes menores que o tamanho mínimo do pacote para o meio selecionado. Nesse caso, MiniportSendNetBufferLists deverá preencher os pacotes com zeros se a mídia selecionada impor um requisito de comprimento mínimo no tamanho do pacote de transmissão.

Se o driver de miniporta definir o sinalizador NDIS_MAC_OPTION_NO_LOOPBACK quando o NDIS consultou o OID_GEN_MAC_OPTIONS OID, o driver de miniporto não deverá tentar executar um loop de volta em nenhum dado de rede. O NDIS fornece suporte de loopback de software para esse driver.

O NDIS chama MiniportSendNetBufferLists em IRQL<= DISPATCH_LEVEL.

Exemplos

Para definir uma função MiniportSendNetBufferLists , primeiro você deve fornecer uma declaração de função que identifique o tipo de função que você está definindo. O Windows fornece um conjunto de tipos de função para drivers. Declarar uma função usando os tipos de função ajuda a Análise de Código para Drivers, SDV ( Verificador de Driver Estático ) e outras ferramentas de verificação a encontrar erros e é um requisito para escrever drivers para o sistema operacional Windows.

Por exemplo, para definir uma função MiniportSendNetBufferLists chamada "MySendNetBufferLists", use o tipo MINIPORT_SEND_NET_BUFFER_LISTS conforme mostrado neste exemplo de código:

MINIPORT_SEND_NET_BUFFER_LISTS MySendNetBufferLists;

Em seguida, implemente sua função da seguinte maneira:

_Use_decl_annotations_
VOID
 MySendNetBufferLists(
    NDIS_HANDLE  MiniportAdapterContext,
    PNET_BUFFER_LIST  NetBufferList,
    NDIS_PORT_NUMBER  PortNumber,
    ULONG  SendFlags
    )
  {...}

O tipo de função MINIPORT_SEND_NET_BUFFER_LISTS é definido no arquivo de cabeçalho Ndis.h. Para identificar erros com mais precisão ao executar as ferramentas de análise de código, adicione a anotação Use_decl_annotations à sua definição de função. A anotação Use_decl_annotations garante que as anotações aplicadas ao tipo de função MINIPORT_SEND_NET_BUFFER_LISTS no arquivo de cabeçalho sejam usadas. Para obter mais informações sobre os requisitos para declarações de função, consulte Declarando funções usando tipos de função de função para drivers NDIS.

Para obter informações sobre Use_decl_annotations, consulte Anotando o comportamento da função.

Requisitos

Requisito Valor
Cliente mínimo com suporte Com suporte no NDIS 6.0 e posterior.
Plataforma de Destino Windows
Cabeçalho ndis.h (inclua Ndis.h)
IRQL <= DISPATCH_LEVEL
Regras de conformidade da DDI NdisTimedDataHang, NdisTimedDataSend

Confira também

MiniportInitializeEx

NET_BUFFER

NET_BUFFER_LIST

NdisMAllocatePort

NdisMSendNetBufferListsComplete

NdisSendNetBufferLists

OID_GEN_MAC_OPTIONS