VM Kuyruğu Ayırma

İlk yapılandırma parametreleri kümesine sahip bir kuyruk ayırmak için, üst sürücü OID_RECEIVE_FILTER_ALLOCATE_QUEUE yöntemi bir OID isteği gönderir. NDIS_OID_REQUEST yapısının InformationBuffer üyesi başlangıçta bir NDIS_RECEIVE_QUEUE_PARAMETERS yapısının işaretçisini içerir. Başarılı bir OID yöntemi isteği dönüşünden sonra, NDIS_OID_REQUEST yapısının InformationBuffer üyesi, yeni bir kuyruk tanımlayıcısı ve bir MSI-X tablo girişi içeren bir NDIS_RECEIVE_QUEUE_PARAMETERS yapısına işaret eden bir işaretçi içerir.

NDIS_RECEIVE_QUEUE_PARAMETERS yapısı OID_RECEIVE_FILTER_ALLOCATE_QUEUE OID ve OID_RECEIVE_FILTER_QUEUE_PARAMETERS OID'de kullanılır. VM kuyruğu parametreleri hakkında daha fazla bilgi için bkz. VM Kuyruğu Parametrelerini Alma ve Güncelleştirme.

Aşırı yükleyen sürücü , NDIS_RECEIVE_QUEUE_PARAMETERS yapısını aşağıdaki kuyruk yapılandırma parametreleriyle başlatır:

  • Kuyruk türü (NDIS_RECEIVE_QUEUE_TYPE numaralandırmasından NdisReceiveQueueTypeVMQueue.)

  • Kuyruğun işlemci ilişkilendirmesi.

  • Kuyruk adı ve sanal makine adı.

  • İleriye-bakış bölme parametreleri.

    Not NDIS 6.30'dan başlayarak paket verilerini ayrı lookahead arabelleklerine bölme artık desteklenmemektedir.

Not Üstteki sürücü, NDIS_RECEIVE_QUEUE_PARAMETERS yapısının Flags üyesinde NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION ve NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED bayrağını ayarlayabilir. Diğer bayraklar kuyruk ayırma için kullanılmaz.

OID isteği NDIS'e bir alma kuyruğu ayırmak için geldiğinde, kuyruk parametrelerini doğrular. NDIS gerekli kaynakları ve kuyruk tanımlayıcısını ayırdıktan sonra OID isteğini temel alınan miniport sürücüsüne gönderir. Kuyruk tanımlayıcısı, ilişkili ağ bağdaştırıcısı için benzersizdir.

Miniport sürücüsü alma kuyruğu için gerekli yazılım ve donanım kaynaklarını başarıyla ayırabiliyorsa, OID isteğini başarı durumuyla tamamlar.

NDIS, OID isteğini miniport sürücüsüne göndermeden önce, NDIS NDIS_RECEIVE_QUEUE_PARAMETERS yapısının QueueId üyesinde bir kuyruk tanımlayıcısı atar ve yöntem isteğini miniport sürücüsüne geçirir. Miniport sürücüsü , MSIXTableEntry üyesinde MSI-X tablo girdisini sağlar.

Miniport sürücüsünün, ayrılan alma kuyrukları için kuyruk tanımlayıcılarını tutması gerekir. NDIS, alma kuyruğunda bir alma filtresi ayarlamak, alma kuyruğu parametrelerini değiştirmek veya alma kuyruğunun serbest olması için miniport sürücüsüne yapılan sonraki çağrılar için bir alma kuyruğunun kuyruk tanımlayıcısını kullanır.

Not Varsayılan kuyruk (kuyruk tanımlayıcısı sıfır) her zaman ayrılmıştır ve serbest bırakılamaz.

Aşırı yükleyen sürücü, örneğin kuyruk parametrelerini değiştirmek veya kuyruğu boşaltmak için NDIS'nin sonraki OID isteklerinde sağladığı kuyruk tanımlayıcısını kullanmalıdır. Kuyruk tanımlayıcısı, kuyrukla ilişkilendirilmiş tüm NET_BUFFER_LIST yapılardaki OOB verilerine de eklenir. Sürücüler NET_BUFFER_LIST yapısındaki kuyruk tanımlayıcısını almak için NET_BUFFER_LIST_RECEIVE_QUEUE_ID makrosunu kullanır.

Not Protokol sürücüsü, bir kuyruğu başarıyla ayırdıktan sonra ve kuyruk silinmeden önce VMQ filtrelerini herhangi bir zamanda ayarlayabilir.

Protokol sürücüsü, kuyruk ayırmayı tamamlamak için bir OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE yöntemi OID isteği gönderir. Miniport sürücüsü, ayırma tamamlandığında paylaşılan belleği ve diğer kaynakları ayırabilir. Paylaşılan bellek kaynaklarını ayırma hakkında daha fazla bilgi için bkz. Paylaşılan Bellek Kaynağı Ayırma.

Bir miniport sürücüsü bir OID_RECEIVE_FILTER_QUEUE_ALLOCATION OID isteği alıp başarıyla işledikten sonra kuyruk Ayrılmış durumda olur. Kuyruk durumları hakkında daha fazla bilgi için bkz. Kuyruk Durumları ve İşlemler.

Üst sürücü bir veya daha fazla alma kuyruğu ayırdıktan (ve isteğe bağlı olarak ilk filtreleri ayarladıktan) sonra, geçerli alma kuyrukları ayırmasının tamamlandığını miniport sürücüsüne bildirmek üzere OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE ayarlı OID istekleri vermelidir.

Alma kuyruğunda ayarlanmış herhangi bir filtre yoksa, miniport sürücüsü bu kuyruğa hiçbir paketi almamalıdır. Bir kuyrukta hiç filtre ayarlanmamışsa veya tüm filtreler temizlenmişse, kuyruk boş olmalı ve tüm paketler atılmalıdır. Diğer bir ifadeyle, sürücü yığınında gösterilmez veya kuyrukta tutulmaz.

Üst katman sürücüler, ayırdıkları kuyrukları serbest bırakmak için OID_RECEIVE_FILTER_FREE_QUEUE OID kullanır. Kuyrukları boşaltma hakkında daha fazla bilgi için bkz. VM Kuyruğu boşaltma.