如果在 NET_BUFFER_LIST 結構中,NblFlags 成員的 NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET 旗標已設定,則封包是回送封包。 通訊協定驅動程式和篩選驅動程式可以檢查此旗標,以判斷封包是否為回送封包。
如果符合下列三個條件,NDIS 會迴圈封包:
基礎迷你埠配接器媒體類型 是NdisMedium802_3 或 NdisMedium802_5。
符合下列三個條件中的任何一個:
通訊協定繫結會使用 OID_GEN_CURRENT_PACKET_FILTER OID 來設定 NDIS_PACKET_TYPE_PROMISCUOUS,以指定其封包篩選條件(如果是 Windows 8 或更新版本,則未在相同的 OID 中設定 NDIS_PACKET_TYPE_NO_LOCAL),且符合下列任一條件:
- 迷你埠配接器有多個系結。
- 有一個連結至迷你埠適配卡的篩選模組,而篩選模塊註冊了接收處理程式。
通訊協議系結會使用 OID_GEN_CURRENT_PACKET_FILTER OID 來設定NDIS_PACKET_TYPE_ALL_LOCAL設定,以指定其封包篩選條件,下列任一項為 true。
- 迷你埠配接器有多個系結。
- 有一個連結至迷你埠適配卡的篩選模組,而篩選模塊註冊了接收處理程式。
呼叫端會在 NdisSendNetBufferLists 函式的 SendFlags 參數中設定NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK旗標。
封包是否可接受,由迷你埠適配器設定的 OID_GEN_CURRENT_PACKET_FILTER OID 的封包篩選器決定。 下列是部份範例:
- 如果封包是直接封包,封包中的目的地地址必須符合迷你埠配接器的 MAC 位址。
- 如果封包是多播封包,封包篩選必須設定NDIS_PACKET_TYPE_ALL_MULTICAST,或目的地位址符合迷你埠配接器多播位址清單中的其中一個多播位址,而且封包篩選條件已設定NDIS_PACKET_TYPE_MULTICAST。
- 如果封包是廣播封包,迷你埠配接器的封包篩選必須已設定NDIS_PACKET_TYPE_BROADCAST。
- 迷你埠配接器的封包篩選已設定NDIS_PACKET_TYPE_PROMISCUOUS或NDIS_PACKET_TYPE_ALL_LOCAL。
如果符合以下任一條件,協定綁定將接收到回送封包:
通訊協議系結是封包的原始傳送者,且已設定NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK。
通訊協議系結不會在封包篩選中設定NDIS_PACKET_TYPE_NO_LOCAL。
如果下列任一項成立,通訊協議系結將不會接收回送封包:
通訊協議系結會在封包篩選中設定NDIS_PACKET_TYPE_NO_LOCAL,而不是封包的原始傳送者。
通訊協定繫結是原始發送者,但在呼叫 NdisSendNetBufferLists 函數時,SendFlags 參數中未設定 NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK。
下圖顯示回送演算法邏輯流程。