123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /*
- * 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-2010 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
- */
- #pragma pack(1)
- //===================================================
- // How many bad DHCPREQUESTs do we receive before we
- // return a NAK?
- //
- // A bad DHCPREQUEST is defined to be one where the
- // requestor doesn't know its IP address.
- //===================================================
- #define BAD_DHCPREQUEST_NAK_THRESHOLD 3
- //==============================================
- // Maximum number of DHCP options bytes supplied
- //==============================================
- #define DHCP_USER_SUPPLIED_OPTIONS_BUFFER_SIZE 256
- #define DHCP_OPTIONS_BUFFER_SIZE 256
- //===================================
- // UDP port numbers of DHCP messages.
- //===================================
- #define BOOTPS_PORT 67
- #define BOOTPC_PORT 68
- //===========================
- // The DHCP message structure
- //===========================
- typedef struct {
- # define BOOTREQUEST 1
- # define BOOTREPLY 2
- UCHAR op; /* message op */
- UCHAR htype; /* hardware address type (e.g. '1' = 10Mb Ethernet) */
- UCHAR hlen; /* hardware address length (e.g. '6' for 10Mb Ethernet) */
- UCHAR hops; /* client sets to 0, may be used by relay agents */
- ULONG xid; /* transaction ID, chosen by client */
- USHORT secs; /* seconds since request process began, set by client */
- USHORT flags;
- ULONG ciaddr; /* client IP address, client sets if known */
- ULONG yiaddr; /* 'your' IP address -- server's response to client */
- ULONG siaddr; /* server IP address */
- ULONG giaddr; /* relay agent IP address */
- UCHAR chaddr[16]; /* client hardware address */
- UCHAR sname[64]; /* optional server host name */
- UCHAR file[128]; /* boot file name */
- ULONG magic; /* must be 0x63825363 (network order) */
- } DHCP;
- typedef struct {
- ETH_HEADER eth;
- IPHDR ip;
- UDPHDR udp;
- DHCP dhcp;
- } DHCPPre;
- typedef struct {
- DHCPPre pre;
- UCHAR options[DHCP_OPTIONS_BUFFER_SIZE];
- } DHCPFull;
- typedef struct {
- unsigned int optlen;
- BOOLEAN overflow;
- DHCPFull msg;
- } DHCPMsg;
- //===================
- // Macros for DHCPMSG
- //===================
- #define DHCPMSG_LEN_BASE(p) (sizeof (DHCPPre))
- #define DHCPMSG_LEN_OPT(p) ((p)->optlen)
- #define DHCPMSG_LEN_FULL(p) (DHCPMSG_LEN_BASE(p) + DHCPMSG_LEN_OPT(p))
- #define DHCPMSG_BUF(p) ((UCHAR*) &(p)->msg)
- #define DHCPMSG_OVERFLOW(p) ((p)->overflow)
- //========================================
- // structs to hold individual DHCP options
- //========================================
- typedef struct {
- UCHAR type;
- } DHCPOPT0;
- typedef struct {
- UCHAR type;
- UCHAR len;
- UCHAR data;
- } DHCPOPT8;
- typedef struct {
- UCHAR type;
- UCHAR len;
- ULONG data;
- } DHCPOPT32;
- #pragma pack()
- //==================
- // DHCP Option types
- //==================
- #define DHCP_MSG_TYPE 53 /* message type (u8) */
- #define DHCP_PARM_REQ 55 /* parameter request list: c1 (u8), ... */
- #define DHCP_CLIENT_ID 61 /* client ID: type (u8), i1 (u8), ... */
- #define DHCP_IP 50 /* requested IP addr (u32) */
- #define DHCP_NETMASK 1 /* subnet mask (u32) */
- #define DHCP_LEASE_TIME 51 /* lease time sec (u32) */
- #define DHCP_RENEW_TIME 58 /* renewal time sec (u32) */
- #define DHCP_REBIND_TIME 59 /* rebind time sec (u32) */
- #define DHCP_SERVER_ID 54 /* server ID: IP addr (u32) */
- #define DHCP_PAD 0
- #define DHCP_END 255
- //====================
- // DHCP Messages types
- //====================
- #define DHCPDISCOVER 1
- #define DHCPOFFER 2
- #define DHCPREQUEST 3
- #define DHCPDECLINE 4
- #define DHCPACK 5
- #define DHCPNAK 6
- #define DHCPRELEASE 7
- #define DHCPINFORM 8
- #if DBG
- VOID
- DumpDHCP (const ETH_HEADER *eth,
- const IPHDR *ip,
- const UDPHDR *udp,
- const DHCP *dhcp,
- const int optlen);
- #endif
|