|
|
|
|
NDIS Interface Impairment Generator
Sample
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Random Packet Drop on Send and Receive Paths | |
| Send and Receive Packet Delay in 1 millisecond (approximate...) Increments |
In addition the generator is capable of editing the IP header TTL (IPv4) or hop limit (IPv6) fields on outgoing packets:
| Set TTL to Specified Value | |
| Decrement TTL by Specified Value |
By default the driver imposes impairments on all packets of selected protocol types that are sent or received on a specified interface. Optionally the user may further specify a remote host and impairments will be imposed only on packets exchanged between the local host and that host.
At this time the Impairment Generator NDIS drivers must be installed using the Network Control Panel. Select an Ethernet adapter, press the Install button and then select Service. Browse to the driver package folder appropriate for your platform:
| WHL - For Windows Vista and Later 32-Bit Platforms | |
| WLH-64BIt - For Windows Vista and Later 64-Bit Platforms | |
| WXP - For Windows XP and Windows Server 2003 32-Bit Platforms | |
| WXP-64BIt - For Windows XP and Windows Server 2003 32-Bit Platforms |
Select the PcaEmulatorV1 INF file and then complete the installation.
If your platform has multiple adapters you can Uncheck the PCAUSA Network Emulator NDIS 6 Filter from adapters that you do not wish to impair.
The Impairment Generator control program is a Windows command line utility named ifimp.exe. The Usage output is:
C:\PCADev\FaultInjector>ifimp
PCAUSA NDIS Interface Impairment Generator V1.00.00.06 (32-Bit)
Copyright (c) 2010 Printing Communications Assoc., Inc. (PCAUSA)
All rights reserved
Set Impairments : ifimp [-4 -6 ] [ -p icmp -p tcp -p udp ] [ -options ]
<interface>
Clear Impaitments: ifimp -c <interface>
Query Impairments: ifimp -q <interface>
Enumerate Filters: ifimp -f <interface>
Set Impairment options:
-4 impair IPv4
-6 impair IPv6
-r ## remote host name
-p ## protocol to impair: icmp, tcp or udp
-i ## ## send drop and receive drop rates as percent
-t ## send ttl: positive->set; negative->decrement
-d ## packet delay in milliseconds
Understand that for all ifimp commands the last parameter of the command must the the IPv4 address of the adapter to be impaired.
In the example below IPv4 ICMP and TCP packets will be impaired on interface 192.168.15.107. Send and receive packets will be randomly dropped at a .5-percent rate. Packets that are not dropped will have their TTL decremented by 32 as they pass through the driver. The packet delay for send and receive is set to 1 milliseconds, which adds a total of 2 milliseconds to round-trip time.
C:\PCADev\FaultInjector>ifimp -4 -p tcp
-i .5 .5 -d 1 -t -32 192.168.15.107
192.168.15.107 0.500000 0.500000 32
Delay: 1 msec
0x00000023 192.168.15.107 10737418 10737418 32
Delay: 10000 100-nsec units
Impairment Changed (Immediate)
It is not necessary to specify all impairment options. For example, the -t and the -d option can be omitted if desired:
C:\PCADev\FaultInjector>ifimp -4 -p tcp -i .5 .5 192.168.15.107
The capability to impose impairments on a single "flow" is also provided. The "-r" option can be used to specify a remote host name. If this option is selected then the impairments are applied only on packets destined to the specified remote host. In the example below impairments are restricted to packets sent/received from "fiveeyes" host:
C:\PCADev\FaultInjector>ifimp -4 -p tcp -r fiveeyes -i .5 .5 -d 100 -t 32 192.168.15.107
The -c "clear" command line option can be used to clear all impairments in a specific interface. For example this command:
C:\PCADev\FaultInjector>ifimp
-c 192.168.15.107
will remove all impairments on interface 192.168.15.107.
The -q "query" command line option can be used to fetch the current impairment settings and statistics on an interface. For example:
C:\PCADev\FaultInjector\Work\Apps\Release>ifimp
-q 192.168.15.121
will fetch this information on
interface 192.168.15.121. Here is sample output:
Impairment Query Success
Interface: 192.168.15.121
Filter : IPv4, Match IPv4, ICMP
Remote IPv4 Host: 192.168.15.117
Send Drop:
Command: 24.999999 percent
Actual : 29.126214 percent
Dropped 30 of 103
Packets
Receive Drop:
Command: 24.999999 percent
Actual : 27.397260 percent
Dropped 20 of 73
Packets
Delay: 0 milliseconds
Delayed 0 Send Packets
Delayed 0 Receive Packets
Delay Failed 0 Receive
Packets
For this test the PCATTCP tool was used to generate a continuous TCP stream. The send and receive packet drop was set to .2 percent in each direction using this command:
C:\PCADev\FaultInjector\Work\Apps\Release>ifimp -4 -6 -p tcp -i .2 .2 192.168.15.107 192.168.15.107 0.200000 0.200000 0 0 0x00000023 192.168.15.107 4294967 4294967 0 0 Impairment Changed (Immediate)
The Task Manager Networking utilization is shown below. You can see that performance varied quite a bit. At the tail of the test the impairments were cleared and you can see the normal steady-state of the unimpaired interface.

Windows is not a real-time operating system. It's minimum
timer quantum is 1 millisecond or (much) more. The impairment generator packet
delay result impairment is somewhat crude, but possibly helpful to some.
Using a TCP test program such as PCATTCP on a 1 Gbps Ethernet sustained TCP
transfers approaching 500 Mbps can be achieved. However, with a minimum delay
setting of 1 millisecond the transfer rate is reduced to about 32 Mbps. This is,
in fact, about right for the 1 millisecond delay.
When performing sustained TCP transfers Windows usually sends a "list" of TCP
packets each containing up to 1460 bytes of data payload. The size of this list
can range from 1 to 6 (or more) packets. Assuming 6 1460-byte packets being sent
with a send delay of 1 millisecond and a receive delay also of 1 millisecond,
then 8760 bytes are transferred every 2 milliseconds. This corresponds roughly
to 35 Mbps and agrees with the observed behavior of the impairment generator
delay results.
This does not mean that the interface
itself has been limited to the much lower apparent rate. For example, adding a
second stream will up the interface utilization. Three even more, and so on.
On some systems - particular pre-Vista - the delay behavior may be fairly poor. For example, specifying a 1 millisecond delay in each direction may result in adding about 30 milliseconds to the RT time.
The -f option displays a list of the filters installed on
the specified interface. Filters are ordered from the highest to the lowest in
this list.
NOTE: This command is only supported on Vista and later platforms.
C:\PCADev\FaultInjector>ifimp -f
192.168.15.107
Enumerating 3 Filter Modules:
Characteristics...: NDIS 6.0 Modifying Mandatory
IfIndex...........: 18
NetLuid...........: Index: 5; IfType: 0
Class.............: "ms_firewall_upper"
InstanceName......:
"{43998418-5578-4337-BC9D-6AA9F6CF2CF4}-{B70D6460-3635-4D42-B866-B8AB1A24454C}-0000"
Characteristics...: NDIS 6.0 Modifying Optional
IfIndex...........: 17
NetLuid...........: Index: 3; IfType: 0
Class.............: "scheduler"
InstanceName......:
"{43998418-5578-4337-BC9D-6AA9F6CF2CF4}-{B5F4D659-7DAA-4565-8E41-BE220ED60542}-0000"
Characteristics...: NDIS 6.0 Modifying Mandatory
IfIndex...........: 16
NetLuid...........: Index: 2; IfType: 0
Class.............: "diagnostic"
InstanceName......:
"{43998418-5578-4337-BC9D-6AA9F6CF2CF4}-{0294AD45-8E86-4F6A-8A22-2EE10888F390}-0000"
The "diagnostic" filter with GUID
{0294AD45-8E86-4F6A-8A22-2EE10888F390} is the fault injector filter. In this
case it is layered immediately above the NIC miniport.
Here are a few "quirks" and limitations in the current impairment generator driver:
| ICMP Impairments - These are limited to ICMP_ECHO and ICMP_ECHOREPLY. | |
| Delay of Resource Limited Packets - Currently when the driver encounters a packet that has resource limitations (cannot be pended...) it does not delay the packet. | |
| NDIS Task Offload - The driver disables NDIS checksum offloads for NDIS 5. NDIS 6 offload is not disabled. | |
| System Timer Resolution - In order to support packet delay the driver sets the system timer resolution to 1 millisecond. | |
| Reboot - Impairment settings are not persistent across reboots. |
This is an early release of this product. The IPv4 functionality has been tested fairly thoroughly. However, the IPv6 functionality has seen only limited testing.
If you find problems or have suggestions for improvement if this product, please let me know.
In addition, if you have a requirement for a customized version of this driver (e.g., editing different fields or headers...) please let me know. PCAUSA can provide customized versions of this driver under contract if the requirements are practical.
tdivine AT PCAUSA DOT com
| NDIS Driver Developers - May be interested in the techniques illustrated in this sample. | |
| Software Testing and QA - The sample executables may be useful as-is in some testing scenarios. |
You can download the NDIS Interface Impairment Generator sample executables for evaluation and your own personal use subject to these limitations:
| The evaluation executables are provided as-is and have no warranty. | |
| You may not redistribute the PCAUSA the sample executables in any way. |
The ZIP file containing sample executables include:
| ifimp.exe - The Impairment Generator control program. |
| WHL - Driver Package For Windows Vista and Later 32-Bit Platforms | |
| WLH-64BIt - Driver Package For Windows Vista and Later 64-Bit Platforms | |
| WXP - Driver Package For Windows XP and Windows Server 2003 32-Bit Platforms | |
| WXP-64BIt - Driver Package For Windows XP and Windows Server 2003 32-Bit Platforms |
Download NDIS Impairment Generator
Sample Executables for Windows XP through Windows 7 (x86 and x64).
![]()
V1.00.00.12, August
12, 2010
The samples are licensed intellectual property of PCAUSA. However, if you purchase a PCAUSA sample driver product they are provided with a royalty-free license that is intended to allow customers to derive their own products using all or parts of the samples. The royalty-free license applies strictly to the distribution of product in binary (executable) form; there are quite naturally restrictions on distribution of sample source code.
The complete license can be found
here.
![]()
[Impairment Generator Q&A with Thomas F. Divine...]
(PCAUSA NetBug Reporter interviews Thomas...)
See the PCAUSA Ordering page.
|
Release Overview |
||
| V1.00.00.12 | August 12, 2010 | Increased size of buffer used for binding enumeration. |
| V1.00.00.11 | August 8, 2010 | 1.) Fixed
nasty bug that occurred under heavy receive stress testing of the NDIS 6
driver. Driver did not properly undo modifications immediately when
receiving resource-limited packets. 2.) NDIS 6 driver no longer disables NDIS checksum offload. |
| V1.00.00.10 | August 5, 2010 | Added NDIS 5 driver for Windows XP and Windows Server 2003. |
| V1.00.00.09 | August 3, 2010 | Added "-r" option to specify remote host for impairments. Only packets flowing between the local host and the specific remote host will be impaired if this option is used. |
| V1.00.00.08 | July 30, 2010 | Fixed uninitialized variable bug which could set TTL/Hop Count to random value and break connectivity. |
| V1.00.00.07 | July 28, 2010 | Eliminated use of EtherType 0xdead when dropping packets. |
| V1.00.00.06 | July 23, 2010 | Initial release of NDIS Interface Impairment Generator. |
07/23/10
|
PCAUSA Home ·
Privacy Statement ·
Products ·
Ordering ·
Support ·
Utilities ·
Resources
|