260 likes | 326 Views
Learn about NDIS LBFO Miniports for load balancing and failover in Windows networking. Discover how to implement and install LBFO miniports for optimized network performance.
E N D
NDIS LBFO Miniports (Load Balancing And Failover)Larry CleetonProgram ManagerWindows Networking And CommunicationsMicrosoft 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 TCP/IP Interface 1 Interface 2 Miniport Adapter 1 Adapter 2
LBFO Binding TCP/IP Interface 1 Second binding not established if Miniport calls NdisMSetSecondary in Adapter 2 MiniportInitialize Miniport Adapter 1 Adapter 2
LBFO Data Flow (Normal) TCP/IP Interface 1 Miniport Adapter 1 Adapter 2
LBFO Data Flow (Failure) TCP/IP Interface 1 Miniport Adapter 1 Adapter 2
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"
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