You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
5.8 KiB
224 lines
5.8 KiB
/* |
|
* TAP-Windows -- A kernel driver to provide virtual tap |
|
* device functionality on Windows. |
|
* |
|
* This code was inspired by the CIPE-Win32 driver by Damion K. Wilson. |
|
* |
|
* This source code is Copyright (C) 2002-2014 OpenVPN Technologies, Inc., |
|
* and is released under the GPL version 2 (see below). |
|
* |
|
* This program is free software; you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License version 2 |
|
* as published by the Free Software Foundation. |
|
* |
|
* This program is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with this program (see the file COPYING included with this |
|
* distribution); if not, write to the Free Software Foundation, Inc., |
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
*/ |
|
|
|
//============================================================ |
|
// MAC address, Ethernet header, and ARP |
|
//============================================================ |
|
|
|
#pragma pack(1) |
|
|
|
#define IP_HEADER_SIZE 20 |
|
#define IPV6_HEADER_SIZE 40 |
|
|
|
#define MACADDR_SIZE 6 |
|
typedef unsigned char MACADDR[MACADDR_SIZE]; |
|
|
|
typedef unsigned long IPADDR; |
|
typedef unsigned char IPV6ADDR[16]; |
|
|
|
//----------------- |
|
// Ethernet address |
|
//----------------- |
|
|
|
typedef struct { |
|
MACADDR addr; |
|
} ETH_ADDR; |
|
|
|
typedef struct { |
|
ETH_ADDR list[TAP_MAX_MCAST_LIST]; |
|
} MC_LIST; |
|
|
|
|
|
// BUGBUG!!! Consider using ststem defines in netiodef.h!!! |
|
|
|
//---------------- |
|
// Ethernet header |
|
//---------------- |
|
typedef struct |
|
{ |
|
MACADDR dest; /* destination eth addr */ |
|
MACADDR src; /* source ether addr */ |
|
USHORT proto; /* packet type ID field */ |
|
} ETH_HEADER, *PETH_HEADER; |
|
|
|
//---------------- |
|
// ARP packet |
|
//---------------- |
|
|
|
typedef struct |
|
{ |
|
MACADDR m_MAC_Destination; // Reverse these two |
|
MACADDR m_MAC_Source; // to answer ARP requests |
|
USHORT m_Proto; // 0x0806 |
|
|
|
# define MAC_ADDR_TYPE 0x0001 |
|
USHORT m_MAC_AddressType; // 0x0001 |
|
|
|
USHORT m_PROTO_AddressType; // 0x0800 |
|
UCHAR m_MAC_AddressSize; // 0x06 |
|
UCHAR m_PROTO_AddressSize; // 0x04 |
|
|
|
# define ARP_REQUEST 0x0001 |
|
# define ARP_REPLY 0x0002 |
|
USHORT m_ARP_Operation; // 0x0001 for ARP request, 0x0002 for ARP reply |
|
|
|
MACADDR m_ARP_MAC_Source; |
|
IPADDR m_ARP_IP_Source; |
|
MACADDR m_ARP_MAC_Destination; |
|
IPADDR m_ARP_IP_Destination; |
|
} |
|
ARP_PACKET, *PARP_PACKET; |
|
|
|
//---------- |
|
// IP Header |
|
//---------- |
|
|
|
typedef struct { |
|
# define IPH_GET_VER(v) (((v) >> 4) & 0x0F) |
|
# define IPH_GET_LEN(v) (((v) & 0x0F) << 2) |
|
UCHAR version_len; |
|
|
|
UCHAR tos; |
|
USHORT tot_len; |
|
USHORT id; |
|
|
|
# define IP_OFFMASK 0x1fff |
|
USHORT frag_off; |
|
|
|
UCHAR ttl; |
|
|
|
# define IPPROTO_UDP 17 /* UDP protocol */ |
|
# define IPPROTO_TCP 6 /* TCP protocol */ |
|
# define IPPROTO_ICMP 1 /* ICMP protocol */ |
|
# define IPPROTO_IGMP 2 /* IGMP protocol */ |
|
UCHAR protocol; |
|
|
|
USHORT check; |
|
ULONG saddr; |
|
ULONG daddr; |
|
/* The options start here. */ |
|
} IPHDR; |
|
|
|
//----------- |
|
// UDP header |
|
//----------- |
|
|
|
typedef struct { |
|
USHORT source; |
|
USHORT dest; |
|
USHORT len; |
|
USHORT check; |
|
} UDPHDR; |
|
|
|
//-------------------------- |
|
// TCP header, per RFC 793. |
|
//-------------------------- |
|
|
|
typedef struct { |
|
USHORT source; /* source port */ |
|
USHORT dest; /* destination port */ |
|
ULONG seq; /* sequence number */ |
|
ULONG ack_seq; /* acknowledgement number */ |
|
|
|
# define TCPH_GET_DOFF(d) (((d) & 0xF0) >> 2) |
|
UCHAR doff_res; |
|
|
|
# define TCPH_FIN_MASK (1<<0) |
|
# define TCPH_SYN_MASK (1<<1) |
|
# define TCPH_RST_MASK (1<<2) |
|
# define TCPH_PSH_MASK (1<<3) |
|
# define TCPH_ACK_MASK (1<<4) |
|
# define TCPH_URG_MASK (1<<5) |
|
# define TCPH_ECE_MASK (1<<6) |
|
# define TCPH_CWR_MASK (1<<7) |
|
UCHAR flags; |
|
|
|
USHORT window; |
|
USHORT check; |
|
USHORT urg_ptr; |
|
} TCPHDR; |
|
|
|
#define TCPOPT_EOL 0 |
|
#define TCPOPT_NOP 1 |
|
#define TCPOPT_MAXSEG 2 |
|
#define TCPOLEN_MAXSEG 4 |
|
|
|
//------------ |
|
// IPv6 Header |
|
//------------ |
|
|
|
typedef struct { |
|
UCHAR version_prio; |
|
UCHAR flow_lbl[3]; |
|
USHORT payload_len; |
|
# define IPPROTO_ICMPV6 0x3a /* ICMP protocol v6 */ |
|
UCHAR nexthdr; |
|
UCHAR hop_limit; |
|
IPV6ADDR saddr; |
|
IPV6ADDR daddr; |
|
} IPV6HDR; |
|
|
|
//-------------------------------------------- |
|
// IPCMPv6 NS/NA Packets (RFC4443 and RFC4861) |
|
//-------------------------------------------- |
|
|
|
// Neighbor Solictiation - RFC 4861, 4.3 |
|
// (this is just the ICMPv6 part of the packet) |
|
typedef struct { |
|
UCHAR type; |
|
# define ICMPV6_TYPE_NS 135 // neighbour solicitation |
|
UCHAR code; |
|
# define ICMPV6_CODE_0 0 // no specific sub-code for NS/NA |
|
USHORT checksum; |
|
ULONG reserved; |
|
IPV6ADDR target_addr; |
|
} ICMPV6_NS; |
|
|
|
// Neighbor Advertisement - RFC 4861, 4.4 + 4.6/4.6.1 |
|
// (this is just the ICMPv6 payload) |
|
typedef struct { |
|
UCHAR type; |
|
# define ICMPV6_TYPE_NA 136 // neighbour advertisement |
|
UCHAR code; |
|
# define ICMPV6_CODE_0 0 // no specific sub-code for NS/NA |
|
USHORT checksum; |
|
UCHAR rso_bits; // Router(0), Solicited(2), Ovrrd(4) |
|
UCHAR reserved[3]; |
|
IPV6ADDR target_addr; |
|
// always include "Target Link-layer Address" option (RFC 4861 4.6.1) |
|
UCHAR opt_type; |
|
#define ICMPV6_OPTION_TLLA 2 |
|
UCHAR opt_length; |
|
#define ICMPV6_LENGTH_TLLA 1 // multiplied by 8 -> 1 = 8 bytes |
|
MACADDR target_macaddr; |
|
} ICMPV6_NA; |
|
|
|
// this is the complete packet with Ethernet and IPv6 headers |
|
typedef struct { |
|
ETH_HEADER eth; |
|
IPV6HDR ipv6; |
|
ICMPV6_NA icmpv6; |
|
} ICMPV6_NA_PKT; |
|
|
|
#pragma pack()
|
|
|