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