NDIS LBFO Miniports (Load Balancing And Failover) Larry Cleeton Program Manager Windows Networking And Communications Microsoft Corporation
Agenda Overview of NDIS LBFO Miniports How to write LBFO miniports How to install LBFO miniports
Typical LBFO Scenario Server machine attached to network with multiple links More total bandwidth Continue to work on failed NIC or cable cut
Overview An NDIS LBFO miniport is a normal NDIS miniport driver plus: Code to use multiple NICs together for load balancing network traffic Code to manage a primary NIC and secondary NICs and manage a fail- over upon the failure of the primary
Overview NDIS gives the miniport driver control over the designation of primary and secondary NICs, exposing only a single binding to protocols Two key NDIS API calls: NdisMSetMiniportSecondary NdisMPromoteMiniport
Normal Binding Miniport TCP/IP Adapter 2 Adapter 1 Interface 2 Interface 1
LBFO Binding Miniport TCP/IP Adapter 2 Adapter 1 Interface 1 Second binding not established if Miniport calls NdisMSetSecondary in Adapter 2 MiniportInitialize
LBFO Data Flow (Normal) Miniport TCP/IP Adapter 2 Adapter 1 Interface 1
LBFO Data Flow (Failure) Miniport TCP/IP Adapter 2 Adapter 1 Interface 1
How To Implement LBFO Design your LBFO strategy Modify your miniport code Modify your INF file
Design Your LBFO Strategy Just failover or load balancing too? How to run multiple ports as one load-sharing bundle? (Network issues) Coordination with attached switch/router?
Modify Your Miniport Code MiniportInitialize MiniportSend/SendPackets NdisMIndicateReceivePacket Miniport(Query,Set)Information
MiniportInitialize Read “BundleId” keyword using NdisReadConfiguraton Search for other adapters that have the same BundleId value If no match, do nothing, adapter defaults to primary If match, set self to secondary using NdisMSetMiniportSecondary
MiniportSend/SendPackets MiniportAdapterContext is always the primary NIC Miniport code can redirect send to other NICs with it’s own logic Always complete Send with original primary MiniportAdapterContext
NdisMIndicateReceivePacket Regardless of adapter on which received, indicate with primary MiniportAdapterHandle
MiniportQuery/SetInformation Process Query or Set OID for specific adapter referenced by MiniportAdapterContext No change from normal behavior
MiniportHalt Secondary Adapter Normal halt handling Primary Adapter Promote secondary with NdisMPromoteMiniport
Sample Pass-through sample in DDK implements failover Although intermediate driver it shows the basic implementation requirements
Installing LBFO Miniports Create net class INF for miniport Add additional advanced property key “BundleId” BundleId property’s existence is the trigger to the miniport to enable LBFO support and the string is the Bundle identifier BundleId property can be optional
BundleId INF Example AddReg = example.advprop.reg [example.advprop.reg] ; BundleId for support of LBFO HKR, Ndi\params\BundleId, ParamDesc, 0, "LBFO Bundle ID" HKR, Ndi\params\BundleId, type, 0, "edit" HKR, Ndi\params\BundleId, LimitText, 0, "15" HKR, Ndi\params\BundleId, UpperCase, 0, "1" HKR, Ndi\params\BundleId, default, 0, "Bundle1" HKR, Ndi\params\BundleId, optional, 0, "1"
Demonstration
Limitations Configuration is spread across multiple network connections If a primary adapter is halted the new primary will have a new interface to IP with a potentially different IP configuration
Call To Action Implement LBFO in your miniport Simple, no config code necessary Valuable feature without high cost Test your LBFO scenarios with appropriate network devices
Discussion