VMQ Alım Yolu

Ağ bağdaştırıcısı, kuyrukta alınan paketi yalnızca kuyrukta ayarlanmış bir filtre için tüm filtre alanı testlerini geçtiğinde gösterir. Filtre testleri hakkında daha fazla bilgi için bkz. VMQ Filtre İşlemleri.

Overlying protokol sürücüsü NDIS_RECEIVE_QUEUE_PARAMETERS yapısının Bayraklar üyesinde NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION bayrağını ayarlamışsa, miniport sürücüsü bu kuyruğun NET_BUFFER_LIST yapıları ile diğer alma kuyrukları için NET_BUFFER_LIST yapılarını NdisMIndicateReceiveNetBufferLists fonksiyonuna tek bir çağrıda karıştırmamalıdır. Ayrıca, sürücünün NdisMIndicateReceiveNetBufferLists işlevinin ReceiveFlags parametresinde NDIS_RECEIVE_FLAGS_SINGLE_QUEUE bayrağını ayarlaması gerekir.

NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION ayarlanmadıysa, miniport sürücüleri farklı VM kuyruklarındaki çerçeveler için NET_BUFFER_LIST yapılarını birleştirip, bunları NdisMIndicateReceiveNetBufferListsfonksiyonuna tek bir çağrıda iletebilir. Bu durumda, belirtilen bağlı NET_BUFFER_LIST yapı listesinin kuyruk numarasına göre sıralanması gerekmez. Farklı kuyrukların NET_BUFFER_LIST yapılarının birlikte gruplanması gerekmez.

Protokol sürücüsü NDIS_RETURN_FLAGS_SINGLE_QUEUE ayarlayıp alma arabellekleri döndürdüğünde, NdisReturnNetBufferLists işlevinin NetBufferLists parametresindeki tüm NET_BUFFER_LIST yapıları aynı VM kuyruğuna ait olmalıdır. Ancak, protokol sürücülerinin, tek bir çağrıda ProtocolReceiveNetBufferLists işlevinde belirtilen tüm NET_BUFFER_LIST yapılarını, tek bir çağrıda NdisReturnNetBufferLists'e döndürmesi gerekmez. Ayrıca, aynı VM kuyruğuna ait olması durumunda, döndürülen liste birden çok alma belirtiminden NET_BUFFER_LIST yapıları içerebilir.

Protokol sürücüleri, döndürülen tüm NET_BUFFER_LIST yapılarının aynı VM kuyruğuna ait olduğunu belirtmek için NdisReturnNetBufferListsReturnFlags parametresinde NDIS_RETURN_FLAGS_SINGLE_QUEUE biti ayarlar.

VMQ alma göstergeleri, NET_BUFFER_LIST yapılarının NetBufferListInfo üyesine aşağıdaki bant dışı (OOB) bilgilerini içermelidir.

  • NetBufferListFilteringInfo bilgisinde kuyruk tanımlayıcısını belirtin.

  • NetBufferListFilteringInfo bilgilerindeki filtre tanımlayıcısını sıfır olarak ayarlayın.

NetBufferListFilteringInfo bilgileri bir NDIS_NET_BUFFER_LIST_FILTERING_INFO yapısında belirtilir. NET_BUFFER_LIST OOB verilerindeki NDIS_NET_BUFFER_LIST_FILTERING_INFO yapısına erişmek için, NDIS sürücüsü NET_BUFFER_LIST_INFO makrosunu çağırır ve NetBufferListFilteringInfo bilgi türünü belirtir.

Filtre tanımlayıcısına ve kuyruk tanımlayıcısına doğrudan erişmek için NET_BUFFER_LIST_RECEIVE_FILTER_ID ve NET_BUFFER_LIST_RECEIVE_QUEUE_ID makrolarını kullanın.

VMQ alma göstergelerinin, NET_BUFFER yapısının SharedMemoryInfo üyesinde paylaşılan bellek bilgilerini tanımlaması gerekir.

Not Bir VMQ silindiğinde (örneğin, VM dinamik geçişi sırasında), miniport sürücüsünün geçersiz bir QueueId değeri içeren bir NBL alması mümkündür. Böyle bir durumda, miniport geçersiz kuyruk kimliğini yoksaymalı ve bunun yerine 0 (varsayılan kuyruk) kullanmalıdır. QueueId NBL'nin OOB verilerinin NetBufferListFilteringInfo bölümünde bulunur ve NET_BUFFER_LIST_RECEIVE_QUEUE_ID makro kullanılarak alınır.

NET_BUFFER_SHARED_MEMORY işaretçisinin SharedMemoryInfo üzerinde geçerli olduğunu belirtmek için, miniport sürücüsü, NdisMIndicateReceiveNetBufferLists işlevinin ReceiveFlags parametresine NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID bayrağını ayarlamalıdır. VMQ alma arabelleklerindeki paylaşılan bellek arabelleklerinin düzeni hakkında daha fazla bilgi için bkz. Alma Arabelleklerindeki Paylaşılan Bellek.

Alma göstergesi, NET_BUFFER_SHARED_MEMORY yapısında aşağıdaki bilgileri içermelidir.

NextSharedMemorySegment
Bir sonraki NET_BUFFER_SHARED_MEMORY yapısına işaret eden ve NULLile sonlandırılan böyle yapıların bağlı listesindeki işaretçi.

Paylaşılan Bellek Tutacağı
NdisAllocateSharedMemorybir NDIS paylaşılan bellek tanıtıcısı döndürüldü.

SharedMemoryOffset
Paylaşılan bellek arabelleğinin başından verilerin başlangıcına bayt cinsinden uzaklık.

Paylaşımlı Bellek Uzunluğu
Paylaşılan bellek kesiminin bayt cinsinden uzunluğu.

Üst düzey protokol sürücüsü, NDIS_RECEIVE_QUEUE_PARAMETERS yapısının üyesi Bayraklar'da NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED bayrağını ayarladıysa, her NET_BUFFER şunları içerir:

  • İki MDL ve karşılık gelen SharedMemoryInfo yapıları.

  • Geri doldurma alanı olan bir son bakış arabelleği.

Gerekirse, protokol sürücüsü önbellek arabelleğinin içeriğini geri doldurma alanına kopyalar. Ancak paket tamamen lookahead arabelleğinde olsa bile geri doldurma alanı bulunmalıdır.

Üstteki sürücü NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED bayrağını ayarlamazsa, her NET_BUFFER yapısı tek bir MDL ve tek bir SharedMemoryInfo yapısı içerir.

MDL'deki bayt sayısı ve bayt uzaklığı ile NET_BUFFER_DATA yapısındaki DataLength ve DataOffset üyeleri, VMQ kullanmayan sürücüler için ayarlandığı şekilde ayarlanır. SharedMemoryInfo yapısındaki SharedMemoryLength ve SharedMemoryOffset üyeleri başlatma sırasında bir kez ayarlanabilir. Miniport sürücüsünün, alınan her pakette SharedMemoryLength ve SharedMemoryOffset üyelerini güncellemesi zorunlu değildir, çünkü üst sürücüler ve NDIS, paketin başlangıcını ve boyutunu belirlemek için NET_BUFFERDataLength üyesini ve MDL bayt sayısını kullanabilir.

Not NDIS 6.30 ve Windows Server 2012'den başlayarak paket verilerini ayrı lookahead arabelleklerine bölme artık desteklenmemektedir. Üstteki protokol sürücüsü, NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED bayrağını ayarlamaz.