Как задать и запросить адрес многоадресной рассылки для драйвера NDIS Virtual miniport?

Я хочу добавить поддержку многоадресной рассылки для виртуального драйвера Miniport. У меня есть драйвер фильтра для каждой физической карты. Согласно документу Microsoft
https://msdn.microsoft.com/en-us/library/windows/hardware/ff569073(v=vs.85).aspx

Я смотрел, чтобы добавить поддержку многоадресного адреса:

Вот мои шаги: В драйвере минипорта: во время miniport initialization я добавил MaxMulticastListSize = 32 в NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES,

NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES MiniportAdapterGeneralAttributes;
MiniportAdapterGeneralAttributes.MediaType = NdisMedium802_3;
MiniportAdapterGeneralAttributes.PhysicalMediumType = NdisPhysicalMediumUnspecified;
MiniportAdapterGeneralAttributes.MaxMulticastListSize = 32;

также я обновил 32 максимальных адреса в OID_802_3_MAXIMUM_LIST_SIZE OID . Далее я обновил PacketFilters в

MiniportAdapterGeneralAttributes.SupportedPacketFilters =    NDIS_PACKET_TYPE_DIRECTED |
        NDIS_PACKET_TYPE_MULTICAST |
        NDIS_PACKET_TYPE_BROADCAST |
        NDIS_PACKET_TYPE_PROMISCUOUS |
        NDIS_PACKET_TYPE_ALL_MULTICAST;

В течение OID_GEN_CURRENT_PACKET_FILTER OID установил запрос, я обновил PacketFilters DATA.SET_INFORMATION.InformationBuffer значение.

и во время OID_GEN_MAC_OPTION я добавляю макросы: NDIS_MAC_OPTION_NO_LOOPBACK | NDIS_MAC_OPTION_FULL_DUPLEX | NDIS_MAC_OPTION_8021P_PRIORITY ;

Затем в OID_802_3_MULTICAST_LIST запросе набора OID я поддерживал многоадресный список

OidRequest->DATA.SET_INFORMATION.BytesNeeded = 6;
OidRequest->DATA.SET_INFORMATION.BytesRead = OidRequest->DATA.SET_INFORMATION.InformationBufferLength;

do
{

  //check multicast address invalid
  if(OidRequest->DATA.SET_INFORMATION.InformationBufferLength % 6){
   OidRequest->DATA.SET_INFORMATION.BytesRead = 0;
   status = NDIS_STATUS_INVALID_LENGTH;
   break;
   }

   //check multicast address list full
  if(OidRequest->DATA.SET_INFORMATION.InformationBufferLength > (VELAN_MAX_MCAST_LIST * 6)){
  status = NDIS_STATUS_MULTICAST_FULL;
  OidRequest->DATA.SET_INFORMATION.BytesNeeded = VELAN_MAX_MCAST_LIST * 6;
  break;
  }

 //setting new multicast address list
 NdisZeroMemory(m_ulMcList,VELAN_MAX_MCAST_LIST * MUX_MAC_ADDRESS);
 NdisMoveMemory(m_ulMcList,OidRequest->DATA.SET_INFORMATION.InformationBuffer,OidRequest->DATA.SET_INFORMATION.InformationBufferLength);
 m_ulMclistSize = OidRequest->DATA.SET_INFORMATION.InformationBufferLength / 6;
 status = NDIS_STATUS_SUCCESS;

}while(FALSE);

Я тестировал с NDISTester . Он имеет драйвер протокола, который будет привязан к адаптеру минипорта. Но я не получил многоадресный пакет во время приема. Любая вещь отсутствует? Я получаю ошибку как received less than expected percentage of sent, Какие-либо предложения?

1 ответ

Решение

Я думаю, что вам нужно предоставить обработчик для OID_802_3_MAXIMUM_LIST_SIZE,

Другие вопросы по тегам