|
|
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:st1="urn:schemas-microsoft-com:office:smarttags" xmlns="http://www.w3.org/TR/REC-html40">
<head> <meta http-equiv=Content-Type content="text/html; charset=windows-1252"> <meta name=ProgId content=Word.Document> <meta name=Generator content="Microsoft Word 10"> <meta name=Originator content="Microsoft Word 10"> <link rel=File-List href="mux_files/filelist.xml"> <title>MUX Intermediate Miniport Driver Help</title> <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="PlaceType"/> <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="PlaceName"/> <o:SmartTagType namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="place"/> <!--[if gte mso 9]><xml>
<w:WordDocument> <w:SpellingState>Clean</w:SpellingState> <w:GrammarState>Clean</w:GrammarState> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if !mso]><object
classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object> <style> st1\:*{behavior:url(#ieooui) } </style> <![endif]--> <style> <!--
/* Font Definitions */ @font-face {font-family:Verdana; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:536871559 0 0 0 415 0;} @font-face {font-family:"MS Sans Serif"; mso-font-alt:"Times New Roman"; mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:auto; mso-font-signature:3 0 0 0 1 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; color:black;} h2 {mso-margin-top-alt:auto; margin-right:0in; mso-margin-bottom-alt:auto; margin-left:0in; mso-pagination:widow-orphan; mso-outline-level:2; font-size:18.0pt; font-family:"Times New Roman"; color:black; font-weight:bold;} h3 {mso-margin-top-alt:auto; margin-right:0in; mso-margin-bottom-alt:auto; margin-left:0in; mso-pagination:widow-orphan; mso-outline-level:3; font-size:13.5pt; font-family:"Times New Roman"; color:black; font-weight:bold;} h4 {mso-margin-top-alt:auto; margin-right:0in; mso-margin-bottom-alt:auto; margin-left:0in; mso-pagination:widow-orphan; mso-outline-level:4; font-size:12.0pt; font-family:"Times New Roman"; color:black; font-weight:bold;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} p {mso-margin-top-alt:auto; margin-right:0in; mso-margin-bottom-alt:auto; margin-left:0in; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; color:black;} pre {margin:0in; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; font-size:10.0pt; font-family:"Courier New"; mso-fareast-font-family:"Courier New"; color:black;} span.SpellE {mso-style-name:""; mso-spl-e:yes;} span.GramE {mso-style-name:""; mso-gram-e:yes;} @page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]>
<style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]--> <meta name=Template content="C:\Program Files\Microsoft Office\Office\html.dot"> <!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="7170"/> </xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--> </head>
<body bgcolor=white lang=EN-US link=blue vlink=purple style='tab-interval:.5in'>
<div class=Section1>
<h2><a name=MYSAMPLE><span style='font-family:Verdana'>
<!doctype HTML>
<! ---------------- Snip Snip ---------------- >MUX.SYS - Sample NDIS MUX Intermediate Driver</span></a><span style='font-family:Verdana'><o:p></o:p></span></h2>
<h3><span style='font-family:Verdana'>SUMMARY<o:p></o:p></span></h3>
<p><st1:place><st1:PlaceName><b><span style='font-family:Verdana'>MUX</span></b></st1:PlaceName><b><span style='font-family:Verdana'> </span></b><st1:PlaceName><b><span style='font-family:Verdana'>Intermediate</span></b></st1:PlaceName><b><span style='font-family:Verdana'> </span></b><st1:PlaceType><b><span style='font-family:Verdana'>Miniport</span></b></st1:PlaceType></st1:place><b><span style='font-family:Verdana'> Driver<o:p></o:p></span></b></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>The MUX Intermediate Miniport (IM) driver is an NDIS 5 driver that demonstrates the operation of an �N<span class=GramE>:1</span>� MUX driver, i.e. one which creates multiple virtual network devices on top of a single lower adapter. Protocols bind to these virtual adapters as if they are real adapters. Examples of </span><st1:place><st1:PlaceName><span style='font-size:10.0pt;font-family:Verdana'>Intermediate</span></st1:PlaceName><span style='font-size:10.0pt;font-family:Verdana'> </span><st1:PlaceType><span style='font-size:10.0pt;font-family:Verdana'>Miniport</span></st1:PlaceType></st1:place><span style='font-size:10.0pt;font-family:Verdana'> drivers that can use this framework are Virtual LAN (VLAN) drivers.<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>This sample implements IEEE 802.1Q VLAN tagging, which is enabled by changing the default VLAN ID to a non-zero valid value (see �Configuring VLANs� below).<o:p></o:p></span></p>
<p><b><span style='mso-bidi-font-size:10.0pt;font-family:Verdana'>Operation<o:p></o:p></span></b></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>The driver binds to Ethernet (NdisMedium802_3) adapters as a protocol, and exposes one or more virtual Ethernet devices over each lower adapter, based on its configuration. The term �VELAN� is used to denote a Virtual Ethernet LAN adapter implemented by this driver.<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>When it binds to a lower adapter, MUX reads the standard �UpperBind� key to obtain a list of VELANs configured over this adapter. For each such VELAN, it calls <span class=GramE>NdisIMInitializeDeviceInstanceEx(</span>) to instantiate the NDIS miniport for the VELAN. NDIS then calls the driver�s MiniportInitialize (<i>MPInitialize</i>) routine to start the VELAN miniport.<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>The MUX driver supports configuring the MAC address for each VELAN miniport using the standard �NetworkAddress� key that it reads from its MiniportInitialize routine. If this is not configured, it computes a �locally significant� MAC address for the VELAN using the MAC address of the lower adapter. The MUX driver sets its lower adapter to promiscuous mode in order to be able to receive frames directed to any of the VELAN MAC addresses. <span class=GramE>However it does implement packet-filtering (and multicast address filtering) logic for all its VELAN miniports so that it only passes up relevant frames on each VELAN.</span> This aspect of the driver may be modified if, for example, your driver design uses the same MAC address as that of the lower adapter on all VELANs. With such a modification, it is not required to set the lower adapter to promiscuous mode and incur the costs of receiving all packets on the network.<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>It supports dynamic addition and deletion of VELANs in conjunction with <span class=GramE>its</span> notify object (related sample). If a VELAN is deleted, the virtual device corresponding to the VELAN is stopped and removed, which in turn results in NDIS halting the miniport instance for the VELAN (see <i>MPHalt</i>). If a VELAN is added, NDIS sends a global reconfiguration event to the protocol edge of this driver. The handler function for this event, PtPNPHandler, goes through all lower adapters to see if any new VELANs have been added, i.e. if any of the �UpperBind� keys have been modified.<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>Since the driver implements a virtual device, it does not simply pass through most NDIS queries/sets. It keeps its own device view that is reflected in its responses to queries/sets. However it does pass through queries/sets for certain OIDs that are best handled by the lower adapter driver. <o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>The driver supports Power Management in the sense that it allows Wake-On-LAN and related functionality, if supported by the lower adapter, to continue to function. It does so by appropriately forwarding OID_PNP_XXX queries/sets to the lower adapter. <o:p></o:p></span></p>
<p><b style='mso-bidi-font-weight:normal'><span style='font-family:Verdana'>IEEE 802.1Q VLAN Operation<o:p></o:p></span></b></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>The driver supports configuring a VLAN ID on each VELAN. It then inserts a tag header containing this VLAN ID on all outgoing frames. For incoming frames that contain a tag header, it verifies that a matching VLAN ID is present before indicating it up to protocols. It removes the tag header, if present, from all indicated frames. In all cases, received frames that do not contain tag headers are always handed up to protocols.<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>With the default configured VLAN ID of zero, the driver does not insert tag header information on sent packets, except for sent packets that contain non-zero Ieee8021QInfo per-packet information, for which the driver does insert corresponding tag headers. Receive-side filtering on VLAN ID is enabled only with a non-zero configured VLAN ID, in which case only received frames containing a matching VLAN ID are passed up. With the default configured VLAN ID of zero, the driver does not check the VLAN ID on received frames.<o:p></o:p></span></p>
<h3><span style='font-family:Verdana'>BUILDING THE SAMPLE<o:p></o:p></span></h3>
<p><span style='font-size:10.0pt;font-family:Verdana'>Run the <b>build</b> command from this directory to build the sample�it creates the binary mux.sys. To disable IEEE VLAN support, comment out the following line in the sources file before building:<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>C_DEFINES=$(C_DEFINES) �DIEEE_VLAN_SUPPORT=1<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>To install this driver on Windows� codename Whistler, use the MUX sample notification object and INFs, also found in this DDK.<o:p></o:p></span></p>
<h3><span style='font-family:Verdana'>INSTALLING THE SAMPLE<o:p></o:p></span></h3>
<p><span style='font-size:10.0pt;font-family:Verdana'>MUX is installed as a protocol (called �Sample <span class=SpellE>Mux</span>-IM Protocol Driver� in the supplied INFs/notification object). To install, follow the steps below.<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>Prepare a floppy disk (or installation directory) that contains these files: <span class=SpellE>muxp.inf</span>, <span class=SpellE>mux_mp.inf</span>, mux.sys and mux.dll (notification object DLL, built in this DDK at network\<span class=SpellE>ndis\mux\notifyob</span>).<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>On the desktop, right-click the <b>My Network Places</b> icon and choose <b>Properties</b>. <o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>Right-click on the relevant Local Area Connection icon and choose <b>Properties</b>. <o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>Click <b>Install</b>, then <b>Protocol</b>, then <b>Add</b>, <span class=GramE>then</span> <b>Have Disk</b>. <o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>Browse to the drive/directory containing the files listed above. Click <b>OK</b>. This should show �Sample <span class=SpellE>Mux</span>-IM Protocol Driver� in a list of Network Protocols. Highlight this and click <b>OK</b>. This should install the MUX driver. <o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>Click <b>OK</b> or <span class=GramE><b>Yes</b></span> each time the system prompts with a warning regarding installation of unsigned files. This is necessary because binaries generated via the DDK build environment are not signed.<o:p></o:p></span></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>Two .INF files are needed rather than one because MUX is installed both as a protocol and a miniport.<o:p></o:p></span></p>
<p><b style='mso-bidi-font-weight:normal'><span style='font-family:Verdana'>Configuring VLANs<o:p></o:p></span></b></p>
<p><span style='font-size:10.0pt;font-family:Verdana'>The VLAN ID for each VELAN (virtual miniport) can be configured as follows. Right-click on the virtual miniport Local Area Connection icon and choose <b style='mso-bidi-font-weight: normal'>Properties</b>. Click on the <b style='mso-bidi-font-weight:normal'>Configure</b> button to bring up the Device Manager UI for the virtual device. Select the <b style='mso-bidi-font-weight:normal'>Advanced</b> property sheet � this should contain a �VLAN ID� parameter that is configurable to the desired VLAN ID. Choosing a value of 0 (zero) disables receive-side filtering based on VLAN ID.<o:p></o:p></span></p>
<h3><span style='font-family:Verdana'>CODE TOUR<o:p></o:p></span></h3>
<h4><span style='font-family:Verdana'>File Manifest<o:p></o:p></span></h4>
<pre><u>File<span style='mso-tab-count:2'>���������� </span>Description<o:p></o:p></u></pre><pre><o:p> </o:p></pre><pre><span class=SpellE>Makefile</span><span style='mso-tab-count:1'>������ </span>Used during compilation to create the object and sys files</pre><pre>Miniport.c<span style='mso-tab-count:1'>���� </span>Miniport related routines for the MUX driver</pre><pre><span class=SpellE>Mux.c</span><span style='mso-tab-count:2'>��������� </span>DriverEntry routine and any routines common to the MUX miniport and protocol </pre><pre><span class=SpellE>Mux.h</span><span style='mso-tab-count:2'>��������� </span>Prototypes of all functions and data structures used by the MUX driver</pre><pre>Mux.htm<span style='mso-tab-count:2'>������� </span>Documentation for the MUX driver (this file)</pre><pre><span class=SpellE>Mux.rc</span><span style='mso-tab-count:2'>�������� </span>Resource <span class=GramE>file</span> for the MUX driver</pre><pre><span class=SpellE>Muxp.inf</span><span style='mso-tab-count:1'>������ </span>Installation INF for the service (protocol side installation)</pre><pre><span class=SpellE>Mux_mp.inf</span><span style='mso-tab-count:1'>���� </span>Installation INF for the miniport (virtual device installation)</pre><pre><span class=SpellE>Precomp.h</span><span style='mso-tab-count:1'>����� </span><span class=SpellE>Precompile</span> header file</pre><pre><span class=SpellE>Protocol.c</span><span style='mso-tab-count:1'>���� </span>Protocol related routines for the MUX driver</pre><pre>Sources<span style='mso-tab-count:2'>������� </span>List of source files that are compiled and linked to create the MUX driver. This can be modified to create binaries that operate on previous Windows versions (e.g. Windows 2000).</pre>
<h4 style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-family:Verdana'>Programming Tour<o:p></o:p></span></h4>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>When it loads, i.e. from its <i>DriverEntry</i> function, the MUX driver registers as an Intermediate miniport driver and as a protocol, in that order.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Binding and VELAN Creation<o:p></o:p></span></b></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>NDIS calls MUX�s BindAdapter function, <i>PtBindAdapter</i>, for each underlying NDIS adapter to which it is configured to bind. This function allocates an ADAPT structure to represent the lower adapter, and calls NdisOpenAdapter to set up a binding to it. In the context of BindAdapterHandler, after successfully opening a binding to the underlying adapter, the driver queries the reserved keyword "UpperBindings" to get a list of device names for the virtual adapters that this particular binding is to expose � see <i>PtBootStrapVElans</i> for more details. Note that the MUX driver does not create bindings (i.e. call NdisOpenAdapter) from any context other than its BindAdapter function � this is recommended behavior for all drivers of this type.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>For each device name specified in the �UpperBindings� key, the MUX driver allocates a VELAN data structure to represent the virtual miniport, calls NdisIMInitializeDeviceInstanceEx. In response, NDIS eventually calls the MUX miniport�s MiniportInitialize entry point, <i>MPInitialize</i>, for each VELAN. After <i>MPInitialize</i> successfully returns, NDIS takes care of getting upper-layer protocols to bind to the newly created virtual adapter(s).<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Unbinding and Halting</span></b><span style='font-size:10.0pt;font-family:Verdana'><o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>NDIS calls MUX�s UnbindAdapter handler, <i>PtUnbindAdapter</i>, to request it to unbind from a lower adapter. In processing this, MUX calls NdisIMDeInitializeDeviceInstance for each VELAN instantiated on the indicated adapter � see <i>PtStopVElan</i> for details. This call results in NDIS first unbinding any protocols bound to the indicated VELAN, and then calling the MiniportHalt routine, <i>MPHalt</i>, for that VELAN. <i>MPHalt</i> waits for any outstanding receives/sends on the VELAN to finish before unlinking the VELAN from the ADAPT.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><i><span style='font-size:10.0pt;font-family:Verdana'>PtUnbindAdapter</span></i><span style='font-size:10.0pt;font-family:Verdana'> itself blocks until all VELANs associated with the ADAPT structure have been unlinked from it. This is to make sure that no thread running in the context of a miniport-edge entry point for a VELAN will ever access an invalid lower binding handle. Once all VELANs have been unlinked, <i>PtUnbindAdapter</i> closes the lower binding by calling NdisCloseAdapter. Note that the MUX driver does not close its lower binding from any context other than its UnbindAdapter function � this is recommended behavior for all drivers of this type.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><i><span style='font-size:10.0pt;font-family:Verdana'>MPHalt</span></i><span style='font-size:10.0pt;font-family:Verdana'> may also be called if the VELAN device is disabled, e.g. from the Network Connections Folder. There is no special code within <i>MPHalt</i> to handle this condition. However, <i>PtUnbindAdapter</i> takes care to not attempt to deinitialize a VELAN miniport (via NdisIMDeInitializeDeviceInstance) that has already been halted.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Handling Queries<o:p></o:p></span></b></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><i><span style='font-size:10.0pt;font-family:Verdana'>MPQueryInformation</span></i><span style='font-size:10.0pt;font-family:Verdana'> is the MUX driver�s function that handles queries for OID values on VELAN miniports. Most of the �Ethernet� type information for the virtual miniport is stored in the VELAN structure itself, and the driver returns information from this structure. The queries that are forwarded are OID_GEN_MEDIA_CONNECT_STATUS, OID_PNP_CAPABILITIES and OID_PNP_WAKE_UP_PATTERN_LIST. See �Handling Power Management� below for more information about the latter two OIDs.<i><o:p></o:p></i></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Handling Sets</span></b><span style='font-size:10.0pt;font-family:Verdana'><o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><i><span style='font-size:10.0pt;font-family:Verdana'>MPSetInformation</span></i><span style='font-size:10.0pt;font-family:Verdana'> handles setting OID values on VELAN miniports. Data management OIDs handled by the MUX driver are OID_802_3_MULTICAST_LIST and OID_GEN_CURRENT_PACKET_FILTER. The multicast list is handled entirely within the MUX driver � it just stores the set of multicast addresses in the VELAN structure, for reference during receive-side data processing. The packet filter is handled in a different way � the MUX driver combines the packet filter settings (bitwise OR) of all VELANs associated with the same lower adapter. If the combined packet filter is non-zero, MUX sends a Set request with a value of NDIS_PACKET_TYPE_PROMISCUOUS for OID_GEN_CURRENT_PACKET_FILTER to start receives on the lower adapter. If the combined packet filter is zero, MUX sets the lower adapter�s packet filter to 0 (turns off all receives if there aren�t any interested protocols).<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>Note that setting the lower adapter to promiscuous mode is only done here in order to be able to receive <span class=SpellE>unicast</span> frames directed to multiple MAC addresses. If, for example, all VELANs are assigned the same MAC address (which is identical to the address of the lower adapter), then the MUX driver should only pass down the combined (bitwise OR) setting of packet filter settings of all VELANs.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>Some power management OIDs are forwarded to the lower miniport. See �Handling Power Management� below for details. <o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Sending Data<o:p></o:p></span></b></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>Data sent down on a VELAN miniport is forwarded to the lower adapter. The MUX driver itself does not generate any data of its own. The MUX driver allocates a new NDIS_PACKET for each packet passed to its <i>MPSendPackets</i> function, and saves a pointer to the original NDIS_PACKET in the reserved area of the packet structure. When the lower adapter completes the send (<i>PtSendComplete</i>), MUX picks up the original packet and calls NdisMSendComplete to complete the original send request.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>If a non-zero VLAN ID is configured for the VELAN, and/or the packet has non-zero Ieee8021QInfo per-packet information, then the MUX driver inserts an NDIS buffer containing a tag header to the front of the packet before sending it down � see function <i style='mso-bidi-font-style:normal'>MPHandleSendTagging</i> for details.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Receiving Data<o:p></o:p></span></b></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>Data received from a lower adapter is indicated up on zero or more VELANs. The <i>PtReceivePacket</i> or <i>PtReceive</i> function is called for each packet received from the lower adapter. In both cases, the received data is checked for matches with the packet filter and multicast list for each VELAN associated with the adapter (see <i>PtMatchPacketToVElan</i>). Whenever a match is found, a new NDIS_PACKET is allocated and set to point to the received data. A pointer to the original received packet (if any) is also stored in the new packet�s reserved area. This packet is indicated up via NdisMIndicateReceivePacket to all interested protocols on that VELAN. <o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>The driver�s <i>MPReturnPacket</i> function is called either by NDIS or by MUX itself when protocols are done with a received packet. This function returns the original packet indicated by the lower driver, if any, by calling NdisReturnPackets.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>The driver indicates up received frames that do not have an IEEE 802.1Q tag header in them � see function <i style='mso-bidi-font-style:normal'>PtHandleRcvTagging</i>. It always strips off tag headers, if present, on received frames. If a non-zero VLAN ID is configured, then it checks received frames that contain tag headers for matching VLAN Ids � only matching frames are indicated up to protocols. Any VLAN/priority information present in incoming frames is copied to per-packet information fields of indicated NDIS_PACKET structures.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Status Indications</span></b><span style='font-size:10.0pt;font-family:Verdana'><o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>The only status indications that are forwarded up by MUX are media connect status indications. See <i>PtStatus</i> for more details.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Handling Power Management</span></b><span style='font-size:10.0pt;font-family:Verdana'><o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>During initialization (<i>MPInitialize</i>), the MUX miniport sets the attribute <i>NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND</i> in its call to NdisMSetAttributesEx. When the MUX miniport is requested to report its Plug and Play capabilities (OID_PNP_CAPABILITIES), the MUX miniport forwards the request to the underlying miniport. If this request succeeds, then the MUX miniport overwrites the following fields before successfully completing the original request: <o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>NDIS_DEVICE_POWER_STATE<span style='mso-tab-count:1'>��������� </span>MinMagicPacketWakeUp = NdisDeviceStateUnspecified;<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>NDIS_DEVICE_POWER_STATE<span style='mso-tab-count:1'>��������� </span><span class=SpellE>MinPatternWakeUp</span>= NdisDeviceStateUnspecified;<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>NDIS_DEVICE_POWER_STATE<span style='mso-tab-count:1'>��������� </span>MinLinkChangeWakeUp=NdisDeviceStateUnspecified<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>See <i>PtPostProcessPnPCapabilities</i> for details. <o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>OID_PNP_SET_POWER and OID_PNP_QUERY_POWER are not passed to the lower adapter, since the lower layer miniport will receive independent requests from NDIS.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>NDIS calls the MUX driver�s ProtocolPnPEvent function (<i>PtPNPHandler</i>) whenever the underlying adapter is transitioned to a different power state. If the underlying adapter is transitioning to a low power state, the driver waits for all outstanding sends and requests to complete.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>Queries/sets received on a VELAN miniport that are to be forwarded to the underlying adapter are queued on the VELAN if the underlying adapter is at a low power state. These are picked up for processing on receiving a notification that the underlying adapter is back to a powered-up state.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Handling Global Reconfiguration</span></b><span style='font-size:10.0pt;font-family:Verdana'><o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>All modifications to VELAN configuration are accompanied by PnP reconfigure notifications, i.e. NetEventReconfigure events passed to the MUX�s PnPEventHandler, <i>PtPNPHandler</i>. This driver takes a broad approach to handling reconfiguration, which is to simply re-examine all the �UpperBindings� keys for all currently bound adapters, and start off VELANs for any that do not exist � see <i>PtBootStrapVElans</i> for details.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>NDIS 5.1 Features</span></b><span style='font-size:10.0pt;font-family:Verdana'><o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'>The NDIS 5.1 features in MUX are identified by #ifdef NDIS51 compiler directives. The following feature is illustrated (refer to the DDK documentation for more information on these):<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><b><span style='font-size:10.0pt;font-family:Verdana'>Canceling Sends</span></b><span style='font-size:10.0pt;font-family:Verdana'>: MUX propagates send cancellations from protocols above it to lower miniports.<o:p></o:p></span></p>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:10.0pt;font-family:Verdana'><span style='mso-spacerun:yes'>�</span><o:p></o:p></span></p>
<p align=center style='text-align:center;tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><a href="#top"><span style='font-size:10.0pt;font-family:Verdana'>Top of page</span></a><span style='font-size:10.0pt;font-family:Verdana'> <o:p></o:p></span></p>
<table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width=624 style='width:6.5in;mso-cellspacing:0in;mso-padding-alt:0in 0in 0in 0in'> <tr style='mso-yfti-irow:0;mso-yfti-lastrow:yes;height:1.5pt'> <td style='background:aqua;padding:.75pt .75pt .75pt .75pt;height:1.5pt'> <p class=MsoNormal><o:p> </o:p></p> </td> </tr> </table>
<p style='tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt'><span style='font-size:7.5pt;font-family:"MS Sans Serif"'>� 1999 Microsoft Corporation</span><span style='font-size:10.0pt;font-family:Verdana'> <o:p></o:p></span></p>
</div>
</body>
</html>
|