<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows Core Networking : QoS</title><link>http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx</link><description>Tags: QoS</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>QoS Traffic Generator Example Usage</title><link>http://blogs.msdn.com/wndp/archive/2009/05/07/qos-traffic-generator-example-usage.aspx</link><pubDate>Fri, 08 May 2009 02:47:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9595311</guid><dc:creator>AriPernick</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/wndp/comments/9595311.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=9595311</wfw:commentRss><description>&lt;p&gt;In my &lt;a href="http://blogs.msdn.com/wndp/archive/2009/04/30/qos-traffic-generator-is-now-available-on-connect.aspx"&gt;last post&lt;/a&gt;, I announced the availability of QoS Traffic Generator on Microsoft Connect. In order to help you understand the usage of this tool, I have provided some examples of what it can do.&lt;/p&gt;  &lt;p&gt;One of the most common tasks is to send traffic from one computer to another. The following example sends UDP traffic at 5 Mbps for 10 seconds.&lt;/p&gt;  &lt;p&gt;&lt;u&gt;Source&lt;/u&gt;&lt;/p&gt;  &lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -source -udp -dest 192.168.1.100 -throttle 5000000 &lt;br /&gt;                      -duration 10
Parsing command line...
WSAStartup successful.
Time between each packet (microsec): 2400
Size of each packet: 1472
Statistics sampling interval (msec): 1000
Sending traffic at 5.00 Mbps to 192.168.1.100:9999
Date, Time, Packets received, Bytes received (headers included), Elapsed time (msec), Throughput (Kbps), Bottleneck BW, Available BW, RTT, BBSet, ABSet, RTTSet, ErrorCode
05/07/2009, 23:06:54, 421, 631500, 1014, 4982.249,,,,,,,
05/07/2009, 23:06:55, 422, 633000, 1014, 4994.083,,,,,,,
05/07/2009, 23:06:56, 423, 634500, 1014, 5005.917,,,,,,,
05/07/2009, 23:06:57, 422, 633000, 1014, 4994.083,,,,,,,
05/07/2009, 23:06:58, 423, 634500, 1014, 5005.917,,,,,,,
05/07/2009, 23:06:59, 422, 633000, 1014, 4994.083,,,,,,,
05/07/2009, 23:07:00, 423, 634500, 1014, 5005.917,,,,,,,
05/07/2009, 23:07:01, 422, 633000, 1014, 4994.083,,,,,,,
05/07/2009, 23:07:02, 423, 634500, 1014, 5005.917,,,,,,,
Time has elapsed, or CTRL+C has been pressed.
Stopping Source traffic, waiting 5 sec.
SenderThread is exiting...
SenderThread exited successfully.
WSACleanup successful.&lt;/pre&gt;

&lt;p&gt;&lt;u&gt;Sink&lt;/u&gt;&lt;/p&gt;

&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -sink -udp
Parsing command line...
Listening on all IP addresses.
WSAStartup successful.
Waiting for UDP traffic on port 9999, hit CTRL+C to exit...
WSARecvFrom completed.
Date, Time, Packets received, Bytes received (headers included), Elapsed time (msec), Throughput (Kbps), Message
05/07/2009, 23:06:54, 421, 631500, 1014, 4982.249,
05/07/2009, 23:06:55, 422, 633000, 1014, 4994.083,
05/07/2009, 23:06:56, 423, 634500, 1014, 5005.917,
05/07/2009, 23:06:57, 422, 633000, 1014, 4994.083,
05/07/2009, 23:06:58, 423, 634500, 1014, 5005.917,
05/07/2009, 23:06:59, 422, 633000, 1014, 4994.083,
05/07/2009, 23:07:00, 423, 634500, 1014, 5005.917,
05/07/2009, 23:07:01, 422, 633000, 1014, 4994.083,
05/07/2009, 23:07:02, 423, 634500, 1014, 5005.917,&lt;/pre&gt;

&lt;p&gt;You can see the throughput in Kbps from the last column, along with other information such as timestamp and bytes received. The QoS Traffic Generator can also support multiple TCP connections from one sink. The next example shows two TCP flows, one using qWave and one using TC (used to throttle traffic) sending to the same destination.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Source 1&lt;/u&gt;&lt;/p&gt;

&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -source -tcp -dest 192.168.1.100 -throttle 1000000 -qwave
Parsing command line...
qWave traffic type: Best effort
qWave flow type: non-adaptive.
qWave LLTD option: system choice.
qWave flow fundamentals: do not display
WSAStartup successful.
qWave started up successfully.
Send interval: not used, packets will be sent as fast as possible
Packets to send per interval: 1
Size of each packet: 1000
Statistics sampling interval (msec): 1000
Sending traffic at 1.00 Mbps to 192.168.1.100:9999
Date, Time, Packets received, Bytes received, Elapsed time (msec), Throughput (Kbps), Bottleneck BW, Available BW, RTT, BBSet, ABSet, RTTSet, ErrorCode
05/07/2009, 23:02:04, 129, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:05, 126, 126000, 1014, 994.083,,,,,,,
05/07/2009, 23:02:06, 125, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:07, 126, 126000, 1014, 994.083,,,,,,,
05/07/2009, 23:02:08, 124, 124000, 1014, 978.304,,,,,,,
05/07/2009, 23:02:09, 127, 127000, 1015, 1000.985,,,,,,,
05/07/2009, 23:02:10, 125, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:11, 126, 126000, 1014, 994.083,,,,,,,
05/07/2009, 23:02:12, 125, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:14, 124, 124000, 1014, 978.304,,,,,,,
05/07/2009, 23:02:15, 126, 126000, 1014, 994.083,,,,,,,
05/07/2009, 23:02:16, 127, 127000, 1014, 1001.972,,,,,,,
05/07/2009, 23:02:17, 125, 125000, 1014, 986.193,,,,,,,
05/07/2009, 23:02:18, 124, 124000, 1014, 978.304,,,,,,,
ERROR: 64 in GetQueuedCompletionStatus: The specified network name is no longer &lt;br /&gt;available.
SenderThread is exiting...
SenderThread exited successfully.
Stopping Source traffic, waiting 5 sec.
SenderThread exited successfully.
WSACleanup successful.&lt;/pre&gt;

&lt;p&gt;&lt;u&gt;Source 2&lt;/u&gt;&lt;/p&gt;

&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -source -tcp -dest 192.168.1.100 -throttle 2000000 -tc 40,4
Parsing command line...
WSAStartup successful.
Send interval: not used, packets will be sent as fast as possible
Packets to send per interval: 1
Size of each packet: 1000
Statistics sampling interval (msec): 1000
Sending traffic at 2.00 Mbps to 192.168.1.100:9999
Date, Time, Packets received, Bytes received, Elapsed time (msec), Throughput (Kbps), Bottleneck BW, Available BW, RTT, BBSet, ABSet, RTTSet, ErrorCode
05/07/2009, 23:01:59, 498, 498000, 1014, 3928.994,,,,,,,
05/07/2009, 23:02:00, 248, 248000, 1014, 1956.607,,,,,,,
05/07/2009, 23:02:01, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:02, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:03, 252, 252000, 1014, 1988.166,,,,,,,
05/07/2009, 23:02:04, 247, 247000, 1014, 1948.718,,,,,,,
05/07/2009, 23:02:05, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:07, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:08, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:09, 247, 247000, 1014, 1948.718,,,,,,,
05/07/2009, 23:02:10, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:11, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:12, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:13, 252, 252000, 1014, 1988.166,,,,,,,
05/07/2009, 23:02:14, 250, 250000, 1014, 1972.387,,,,,,,
05/07/2009, 23:02:15, 252, 252000, 1014, 1988.166,,,,,,,
05/07/2009, 23:02:16, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:17, 251, 251000, 1014, 1980.276,,,,,,,
05/07/2009, 23:02:18, 247, 247000, 1014, 1948.718,,,,,,,
ERROR: 64 in GetQueuedCompletionStatus: The specified network name is no longer &lt;br /&gt;available.
SenderThread is exiting...
SenderThread exited successfully.
Stopping Source traffic, waiting 5 sec.
SenderThread exited successfully.
WSACleanup successful.&lt;/pre&gt;

&lt;p&gt;&lt;u&gt;Sink&lt;/u&gt;&lt;/p&gt;

&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -sink -tcp
Parsing command line...
Listening on all IP addresses.
WSAStartup successful.
Waiting for TCP traffic on port 9999, hit CTRL+C to exit...
AcceptEx has successfully completed.
Overlapped AcceptEx signaled.
Connection received: ::ffff:157.59.28.243:56677 --&amp;gt; ::ffff:192.168.1.100:9999
Date, Time, Packets received, Bytes received, Elapsed time (msec), Throughput (Kbps), Message
05/07/2009, 23:01:59, 498, 498000, 1014, 3928.994,
05/07/2009, 23:02:00, 248, 248000, 1014, 1956.607,
05/07/2009, 23:02:01, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:02, 251, 251000, 1014, 1980.276,
Overlapped AcceptEx signaled.
Connection received: ::ffff:157.59.28.243:56678 --&amp;gt; ::ffff:192.168.1.100:9999
Date, Time, Packets received, Bytes received, Elapsed time (msec), Throughput (Kbps), Message
AcceptEx has successfully completed.
05/07/2009, 23:02:03, 252, 252000, 1014, 1988.166,
05/07/2009, 23:02:04, 129, 125000, 1014, 986.193,
05/07/2009, 23:02:04, 247, 247000, 1014, 1948.718,
05/07/2009, 23:02:05, 126, 126000, 1014, 994.083,
05/07/2009, 23:02:05, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:06, 125, 125000, 1014, 986.193,
05/07/2009, 23:02:07, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:07, 126, 126000, 1014, 994.083,
05/07/2009, 23:02:08, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:08, 124, 124000, 1014, 978.304,
05/07/2009, 23:02:09, 247, 247000, 1014, 1948.718,
05/07/2009, 23:02:09, 127, 127000, 1015, 1000.985,
05/07/2009, 23:02:10, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:10, 125, 125000, 1014, 986.193,
05/07/2009, 23:02:11, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:11, 126, 126000, 1014, 994.083,
05/07/2009, 23:02:12, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:12, 125, 125000, 1014, 986.193,
05/07/2009, 23:02:13, 252, 252000, 1014, 1988.166,
05/07/2009, 23:02:14, 124, 124000, 1014, 978.304,
05/07/2009, 23:02:14, 250, 250000, 1014, 1972.387,
05/07/2009, 23:02:15, 126, 126000, 1014, 994.083,
05/07/2009, 23:02:15, 252, 252000, 1014, 1988.166,
05/07/2009, 23:02:16, 127, 127000, 1014, 1001.972,
05/07/2009, 23:02:16, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:17, 125, 125000, 1014, 986.193,
05/07/2009, 23:02:17, 251, 251000, 1014, 1980.276,
05/07/2009, 23:02:18, 124, 124000, 1014, 978.304,
05/07/2009, 23:02:18, 247, 247000, 1014, 1948.718,
Event set, thread exiting.
Receive thread exiting.
ReceiverThread exited successfully.
Control Event or Stop() called. TCP receive thread is exiting.
Main receive thread exited successfully.
WSACleanup successful.&lt;/pre&gt;

&lt;p&gt;The sink prints out statistics from both sources and was stopped using CTRL+C after about 20 seconds. Both traffic sources then exit gracefully. A full list of options is shown below.&lt;/p&gt;

&lt;pre&gt;C:\qos&amp;gt;qostraffic.exe -?
Parsing command line...
Need to specify -source or -sink flag.

QoS Traffic Generator (Daytona), v. 1.0

Usage:

Sink: qostraffic -sink -tcp/-udp/-tcp_a &lt;br /&gt;                 [-dest destIP,destPort -local localIP,localPort] ...
Source: qostraffic -source -tcp/-udp/-tcp_a -dest destIP,destPort &lt;br /&gt;                   -throttle rate&lt;br /&gt;                   [-local localIP,localPort -duration sec] ...

Sink flags:
-tcp/-udp       Listens for TCP/UDP traffic
                default: listens on all addresses, port 9999
-tcp_a          Connects to source and then begins receiving traffic
                Source must also specify -tcp_a flag
                Note: start the source first, then the sink
-dest           OPTIONAL
                Destination address to connect to for -tcp_a
                Ignored for -tcp/-udp cases
-local          OPTIONAL
                Listens on specific local address/port
                default port: 9999
                Note: Can specify different port to listen on with,&lt;br /&gt;                      localPort only.
-qwave          OPTIONAL
                Starts up qWave service.
                Used for adaptive flows from the source.
-noconsole      OPTIONAL
                Suppresses console output
                default is not suppressed
Source flags:
-tcp/-udp       Listens for TCP/UDP traffic
-tcp_a          Accepts connection from sink then sends traffic
                Sink must also specify -tcp_a flag
                Note: start the source first, then the sink
-dest           Send traffic to destination address/port
                default port: 9999
                Note: ignored for -tcp_a case
-throttle       Throttles traffic at specified rate (bits/sec)
-pull           OPTIONAL
                Operates the source in pull mode.
                Note: supported for TCP traffic only.
-local          OPTIONAL
                Send traffic from specified local address/port
                default port: 9999
                Note: for -tcp_a case, this is the local address to &lt;br /&gt;                      listen on
-duration       OPTIONAL
                Send traffic for specified time (sec)
                default: infinite
-stats          OPTIONAL
                Prints out statistics for specified time (msec)
                default: 1000 msec
                minimum: 200 msec
-qwave          OPTIONAL
                Uses qWave with the specified options (all optional)
                &lt;traffictype&gt;,&lt;adaptive&gt;,&lt;lltd&gt;
                trafficType: traffic type defined by QoS subsystem
                        BE - best effort (default)
                        BCK - background
                        EE - excellent effort
                        AV - audio/video
                        VO - voice
                        CTRL - control
                adaptive: force use adaptive flow
                        default is nonadaptive
                lltd: force use LLTD packets
                        default lets system choose LLTD or not
                flowfund: prints out QueryFlowFundamentals
                        prints bandwidth estimations every 25 ms
                        only supported when using adaptive flows
                EXAMPLE: -qwave AV,LLTD
-server         Optional, when used with qWave will prevent doing &lt;br /&gt;                   QOSStartTracking/QOSStopTracking
                Note: conflicts with -tc flag.
-tc             OPTIONAL
                Uses TC with the specified options (all optional)
                &lt;dscp&gt;,&amp;lt;1p&amp;gt;
                dscp: DSCP value ranging from 0 to 63
                        default lets system choose
                1p: 802.1p tag ranging from 0 to 7
                        default lets system choose
                Specifying -1 for either value is equivalent to &lt;br /&gt;                default. EXAMPLE: -tc 40,4
                Note: conflicts with -qwave flag. Must be run as &lt;br /&gt;                      admin.
-packet         OPTIONAL
                Performs packet experiments with given options (all &lt;br /&gt;                required)
                &lt;size&gt;,&lt;num&gt;,&lt;interval&gt;
                size - size of each packet in bytes
                num - number of packets to send
                interval - time between each send in ms
                EXAMPLE: -packet 59,50,100
                This will send a 59 byte packet every 100 ms, 50 &lt;br /&gt;                times total.
                Note: packets can be tagged by using -tc options.
-log            OPTIONAL
                Logs to the specified file
                default filename: is &amp;quot;daytona_&lt;timestamp&gt;.txt&amp;quot;
-noconsole      OPTIONAL
                Suppresses console output
                default is not suppressed
-localstats     OPTIONAL
                Prints statistics from source
                default is sink side stats
                Note: conflicts with packet option, results will be &lt;br /&gt;                undefined
-tolerance      OPTIONAL
                Specify tolerance
                If no tolerance will assume 2%&lt;/pre&gt;

&lt;p&gt;Hopefully this post has been helpful in understanding what the QoS Traffic Generator can do. Please send us any comments you have!&lt;/p&gt;

&lt;p&gt;&amp;#160; -- Jim Liu&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9595311" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category></item><item><title>QoS Traffic Generator is now available on Connect</title><link>http://blogs.msdn.com/wndp/archive/2009/04/30/qos-traffic-generator-is-now-available-on-connect.aspx</link><pubDate>Fri, 01 May 2009 02:35:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9581533</guid><dc:creator>AriPernick</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/wndp/comments/9581533.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=9581533</wfw:commentRss><description>&lt;p&gt;&lt;em&gt;I’m posting on behalf of Jim Liu who is a SDET in Windows Core Networking. -- Ari&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;The QoS team is pleased to announce the availability of the QoS Traffic Generator on Microsoft Connect. This tool was developed during the Windows 7 development process and has been used extensively to aid in the testing of our QoS technologies. It is a command-line based tool that generates network traffic and utilizes TC/qWave to throttle and mark packets as desired. Some notable features include:&lt;/p&gt;  &lt;p&gt;· Ability to send traffic at a specified throughput using Winsock from one machine to another&lt;/p&gt;  &lt;p&gt;· Throttling is performed by the application itself or through QoS APIs (Traffic Control or qWave)&lt;/p&gt;  &lt;p&gt;· Support TCP and UDP dual-mode sockets&lt;/p&gt;  &lt;p&gt;· Provide traffic statistics from either the source machine or destination machine&lt;/p&gt;  &lt;p&gt;· Can be built as a static library for use in other applications&lt;/p&gt;  &lt;p&gt;We are providing this tool as a demonstration of QoS technologies and how they may be used to produce a novel application. Both 32 and 64-bit binaries are provided along with the source code and instructions for building the static library and the accompanying executable. The application itself has usage information on the available usage options.&lt;/p&gt;  &lt;p&gt;To download the package, go to the &lt;a href="http://connect.microsoft.com/wndp"&gt;WNDP site&lt;/a&gt; on Microsoft Connect and select Downloads from the left-hand menu. Select QoS Traffic Generator. Please send us any feedback you have about the tool!&lt;/p&gt;  &lt;p&gt;&amp;#160; -- Jim Liu&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9581533" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category></item><item><title>QoS in Windows 7</title><link>http://blogs.msdn.com/wndp/archive/2009/01/28/qos-in-windows-7.aspx</link><pubDate>Wed, 28 Jan 2009 03:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9379293</guid><dc:creator>charwen</dc:creator><slash:comments>13</slash:comments><comments>http://blogs.msdn.com/wndp/comments/9379293.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=9379293</wfw:commentRss><description>&lt;P&gt;Hello all. My name is Charley. I’m the new QoS program manager for Windows Core Networking. &lt;/P&gt;
&lt;P&gt;It has been a while since we posted our last article about QoS. We want to assure you that we’re still committed to improving this technology and building new QoS features in Windows. We received many questions and suggestions from you in the past. We hope you continue doing so because they are important to us.&lt;/P&gt;
&lt;P&gt;You probably all know that Windows 7 beta is live and available for you to download. You may wonder what is new in Windows 7 regarding QoS. But before getting to that, I’d like to refresh our memory as to what was new in Windows Vista. In Vista, we introduced two major QoS features: qWAVE and Policy based QoS. qWAVE, or Quality Windows Audio Video Experience, is designed to estimate the network bandwidth, intelligently mark the application packets (with proper DSCP values), and interact with the application in the event of network congestion or fluctuations of available bandwidth (so that the application can take appropriate actions). qWAVE APIs aim to simplify the work of application developers developing QoS-enabled applications for a home network. The APIs are documented in the Windows SDK. In contrast, Policy based QoS has a different target audience. It is intended to enable IT administrators to apply QoS to applications (which don’t need to have native supports of QoS), computers, and users in their enterprise network. It is especially beneficial to an organization with branch offices, where the WAN link capacity is limited and users tend to experience unpredictable network delays when accessing files or applications hosted on the main campus (or a different branch office). If you’d like to know more about these features, we’d suggest you read an excellent article written by Joseph Davies for TechNet magazine. Click &lt;A href="http://technet.microsoft.com/en-us/magazine/2007.02.cableguy.aspx"&gt;&lt;FONT color=#4271d6&gt;here&lt;/FONT&gt;&lt;/A&gt; to check it out.&lt;/P&gt;
&lt;P&gt;So what’s new in Windows 7? The enhancement we’ve made is called URL based QoS. If you’re familiar with Policy based QoS you know that in Vista an IT administrator can create a policy based on the application name, source and/or destination IP addresses, source and/or destination ports, and the protocol (TCP, UDP, or both). We’ve learned since then that many enterprise applications have been, or will be, hosted on web servers and accessed from a browser, so the IT administrators would love to be able to prioritize or control the network traffic &lt;I&gt;from&lt;/I&gt; those web-based applications, provided that a convenient configuration is available. To answer their request, we’ve added a new configuration option: you can create a policy based on the URL of an HTTP server. Say, you host all the training videos of your company on an IIS server running Windows 7 (or more precisely, Windows Server 2008 R2). You can then use a URL based QoS policy to throttle the video traffic (to prevent it from overwhelming your corporate network). Or, you host your company’s CRM or ERP applications on an HTTP application server running Windows 7. You can similarly use a URL based QoS policy to prioritize these applications traffic so that even users at a remote branch office always get prompt replies and have smooth UI experience.&lt;/P&gt;
&lt;P&gt;Does this sound interesting to you? Please let us know what you think. In the next blog, we’ll detail the configuration and the rules.&lt;/P&gt;
&lt;P&gt;Charley&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9379293" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category></item><item><title>Throttling, DSCP, and 802.1p with Traffic Control</title><link>http://blogs.msdn.com/wndp/archive/2007/11/14/throttling-dscp-and-802-1p-with-the-traffic-control-api.aspx</link><pubDate>Thu, 15 Nov 2007 02:07:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6231069</guid><dc:creator>wndpteam</dc:creator><slash:comments>19</slash:comments><comments>http://blogs.msdn.com/wndp/comments/6231069.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=6231069</wfw:commentRss><description>&lt;p&gt;&lt;font size="2"&gt;In his introductory post about the legacy &lt;a href="http://blogs.msdn.com/wndp/archive/2007/10/09/introduction-to-windows-qos-traffic-control.aspx" target="_blank"&gt;Traffic Control (TC) API&lt;/a&gt;, Gabe discussed the host-based model that TC provides. In this post, we will see how Traffic Control APIs can be used to achieve the following for TCP/IPv4 and UDP/IPv4 traffic sent from a host:&lt;/font&gt; &lt;ul&gt; &lt;li&gt;&lt;font size="2"&gt;Throttle (rate-limit) outgoing traffic&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font size="2"&gt;Add DSCP value in layer-3 (IPv4) header&lt;/font&gt;&lt;/li&gt; &lt;li&gt;&lt;font size="2"&gt;Indicate that an 802.1p tag value should be added in layer-2 header&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;font size="2"&gt;At the bottom of the post, we’ve provided a link to the Networking Connect site to download full source and binaries to a tool which implements all of the above functionality.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;The following are the steps involved:&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;1. The first step in the process is to obtain a handle to the Traffic Control subsystem through a call to &lt;i&gt;TcRegisterClient()&lt;/i&gt;.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;2. Next, make a call to &lt;i&gt;TcEnumerateInterfaces()&lt;/i&gt; using the registration handle obtained in step #1. This call returns a list of all TC enabled interfaces on the system. Iterate through the list to find the interface(s) on which you want to prioritize and/or throttle outgoing traffic.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;3. For each interface of interest, issue a &lt;i&gt;TcOpenInterface()&lt;/i&gt; using the &lt;i&gt;pInterfaceName&lt;/i&gt; from the corresponding &lt;i&gt;TC_IFC_DESCRIPTOR&lt;/i&gt; for that interface from the list returned in step#2. Store the handle returned by &lt;i&gt;TcOpenInterface()&lt;/i&gt;; let’s call it the &lt;i&gt;ifchandle&lt;/i&gt;.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;4. At this point, create a TC Flow and add it to the interface(s) of interest.&lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;a. Create the TC Flow:&lt;br&gt;A TC flow is a way of describing various QoS characteristics to be applied to a set of packets and is represented by a &lt;i&gt;TC_GEN_FLOW&lt;/i&gt; structure. The following code snippet shows how to create a TC Flow given the DSCP value, 802.1p value and the throttle rate. &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;BOOL CreateFlow(PTC_GEN_FLOW * _ppTcFlowObj, USHORT DSCPValue, USHORT OnePValue, ULONG ThrottleRate)&lt;br&gt;{&lt;br&gt;&amp;nbsp; BOOL status = FALSE; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Flow Parameters&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; ULONG TokenRate = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG TokenBucketSize = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG PeakBandwidth = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG Latency = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG DelayVariation = QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; SERVICETYPE ServiceType = SERVICETYPE_BESTEFFORT;&lt;br&gt;&amp;nbsp; ULONG MaxSduSize=QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; ULONG MinimumPolicedSize=QOS_NOT_SPECIFIED;&lt;br&gt;&amp;nbsp; PVOID pCurrentObject;&lt;br&gt;&amp;nbsp; PTC_GEN_FLOW _pTcFlowObj = NULL;&lt;br&gt;&amp;nbsp; int Length = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Calculate the memory size required for the optional TC objects&lt;br&gt;&amp;nbsp; // &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; Length += (OnePValue == NOT_SPECIFIED ? 0:sizeof(QOS_TRAFFIC_CLASS)) + (DSCPValue == NOT_SPECIFIED ? 0:sizeof(QOS_DS_CLASS)); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Print the Flow parameters&lt;br&gt;&amp;nbsp; // &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; printf("Flow Parameters:\n");&lt;br&gt;&amp;nbsp; DSCPValue == NOT_SPECIFIED ? printf("\tDSCP: *\n"):printf("\tDSCP: %u\n", DSCPValue);&lt;br&gt;&amp;nbsp; OnePValue == NOT_SPECIFIED ? printf("\t802.1p: *\n"):printf("\t802.1p: %u\n", OnePValue);&lt;br&gt;&amp;nbsp; ThrottleRate == QOS_NOT_SPECIFIED ? printf("\tThrottleRate: *\n"):printf("\tThrottleRate: %u\n", ThrottleRate);&lt;br&gt;&amp;nbsp; TokenRate = TokenBucketSize = ThrottleRate; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Allocate the flow descriptor&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; _pTcFlowObj = (PTC_GEN_FLOW)malloc(FIELD_OFFSET(TC_GEN_FLOW, TcObjects) + Length); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if (!_pTcFlowObj) &lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Flow Allocation Failed\n");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit;&lt;br&gt;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.TokenRate = TokenRate;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.TokenBucketSize = TokenBucketSize;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.PeakBandwidth = PeakBandwidth;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.Latency = Latency;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.DelayVariation = DelayVariation;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.ServiceType = ServiceType;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.MaxSduSize = MaxSduSize;&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;SendingFlowspec.MinimumPolicedSize = MinimumPolicedSize; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Currently TC only supports QoS on the send path&lt;br&gt;&amp;nbsp; // ReceivingFlowSpec is legacy and ignored&lt;br&gt;&amp;nbsp; // &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; memcpy(&amp;amp;(_pTcFlowObj-&amp;gt;ReceivingFlowspec), &amp;amp;(_pTcFlowObj-&amp;gt;SendingFlowspec), sizeof(_pTcFlowObj-&amp;gt;ReceivingFlowspec));&lt;br&gt;&amp;nbsp; _pTcFlowObj-&amp;gt;TcObjectsLength = Length; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Add any requested objects&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; pCurrentObject = (PVOID)_pTcFlowObj-&amp;gt;TcObjects;&lt;br&gt;&amp;nbsp; if(OnePValue != NOT_SPECIFIED)&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QOS_TRAFFIC_CLASS *pTClassObject = (QOS_TRAFFIC_CLASS*)pCurrentObject;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTClassObject-&amp;gt;ObjectHdr.ObjectType = QOS_OBJECT_TRAFFIC_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTClassObject-&amp;gt;ObjectHdr.ObjectLength = sizeof(QOS_TRAFFIC_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pTClassObject-&amp;gt;TrafficClass = OnePValue; //802.1p tag to be used&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCurrentObject = (PVOID)(pTClassObject + 1);&lt;br&gt;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(DSCPValue != NOT_SPECIFIED)&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QOS_DS_CLASS *pDSClassObject = (QOS_DS_CLASS*)pCurrentObject;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDSClassObject-&amp;gt;ObjectHdr.ObjectType = QOS_OBJECT_DS_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDSClassObject-&amp;gt;ObjectHdr.ObjectLength = sizeof(QOS_DS_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pDSClassObject-&amp;gt;DSField = DSCPValue; //Services Type&lt;br&gt;&amp;nbsp; } &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; DeleteFlow(_ppTcFlowObj);&lt;br&gt;&amp;nbsp; *_ppTcFlowObj = _pTcFlowObj;&lt;br&gt;&amp;nbsp; status = TRUE;&lt;br&gt;&amp;nbsp; Exit: &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(!status)&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Flow Creation Failed\n");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFlow(&amp;amp;_pTcFlowObj);&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Flow Creation Succeeded\n"); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; return status;&lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;b. Add the Flow on the interface:&lt;br&gt;After obtaining a &lt;i&gt;TC_GEN_FLOW&lt;/i&gt; structure with the desired characteristics using a function similar to the one above, issue a call to &lt;i&gt;TcAddFlow()&lt;/i&gt; with the &lt;i&gt;ifchandle &lt;/i&gt;(obtained in step #3) and a pointer to the &lt;i&gt;TC_GEN_FLOW&lt;/i&gt; object (obtained in step #4a). Store the handle returned by &lt;i&gt;TcAddFlow()&lt;/i&gt;;let’s call it the &lt;i&gt;flowhandle&lt;/i&gt;.&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="v" size="2"&gt;5. The next step is to create a TC Filter and add it to the TC Flow created above. &lt;/font&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="v" size="2"&gt;a. Create the TC Filter:&lt;br&gt;A TC Filter is a way of describing which packets to apply the QoS characteristics to. The QoS characteristics defined in the &lt;i&gt;TC_GEN_FLOW&lt;/i&gt; will only apply to the packets matching the filter(s) associated with the Flow. &lt;br&gt;The following code snippet describes how to create a TC Filter given the destination address, the destination port, and the protocol (TCP,UDP or IP).&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;font face="v"&gt;BOOL CreateFilter(PTC_GEN_FILTER&lt;/font&gt; * ppFilter, SOCKADDR_STORAGE Address, USHORT Port, UCHAR ProtocolId)&lt;br&gt;{ &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; BOOL status = FALSE;&lt;br&gt;&amp;nbsp; USHORT AddressFamily = Address.ss_family;&lt;br&gt;&amp;nbsp; PTC_GEN_FILTER pFilter = NULL;&lt;br&gt;&amp;nbsp; PIP_PATTERN pPattern = NULL;&lt;br&gt;&amp;nbsp; PIP_PATTERN pMask = NULL; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(AddressFamily != AF_INET)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Allocate memory for the filter&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; pFilter = (PTC_GEN_FILTER)malloc(sizeof (TC_GEN_FILTER));&lt;br&gt;&amp;nbsp; if(!pFilter)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; ZeroMemory(pFilter, sizeof(TC_GEN_FILTER)); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Allocate memory for the pattern and mask&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; pPattern = (PIP_PATTERN)malloc( sizeof(IP_PATTERN));&lt;br&gt;&amp;nbsp; pMask = (PIP_PATTERN)malloc( sizeof(IP_PATTERN));&lt;br&gt;&amp;nbsp; if(!pPattern || !pMask)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto Exit; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; memset ( pPattern, 0, sizeof(IP_PATTERN) );&lt;br&gt;&amp;nbsp; pPattern-&amp;gt;DstAddr = ((SOCKADDR_IN *)&amp;amp;Address)-&amp;gt;sin_addr.s_addr;&lt;br&gt;&amp;nbsp; pPattern-&amp;gt;tcDstPort = htons(Port);&lt;br&gt;&amp;nbsp; pPattern-&amp;gt;ProtocolId = ProtocolId;&lt;br&gt;&amp;nbsp; memset ( pMask, (ULONG) -1, sizeof(IP_PATTERN) ); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Set the source address and port to wildcard&lt;br&gt;&amp;nbsp; // 0 -&amp;gt; wildcard, 0xFF-&amp;gt; exact match &lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; pMask-&amp;gt;SrcAddr = 0;&lt;br&gt;&amp;nbsp; pMask-&amp;gt;tcSrcPort = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // if the user specified 0 for dest port, dest address or protocol&lt;br&gt;&amp;nbsp; // set the appropriate mask as wildcard&lt;br&gt;&amp;nbsp; // 0 -&amp;gt; wildcard, 0xFF-&amp;gt; exact match &lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; if(pPattern-&amp;gt;tcDstPort == 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMask-&amp;gt;tcDstPort = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(pPattern-&amp;gt;ProtocolId == 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMask-&amp;gt;ProtocolId = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; if(pPattern-&amp;gt;DstAddr == 0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pMask-&amp;gt;DstAddr = 0; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; pFilter-&amp;gt;AddressType = NDIS_PROTOCOL_ID_TCP_IP;&lt;br&gt;&amp;nbsp; pFilter-&amp;gt;PatternSize = sizeof(IP_PATTERN);&lt;br&gt;&amp;nbsp; pFilter-&amp;gt;Pattern = pPattern;&lt;br&gt;&amp;nbsp; pFilter-&amp;gt;Mask = pMask; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; // Delete any previous instances of the Filter&lt;br&gt;&amp;nbsp; //&lt;br&gt;&amp;nbsp; DeleteFilter(ppFilter);&lt;br&gt;&amp;nbsp; *ppFilter = pFilter;&lt;br&gt;&amp;nbsp; status = TRUE; &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; Exit:&lt;br&gt;&amp;nbsp; if(!status)&lt;br&gt;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Filter Creation Failed\n");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteFilter(&amp;amp;pFilter);&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Filter Creation Succeeded\n"); &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" size="2"&gt;&amp;nbsp; return status; &lt;br&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;b. Adding the Filter to the TC Flow:&lt;br&gt;Once a TC Filter structure is obtained using a function similar to the one above, issue a call to &lt;i&gt;TcAddFilter()&lt;/i&gt; passing the &lt;i&gt;flowhandle&lt;/i&gt; obtained in step #4b and a pointer to the &lt;i&gt;TC_GEN_FILTER&lt;/i&gt; structure obtained in step #5a. Store the filter handle returned by &lt;i&gt;TcAddFilter()&lt;/i&gt;;&lt;i&gt; &lt;/i&gt;let’s call it &lt;i&gt;filterhandle&lt;/i&gt;.&lt;br&gt;You can add multiple filters on the same flow causing different sets of packets matching each filter to get the same QoS characteristics applied to them. &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;6. At this point, your application is applying QoS on all matching outgoing packets as specified in the TC Filter and TC Flow. Finally, once your purpose is served, make sure you call the respective close calls on all the open TC handles – &lt;i&gt;TcDeletefilter()&lt;/i&gt;, &lt;i&gt;TcDeleteFlow()&lt;/i&gt;, &lt;i&gt;TcCloseInterface()&lt;/i&gt; and &lt;i&gt;TcDeregisterClient()&lt;/i&gt;.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;You can download the full source and binaries of a simple command line tool – tcmonlite, which takes the filter and flow parameters as input, creates TC Flow and Filter, and configures the QoS subsystem with them using the Traffic Control API. All the outgoing traffic on the system matching the filter gets the desired QoS characteristics as long as tcmonlite is running. G&lt;/font&gt;&lt;font size="2"&gt;o to the &lt;/font&gt;&lt;a href="http://connect.microsoft.com/"&gt;&lt;font size="2"&gt;Microsoft Connect&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; website, choose &lt;i&gt;Available Connections &lt;/i&gt;on the left-hand side of the page, and select &lt;i&gt;Windows Networking &lt;/i&gt;from the available connections (bottom half of the page). On the left-hand side of the &lt;i&gt;Windows Networking &lt;/i&gt;page, choose &lt;i&gt;Downloads&lt;/i&gt;, and select &lt;em&gt;TCMonLite&lt;/em&gt;.&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;This tool can be used in conjunction with the &lt;a href="http://blogs.msdn.com/wndp/archive/2007/09/14/detecting-802-1p-priority-tags-part-3.aspx" target="_blank"&gt;NDIS LWF driver&lt;/a&gt; to detect 802.1p tags in the Ethernet header and DSCP in the IP header of packets. Let us know what you think!&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;-- Hemant Banavar&amp;nbsp; &lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6231069" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category></item><item><title>Introduction to Windows QoS Traffic Control</title><link>http://blogs.msdn.com/wndp/archive/2007/10/09/introduction-to-windows-qos-traffic-control.aspx</link><pubDate>Tue, 09 Oct 2007 21:05:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5384320</guid><dc:creator>wndpteam</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/wndp/comments/5384320.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=5384320</wfw:commentRss><description>&lt;p&gt;&lt;font size="2"&gt;Disclaimer: Traffic Control (TC) APIs have been marked as &lt;a href="http://blogs.msdn.com/wndp/archive/2006/07/05/657196.aspx" target="_blank"&gt;deprecated&lt;/a&gt;, and will be phased out (eventually removed) when a suitable replacement API is available. &lt;u&gt;No&lt;/u&gt; advancements will be made to these APIs (including adding IPv6 support) in their deprecated state; however, application compatibility will be maintained until their eventual removal.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;Since the introduction of a QoS platform in Windows 2000, there have been two models for applying prioritization and/or send-rate throttling to TCP/IP and UDP/IP network traffic sent from a Windows PC: host-based and application-based. These terms have been used in QoS documentation such as this recent &lt;a href="http://blogs.msdn.com/wndp/archive/2007/02/02/Windows_5F00_QoS_5F00_Support.aspx" target="_blank"&gt;CableGuy article&lt;/a&gt;; however, I acknowledge the meaning of these terms are not immediately obvious. &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;An application-based model means only the application which owns the socket handle can add/remove/modify a QoS flow for its traffic. Because the application sending data onto the wire (or air) is applying throttling or priority to its own traffic (the connected socket), no elevation of privileges is required. A host-based model means some other process (not the application sending traffic through the socket) on the PC is applying prioritization or throttling to this traffic it doesn't own. Because the process doesn't own the socket handle, elevation of privileges (administrator) is required. While it is certainly possible for the process that owns the socket handle to leverage a host-based model, the added complexity is unnecessary considering socket-based QoS APIs are available for this purpose. &lt;/font&gt;&lt;font size="2"&gt;A host-based model is a much more complex model than application-based for the following reasons:&lt;/font&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;font size="2"&gt;The process applying QoS properties to traffic it doesn't own has to run as a service or some other out-of-band means&lt;/font&gt; (in typical use cases) &lt;li&gt;&lt;font size="2"&gt;Administrative privileges are required&lt;/font&gt;  &lt;li&gt;&lt;font size="2"&gt;Because the socket handle is not known, a filter has to be applied to match the traffic of interest, based on: source/destination IPv4 address, source/destination port, and protocol (TCP or UDP)&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;font size="2"&gt;In Windows, only the Traffic Control (traffic.h/traffic.dll) interface provides programmatic access to a host-based model. T&lt;/font&gt;&lt;font size="2"&gt;here is value gained from this complexity; however. Because this API requires administrative privileges, the caller can specify any arbitrary layer-2 (802.1p) or layer-3 (DSCP) priority value; whereas application-based API models abstract specific priority values with traffic-classes based on established industry standards. It is worth noting that a&lt;/font&gt;&lt;font size="2"&gt; new &lt;a href="http://blogs.msdn.com/wndp/archive/2006/06/30/653047.aspx" target="_blank"&gt;policy-based&lt;/a&gt; feature has been added to Windows Vista and Windows Server 2008 which enables a host-based model for IT administrators (no coding necessary), which enables significantly richer classification than what TC provides. Policy-based QoS; however, does not provide programmatic access and does not allow for setting layer-2 802.1p tags, only layer-3 DSCP.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;Innovation has been focused on application-based APIs such as qWAVE (qos2.h/qwave.dll) to significantly simplify *&lt;a href="http://blogs.msdn.com/wndp/archive/2005/10/24/484444.aspx" target="_blank"&gt;safely&lt;/a&gt;* adding prioritization and throttling to traffic, as well as policy-based mechanisms for host-based needs.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;Stay tuned for follow-up posts on how to use TC for adding 802.1p tags to the Ethernet header, DSCP to the IPv4 header, and applying throttling to outgoing traffic.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2"&gt;-- Gabe Frost&lt;/font&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5384320" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category></item><item><title>WiFi WMM Requirements for Vista Miniport Drivers</title><link>http://blogs.msdn.com/wndp/archive/2007/09/18/wifi-wmm-requirements-for-vista-miniport-drivers.aspx</link><pubDate>Tue, 18 Sep 2007 18:00:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4967008</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/4967008.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=4967008</wfw:commentRss><description>&lt;p&gt;&lt;font size="2"&gt;A number of partners who author wireless drivers for Vista have asked how they can ensure their WiFi Wireless Multimedia (WMM) implementation is correct, so I thought I'd be explicit about this very important topic. To begin, read the 4-part series &lt;/font&gt;&lt;a href="http://blogs.msdn.com/wndp/archive/2006/06/28/650363.aspx" target="_blank"&gt;&lt;font size="2"&gt;WiFi QoS Support in Windows Vista&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt;, which describes how Vista internally indicates a WMM Access Category (WMM_AC), how to detect whether an Access Point supports this capability, and how to observe the behavior of prioritized traffic. Next, be sure you explicitly validate your driver does the following:&lt;/font&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;font size="2"&gt; &lt;p&gt;&lt;font size="2"&gt;Confirm the QoS header exists in 802.11 data frames when DSCP and 802.1p are set independently:&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;DSCP [56, 48, 40, 32, 24, 16, 8, 0]&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;802.1p [7, 6, 5, 4, 3, 2, 1, 0]&lt;/font&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Ensure the miniport indicates &lt;em&gt;NDIS_MAC_OPTION_8021P_PRIORITY&lt;/em&gt; in &lt;em&gt;OID_GEN_MAC_OPTIONS&lt;/em&gt;&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Miniport behavior on receive:&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;If WMM/11e header is stripped, WMM bit in &lt;em&gt;FrameControlSubtype&lt;/em&gt; must be cleared&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;If WMM/11e header is not stripped, WMM bit in &lt;em&gt;FrameControlSubtype&lt;/em&gt; must *&lt;b&gt;not&lt;/b&gt;* be cleared&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Must *&lt;b&gt;not&lt;/b&gt;* strip 802.1Q tag in SNAP header (nwifi.sys will strip if necessary&lt;/font&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Miniport behavior on transmit:&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;font size="2"&gt;Only use &lt;em&gt;NDIS_NET_BUFFER_LIST_8021Q_INFO.WMMInfo&lt;/em&gt; field to ascertain correct WMM_AC (*&lt;b&gt;not&lt;/b&gt;* &lt;em&gt;UserPriority&lt;/em&gt;, or IP DSCP field)&lt;/font&gt;&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;font size="2"&gt; &lt;p&gt;&lt;font size="2"&gt;Must not strip 802.1Q tag in SNAP header (may be added by nwifi.sys)&lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;font size="2"&gt; &lt;p&gt;-- Gabe Frost&lt;/font&gt;&lt;font size="2"&gt;&lt;/p&gt;&lt;/font&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4967008" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/ndis/default.aspx">ndis</category></item><item><title>Detecting 802.1p Priority Tags: Part 3</title><link>http://blogs.msdn.com/wndp/archive/2007/09/14/detecting-802-1p-priority-tags-part-3.aspx</link><pubDate>Sat, 15 Sep 2007 01:39:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4918303</guid><dc:creator>wndpteam</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/wndp/comments/4918303.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=4918303</wfw:commentRss><description>&lt;p&gt;Parts &lt;a href="http://blogs.msdn.com/wndp/archive/2007/09/07/detecting-802-1p-priority-tags.aspx" target="_blank"&gt;1&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/wndp/archive/2007/09/13/detecting-802-1p-priority-tags-part-2.aspx" target="_blank"&gt;2&lt;/a&gt; of this series discussed how to determine whether an 802.1p tag was added to traffic, and how to modify the NDIS light-weight-filter (LWF) sample driver source code to accomplish this task. We do know that you're all very busy and not everyone is a developer, so we've added to the package: full source code for the complete filter driver, a command-line tool for accessing the filtered packets, and compiled binaries for you non-developers. We also added the ability to validate *both* 802.1p and DSCP (from the IPv4/IPv6 header). This additional package was added to the existing download, so if you haven't already read part-2 of this series, do so now and you'll find download instructions there. For installation instructions, read the README file in the zip archive. &lt;/p&gt; &lt;p&gt;What do you think? Is this approach (source and tools) helpful? We do actively monitor the &lt;a href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=825&amp;amp;siteid=1" target="_blank"&gt;QoS forum&lt;/a&gt;, so let us know how we can improve your understanding of Windows QoS capabilities.&lt;/p&gt; &lt;p&gt;-- Gabe Frost&lt;/p&gt; &lt;p&gt;-- Huge thanks to Hemant Banavar who authored the tools&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4918303" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/ndis/default.aspx">ndis</category></item><item><title>Detecting 802.1p Priority Tags: Part 2</title><link>http://blogs.msdn.com/wndp/archive/2007/09/13/detecting-802-1p-priority-tags-part-2.aspx</link><pubDate>Fri, 14 Sep 2007 02:43:33 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4902488</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/4902488.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=4902488</wfw:commentRss><description>&lt;p&gt;&lt;font size="2"&gt;In Gabe’s last post on detecting 802.1p priority tags, he described at a relatively high-level why it is difficult to detect a priority tag using packet tracing applications, as well as the proper way to determine whether a tag was present in a packet that was sent onto the wire (or air). In this post, I’ll describe how to programmatically access this information by modifying the NDIS Light Weight Filter (LWF) sample driver found in the &lt;/font&gt;&lt;a href="http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx"&gt;&lt;font size="2"&gt;Windows Driver Kit&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; (WDK). To begin, download and install the WDK and navigate to the LWF sample found in the &lt;i&gt;WinDDK\6000\src\network\ndis\filter&lt;/i&gt; directory. The remainder of this post will describe how to modify this sample to gain access to the &lt;i&gt;UserPriority&lt;/i&gt; value in the out-of-band (OOB) data of a Net Buffer List (NBL) structure, and whether the miniport driver actually stripped the 1Q tag from the Ethernet header like it was supposed to. Based on what part-1 of this series describes about driver (miniport/LWF) layering and framing details, the modified driver will inspect received packets (meaning the sender added the tag to outgoing traffic).&lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;The source file in the LWF sample of particular interest is &lt;i&gt;filter.c&lt;/i&gt;, where we’ll modify the &lt;i&gt;FilterReceiveNetBufferLists() &lt;/i&gt;function. &lt;i&gt;FilterReceiveNetBufferLists() &lt;/i&gt;is an optional function for filter drivers, which if provided, processes receive indications made by the underlying miniport or filter drivers beneath in the stack. If this handler is &lt;i&gt;NULL&lt;/i&gt;, NDIS will skip calling this filter when processing a receive indication and will call the next filter (or protocol driver) above in the stack with a non-&lt;i&gt;NULL&lt;/i&gt; &lt;i&gt;FilterReceiveNetBufferLists &lt;/i&gt;handler. The remainder of this post goes into detail about which areas of &lt;i&gt;filter.c &lt;/i&gt;need to be modified.&lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;To begin, let’s explore how to access the received packets in this function so they can be inspected. The second parameter to the function, &lt;i&gt;NetBufferLists, &lt;/i&gt;is a linked list of &lt;i&gt;NetBufferList &lt;/i&gt;structures allocated by the underlying driver. Each &lt;i&gt;NetBufferList &lt;/i&gt;contains one &lt;i&gt;NetBuffer &lt;/i&gt;structure, which represents a received packet. This means, in order to inspect each packet in the &lt;i&gt;NetBufferLists &lt;/i&gt;linked list, we need a loop of the following kind within &lt;i&gt;FilterReceiveNetBufferLists():&lt;/i&gt;&lt;/font&gt;  &lt;blockquote&gt; &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;if (pFilter-&amp;gt;TrackReceives) &lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;{&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILTER_ACQUIRE_LOCK(&amp;amp;pFilter-&amp;gt;Lock, DispatchLevel);&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pFilter-&amp;gt;OutstandingRcvs += NumberOfNetBufferLists;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ref = pFilter-&amp;gt;OutstandingRcvs;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currNbl = NetBufferLists;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(currNbl)&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman"&gt;&lt;font color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Call the function to parse the packet in each &lt;/font&gt;&lt;/font&gt; &lt;p&gt;&lt;font face="Times New Roman"&gt;&lt;font color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NetBufferList (one net buffer per NBL )&lt;/font&gt;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inspectNetBuffer(currNbl, pFilter);&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currNbl = currNbl-&amp;gt;Next;&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILTER_LOG_RCV_REF(1, pFilter, NetBufferLists, Ref);&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FILTER_RELEASE_LOCK(&amp;amp;pFilter-&amp;gt;Lock, DispatchLevel);&lt;/font&gt;  &lt;p&gt;&lt;font face="Times New Roman" color="#000000" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;In the above code snippet, observe that the loop is run only if &lt;i&gt;pFilter-&amp;gt;TrackReceives &lt;/i&gt;is &lt;i&gt;TRUE&lt;/i&gt;. The idea here is to only inspect packets if the user requests the driver to do receive-side inspections (our focus is on a debugging tool). The &lt;i&gt;TrackReceives &lt;/i&gt;flag can be set to &lt;i&gt;FALSE &lt;/i&gt;at &lt;i&gt;FilterAttach&lt;/i&gt; and can be set to &lt;i&gt;TRUE &lt;/i&gt;through an IOCTL. Look at the &lt;i&gt;FilterDeviceIoControl() &lt;/i&gt;function in &lt;i&gt;device.c &lt;/i&gt;for defining IOCTLs. &lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;Now that we have a pointer to the &lt;i&gt;NetBufferList &lt;/i&gt;structure which holds the packet information, let’s explore how to inspect the packet for the 802.1p tag (note you could also inspect the IPv4 or IPv6 header for DSCP here if you really wanted). The &lt;i&gt;inspectNetBuffer&lt;/i&gt; function in the above code snippet starts by extracting the &lt;i&gt;NetBuffer &lt;/i&gt;pointer from the &lt;i&gt;NetBufferList&lt;/i&gt;. Please see the bottom of this post for instructions on where to download the full implementation of this function. Next, if an 802.1p tag is available in the OOB data, it is extracted and stored in the variable called &lt;i&gt;UserPriority &lt;/i&gt;as follows:&lt;/font&gt;  &lt;blockquote&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;if (NET_BUFFER_LIST_INFO&lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;(pNetBufferList, Ieee8021QNetBufferListInfo) != 0) &lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;{ &lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ndis8021QInfo.Value = NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo); &lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserPriority = (UCHAR)Ndis8021QInfo.TagHeader.UserPriority; &lt;/font&gt; &lt;p&gt;&lt;font face="times" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="2"&gt;At this point, a pointer to the start of the packet is obtained and stored in &lt;i&gt;packetBuffer&lt;/i&gt;. The Ethernet header is parsed and &lt;i&gt;RecdUnStrippedPackets &lt;/i&gt;(which is initialized to zero at the beginning before starting to track received packets) is incremented if it is found that the Ethernet header still contains the 802.1p tag - indicating the underlying miniport did not strip the tag as per NDIS documentation.&lt;/font&gt;  &lt;p&gt;&lt;font size="2"&gt;To download the full implementation of &lt;i&gt;inspectNetBuffer()&lt;/i&gt;, as used to do the majority of parsing work, go to &lt;/font&gt;&lt;a href="http://connect.microsoft.com/"&gt;&lt;font size="2"&gt;Microsoft Connect&lt;/font&gt;&lt;/a&gt;&lt;font size="2"&gt; website and login using your passport account (create one if you don’t already have one). Once you have logged in, choose &lt;i&gt;Available Connections &lt;/i&gt;on the left-hand side of the page, and select &lt;i&gt;Windows Networking &lt;/i&gt;from the available connections (bottom half of the page). On the left-hand side of the &lt;i&gt;Windows Networking &lt;/i&gt;page, choose &lt;i&gt;Downloads&lt;/i&gt;, and select &lt;i&gt;NDIS LWF Sample With Packet Priority Detection&lt;/i&gt;.&lt;/font&gt;  &lt;p&gt;-- Hemant Banavar&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4902488" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/ndis/default.aspx">ndis</category></item><item><title>Detecting 802.1p Priority Tags</title><link>http://blogs.msdn.com/wndp/archive/2007/09/07/detecting-802-1p-priority-tags.aspx</link><pubDate>Fri, 07 Sep 2007 17:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4797810</guid><dc:creator>wndpteam</dc:creator><slash:comments>12</slash:comments><comments>http://blogs.msdn.com/wndp/comments/4797810.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=4797810</wfw:commentRss><description>&lt;P&gt;&lt;FONT size=2&gt;Consider a case where a network application calls Windows QoS APIs to add a layer-2 IEEE 802.1Q UserPriority tag (almost always referred to as &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;A href="http://blogs.msdn.com/wndp/archive/2006/01/09/511020.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2006/01/09/511020.aspx"&gt;802.1p&lt;/A&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;) to outgoing traffic. Ascertaining whether the tag actually got added to an outgoing packet is not as simple as it seems due to the nature of how the Windows network stack is designed, and how framing actually occurs. From an internal implementation perspective, The QoS Packet Scheduler (Pacer.sys in Vista/2008 Server, and Psched.sys in XP/2003 Server) in the network stack merely updates an out-of-band structure (not the actual formed packet) that an 802.1Q UserPriority tag should be added. The specific NDIS structure is &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;A class="" href="http://msdn2.microsoft.com/en-us/library/bb245890.aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/library/bb245890.aspx"&gt;NDIS_NET_BUFFER_LIST_8021Q_INFO&lt;/A&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;, which contains member variables for both VlanID and UserPriority, and is passed to the NDIS miniport driver for implementing both priority tagging (UserPriority) and VLAN (VlanId). It is up to the NDIS miniport driver to actually insert the 802.1Q tag into the frame based on these values before transmitting on the wire. A miniport driver will only insert this tag if the feature is supported and enabled in the advanced properties of the NIC driver; typically layer-2 priority tagging is disabled by default.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;From a network stack layering perspective, it’s important to understand that Pacer.sys is an NDIS Lightweight Filter (LWF) driver, and will always be inserted above a miniport driver, which will always be the lowest network software in the stack because it communicates directly with the NIC hardware. Also note that network sniffing applications like NetMon and WireShark are also network stack filters, and will always be inserted above the miniport driver. This is important knowledge because it should be clear that taking a network sniff of traffic on the sending PC will never show the tag in a packet (because the tag gets added below the sniffing software). Also,&amp;nbsp;the QoS Packet Scheduler can't know for absolute certainty whether the miniport driver added the tag to the outgoing&amp;nbsp;packet.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;What about trying to do a network sniff on the receiving PC? Good question, but also will show the layer-2 tag not present in packets. The reason for this is NDIS developer documentation clearly states that miniport drivers must strip the tag when received, and populate the NDIS_NET_BUFFER_LIST_8021Q_INFO UserPriority and VlanId fields with the values in the tag. This out-of-band structure can then be used by NDIS filter drivers higher up in the stack for implementing these features. The functional reason for stripping the layer-2 tag is because Tcpip.sys will drop any received packet that contains this tag. Therefore, if a misbehaving miniport driver does not strip the tag, the packet will never be received by the user-mode application because it will be dropped internally.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;In conclusion:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size=2&gt;A network sniffing app on the sending PC will never see a tag&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size=2&gt;A network sniffing app on the receiving PC will never see a tag &lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size=2&gt;Unless the miniport driver is misbehaving, which will result in dropped packets&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI&gt;&lt;FONT size=2&gt;Monitoring tagged packets from intermediate network elements (such as a switch) is hard if at all possible&lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size=2&gt;Perhaps a clever SNMP counter could be used, but would depend on the device manufacturer&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT size=2&gt;If you have not came to this conclusion already, the only way to determine whether a layer-2 tag got added on the sending PC and/or received by the receiving PC is to monitor the NDIS_NET_BUFFER_LIST_8021Q_INFO.UserPriority field. Stay tuned for a follow-up post which describes how to do this.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;-- Gabe Frost&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4797810" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category></item><item><title>Windows Rally Demo'd at WinHEC</title><link>http://blogs.msdn.com/wndp/archive/2007/05/16/windows-rally-demo-at-winhec.aspx</link><pubDate>Wed, 16 May 2007 22:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2679177</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/2679177.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=2679177</wfw:commentRss><description>&lt;P&gt;I noticed that there was a demo of Rally technologies at the WinHEC keynote the other day, so I created &lt;A class="" href="http://blogs.msdn.com/wndp/attachment/2679177.ashx" mce_href="http://blogs.msdn.com/wndp/attachment/2679177.ashx"&gt;a link to part of the keynote with the Rally&amp;nbsp;demo&lt;/A&gt;. Enjoy.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;-- Ari Pernick&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2679177" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/wndp/attachment/2679177.ashx" length="441" type="video/x-ms-asf" /><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Rally/default.aspx">Rally</category></item><item><title>The Importance of 5GHz Operation for Video</title><link>http://blogs.msdn.com/wndp/archive/2007/02/09/importance_5F00_of_5F00_5GHz_5F00_operation_5F00_for_5F00_video.aspx</link><pubDate>Fri, 09 Feb 2007 19:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1632182</guid><dc:creator>wndpteam</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/wndp/comments/1632182.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=1632182</wfw:commentRss><description>&lt;P&gt;Recently, I read a great article on ZDNet that discusses the challenges IEEE 802.11n faces with 2.4GHz operation. The article is appropriately titled &lt;A class="" href="http://blogs.zdnet.com/Ou/?p=411" target=_blank mce_href="http://blogs.zdnet.com/Ou/?p=411"&gt;The Consequences of Abandoning the 5GHz Frontier&lt;/A&gt;, and discusses some history, backward compatibility, and interference. The important takeaway from this article is if you want a premium experience of video and other Windows Vista scenarios, especially Xbox 360 and Media Center Extender, look for the Certified for Windows Vista logo when purchasing consumer network equipment:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/photos/wndp/images/731378/original.aspx" target=_blank&gt;&lt;IMG src="http://blogs.msdn.com/photos/wndp/images/731378/secondarythumb.aspx" border=0&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;I posted a comment on this article that provides a little more information, which can be found here: &lt;A href="http://talkback.zdnet.com/5208-10533-0.html?forumID=1&amp;amp;threadID=29474&amp;amp;messageID=559062"&gt;http://talkback.zdnet.com/5208-10533-0.html?forumID=1&amp;amp;threadID=29474&amp;amp;messageID=559062&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;-- Gabe Frost&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1632182" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/networking/default.aspx">networking</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Rally/default.aspx">Rally</category></item><item><title>Wireless Routers That Rock: First Works With Vista Router</title><link>http://blogs.msdn.com/wndp/archive/2007/02/07/first_5F00_works_5F00_with_5F00_vista_5F00_router.aspx</link><pubDate>Wed, 07 Feb 2007 19:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1613926</guid><dc:creator>wndpteam</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/wndp/comments/1613926.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=1613926</wfw:commentRss><description>&lt;P&gt;Congratulations to D-Link (powered by &lt;A class="" href="http://www.ubicom.com/news/releases/2006/20061106_Windows_Vista.html" target=_blank mce_href="http://www.ubicom.com/news/releases/2006/20061106_Windows_Vista.html"&gt;Ubicom&lt;/A&gt;) for being the first ever to acheive a Windows Vista logo for&amp;nbsp;the &lt;A class="" href="http://www.dlink.com/products/?sec=1&amp;amp;pid=530" target=_blank mce_href="http://www.dlink.com/products/?sec=1&amp;amp;pid=530"&gt;DIR-655&lt;/A&gt;&amp;nbsp;wireless router. While &lt;A class="" href="http://blogs.msdn.com/wndp/archive/2007/02/05/first_5F00_certified_5F00_for_5F00_vista_5F00_router.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2007/02/05/first_5F00_certified_5F00_for_5F00_vista_5F00_router.aspx"&gt;Buffalo acheived the premium "Certified for Windows Vista" logo&lt;/A&gt;, D-Link was first to meet the baseline "Works with Windows Vista" requirements (months ago). What's the difference between the two you ask? First, the requirements for "works with" certification include: &lt;A class="" href="http://blogs.msdn.com/wndp/archive/2006/10/02/Consumer_5F00_network_5F00_rocks_5F00_QoS.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2006/10/02/Consumer_5F00_network_5F00_rocks_5F00_QoS.aspx"&gt;QoS&lt;/A&gt;, &lt;A class="" href="http://www.microsoft.com/whdc/rally/rallylltd.mspx" target=_blank mce_href="http://www.microsoft.com/whdc/rally/rallylltd.mspx"&gt;LLTD&lt;/A&gt; for rich &lt;A class="" href="http://blogs.msdn.com/wndp/archive/2006/11/03/enable_5F00_vista_5F00_network_5F00_map.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2006/11/03/enable_5F00_vista_5F00_network_5F00_map.aspx"&gt;Network Maps&lt;/A&gt;, &lt;A class="" href="http://blogs.msdn.com/wndp/archive/2007/01/04/vista_5F00_networking_5F00_goodies_5F00_part1.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2007/01/04/vista_5F00_networking_5F00_goodies_5F00_part1.aspx"&gt;WCN&lt;/A&gt;, Xbox Live, and more. Our baseline suite of tests ensure these devices are&amp;nbsp;extremely robust. To put things in perspective, the *massive* majority of existing consumer networking products *do not* meet the baseline requirements! Remember, our goal is to transform the consumer networking ecosystem, and these devices do.&lt;/P&gt;
&lt;P&gt;The requirement differences between the premium logo and baseline are: IPv6 and concurrent dual-band (2.4 &amp;amp; 5 GHz operation); which are huge feats. premium routers must meet all the baseline requirements in addition to the others. Essentially, the premium class routers are for video (both standard-definiton &amp;amp; high-definition) scenarios, and the baseline routers are for everything else.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/photos/wndp/images/1613683/original.aspx" target=_blank&gt;&lt;IMG src="http://blogs.msdn.com/photos/wndp/images/1613683/500x306.aspx" border=0&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I'll keep everyone updated on the new devices that acheive&amp;nbsp;the logo. More to talk about very soon...&lt;/P&gt;
&lt;P&gt;-- Gabe Frost&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1613926" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/networking/default.aspx">networking</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Rally/default.aspx">Rally</category></item><item><title>Wireless Routers That Rock: First Certified For Vista Router</title><link>http://blogs.msdn.com/wndp/archive/2007/02/05/first_5F00_certified_5F00_for_5F00_vista_5F00_router.aspx</link><pubDate>Tue, 06 Feb 2007 03:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1607757</guid><dc:creator>wndpteam</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/wndp/comments/1607757.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=1607757</wfw:commentRss><description>&lt;P&gt;Congratulations to Buffalo for being the first to acheive a &lt;A class="" href="http://blogs.msdn.com/wndp/archive/2006/08/30/consumer-network-gear-that-rocks.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2006/08/30/consumer-network-gear-that-rocks.aspx"&gt;Certified for Windows Vista&lt;/A&gt; logo for their dual-band WZR-AG300NH wireless router. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/photos/wndp/images/1607671/original.aspx" target=_blank&gt;&lt;IMG src="http://blogs.msdn.com/photos/wndp/images/1607671/500x368.aspx" border=0&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In short, this&amp;nbsp;device passed over eight hours worth of rigerous testing designed to ensure a fantastic experience of Windows Vista scenarios; including HD video streaming from Media Center to Media Center Extenders over wireless! Many folks within core networking worked very hard to create meaningful tests that raise the bar of the consumer networking ecosystem. Certified for Vista wireless routers fully (and correctly) implement: &lt;A class="" href="http://blogs.msdn.com/wndp/archive/2006/10/02/Consumer_5F00_network_5F00_rocks_5F00_QoS.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2006/10/02/Consumer_5F00_network_5F00_rocks_5F00_QoS.aspx"&gt;network QoS&lt;/A&gt; for differentiating voice/video/best-effort/background traffic, &lt;A class="" href="http://www.microsoft.com/whdc/rally/rallylltd.mspx" target=_blank mce_href="http://www.microsoft.com/whdc/rally/rallylltd.mspx"&gt;LLTD&lt;/A&gt; for producing a rich &lt;A class="" href="http://blogs.msdn.com/wndp/archive/2006/11/03/enable_5F00_vista_5F00_network_5F00_map.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2006/11/03/enable_5F00_vista_5F00_network_5F00_map.aspx"&gt;Network Map&lt;/A&gt;, &lt;A class="" href="http://blogs.msdn.com/wndp/archive/2007/01/04/vista_5F00_networking_5F00_goodies_5F00_part1.aspx" target=_blank mce_href="http://blogs.msdn.com/wndp/archive/2007/01/04/vista_5F00_networking_5F00_goodies_5F00_part1.aspx"&gt;Windows Connect Now&lt;/A&gt;&amp;nbsp;for super simple&amp;nbsp;secure setup and adding new devices, IPv6, etc.&amp;nbsp;Glenn Ward on the &lt;A class="" href="http://www.microsoft.com/rally" target=_blank mce_href="http://www.microsoft.com/rally"&gt;Windows Rally&lt;/A&gt; team, who is responsible for the router logo program, says it best in his email response to Buffalo receiving this honor:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"On behalf of all of us at Microsoft, please accept our congratulations and warmest thanks. Incredible engineering, effort, and determination went into making this happen - outstanding job to all at Buffalo, as well as the&amp;nbsp;internal team&amp;nbsp;who likewise worked tirelessly."&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Well said Glenn, thanks for all the hard work!&lt;/P&gt;
&lt;P&gt;-- Gabe Frost&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1607757" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/networking/default.aspx">networking</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Rally/default.aspx">Rally</category></item><item><title>QoS Support in Windows </title><link>http://blogs.msdn.com/wndp/archive/2007/02/02/Windows_5F00_QoS_5F00_Support.aspx</link><pubDate>Sat, 03 Feb 2007 00:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1585222</guid><dc:creator>wndpteam</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/wndp/comments/1585222.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=1585222</wfw:commentRss><description>&lt;P&gt;A few months ago, a technical account manager for a customer sent an email to everyone in Windows networking asking about QoS support in Windows. When answering the question, I realized that there was no single document or web page that outlined the level of support and what resources are available for further detail. Because of this,&amp;nbsp;my email response was really extensive and probably overkill for what the customer needed. However, Joseph Davies, who writes&amp;nbsp;as The Cable Guy for&amp;nbsp;&lt;A class="" href="http://www.microsoft.com/technet/technetmag/" target=_blank mce_href="http://www.microsoft.com/technet/technetmag/"&gt;TechNet magazine&lt;/A&gt;, saw the response and thought it interesting enough to work with folks on the core QoS team on an article called &lt;A class="" href="http://www.microsoft.com/technet/technetmag/issues/2007/02/CableGuy/default.aspx" target=_blank mce_href="http://www.microsoft.com/technet/technetmag/issues/2007/02/CableGuy/default.aspx"&gt;QoS Support in Windows&lt;/A&gt;, which was recently published. Also, this article will be published hard copy in this months TechNet magazine. Check it out and let me know what you think or if you have any questions.&lt;/P&gt;
&lt;P&gt;-- Gabe Frost&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1585222" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category></item><item><title>Windows Vista Networking Goodies, Part 2: Device &amp;amp; Service Discovery</title><link>http://blogs.msdn.com/wndp/archive/2007/01/05/vista_5F00_networking_5F00_goodies_5F00_part2.aspx</link><pubDate>Fri, 05 Jan 2007 22:34:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1417596</guid><dc:creator>wndpteam</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/wndp/comments/1417596.aspx</comments><wfw:commentRss>http://blogs.msdn.com/wndp/commentrss.aspx?PostID=1417596</wfw:commentRss><description>&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;In my &lt;A href="http://blogs.msdn.com/wndp/archive/2007/01/04/vista_5F00_networking_5F00_goodies_5F00_part1.aspx" mce_href="http://blogs.msdn.com/wndp/archive/2007/01/04/vista_5F00_networking_5F00_goodies_5F00_part1.aspx"&gt;first post&lt;/A&gt; of this series, I talked about Windows Connect Now (WCN) and how easy it is in Windows Vista to discover, configure, and securely connect devices to a wireless network. In this post, I’ll talk about how to discover PCs, devices, and services that are available on the network. In Windows XP, if you wanted to find other PCs (and a limited number of devices) on your network, you went to Network Neighborhood. This interface basically listed all network PCs and, if you enabled Universal Plug-n-Play (UPnP), a small subset of UPnP capable devices such as your router. It’s never a wonderful day in the neighborhood though because the best you can do here is see other networked PCs and browse their file shares. While UPnP eventually provided more service descriptions, those capabilities were not finalized until well after XP shipped, and were almost always disabled by default in devices such as routers and APs. Network Neighborhood doesn’t provide any clear indication of what you can do with a particular PC or device, so we did a bunch of work in Vista to improve.&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;Windows Vista drastically improves this story by supporting a new concept called function discovery. In Vista’s Network Explorer (the replacement to XP’s Network Neighborhood), devices are discovered using function discovery. Function discovery can find devices using much more efficient, diverse and robust protocols than were available in XP’s Network Neighborhood. These protocols include NetBios, UPnP/SSDP, and Web Services Discovery (WSD). Further, additional providers can be added via a flexible function discovery platform, which means software developers can plug their own discovery methods in for a consistent user experience through the Network Explorer. So how does this relate to Network Neighborhood? In Vista, you can access the Network Explorer by clicking Start\Network. The value of improved function discovery is experienced here. PCs, devices, and their respective services are displayed here in all their glory. In addition to the out-of-box high-resolution icons Vista provides for various device classes, Windows shell extensions can be defined (by the device maker, not the end user) for custom icons and actions (when you right-click or double-click the device). And, network connected devices requiring a device driver can be installed directly from the Network Explorer following a simple plug and play process (the same experience as installing a directly attached peripheral).&lt;/SPAN&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'"&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;o:p&gt;&lt;A href="http://blogs.msdn.com/photos/wndp/picture1417620.aspx" target=_blank&gt;&lt;/A&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;FONT size=3&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;A href="http://blogs.msdn.com/photos/wndp/images/1417620/original.aspx" target=_blank&gt;&lt;IMG src="http://blogs.msdn.com/photos/wndp/images/1417620/original.aspx" border=0&gt;&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;In the above snapshot of my Network folder, you’ll see PCs, a network projector, a media sharing service (pictures, music, video), and an un-configured device. In my next post, I’ll talk about IP as just another bus via the PnP-X framework, and how the experience of discovery, installation, and use of network devices is the same as directly attached peripherals. Stay tuned.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;/FONT&gt;&lt;/SPAN&gt;-- Gabe Frost&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1417596" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/wndp/archive/tags/QoS/default.aspx">QoS</category><category domain="http://blogs.msdn.com/wndp/archive/tags/networking/default.aspx">networking</category><category domain="http://blogs.msdn.com/wndp/archive/tags/Rally/default.aspx">Rally</category></item></channel></rss>