123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- /*
- * 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()
|