busybox/networking/udhcp/dhcpd.h
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/* dhcpd.h */
   3#ifndef UDHCP_DHCPD_H
   4#define UDHCP_DHCPD_H 1
   5
   6PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
   7
   8/* Defaults you may want to tweak */
   9/* Default max_lease_sec */
  10#define LEASE_TIME      (60*60*24 * 10)
  11#define LEASES_FILE     CONFIG_DHCPD_LEASES_FILE
  12/* Where to find the DHCP server configuration file */
  13#define DHCPD_CONF_FILE         "/etc/udhcpd.conf"
  14
  15
  16struct option_set {
  17        uint8_t *data;
  18        struct option_set *next;
  19};
  20
  21struct static_lease {
  22        struct static_lease *next;
  23        uint32_t nip;
  24        uint8_t mac[6];
  25};
  26
  27struct server_config_t {
  28        char *interface;                /* interface to use */
  29//TODO: ifindex, server_nip, server_mac
  30// are obtained from interface name.
  31// Instead of querying them *once*, create update_server_network_data_cache()
  32// and call it before any usage of these fields.
  33// update_server_network_data_cache() must re-query data
  34// if more than N seconds have passed after last use.
  35        int ifindex;
  36        uint32_t server_nip;
  37#if ENABLE_FEATURE_UDHCP_PORT
  38        uint16_t port;
  39#endif
  40        uint8_t server_mac[6];          /* our MAC address (used only for ARP probing) */
  41        struct option_set *options;     /* list of DHCP options loaded from the config file */
  42        int verbose;
  43        /* start,end are in host order: we need to compare start <= ip <= end */
  44        uint32_t start_ip;              /* start address of leases, in host order */
  45        uint32_t end_ip;                /* end of leases, in host order */
  46        uint32_t max_lease_sec;         /* maximum lease time (host order) */
  47        uint32_t min_lease_sec;         /* minimum lease time a client can request */
  48        uint32_t max_leases;            /* maximum number of leases (including reserved addresses) */
  49        uint32_t auto_time;             /* how long should udhcpd wait before writing a config file.
  50                                         * if this is zero, it will only write one on SIGUSR1 */
  51        uint32_t decline_time;          /* how long an address is reserved if a client returns a
  52                                         * decline message */
  53        uint32_t conflict_time;         /* how long an arp conflict offender is leased for */
  54        uint32_t offer_time;            /* how long an offered address is reserved */
  55        uint32_t siaddr_nip;            /* "next server" bootp option */
  56        char *lease_file;
  57        char *pidfile;
  58        char *notify_file;              /* what to run whenever leases are written */
  59        char *sname;                    /* bootp server name */
  60        char *boot_file;                /* bootp boot file option */
  61        struct static_lease *static_leases; /* List of ip/mac pairs to assign static leases */
  62};
  63
  64#define server_config (*(struct server_config_t*)&bb_common_bufsiz1)
  65/* client_config sits in 2nd half of bb_common_bufsiz1 */
  66
  67#if ENABLE_FEATURE_UDHCP_PORT
  68#define SERVER_PORT (server_config.port)
  69#else
  70#define SERVER_PORT 67
  71#endif
  72
  73
  74/*** leases.h ***/
  75
  76typedef uint32_t leasetime_t;
  77typedef int32_t signed_leasetime_t;
  78
  79struct dyn_lease {
  80        /* "nip": IP in network order */
  81        /* Unix time when lease expires. Kept in memory in host order.
  82         * When written to file, converted to network order
  83         * and adjusted (current time subtracted) */
  84        leasetime_t expires;
  85        uint32_t lease_nip;
  86        /* We use lease_mac[6], since e.g. ARP probing uses
  87         * only 6 first bytes anyway. We check received dhcp packets
  88         * that their hlen == 6 and thus chaddr has only 6 significant bytes
  89         * (dhcp packet has chaddr[16], not [6])
  90         */
  91        uint8_t lease_mac[6];
  92        char hostname[20];
  93        uint8_t pad[2];
  94        /* total size is a multiply of 4 */
  95} PACKED;
  96
  97extern struct dyn_lease *g_leases;
  98
  99struct dyn_lease *add_lease(
 100                const uint8_t *chaddr, uint32_t yiaddr,
 101                leasetime_t leasetime,
 102                const char *hostname, int hostname_len
 103                ) FAST_FUNC;
 104int is_expired_lease(struct dyn_lease *lease) FAST_FUNC;
 105struct dyn_lease *find_lease_by_mac(const uint8_t *mac) FAST_FUNC;
 106struct dyn_lease *find_lease_by_nip(uint32_t nip) FAST_FUNC;
 107uint32_t find_free_or_expired_nip(const uint8_t *safe_mac) FAST_FUNC;
 108
 109
 110/*** static_leases.h ***/
 111
 112/* Config file parser will pass static lease info to this function
 113 * which will add it to a data structure that can be searched later */
 114void add_static_lease(struct static_lease **st_lease_pp, uint8_t *mac, uint32_t nip) FAST_FUNC;
 115/* Find static lease IP by mac */
 116uint32_t get_static_nip_by_mac(struct static_lease *st_lease, void *arg) FAST_FUNC;
 117/* Check to see if an IP is reserved as a static IP */
 118int is_nip_reserved(struct static_lease *st_lease, uint32_t nip) FAST_FUNC;
 119/* Print out static leases just to check what's going on (debug code) */
 120#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 2
 121void log_static_leases(struct static_lease **st_lease_pp) FAST_FUNC;
 122#else
 123# define log_static_leases(st_lease_pp) ((void)0)
 124#endif
 125
 126
 127/*** serverpacket.h ***/
 128
 129int send_offer(struct dhcp_packet *oldpacket) FAST_FUNC;
 130int send_NAK(struct dhcp_packet *oldpacket) FAST_FUNC;
 131int send_ACK(struct dhcp_packet *oldpacket, uint32_t yiaddr) FAST_FUNC;
 132int send_inform(struct dhcp_packet *oldpacket) FAST_FUNC;
 133
 134
 135/*** files.h ***/
 136
 137void read_config(const char *file) FAST_FUNC;
 138void write_leases(void) FAST_FUNC;
 139void read_leases(const char *file) FAST_FUNC;
 140struct option_set *find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC;
 141
 142
 143POP_SAVED_FUNCTION_VISIBILITY
 144
 145#endif
 146