Anexando carimbos de data/hora a pacotes

Depois que o driver de miniporte relatar quais recursos de carimbo de data/hora estão presentes e habilitados no momento, o driver pode anexar os carimbos de data/hora relevantes aos pacotes usando a estrutura de NET_BUFFER_LIST (NBL).

Para obter mais informações sobre como relatar os recursos de carimbo de data/hora de hardware da NIC e os recursos de carimbo de data/hora de software do driver de miniporte para o sistema operacional, consulte Relatórios de recursos de carimbo de data/hora e configuração atual.

Carimbos de data/hora de hardware

Os PtpV2OverUdpIPv4EventMsgReceiveHwsinalizadores , PtpV2OverUdpIPv4AllMsgReceiveHw, PtpV2OverUdpIPv4EventMsgTransmitHw, PtpV2OverUdpIPv4AllMsgTransmitHw, PtpV2OverUdpIPv6EventMsgReceiveHw, PtpV2OverUdpIPv6AllMsgReceiveHwPtpV2OverUdpIPv6EventMsgTransmitHw, PtpV2OverUdpIPv6AllMsgTransmitHw, AllTransmitHwAllReceiveHwe TaggedTransmitHw na estrutura NDIS_TIMESTAMP_CAPABILITY_FLAGS indicam quais carimbos de data/hora de hardware o driver de miniporte dá suporte.

O carimbo de data/hora gerado pelo hardware NIC na recepção ou transmissão de um pacote é representado por um valor inteiro de 64 bits. Esse deve ser o valor bruto do relógio do hardware nic no ponto em que o carimbo de data/hora é capturado. O carimbo de data/hora é armazenado na matriz NetBufferListInfo da estrutura NBL.

Os drivers de miniport podem usar a estrutura NET_BUFFER_LIST_TIMESTAMP para definir o carimbo de data/hora no campo NetBufferListInfo da NBL. O driver preenche o campo Carimbo de data/hora da estrutura NET_BUFFER_LIST_TIMESTAMP com o carimbo de data/hora gerado pelo hardware e chama a função do utilitário NdisSetNblTimestampInfo , passando a estrutura.

Os drivers de miniport podem usar NdisGetNblTimestampInfo e NdisCopyNblTimestampInfo para recuperar e copiar carimbos de data/hora.

Se uma configuração de carimbo de data/hora de hardware específica estiver habilitada, mas um carimbo de data/hora que corresponda a essa funcionalidade não for gerado, o miniporto deverá definir o carimbo de data/hora que ele anexa à NBL como zero.

Observação

Ao reconhecer pacotes ptp versão 2 para gerar carimbos de data/hora de hardware, a implementação não deve restringir a geração de carimbo de data/hora a pacotes que usam os endereços multicast (IPv4 e IPv6) especificados pela especificação PTP. A implementação deve tentar reconhecer pacotes PTP de outras maneiras, por exemplo, usando o cabeçalho UDP ou o conteúdo PTP. Isso é tão que os carimbos de data/hora ainda são gerados em cenários em que uma implementação de PTP pode não usar os endereços multicast especificados na especificação PTP, por exemplo, em que endereços unicast são usados.

Receber carimbo de data/hora lateral

O hardware deve obter o carimbo de data/hora o mais próximo possível do ponto em que o hardware recebe o quadro do meio. Essa diretriz é especificada pelo padrão IEEE 1588.

Quando um pacote é recebido, o driver de miniporto deve:

  1. Corrija o carimbo de data/hora para quaisquer atrasos existentes entre quando o hardware capturou o carimbo de data/hora e quando o hardware realmente recebeu o quadro.

  2. Anexe o carimbo de data/hora gerado no hardware à NBL. O carimbo de data/hora corresponde ao quadro (estrutura NET_BUFFER ) contido na NBL.

  3. Chame NdisMIndicateReceiveNetBufferLists para indicar a NBL para NDIS.

Observe que, na direção de recebimento, os drivers de miniporto para hardware Ethernet são necessários para indicar apenas uma NET_BUFFER por NBL.

Transmitir carimbo de data/hora lateral

O hardware deve obter o carimbo de data/hora o mais próximo possível do ponto em que o hardware transmite o quadro para o meio. Essa diretriz é especificada pelo padrão IEEE 1588.

Quando um pacote é transmitido, o driver de miniporto deve:

  1. Corrija o carimbo de data/hora para quaisquer atrasos existentes entre quando o hardware capturou o carimbo de data/hora e quando o hardware realmente transmitiu o quadro.

  2. Anexe o carimbo de data/hora gerado no hardware à NBL. Se a NBL contiver várias NET_BUFFERs, o carimbo de data/hora de hardware correspondente ao primeiro NET_BUFFER na NBL deverá ser anexado à NBL.

  3. Chame NdisMSendNetBufferListsComplete para enviar a NBL completa para o NDIS.

Miniportes e hardware NIC que relatam que o TaggedTransmitHw sinalizador de funcionalidade tem suporte e atualmente habilitado devem marcar se o NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT sinalizador for definido no campo NblFlags de um NBL que é dado ao miniporto para transmissão. Se esse sinalizador estiver definido, isso indicará que um carimbo de data/hora de transmissão é necessário para esse NBL e um carimbo de data/hora de hardware de tempo de transmissão deve ser gerado para a NBL.

Carimbos de data/hora de software

Os AllReceiveSwsinalizadores e AllTransmitSwTaggedTransmitSw na estrutura NDIS_TIMESTAMP_CAPABILITY_FLAGS indicam se o miniporto dá suporte à geração de carimbos de data/hora de software.

Os carimbos de data/hora de software também são representados como valores inteiros de 64 bits e são armazenados no mesmo slot na matriz NetBufferListInfo da estrutura de NET_BUFFER (NBL) que os carimbos de data/hora de hardware.

Se os recursos de carimbo de data/hora de software estiverem presentes e habilitados, o driver de miniporte definirá o carimbo de data/hora na NBL usando o QPC (valor do contador de desempenho). O driver de miniporte deve:

  1. Chame KeQueryPerformanceCounter para obter o QPC.

  2. Preencha o campo Carimbo de data/hora da estrutura NET_BUFFER_LIST_TIMESTAMP com o QPC.

  3. Defina o carimbo de data/hora na NBL chamando NdisSetNblTimestampInfo e passando o NET_BUFFER_LIST_TIMESTAMP.

Ao receber, o driver de miniporto deve capturar o QPC o mais cedo possível, mas não antes de quando o pacote chegou.

Ao transmitir, o driver de miniporto deve capturar o QPC o mais tarde possível antes que o pacote seja dado ao hardware para transmissão.

O TaggedTransmitSw sinalizador é análogo ao TaggedTransmitHw sinalizador, mas corresponde aos carimbos de data/hora do software. Se a funcionalidade tiver suporte e habilitada, o miniporto deverá marcar o NDIS_NBL_FLAGS_CAPTURE_TIMESTAMP_ON_TRANSMIT sinalizador no campo NblFlags da NBL. Se esse sinalizador estiver definido, o miniporto deverá gerar um carimbo de data/hora do software de transmissão para a NBL.