1 /* vi: set sw=4 ts=4: */
2 /*
3  * Licensed under GPLv2, see file LICENSE in this source tree.
4  */
5 #ifndef UDHCP_DHCPD_H
6 #define UDHCP_DHCPD_H 1
7 
8 PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
9 
10 /* Defaults you may want to tweak */
11 /* Default max_lease_sec */
12 #define DEFAULT_LEASE_TIME      (60*60*24 * 10)
13 #define LEASES_FILE             CONFIG_DHCPD_LEASES_FILE
14 /* Where to find the DHCP server configuration file */
15 #define DHCPD_CONF_FILE         "/etc/udhcpd.conf"
16 
17 
18 struct static_lease;
19 
20 struct server_data_t {
21 	char *interface;                /* interface to use */
22 //TODO: ifindex, server_nip, server_mac
23 // are obtained from interface name.
24 // Instead of querying them *once*, create update_server_network_data_cache()
25 // and call it before any usage of these fields.
26 // update_server_network_data_cache() must re-query data
27 // if more than N seconds have passed after last use.
28 	int ifindex;
29 	uint32_t server_nip;
30 #if ENABLE_FEATURE_UDHCP_PORT
31 	uint16_t port;
32 #endif
33 	uint8_t server_mac[6];          /* our MAC address (used only for ARP probing) */
34 	struct option_set *options;     /* list of DHCP options loaded from the config file */
35 	/* start,end are in host order: we need to compare start <= ip <= end */
36 	uint32_t start_ip;              /* start address of leases, in host order */
37 	uint32_t end_ip;                /* end of leases, in host order */
38 	uint32_t max_lease_sec;         /* maximum lease time (host order) */
39 	uint32_t min_lease_sec;         /* minimum lease time a client can request */
40 	uint32_t max_leases;            /* maximum number of leases (including reserved addresses) */
41 	uint32_t auto_time;             /* how long should udhcpd wait before writing a config file.
42 	                                 * if this is zero, it will only write one on SIGUSR1 */
43 	uint32_t decline_time;          /* how long an address is reserved if a client returns a
44 	                                 * decline message */
45 	uint32_t conflict_time;         /* how long an arp conflict offender is leased for */
46 	uint32_t offer_time;            /* how long an offered address is reserved */
47 	uint32_t siaddr_nip;            /* "next server" bootp option */
48 	char *lease_file;
49 	char *pidfile;
50 	char *notify_file;              /* what to run whenever leases are written */
51 	char *sname;                    /* bootp server name */
52 	char *boot_file;                /* bootp boot file option */
53 	struct static_lease *static_leases; /* List of ip/mac pairs to assign static leases */
54 } FIX_ALIASING;
55 
56 #define server_data (*(struct server_data_t*)bb_common_bufsiz1)
57 /* client_data sits in 2nd half of bb_common_bufsiz1 */
58 
59 #if ENABLE_FEATURE_UDHCP_PORT
60 #define SERVER_PORT  (server_data.port)
61 #define SERVER_PORT6 (server_data.port)
62 #else
63 #define SERVER_PORT  67
64 #define SERVER_PORT6 547
65 #endif
66 
67 
68 typedef uint32_t leasetime_t;
69 typedef int32_t signed_leasetime_t;
70 
71 struct dyn_lease {
72 	/* Unix time when lease expires. Kept in memory in host order.
73 	 * When written to file, converted to network order
74 	 * and adjusted (current time subtracted) */
75 	leasetime_t expires;
76 	/* "nip": IP in network order */
77 	uint32_t lease_nip;
78 	/* We use lease_mac[6], since e.g. ARP probing uses
79 	 * only 6 first bytes anyway. We check received dhcp packets
80 	 * that their hlen == 6 and thus chaddr has only 6 significant bytes
81 	 * (dhcp packet has chaddr[16], not [6])
82 	 */
83 	uint8_t lease_mac[6];
84 	char hostname[20];
85 	uint8_t pad[2];
86 	/* total size is a multiply of 4 */
87 } PACKED;
88 
89 POP_SAVED_FUNCTION_VISIBILITY
90 
91 #endif
92