【问题标题】:How to set and query multicast address for NDIS Virtual miniport driver?如何设置和查询 NDIS 虚拟微型端口驱动程序的多播地址?
【发布时间】:2017-08-18 06:47:43
【问题描述】:

我想在虚拟微型端口驱动程序上添加多播支持。我有一个过滤器驱动程序绑定在每个物理 NIC 上。根据微软文档
https://msdn.microsoft.com/en-us/library/windows/hardware/ff569073(v=vs.85).aspx

我盯着添加支持组播地址:

这些是我的步骤: 在微型端口驱动程序中: 在miniport initialization 期间,我在NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES 中添加了MaxMulticastListSize = 32

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

我还在 OID_802_3_MAXIMUM_LIST_SIZE OID 中更新了 32 个最大地址。 接下来我在

中更新了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 设置请求期间,我用DATA.SET_INFORMATION.InformationBuffer 值更新了PacketFilters。

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 的错误。有什么建议 ?

【问题讨论】:

    标签: windows filter wdk ndis miniport


    【解决方案1】:

    我认为您需要为 OID_802_3_MAXIMUM_LIST_SIZE 提供处理程序。

    【讨论】:

    • 这应该是评论,而不是答案。
    猜你喜欢
    • 2015-05-14
    • 2012-04-25
    • 1970-01-01
    • 2017-03-31
    • 2020-03-27
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多