windows - Sådan indstilles og forespørges multicast-adresse til NDIS Virtual miniport-driver?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne tilføje multicast support på virtuelle miniport driver. Jeg har en filterdriver binder over hver fysisk NIC. Som i Microsoft-dokument

https://msdn.microsoft.com/en-us/library/windows/hardware/ff569073(v=vs.85).aspx[14]


Jeg stirrede på at tilføje support multicast adresse:


Dette er mine trin:
I miniport driver:
i løbet af miniport initialization tilføjede jeg MaxMulticastListSize = 32 i NDIS\_MINIPORT\_ADAPTER\_GENERAL\_ATTRIBUTES.


NDIS\_MINIPORT\_ADAPTER\_GENERAL\_ATTRIBUTES MiniportAdapterGeneralAttributes;
MiniportAdapterGeneralAttributes.MediaType = NdisMedium802\_3;
MiniportAdapterGeneralAttributes.PhysicalMediumType = NdisPhysicalMediumUnspecified;
MiniportAdapterGeneralAttributes.MaxMulticastListSize = 32;


Jeg har også opdateret 32 ​​maksimal adresse i OID\_802\_3\_MAXIMUM\_LIST\_SIZE OID.
Næste opdaterede jeg PacketFilters i


MiniportAdapterGeneralAttributes.SupportedPacketFilters =    NDIS\_PACKET\_TYPE\_DIRECTED |
        NDIS\_PACKET\_TYPE\_MULTICAST |
        NDIS\_PACKET\_TYPE\_BROADCAST |
        NDIS\_PACKET\_TYPE\_PROMISCUOUS |
        NDIS\_PACKET\_TYPE\_ALL\_MULTICAST;


Under OID\_GEN\_CURRENT\_PACKET\_FILTER OID-sæt anmodning, jeg opdaterede PacketFilters med DATA.SET\_INFORMATION.InformationBuffer værdi.


og under OID\_GEN\_MAC\_OPTION tilføjer jeg makroer: NDIS\_MAC\_OPTION\_NO\_LOOPBACK | NDIS\_MAC\_OPTION\_FULL\_DUPLEX | NDIS\_MAC\_OPTION\_8021P\_PRIORITY ;


Næste i OID\_802\_3\_MULTICAST\_LIST OID-sæt anmodning opretholdt jeg en multicast-liste


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);


Jeg testede med NDISTester. Den har en protokolldriver, der vil binde til miniportadapteren. Men jeg fik ikke en multicast-pakke i løbet af modtagelsestiden. Enhver ting mangler? Jeg får fejl som received less than expected percentage of sent. Eventuelle forslag?

Bedste reference


Jeg tror, ​​du skal levere en handler til OID\_802\_3\_MAXIMUM\_LIST\_SIZE.