blob: 02e392aaf0e92ac8c7572898e37b68249bdd596d [file] [log] [blame]
"Robert P. J. Day"63fc1a92006-07-02 19:47:05 +00001/* vi: set sw=4 ts=4: */
Mike Frysinger7031f622006-05-08 03:20:50 +00002/* dhcpd.h */
Denis Vlasenkod55fe3e2008-02-04 13:12:16 +00003
Mike Frysinger7031f622006-05-08 03:20:50 +00004#ifndef _DHCPD_H
5#define _DHCPD_H
6
Denis Vlasenko98636eb2008-05-09 17:59:34 +00007#if __GNUC_PREREQ(4,1)
8# pragma GCC visibility push(hidden)
9#endif
10
Mike Frysinger7031f622006-05-08 03:20:50 +000011/************************************/
12/* Defaults _you_ may want to tweak */
13/************************************/
14
15/* the period of time the client is allowed to use that address */
16#define LEASE_TIME (60*60*24*10) /* 10 days of seconds */
Denis Vlasenko84da0bf2008-02-20 22:29:52 +000017#define LEASES_FILE CONFIG_DHCPD_LEASES_FILE
Mike Frysinger7031f622006-05-08 03:20:50 +000018
19/* where to find the DHCP server configuration file */
20#define DHCPD_CONF_FILE "/etc/udhcpd.conf"
21
Mike Frysinger7031f622006-05-08 03:20:50 +000022struct option_set {
23 uint8_t *data;
24 struct option_set *next;
25};
26
27struct static_lease {
Denis Vlasenko42b3dea2007-07-03 15:47:50 +000028 struct static_lease *next;
Denis Vlasenko0416e3d2009-01-01 17:52:09 +000029 uint32_t ip;
30 uint8_t mac[6];
Mike Frysinger7031f622006-05-08 03:20:50 +000031};
32
33struct server_config_t {
Denis Vlasenko42b3dea2007-07-03 15:47:50 +000034 uint32_t server; /* Our IP, in network order */
Denis Vlasenkob386c1c2008-02-04 13:23:53 +000035#if ENABLE_FEATURE_UDHCP_PORT
Denis Vlasenkod55fe3e2008-02-04 13:12:16 +000036 uint16_t port;
Denis Vlasenkob386c1c2008-02-04 13:23:53 +000037#endif
Denis Vlasenkoc82b5102007-07-01 17:05:57 +000038 /* start,end are in host order: we need to compare start <= ip <= end */
Denis Vlasenko42b3dea2007-07-03 15:47:50 +000039 uint32_t start_ip; /* Start address of leases, in host order */
40 uint32_t end_ip; /* End of leases, in host order */
41 struct option_set *options; /* List of DHCP options loaded from the config file */
42 char *interface; /* The name of the interface to use */
43 int ifindex; /* Index number of the interface to use */
44 uint8_t arp[6]; /* Our arp address */
Denis Vlasenko0416e3d2009-01-01 17:52:09 +000045// disabled: dumpleases has no way of knowing this value,
46// and will break if it's off. Now it's on always.
47// char remaining; /* Should the lease time in lease file
48// * be written as lease time remaining, or
49// * as the absolute time the lease expires */
Denis Vlasenko42b3dea2007-07-03 15:47:50 +000050 uint32_t lease; /* lease time in seconds (host order) */
51 uint32_t max_leases; /* maximum number of leases (including reserved address) */
52 uint32_t auto_time; /* how long should udhcpd wait before writing a config file.
53 * if this is zero, it will only write one on SIGUSR1 */
54 uint32_t decline_time; /* how long an address is reserved if a client returns a
55 * decline message */
56 uint32_t conflict_time; /* how long an arp conflict offender is leased for */
57 uint32_t offer_time; /* how long an offered address is reserved */
Denis Vlasenko0416e3d2009-01-01 17:52:09 +000058 uint32_t min_lease; /* minimum lease time a client can request */
59 uint32_t siaddr; /* next server bootp option */
Mike Frysinger7031f622006-05-08 03:20:50 +000060 char *lease_file;
61 char *pidfile;
Denis Vlasenko42b3dea2007-07-03 15:47:50 +000062 char *notify_file; /* What to run whenever leases are written */
Denis Vlasenko42b3dea2007-07-03 15:47:50 +000063 char *sname; /* bootp server name */
64 char *boot_file; /* bootp boot file option */
Mike Frysinger7031f622006-05-08 03:20:50 +000065 struct static_lease *static_leases; /* List of ip/mac pairs to assign static leases */
66};
67
Denis Vlasenkodeabacd2007-09-30 17:55:43 +000068#define server_config (*(struct server_config_t*)&bb_common_bufsiz1)
Denis Vlasenkod55fe3e2008-02-04 13:12:16 +000069/* client_config sits in 2nd half of bb_common_bufsiz1 */
70
71#if ENABLE_FEATURE_UDHCP_PORT
72#define SERVER_PORT (server_config.port)
73#else
74#define SERVER_PORT 67
75#endif
Denis Vlasenkodeabacd2007-09-30 17:55:43 +000076
Mike Frysinger7031f622006-05-08 03:20:50 +000077extern struct dhcpOfferedAddr *leases;
78
79
Denis Vlasenko5a3395b2006-11-18 19:51:32 +000080/*** leases.h ***/
81
Denis Vlasenko0416e3d2009-01-01 17:52:09 +000082typedef uint32_t leasetime_t;
83typedef int32_t signed_leasetime_t;
84
Denis Vlasenko5a3395b2006-11-18 19:51:32 +000085struct dhcpOfferedAddr {
86 uint8_t chaddr[16];
Denis Vlasenko0416e3d2009-01-01 17:52:09 +000087 /* In network order */
88 uint32_t yiaddr;
89 /* Unix time when lease expires, regardless of value of
90 * server_config.remaining. Kept in memory in host order.
91 * When written to file, converted to network order
92 * and optionally adjusted (current time subtracted)
93 * if server_config.remaining = 1 */
94 leasetime_t expires;
Denis Vlasenko5a3395b2006-11-18 19:51:32 +000095};
96
Denis Vlasenko0416e3d2009-01-01 17:52:09 +000097struct dhcpOfferedAddr *add_lease(const uint8_t *chaddr, uint32_t yiaddr, leasetime_t leasetime) FAST_FUNC;
Denis Vlasenkof1980f62008-09-26 09:34:59 +000098int lease_expired(struct dhcpOfferedAddr *lease) FAST_FUNC;
99struct dhcpOfferedAddr *find_lease_by_chaddr(const uint8_t *chaddr) FAST_FUNC;
100struct dhcpOfferedAddr *find_lease_by_yiaddr(uint32_t yiaddr) FAST_FUNC;
Denis Vlasenko0416e3d2009-01-01 17:52:09 +0000101uint32_t find_free_or_expired_address(void) FAST_FUNC;
Denis Vlasenko5a3395b2006-11-18 19:51:32 +0000102
103
104/*** static_leases.h ***/
105
106/* Config file will pass static lease info to this function which will add it
107 * to a data structure that can be searched later */
Denis Vlasenko0416e3d2009-01-01 17:52:09 +0000108void addStaticLease(struct static_lease **lease_struct, uint8_t *mac, uint32_t ip) FAST_FUNC;
Denis Vlasenko5a3395b2006-11-18 19:51:32 +0000109/* Check to see if a mac has an associated static lease */
Denis Vlasenkof1980f62008-09-26 09:34:59 +0000110uint32_t getIpByMac(struct static_lease *lease_struct, void *arg) FAST_FUNC;
Denis Vlasenko5a3395b2006-11-18 19:51:32 +0000111/* Check to see if an ip is reserved as a static ip */
Denis Vlasenko0416e3d2009-01-01 17:52:09 +0000112int reservedIp(struct static_lease *lease_struct, uint32_t ip) FAST_FUNC;
Denis Vlasenko5a3395b2006-11-18 19:51:32 +0000113/* Print out static leases just to check what's going on (debug code) */
Denis Vlasenkof1980f62008-09-26 09:34:59 +0000114void printStaticLeases(struct static_lease **lease_struct) FAST_FUNC;
Denis Vlasenko5a3395b2006-11-18 19:51:32 +0000115
116
117/*** serverpacket.h ***/
118
Denis Vlasenkof1980f62008-09-26 09:34:59 +0000119int send_offer(struct dhcpMessage *oldpacket) FAST_FUNC;
120int send_NAK(struct dhcpMessage *oldpacket) FAST_FUNC;
121int send_ACK(struct dhcpMessage *oldpacket, uint32_t yiaddr) FAST_FUNC;
122int send_inform(struct dhcpMessage *oldpacket) FAST_FUNC;
Denis Vlasenko5a3395b2006-11-18 19:51:32 +0000123
124
125/*** files.h ***/
126
Denis Vlasenkof1980f62008-09-26 09:34:59 +0000127void read_config(const char *file) FAST_FUNC;
128void write_leases(void) FAST_FUNC;
129void read_leases(const char *file) FAST_FUNC;
130struct option_set *find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC;
Denis Vlasenko5a3395b2006-11-18 19:51:32 +0000131
132
Denis Vlasenko98636eb2008-05-09 17:59:34 +0000133#if __GNUC_PREREQ(4,1)
134# pragma GCC visibility pop
135#endif
136
Mike Frysinger7031f622006-05-08 03:20:50 +0000137#endif