Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ostrzeżenie
Niektóre informacje w tym temacie dotyczą wstępnie wydanego produktu, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, wyraźnych ani domniemanych, w odniesieniu do podanych tutaj informacji.
RSSv2 jest w wersji zapoznawczej tylko w systemie Windows 10 w wersji 1809.
Identyfikator OID OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES jest wysyłany do RSSv2-obsługa sterowników miniportów w celu wykonywania ruchów poszczególnych wpisów tabeli pośredniej. Ten OID jest synchronicznymOID, co oznacza, że nie może zwrócić NDIS_STATUS_PENDING. Jest on wystawiany tylko jako żądanie metody w irQL == DISPATCH_LEVEL.
To wywołanie używa punktu wejścia xxxSynchronousOidRequest, w którym Xxx xxx jest Miniport lub Filtr w zależności od typu sterownika odbierającego żądanie. Ten punkt wejścia powoduje sprawdzenie błędu systemu, jeśli widzi stan zwracania NDIS_STATUS_PENDING.
OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES używa struktury NDIS_RSS_SET_INDIRECTION_ENTRIES, aby poinstruować kartę miniportu do synchronicznego wykonywania zestawu akcji, gdzie każda akcja przenosi pojedynczy wpis tabeli pośredniej RSS określonego wirtualnegoportu do określonego procesora CPU.
Uwagi
Ten identyfikator OID musi zostać wykonany i ukończony w kontekście procesora, który go wystawił. Sterowniki miniportu muszą w pełni wykonać ten identyfikator OID po powrocie NDIS_STATUS_SUCCESS do górnej warstwy. Oznacza to, że sterownik miniportu powinien być przygotowany do odbierania żądań OID z powrotem do tyłu w celu przeniesienia wielu ITE na nowy procesor natychmiast po zakończeniu pierwszego przenoszenia z NDIS_STATUS_SUCCESS.
Napiwek
Pełne wykonanie tego identyfikatora OID oznacza, że sterownik miniportu musi być gotowy do pomyślnej próby wykonania innej akcji w celu przeniesienia ITE. Nie określa, gdzie ruch odbierany w locie jest wskazywany bezpośrednio po przeniesieniu kolejki, który może znajdować się na źródłowym procesorze CPU lub docelowym procesorze CPU.
Protokoły górnej warstwy OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES ustawiać ite i/lub podstawowe i domyślne parametry procesora, aby wskazać różne procesory.
Ten OID może być wystawiony dla aktywnych lub nieaktywnych parametrów kierowania ruchem. Aby uzyskać więcej informacji na temat parametrów sterowania, zobacz Skalowanie po stronie odbierającej w wersji 2 (RSSv2). W przypadku parametrów/ITE w stanie nieaktywnego sterownik miniportu powinien weryfikować i buforować procesor docelowy do momentu następnej odpowiedniej zmiany stanu RSS (włączenie lub wyłączenie). W tym momencie buforowane numery procesorów stają się aktywne i są używane do kierowania ruchem. Aktualizacje aktywnych parametrów (które również muszą zostać zweryfikowane) powinny być natychmiast wprowadzane w celu kierowania ruchu.
OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES należy wydać kartę miniportu z wyczyszczonej flagą NDIS_OID_REQUEST_FLAGS_VPORT_ID_VALID. Wynika to z możliwości przywołowania różnych wirtualnych portów wirtualnych przez różne elementy w tablicy.
Ten OID jest wywoływany tylko w IRQL == DISPATCH_LEVEL.
Sterowniki miniportu powinny być przygotowane do obsługi co najmniej tyle akcji przenoszenia wejścia tabeli pośredniej, jak anonsują się w strukturze NDIS_NIC_SWITCH_CAPABILITIES. Jest to zdefiniowane w NumberOfIndirectionTableEntriesPerNonDefaultPFVPort lub NumberOfIndirectionTableEntriesForDefaultVPort składowej tej struktury lub 128 w trybie natywnej RSS.
Sterowniki miniportu powinny próbować wykonać tyle wpisów, ile mogą i zaktualizować EntryStatus elementu członkowskiego każdego NDIS_RSS_SET_INDIRECTION_ENTRY z wynikiem operacji.
Procedura obsługi OID dla OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES
Program obsługi OID dla OID_GEN_RSS_SET_INDIRECTION_TABLE_ENTRIES powinien zachowywać się w następujący sposób:
- Zwracanie NDIS_STATUS_PENDING jest niedozwolone z powodu typu wywołania synchronicznego OID.
- Finalizuj wszystkie przychodzące ruchy ITE przeznaczone dla bieżącego procesora CPU (wcześniej zainicjowane na zdalnych procesorach).
- Zdecydowanie zaleca się, aby sterowniki miniportów przeprowadzały pełne sprawdzanie poprawności parametru. Jeśli nie jest to możliwe, wykonaj walidację jeden po jednym i wykonywanie wpisów tablicy. Sterowniki miniportu powinny dokładnie sprawdzić, czy wszystkie przywołyne obiekty są prawidłowe:
- Zwracanie NDIS_STATUS_PENDING w polu EntryStatus dla ite nie jest dozwolone.
- Karta miniportu istnieje i jest w dobrym stanie. W przeciwnym razie ustaw pole EntryStatus wpisu na NDIS_STATUS_ADAPTER_NOT_FOUND, NDIS_STATUS_ADAPTER_NOT_READY itp.
- Każdy port VPort istnieje i jest w dobrym stanie. W przeciwnym razie ustaw EntryStatus pola wpisu na NDIS_STATUS_INVALID_PORT, NDIS_STATUS_INVALID_PORT_STATE itp.
- Każdy indeks wpisu tabeli pośredniej znajduje się w skonfigurowanym zakresie. Ten zakres jest 0xFFFF lub znajduje się w zakresie [0...NumberOfIndirectionTableEntries - 1] ustawionym przez OID_GEN_RECEIVE_SCALE_PARAMETERS_V2 OID. Indeksy wejściowe 0xFFFF i 0xFFFE mają specjalne znaczenie: 0xFFFF definiuje procesor domyślny, a 0xFFFE definiuje procesor podstawowy. Po błędzie program obsługi ustawia pole EntryStatus wpisu na NDIS_STATUS_INVALID_PARAMETER.
- Górna warstwa i sterownik miniportu oczekują, że ite wskazuje bieżący procesor (procesor cpu aktora) przed przeniesieniem. Innymi słowy, ite nie może być przekierowywane zdalnie. Jeśli tak nie jest, ustaw pole EntryStatus wpisu na wartość NDIS_STATUS_NOT_ACCEPTED.
- Wszystkie procesory docelowe są prawidłowe i są częścią zestawu DANYCH RSS karty miniport. W przeciwnym razie ustaw pole EntryStatus wpisu na wartość NDIS_STATUS_INVALID_DATA.
- Następnie lub w ramach przebiegu weryfikacji parametru zweryfikuj sytuację zasobu. Sprawdź, czy liczba kolejek do użycia po pełnym przeniesieniu wsadowym (ewakuacja) nie przekracza numberOfQueues ustawionej w strukturze NDIS_RECEIVE_SCALE_PARAMETERS_V2 podczas żądania OID_GEN_RECEIVE_SCALE_PARAMETERS_V2. W przeciwnym razie zostanie zwrócona NDIS_STATUS_NO_QUEUES. NDIS_STATUS_NO_QUEUES należy użyć dla wszystkich warunków reprezentujących naruszenie skonfigurowanej liczby kolejek. NDIS_STATUS_RESOURCES należy użyć tylko do wyznaczenia przejściowych warunków braku pamięci.
- W ramach kontroli zasobów dla każdej jednostki skalowania (na przykład VPort) sterownik miniportu musi obsługiwać warunek, gdy wszystkie ITE wskazujące bieżący procesor CPU są od niego przenoszone.
Jeśli wszystkie powyższe kontrole przejdą, sterownik miniportu powinien być w stanie bezwarunkowo zastosować nową konfigurację i musi ustawić EntryStatus pole każdego wpisu na NDIS_STATUS_SUCCESS.
Ogólnie rzecz biorąc, procedura obsługi tego OID powinna być bardzo lekka. Nie należy wywoływać usługi NDIS ani usług systemu operacyjnego innych niż w przypadku możliwych operacji synchronizacji, takich jak spinlocks i NdisMConfigMSIXTableEntry.
Sterownik miniportu nie powinien wywoływać NDIS, aby wskazać stan lub zdarzenia PnP.
Sterownik miniportu nie powinien również używać pełnych wskazówek odbioru/przesyłania w kontekście tej procedury obsługi identyfikatora OID, ponieważ prowadzi to do rekursji. Górna warstwa może wywołać ten identyfikator OID z kontekstu sygnałów odbierania lub przesyłania.
Przenoszenie wszystkich wpisów tabeli pośredniej
Sterowniki miniportu powinny rozpoznawać i obsługiwać specjalne żądanie, które przenosi wszystkie wpisy tabeli pośredniej z dala od bieżącego procesora CPU. Ponieważ RSSv2 działa z poszczególnymi ruchami ITE, sterowniki miniportu muszą zagwarantować niepodzielność ogólnej operacji. Jeśli wystąpi błąd w środku partii podczas przetwarzania odpowiedniej tablicy poleceń przenoszenia, sterownik miniportu powinien przywrócić wszystkie polecenia, które zostały już wykonane i oznaczyć wszystkie polecenia jako "niepowodzenie" w EntryStatus pole. Protokół górnej warstwy zawsze oczekuje, że partia "przenieś wszystkie ITE" będzie zawierać wszystkie polecenia oznaczone jako "powodzenie" lub wszystkie polecenia oznaczone jako "niepowodzenie", i zakłada, że ruch przestrzega stanu wynikowego (przed lub po przeniesieniu). Jeśli górna warstwa widzi tylko niektóre wpisy oznaczone jako "niepowodzenie", błąd sprawdzi system i wskaże sterownik miniportu jako przyczynę.
Aby ułatwić obsługę polecenia "przenieś wszystkie ITE" sterownika miniportu i uniknąć zakleszczenia, górne protokoły warstwy grupować polecenia przenoszenia w partii w parach SwitchId + VPortId pola, takie jak:
- Polecenia, które górna warstwa chce być wykonywana razem, w ramach polecenia "przenieś wszystko" dla tego samego wirtualnegoportu są umieszczane kolejno w całej partii.
- Sterownik miniportu nie powinien próbować wykonać ogólnej partii poleceń, która może być skierowana do różnych portów wirtualnych w sposób "przenieś wszystko". Należy wykonać tylko grupę poleceń, które są przeznaczone dla tego samego wirtualnegoportu (oznaczonego tym samym SwitchId + VPortId pary) zgodne z semantyki "przenieś wszystko".
- Jeśli górna warstwa nie dba o semantykę "przenieś wszystko", może przeplatać polecenia do tego samego wirtualnegoportu z poleceniami do różnych portów VPort. W takim przypadku, jeśli nie można wykonać drugiej grupy poleceń do tego samego portu VPort z powodu naruszenia "liczby kolejek", miniport sterownik oznacza tę grupę z odpowiednim kodem stanu (NDIS_STATUS_NO_QUEUES), a górna warstwa ponosi odpowiedzialność za odzyskanie.
Jeśli na przykład protokół górnej warstwy przeplata serię poleceń w następujący sposób:
VPort=1 ITE[0,1]VPort=2 ITE[0]VPort=1 ITE[2]
Sterownik miniportu nie musi próbować wykonać niepodziealnie wszystkich czterech poleceń przenoszenia ani wszystkich trzech poleceń przenoszenia dla VPort=1 (ITE[0,1,2]). Musi tylko wykonać grupę VPort=1 ITE[0,1] w sposób "przenieś wszystko", a następnie grupę VPort=2 ITE[0], a następnie VPort=1 ITE[2]. Wszystkie trzy grupy poleceń mogą mieć inny wynik. Na przykład grupy VPort=1 ITE[0,1] i VPort=2 ITE[0] mogą zakończyć się powodzeniem, a grupa VPort=1 ITE[2] może zakończyć się niepowodzeniem. Wynik powinien zostać odzwierciedlony w odpowiednich EntryStatus składowych każdej struktury poleceń. W ten sposób sterownik miniportu nie musi podjąć środków ostrożności w celu bezpiecznego wykonania całej partii (na przykład zablokować całą kartę). Tylko te polecenia, które dotyczą określonego portu VPort, muszą być serializowane, bardziej szczegółowe na VPort blokady mogą być używane, a niektóre zakleszczenia są unikane.
Nuta
Cała grupa wpisów poleceń musi być oznaczona tym samym stanem wpisu.
Warunki błędu i kody stanu
Ten identyfikator OID zwraca następujące kody stanu w przypadku wystąpienia błędu:
| Kod stanu | Warunek błędu |
|---|---|
| NDIS_STATUS_INVALID_LENGTH | OID był źle sformułowany. |
| NDIS_STATUS_INVALID_PARAMETER | Inne pola w nagłówku lub w samym identyfikatorze OID (ale nie w pojedynczych wpisach poleceń) zawierają nieprawidłowe wartości. |
Wymagania
wersja: Windows 10, wersja 1709 nagłówek: Ntddndis.h (w tym Ndis.h)