Udostępnij przez


Ścieżka odbierania vmQ

Karta sieciowa wskazuje odebrany pakiet w kolejce tylko wtedy, gdy przejdzie wszystkie testy pól filtru dla filtru ustawionego w tej kolejce. Aby uzyskać więcej informacji na temat testów filtrów, zobacz operacje filtrowania VMQ.

Jeśli sterownik protokołu nadrzędnego ustawia flagę NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION w Flags elementu struktury NDIS_RECEIVE_QUEUE_PARAMETERS, sterownik miniportu nie może mieszać struktur NET_BUFFER_LIST dla innych kolejek odbierania ze strukturami NET_BUFFER_LIST dla tej kolejki w jednym wywołaniu funkcji NdisMIndicateReceiveNetBufferLists. Ponadto sterownik musi ustawić flagę NDIS_RECEIVE_FLAGS_SINGLE_QUEUE w parametrze ReceiveFlags funkcji NdisMIndicateReceiveNetBufferLists.

Jeśli NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION nie został ustawiony, sterowniki miniportu mogą łączyć struktury NET_BUFFER_LIST pochodzące z ramek z różnych kolejek maszyn wirtualnych i sygnalizować je jednym wywołaniem do NdisMIndicateReceiveNetBufferLists. W tym przypadku wskazana lista połączona struktur NET_BUFFER_LIST nie musi być posortowana według numeru kolejki. NET_BUFFER_LIST struktury dla różnych kolejek nie muszą być grupowane.

Gdy sterownik protokołu ustawia NDIS_RETURN_FLAGS_SINGLE_QUEUE i zwraca bufor odbioru, wszystkie struktury NET_BUFFER_LIST w parametrze NetBufferLists funkcji NdisReturnNetBufferLists muszą należeć do tej samej kolejki maszyny wirtualnej. Jednak sterowniki protokołów nie muszą zwracać wszystkich struktur NET_BUFFER_LIST, które zostały wskazane w jednym wywołaniu do funkcji ProtocolReceiveNetBufferLists, w jednym wywołaniu do NdisReturnNetBufferLists. Ponadto zwracana lista może zawierać struktury NET_BUFFER_LIST z wielu wskaźników odbioru, jeśli należą do tej samej kolejki maszyny wirtualnej.

Sterowniki protokołu ustawiają bit NDIS_RETURN_FLAGS_SINGLE_QUEUE na parametrze ReturnFlags funkcji NdisReturnNetBufferLists, aby wskazać, że wszystkie zwrócone struktury NET_BUFFER_LIST należą do tej samej kolejki maszyny wirtualnej.

Sygnały odbierane przez VMQ muszą zawierać następujące informacje poza pasmem (OOB) w składowej NetBufferListInfo struktur NET_BUFFER_LIST.

  • Określ identyfikator kolejki w informacjach NetBufferListFilteringInfo.

  • Ustaw identyfikator filtru na zero w informacji NetBufferListFilteringInfo.

Informacje NetBufferListFilteringInfo są określone w strukturze NDIS_NET_BUFFER_LIST_FILTERING_INFO. Aby uzyskać dostęp do struktury NDIS_NET_BUFFER_LIST_FILTERING_INFO w danych NET_BUFFER_LIST OOB, sterownik NDIS wywołuje makro NET_BUFFER_LIST_INFO i określa NetBufferListFilteringInfo typ informacji.

Aby uzyskać bezpośredni dostęp do identyfikatora filtru i identyfikatora kolejki, użyj makr NET_BUFFER_LIST_RECEIVE_FILTER_ID i NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Wskaźniki odbioru VMQ muszą definiować informacje o pamięci współdzielonej w członku SharedMemoryInfo struktury NET_BUFFER.

Uwaga Gdy VMQ zostanie usunięty (na przykład podczas migracji na żywo maszyny wirtualnej), sterownik miniportu może otrzymać NBL, który zawiera nieprawidłową wartość QueueId. W takim przypadku miniport powinien zignorować nieprawidłowy identyfikator kolejki i zamiast tego użyć wartości 0 (kolejki domyślnej). QueueId znajduje się w części NetBufferListFilteringInfo danych OOB NBL i jest pobierany przy użyciu makra NET_BUFFER_LIST_RECEIVE_QUEUE_ID.

Aby wskazać, że wskaźnik NET_BUFFER_SHARED_MEMORY w SharedMemoryInfo jest prawidłowy, sterownik miniportu musi ustawić flagę NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID w parametrze ReceiveFlags funkcji NdisMIndicateReceiveNetBufferLists. Aby uzyskać więcej informacji na temat układu buforów pamięci udostępnionej w buforach odbioru VMQ, zobacz pamięć udostępniona w buforach odbioru.

Wskazanie odbioru musi zawierać następujące informacje w strukturze NET_BUFFER_SHARED_MEMORY.

NextSharedMemorySegment
Wskaźnik do następnej struktury NET_BUFFER_SHARED_MEMORY w liście połączonej zakończonej wartością NULLtakich struktur.

SharedMemoryHandle
Uchwyt pamięci udostępnionej NDIS, który NdisAllocateSharedMemory zwrócił.

SharedMemoryOffset
Przesunięcie (w bajtach) na początek danych od początku buforu pamięci udostępnionej.

SharedMemoryLength
Długość w bajtach segmentu pamięci udostępnionej.

Jeśli nadrzędny sterownik protokołu ustawił flagę NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED w Flags członka struktury NDIS_RECEIVE_QUEUE_PARAMETERS, każdy NET_BUFFER obejmuje:

  • Dwa MDL i odpowiadające im struktury SharedMemoryInfo.

  • Bufor post-lookahead z miejscem na wypełnienie.

W razie potrzeby sterownik protokołu kopiuje zawartość buforu lookahead do obszaru wypełniania. Jednak miejsce na wypełnienie musi istnieć nawet wtedy, gdy pakiet znajduje się całkowicie w buforze lookahead.

Jeśli sterownik nadrzędny nie ustawi flagi NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED, każda struktura NET_BUFFER zawiera pojedynczy MDL i jedną strukturę SharedMemoryInfo.

Liczba bajtów i przesunięcie bajtów w języku MDL oraz DataLength i DataOffset składowych w strukturze NET_BUFFER_DATA są ustawiane w taki sam sposób, jak dla sterowników, które nie używają vmQ. Elementy SharedMemoryLength i SharedMemoryOffset w strukturze SharedMemoryInfo można ustawić tylko raz podczas inicjalizacji. Sterownik miniportu nie musi aktualizować elementów członkowskich SharedMemoryLength i SharedMemoryOffset dla każdego odebranego pakietu, ponieważ nadrzędne sterowniki i NDIS mogą używać elementu członkowskiego NET_BUFFERDataLength i liczby bajtów MDL w celu określenia rozpoczęcia i rozmiaru pakietu.

Uwaga Począwszy od NDIS 6.30 i Windows Server 2012, dzielenie danych pakietów na oddzielne bufory wstępne (lookahead buffers) nie jest już obsługiwane. Nadrzędny sterownik protokołu nie ustawi flagi NDIS_RECEIVE_QUEUE_PARAMETERS_LOOKAHEAD_SPLIT_REQUIRED.