Files
NetworkManager/dhcpcd/client.h
Dan Williams e26e7e9983 2004-12-15 Dan Williams <dcbw@redhat.com>
* Rework the DHCP code again to revert to sending full ethernet frames
		rather then relying on the kernel to do the right thing with our
		packets.


git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@340 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2004-12-15 17:58:59 +00:00

219 lines
7.2 KiB
C

/*
* dhcpcd - DHCP client daemon -
* Copyright (C) 1996 - 1997 Yoichi Hariguchi <yoichi@fore.com>
* Copyright (C) January, 1998 Sergei Viznyuk <sv@phystech.com>
*
* dhcpcd is an RFC2131 and RFC1541 compliant DHCP client daemon.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef CLIENT_H
#define CLIENT_H
#include <net/ethernet.h>
#include <linux/types.h>
#include <linux/if_tr.h>
#include <netinet/in.h>
#include "dhcpcd.h"
#define IPPACKET_SIZE 1500
#define MAGIC_COOKIE 0x63825363
#define BROADCAST_FLAG 0x8000
#define MAC_BCAST_ADDR "\xff\xff\xff\xff\xff\xff"
#define IP_BCAST_ADDR 0xFFFFFFFF
#ifndef AF_PACKET
#define AF_PACKET 17 /* should have been in socketbits.h */
#endif
#define HWADDR_TRIES 3
/* UDP port numbers for DHCP */
#define DHCP_SERVER_PORT 67 /* from client to server */
#define DHCP_CLIENT_PORT 68 /* from server to client */
/* DHCP message OP code */
#define DHCP_BOOTREQUEST 1
#define DHCP_BOOTREPLY 2
/* DHCP message type */
#define DHCP_DISCOVER 1
#define DHCP_OFFER 2
#define DHCP_REQUEST 3
#define DHCP_DECLINE 4
#define DHCP_ACK 5
#define DHCP_NAK 6
#define DHCP_RELEASE 7
#define DHCP_INFORM 8
/* DHCP RETRANSMISSION TIMEOUT (seconds) */
#define DHCP_INITIAL_RTO (5)
#define DHCP_MAX_RTO (64)
#define DHCP_OPTIONS_LENGTH 312
typedef struct dhcpMessage
{
u_char op; /* message type */
u_char htype; /* hardware address type */
u_char hlen; /* hardware address length */
u_char hops; /* should be zero in client's message */
u_int xid; /* transaction id */
u_short secs; /* elapsed time in sec. from trying to boot */
u_short flags;
u_int ciaddr; /* (previously allocated) client IP address */
u_int yiaddr; /* 'your' client IP address */
u_int siaddr; /* should be zero in client's messages */
u_int giaddr; /* should be zero in client's messages */
u_char chaddr[16]; /* client's hardware address */
u_char sname[64]; /* server host name, null terminated string */
u_char file[128]; /* boot file name, null terminated string */
u_char options[DHCP_OPTIONS_LENGTH]; /* message options */
} __attribute__((packed)) dhcpMessage;
typedef struct dhcpOptions
{
u_char num;
u_char len[256];
void *val[256];
} __attribute__((packed)) dhcpOptions;
struct packed_ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; /* destination eth addr */
u_int8_t ether_shost[ETH_ALEN]; /* source ether addr */
u_int16_t ether_type; /* packet type ID field */
} __attribute__((packed));
#define TOKEN_RING_HEADER_PAD sizeof(struct trh_hdr) + sizeof(struct trllc)
typedef struct udpipMessage
{
struct packed_ether_header ethhdr;
char udpipmsg[IPPACKET_SIZE];
char pad_for_tokenring_header[TOKEN_RING_HEADER_PAD];
} __attribute__((packed)) udpipMessage;
typedef struct dhcp_interface
{
char *iface;
int cease;
int running;
int sk;
int foo_sk;
short int saved_if_flags;
unsigned int default_lease_time;
struct in_addr default_router;
int ciaddr;
unsigned char chaddr[ETH_ALEN];
int siaddr;
unsigned char shaddr[ETH_ALEN];
unsigned int xid;
unsigned short ip_id;
unsigned char cls_id[DHCP_CLASS_ID_MAX_LEN];
int cls_id_len;
unsigned char cli_id[DHCP_CLIENT_ID_MAX_LEN];
int cli_id_len;
dhcpOptions dhcp_options;
dhcp_client_options *client_options;
} dhcp_interface;
typedef struct dhcp_option_table
{
const int option;
const char *name;
const int len;
} dhcp_option_table;
static dhcp_option_table dhcp_opt_table[] =
{
{ padOption, "padOption", 1 },
{ subnetMask, "subnetMask", 4 },
{ timerOffset, "timerOffset", -1 },
{ routersOnSubnet, "routersOnSubnet", 4 },
{ timeServer, "timeServer", 4 },
{ nameServer, "nameServer", 4 },
{ dns, "dns", 4 },
{ logServer, "logServer", 4 },
{ cookieServer, "cookieServer", 4 },
{ lprServer, "lprServer", 4 },
{ impressServer, "impressServer", 4 },
{ resourceLocationServer,"resourceLocationServer",4 },
{ hostName, "hostName", -1 },
{ bootFileSize, "bootFileSize", 4 },
{ meritDumpFile, "meritDumpFile", 4 },
{ domainName, "domainName", -1 },
{ swapServer, "swapServer", 4 },
{ rootPath, "rootPath", -1 },
{ extentionsPath, "extentionsPath", -1 },
{ IPforwarding, "IPforwarding", -1 },
{ nonLocalSourceRouting, "nonLocalSourceRouting", -1 },
{ policyFilter, "policyFilter", -1 },
{ maxDgramReasmSize, "maxDgramReasmSize", -1 },
{ defaultIPTTL, "defaultIPTTL", -1 },
{ pathMTUagingTimeout, "pathMTUagingTimeout", -1 },
{ pathMTUplateauTable, "pathMTUplateauTable", -1 },
{ ifMTU, "ifMTU", -1 },
{ allSubnetsLocal, "allSubnetsLocal", -1 },
{ broadcastAddr, "broadcastAddr", 4 },
{ performMaskDiscovery, "performMaskDiscovery", -1 },
{ routerSolicitationAddr,"routerSolicitationAddr",-1 },
{ staticRoute, "staticRoute", 4 },
{ trailerEncapsulation, "trailerEncapsulation", -1 },
{ arpCacheTimeout, "arpCacheTimeout", -1 },
{ ethernetEncapsulation, "ethernetEncapsulation", -1 },
{ tcpDefaultTTL, "tcpDefaultTTL", -1 },
{ tcpKeepaliveInterval, "tcpKeepaliveInterval", -1 },
{ tcpKeepaliveGarbage, "tcpKeepaliveGarbage", -1 },
{ nisDomainName, "nisDomainName", -1 },
{ nisServers, "nisServers", 4 },
{ ntpServers, "ntpServers", 4 },
{ vendorSpecificInfo, "vendorSpecificInfo", -1 },
{ netBIOSnameServer, "netBIOSnameServer", -1 },
{ netBIOSdgramDistServer,"netBIOSdgramDistServer",-1 },
{ netBIOSnodeType, "netBIOSnodeType", -1 },
{ netBIOSscope, "netBIOSscope", -1 },
{ xFontServer, "xFontServer", -1 },
{ xDisplayManager, "xDisplayManager", -1 },
{ dhcpRequestedIPaddr, "dhcpRequestedIPaddr", 4 },
{ dhcpIPaddrLeaseTime, "dhcpIPaddrLeaseTime", 4 },
{ dhcpOptionOverload, "dhcpOptionOverload", -1 },
{ dhcpMessageType, "dhcpMessageType", -1 },
{ dhcpServerIdentifier, "dhcpServerIdentifier", -1 },
{ dhcpParamRequest, "dhcpParamRequest", -1 },
{ dhcpMsg, "dhcpMsg", -1 },
{ dhcpMaxMsgSize, "dhcpMaxMsgSize", -1 },
{ dhcpT1value, "dhcpT1value", 4 },
{ dhcpT2value, "dhcpT2value", 4 },
{ dhcpClassIdentifier, "dhcpClassIdentifier", -1 },
{ dhcpClientIdentifier, "dhcpClientIdentifier", -1 },
{ -1, NULL, -1 }
};
typedef udpipMessage *(*dhcp_msg_build_proc)(dhcp_interface *, int *msg_len);
int dhcp_reboot(dhcp_interface *iface);
int dhcp_init(dhcp_interface *iface);
int dhcp_request(dhcp_interface *iface, dhcp_msg_build_proc buildDhcpMsg);
int dhcp_renew(dhcp_interface *iface);
int dhcp_rebind(dhcp_interface *iface);
int dhcp_release(dhcp_interface *iface);
#ifdef ARPCHECK
int dhcp_decline(dhcp_interface *iface);
#endif
int dhcp_inform(dhcp_interface *iface);
#endif