1 /*
2  *  TAP-Windows -- A kernel driver to provide virtual tap
3  *                 device functionality on Windows.
4  *
5  *  This code was inspired by the CIPE-Win32 driver by Damion K. Wilson.
6  *
7  *  This source code is Copyright (C) 2002-2014 OpenVPN Technologies, Inc.,
8  *  and is released under the GPL version 2 (see below).
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License version 2
12  *  as published by the Free Software Foundation.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program (see the file COPYING included with this
21  *  distribution); if not, write to the Free Software Foundation, Inc.,
22  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23  */
24 
25 //====================================================================
26 //                        Product and Version public settings
27 //====================================================================
28 
29 #define PRODUCT_STRING PRODUCT_TAP_DEVICE_DESCRIPTION
30 
31 
32 //
33 // Update the driver version number every time you release a new driver
34 // The high word is the major version. The low word is the minor version.
35 // Also make sure that VER_FILEVERSION specified in the .RC file also
36 // matches with the driver version because NDISTESTER checks for that.
37 //
38 #ifndef TAP_DRIVER_MAJOR_VERSION
39 
40 #define TAP_DRIVER_MAJOR_VERSION           0x04
41 #define TAP_DRIVER_MINOR_VERSION           0x02
42 
43 #endif
44 
45 #define TAP_DRIVER_VENDOR_VERSION          ((TAP_DRIVER_MAJOR_VERSION << 16) | TAP_DRIVER_MINOR_VERSION)
46 
47 //
48 // Define the NDIS miniport interface version that this driver targets.
49 //
50 #if defined(NDIS60_MINIPORT)
51 #  define TAP_NDIS_MAJOR_VERSION    6
52 #  define TAP_NDIS_MINOR_VERSION    0
53 #elif defined(NDIS61_MINIPORT)
54 #  define TAP_NDIS_MAJOR_VERSION    6
55 #  define TAP_NDIS_MINOR_VERSION    1
56 #elif defined(NDIS620_MINIPORT)
57 #  define TAP_NDIS_MAJOR_VERSION    6
58 #  define TAP_NDIS_MINOR_VERSION    20
59 #elif defined(NDIS630_MINIPORT)
60 #  define TAP_NDIS_MAJOR_VERSION    6
61 #  define TAP_NDIS_MINOR_VERSION    30
62 #else
63 #define TAP_NDIS_MAJOR_VERSION      5
64 #define TAP_NDIS_MINOR_VERSION      0
65 #endif
66 
67 //===========================================================
68 // Driver constants
69 //===========================================================
70 
71 #define ETHERNET_HEADER_SIZE        (sizeof (ETH_HEADER))
72 //#define ETHERNET_MTU                1500
73 #define ETHERNET_MTU                2800
74 #define ETHERNET_PACKET_SIZE        (ETHERNET_MTU + ETHERNET_HEADER_SIZE)
75 #define DEFAULT_PACKET_LOOKAHEAD    (ETHERNET_PACKET_SIZE)
76 #define VLAN_TAG_SIZE               4
77 
78 //===========================================================
79 // Medium properties
80 //===========================================================
81 
82 #define TAP_FRAME_HEADER_SIZE       ETHERNET_HEADER_SIZE
83 #define TAP_FRAME_MAX_DATA_SIZE     ETHERNET_MTU
84 #define TAP_MAX_FRAME_SIZE          (TAP_FRAME_HEADER_SIZE + TAP_FRAME_MAX_DATA_SIZE)
85 #define TAP_MIN_FRAME_SIZE          60
86 
87 #define TAP_MEDIUM_TYPE             NdisMedium802_3
88 
89 //===========================================================
90 // Physical adapter properties
91 //===========================================================
92 
93 // The bus that connects the adapter to the PC.
94 // (Example: PCI adapters should use NdisInterfacePci).
95 #define TAP_INTERFACE_TYPE          NdisInterfaceInternal
96 
97 #define TAP_VENDOR_DESC             PRODUCT_TAP_WIN_DEVICE_DESCRIPTION
98 
99 // Highest byte is the NIC byte plus three vendor bytes. This is normally
100 // obtained from the NIC.
101 #define TAP_VENDOR_ID               0x00FFFFFF
102 
103 // If you have physical hardware on 802.3, use NdisPhysicalMedium802_3.
104 #define TAP_PHYSICAL_MEDIUM         NdisPhysicalMediumUnspecified
105 
106 // Claim to be 100mbps duplex
107 #define MEGABITS_PER_SECOND                1000000ULL
108 #define TAP_XMIT_SPEED                     (100ULL*MEGABITS_PER_SECOND)
109 #define TAP_RECV_SPEED                     (100ULL*MEGABITS_PER_SECOND)
110 
111 // Max number of multicast addresses supported in hardware
112 #define TAP_MAX_MCAST_LIST                 128
113 
114 #define TAP_MAX_LOOKAHEAD                  TAP_FRAME_MAX_DATA_SIZE
115 #define TAP_BUFFER_SIZE                    TAP_MAX_FRAME_SIZE
116 
117 // Set this value to TRUE if there is a physical adapter.
118 #define TAP_HAS_PHYSICAL_CONNECTOR         FALSE
119 #define TAP_ACCESS_TYPE                    NET_IF_ACCESS_BROADCAST
120 #define TAP_DIRECTION_TYPE                 NET_IF_DIRECTION_SENDRECEIVE
121 #define TAP_CONNECTION_TYPE                NET_IF_CONNECTION_DEDICATED
122 
123 // This value must match the *IfType in the driver .inf file
124 #define TAP_IFTYPE                         IF_TYPE_ETHERNET_CSMACD
125 
126 //
127 // This is a virtual device, so it can tolerate surprise removal and
128 // suspend.  Ensure the correct flags are set for your hardware.
129 //
130 #define TAP_ADAPTER_ATTRIBUTES_FLAGS (\
131                 NDIS_MINIPORT_ATTRIBUTES_SURPRISE_REMOVE_OK | NDIS_MINIPORT_ATTRIBUTES_NDIS_WDM)
132 
133 #define TAP_SUPPORTED_FILTERS ( \
134                 NDIS_PACKET_TYPE_DIRECTED   | \
135                 NDIS_PACKET_TYPE_MULTICAST  | \
136                 NDIS_PACKET_TYPE_BROADCAST  | \
137                 NDIS_PACKET_TYPE_ALL_LOCAL  | \
138                 NDIS_PACKET_TYPE_PROMISCUOUS | \
139                 NDIS_PACKET_TYPE_ALL_MULTICAST)
140 
141 //#define TAP_MAX_MCAST_LIST          128  // Max length of multicast address list
142 
143 //
144 // Specify a bitmask that defines optional properties of the NIC.
145 // This miniport indicates receive with NdisMIndicateReceiveNetBufferLists
146 // function.  Such a driver should set this NDIS_MAC_OPTION_TRANSFERS_NOT_PEND
147 // flag.
148 //
149 // NDIS_MAC_OPTION_NO_LOOPBACK tells NDIS that NIC has no internal
150 // loopback support so NDIS will manage loopbacks on behalf of
151 // this driver.
152 //
153 // NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA tells the protocol that
154 // our receive buffer is not on a device-specific card. If
155 // NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA is not set, multi-buffer
156 // indications are copied to a single flat buffer.
157 //
158 
159 #define TAP_MAC_OPTIONS (\
160                 NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | \
161                 NDIS_MAC_OPTION_TRANSFERS_NOT_PEND  | \
162                 NDIS_MAC_OPTION_NO_LOOPBACK)
163 
164 #define TAP_ADAPTER_CHECK_FOR_HANG_TIME_IN_SECONDS 4
165 
166 
167 // NDIS 6.x miniports must support all counters in OID_GEN_STATISTICS.
168 #define TAP_SUPPORTED_STATISTICS (\
169                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_RCV    | \
170                 NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_RCV   | \
171                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_RCV   | \
172                 NDIS_STATISTICS_FLAGS_VALID_BYTES_RCV              | \
173                 NDIS_STATISTICS_FLAGS_VALID_RCV_DISCARDS           | \
174                 NDIS_STATISTICS_FLAGS_VALID_RCV_ERROR              | \
175                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_FRAMES_XMIT   | \
176                 NDIS_STATISTICS_FLAGS_VALID_MULTICAST_FRAMES_XMIT  | \
177                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_FRAMES_XMIT  | \
178                 NDIS_STATISTICS_FLAGS_VALID_BYTES_XMIT             | \
179                 NDIS_STATISTICS_FLAGS_VALID_XMIT_ERROR             | \
180                 NDIS_STATISTICS_FLAGS_VALID_XMIT_DISCARDS          | \
181                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_RCV     | \
182                 NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_RCV    | \
183                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_RCV    | \
184                 NDIS_STATISTICS_FLAGS_VALID_DIRECTED_BYTES_XMIT    | \
185                 NDIS_STATISTICS_FLAGS_VALID_MULTICAST_BYTES_XMIT   | \
186                 NDIS_STATISTICS_FLAGS_VALID_BROADCAST_BYTES_XMIT)
187 
188 
189 #define MINIMUM_MTU                 576        // USE TCP Minimum MTU
190 #define MAXIMUM_MTU                 65536      // IP maximum MTU
191 
192 #define PACKET_QUEUE_SIZE           64 // tap -> userspace queue size
193 #define IRP_QUEUE_SIZE              16 // max number of simultaneous i/o operations from userspace
194 #define INJECT_QUEUE_SIZE           16 // DHCP/ARP -> tap injection queue
195 
196 #define TAP_LITTLE_ENDIAN      // affects ntohs, htonl, etc. functions
197