From dc4ca6861fc0becc11be1e1749e4b451817fb389 Mon Sep 17 00:00:00 2001
From: Angus Gratton <gus@projectgus.com>
Date: Thu, 21 May 2015 12:21:26 +1000
Subject: [PATCH] Remove udhcp (DHCP server support) as it's a GPL violation :(

---
 FreeRTOS/Source/portable/esp8266/sdk_compat.c |   4 +
 common.mk                                     |   2 +-
 include/udhcp/common.h                        | 434 ------------------
 include/udhcp/dhcpc.h                         |  42 --
 include/udhcp/dhcpd.h                         | 146 ------
 lib/libudhcp.a                                | Bin 42930 -> 0 bytes
 6 files changed, 5 insertions(+), 623 deletions(-)
 delete mode 100644 include/udhcp/common.h
 delete mode 100644 include/udhcp/dhcpc.h
 delete mode 100644 include/udhcp/dhcpd.h
 delete mode 100644 lib/libudhcp.a

diff --git a/FreeRTOS/Source/portable/esp8266/sdk_compat.c b/FreeRTOS/Source/portable/esp8266/sdk_compat.c
index 36b6f7c..9af3b4b 100644
--- a/FreeRTOS/Source/portable/esp8266/sdk_compat.c
+++ b/FreeRTOS/Source/portable/esp8266/sdk_compat.c
@@ -4,6 +4,10 @@
 #include <string.h>
 #include "FreeRTOS.h"
 
+/* SDK uses this and so does lwip, it was defined in libudhcp.a
+   but that library has been removed. */
+int errno;
+
 /* libc memory management functions.
 
    Many of these are linked from the RTOS SDK blob libraries.
diff --git a/common.mk b/common.mk
index 9bdf63e..afeaa0e 100644
--- a/common.mk
+++ b/common.mk
@@ -56,7 +56,7 @@ OBJCOPY = $(CROSS)objcopy
 COMPONENTS     ?= FreeRTOS lwip
 
 # libraries to link, mainly blobs provided by the esp-iot-rtos SDK
-LIBS		?= gcc json main net80211 phy pp ssl udhcp wpa hal
+LIBS		?= gcc json main net80211 phy pp ssl wpa hal
 
 CFLAGS		= -Wall -Werror -Wl,-EL -nostdlib -mlongcalls -mtext-section-literals -std=gnu99
 LDFLAGS		= -nostdlib -Wl,--no-check-sections -Wl,-L$(ROOT)lib -u call_user_start -Wl,-static -Wl,-Map=build/${TARGET}.map
diff --git a/include/udhcp/common.h b/include/udhcp/common.h
deleted file mode 100644
index 332cf76..0000000
--- a/include/udhcp/common.h
+++ /dev/null
@@ -1,434 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Russ Dill <Russ.Dill@asu.edu> September 2001
- * Rewritten by Vladimir Oleynik <dzo@simtreas.ru> (C) 2003
- *
- * Licensed under GPLv2 or later, see file LICENSE in this source tree.
- */
-#ifndef UDHCP_COMMON_H
-#define UDHCP_COMMON_H 1
-
-#include "esp_common.h"
-
-#include "lwip/sockets.h"
-
-//PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
-
-extern const uint8_t MAC_BCAST_ADDR[6]; /* six all-ones */
-
-#ifndef BUFSIZ
-# define BUFSIZ 1024
-#endif
-
-typedef int smallint;
-typedef unsigned smalluint;
-
-/* Providing hard guarantee on minimum size (think of BUFSIZ == 128) */
-enum { COMMON_BUFSIZE = (BUFSIZ >= 256*sizeof(void*) ? BUFSIZ+1 : 256*sizeof(void*)) };
-extern char bb_common_bufsiz1[COMMON_BUFSIZE];
-
-/* In this form code with pipes is much more readable */
-struct fd_pair { int rd; int wr; };
-
-/* Having next pointer as a first member allows easy creation
- * of "llist-compatible" structs, and using llist_FOO functions
- * on them.
- */
-typedef struct llist_t {
-	struct llist_t *link;
-	char *data;
-} llist_t;
-
-void llist_add_to(llist_t **old_head, void *data);
-void llist_add_to_end(llist_t **list_head, void *data);
-void *llist_pop(llist_t **elm);
-void llist_unlink(llist_t **head, llist_t *elm);
-void llist_free(llist_t *elm, void (*freeit)(void *data));
-llist_t *llist_rev(llist_t *list);
-llist_t *llist_find_str(llist_t *first, const char *str);
-
-//unsigned long long monotonic_ns(void);
-//unsigned long long monotonic_us(void);
-//unsigned long long monotonic_ms(void);
-unsigned monotonic_sec(void);
-
-/* performs reasonably well (gcc usually inlines memcpy here) */
-# define move_from_unaligned_int(v, intp) (memcpy(&(v), (intp), sizeof(int)))
-# define move_from_unaligned_long(v, longp) (memcpy(&(v), (longp), sizeof(long)))
-# define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2))
-# define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4))
-# define move_to_unaligned16(u16p, v) do { \
-	uint16_t __t = (v); \
-	memcpy((u16p), &__t, 2); \
-} while (0)
-# define move_to_unaligned32(u32p, v) do { \
-	uint32_t __t = (v); \
-	memcpy((u32p), &__t, 4); \
-} while (0)
-
-enum { wrote_pidfile = 0 };
-#define write_pidfile(path)  ((void)0)
-#define remove_pidfile(path) ((void)0)
-
-#ifndef ENABLE_FEATURE_UDHCP_8021Q
-#define ENABLE_FEATURE_UDHCP_8021Q 0
-#endif
-
-#ifndef ENABLE_FEATURE_UDHCP_RFC3397
-#define ENABLE_FEATURE_UDHCP_RFC3397 0
-#endif
-
-#ifndef ENABLE_LONG_OPTS
-#define ENABLE_LONG_OPTS 0
-#endif
-
-#ifndef ENABLE_FEATURE_UDHCPC_ARPING
-#define ENABLE_FEATURE_UDHCPC_ARPING 0
-#endif
-
-#ifndef ENABLE_FEATURE_UDHCP_PORT
-#define ENABLE_FEATURE_UDHCP_PORT 0
-#endif
-
-#ifndef ENABLE_FEATURE_UDHCPD_BASE_IP_ON_MAC
-#define ENABLE_FEATURE_UDHCPD_BASE_IP_ON_MAC 0
-#endif
-
-#ifndef ENABLE_NOMMU
-#define ENABLE_NOMMU 0
-#endif
-
-#ifndef ENABLE_FEATURE_IPV6
-#define ENABLE_FEATURE_IPV6 0
-#endif
-
-#ifndef ENABLE_FEATURE_UDHCPD_WRITE_LEASES_EARLY
-#define ENABLE_FEATURE_UDHCPD_WRITE_LEASES_EARLY 0
-#endif
-
-/*
- * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably.
- * For earlier versions there is no reliable way to check if we are building
- * for a mmu-less system.
- */
-#if ENABLE_NOMMU
-# define BB_MMU 0
-# define USE_FOR_NOMMU(...) __VA_ARGS__
-# define USE_FOR_MMU(...)
-#else
-# define BB_MMU 1
-# define USE_FOR_NOMMU(...)
-# define USE_FOR_MMU(...) __VA_ARGS__
-#endif
-
-#define ARRAY_SIZE(x) ((unsigned)(sizeof(x) / sizeof((x)[0])))
-
-/*** DHCP packet ***/
-
-/* DHCP protocol. See RFC 2131 */
-#define DHCP_MAGIC              0x63825363
-#define DHCP_OPTIONS_BUFSIZE    308
-#define BOOTREQUEST             1
-#define BOOTREPLY               2
-
-//TODO: rename ciaddr/yiaddr/chaddr
-struct dhcp_packet {
-	uint8_t op;      /* BOOTREQUEST or BOOTREPLY */
-	uint8_t htype;   /* hardware address type. 1 = 10mb ethernet */
-	uint8_t hlen;    /* hardware address length */
-	uint8_t hops;    /* used by relay agents only */
-	uint32_t xid;    /* unique id */
-	uint16_t secs;   /* elapsed since client began acquisition/renewal */
-	uint16_t flags;  /* only one flag so far: */
-#define BROADCAST_FLAG 0x8000 /* "I need broadcast replies" */
-	uint32_t ciaddr; /* client IP (if client is in BOUND, RENEW or REBINDING state) */
-	uint32_t yiaddr; /* 'your' (client) IP address */
-	/* IP address of next server to use in bootstrap, returned in DHCPOFFER, DHCPACK by server */
-	uint32_t siaddr_nip;
-	uint32_t gateway_nip; /* relay agent IP address */
-	uint8_t chaddr[16];   /* link-layer client hardware address (MAC) */
-	uint8_t sname[64];    /* server host name (ASCIZ) */
-	uint8_t file[128];    /* boot file name (ASCIZ) */
-	uint32_t cookie;      /* fixed first four option bytes (99,130,83,99 dec) */
-	uint8_t options[DHCP_OPTIONS_BUFSIZE];// + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS];
-};
-
-#define DHCP_PKT_SNAME_LEN      64
-#define DHCP_PKT_FILE_LEN      128
-#define DHCP_PKT_SNAME_LEN_STR "64"
-#define DHCP_PKT_FILE_LEN_STR "128"
-
-//struct ip_udp_dhcp_packet {
-//	struct ip_hdr ip;
-//	struct udp_hdr udp;
-//	struct dhcp_packet data;
-//};
-//
-//struct udp_dhcp_packet {
-//	struct udp_hdr udp;
-//	struct dhcp_packet data;
-//};
-
-enum {
-//	IP_UDP_DHCP_SIZE = sizeof(struct ip_udp_dhcp_packet),// - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
-//	UDP_DHCP_SIZE    = sizeof(struct udp_dhcp_packet),// - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
-	DHCP_SIZE        = sizeof(struct dhcp_packet),// - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
-};
-
-/* Let's see whether compiler understood us right */
-//struct BUG_bad_sizeof_struct_ip_udp_dhcp_packet {
-//	char c[IP_UDP_DHCP_SIZE == 576 ? 1 : -1];
-//};
-
-
-/*** Options ***/
-
-enum {
-	OPTION_IP = 1,
-	OPTION_IP_PAIR,
-	OPTION_STRING,
-	/* Opts of STRING_HOST type will be sanitized before they are passed
-	 * to udhcpc script's environment: */
-	OPTION_STRING_HOST,
-//	OPTION_BOOLEAN,
-	OPTION_U8,
-	OPTION_U16,
-//	OPTION_S16,
-	OPTION_U32,
-	OPTION_S32,
-	OPTION_BIN,
-	OPTION_STATIC_ROUTES,
-	OPTION_6RD,
-#if ENABLE_FEATURE_UDHCP_RFC3397
-	OPTION_DNS_STRING,  /* RFC1035 compressed domain name list */
-	OPTION_SIP_SERVERS,
-#endif
-
-	OPTION_TYPE_MASK = 0x0f,
-	/* Client requests this option by default */
-	OPTION_REQ  = 0x10,
-	/* There can be a list of 1 or more of these */
-	OPTION_LIST = 0x20,
-};
-
-/* DHCP option codes (partial list). See RFC 2132 and
- * http://www.iana.org/assignments/bootp-dhcp-parameters/
- * Commented out options are handled by common option machinery,
- * uncommented ones have special cases (grep for them to see).
- */
-#define DHCP_PADDING            0x00
-#define DHCP_SUBNET             0x01
-//#define DHCP_TIME_OFFSET      0x02 /* (localtime - UTC_time) in seconds. signed */
-//#define DHCP_ROUTER           0x03
-//#define DHCP_TIME_SERVER      0x04 /* RFC 868 time server (32-bit, 0 = 1.1.1900) */
-//#define DHCP_NAME_SERVER      0x05 /* IEN 116 _really_ ancient kind of NS */
-//#define DHCP_DNS_SERVER       0x06
-//#define DHCP_LOG_SERVER       0x07 /* port 704 UDP log (not syslog)
-//#define DHCP_COOKIE_SERVER    0x08 /* "quote of the day" server */
-//#define DHCP_LPR_SERVER       0x09
-#define DHCP_HOST_NAME          0x0c /* either client informs server or server gives name to client */
-//#define DHCP_BOOT_SIZE        0x0d
-//#define DHCP_DOMAIN_NAME      0x0f /* server gives domain suffix */
-//#define DHCP_SWAP_SERVER      0x10
-//#define DHCP_ROOT_PATH        0x11
-//#define DHCP_IP_TTL           0x17
-//#define DHCP_MTU              0x1a
-//#define DHCP_BROADCAST        0x1c
-//#define DHCP_ROUTES           0x21
-//#define DHCP_NIS_DOMAIN       0x28
-//#define DHCP_NIS_SERVER       0x29
-//#define DHCP_NTP_SERVER       0x2a
-//#define DHCP_WINS_SERVER      0x2c
-#define DHCP_REQUESTED_IP       0x32 /* sent by client if specific IP is wanted */
-#define DHCP_LEASE_TIME         0x33
-#define DHCP_OPTION_OVERLOAD    0x34
-#define DHCP_MESSAGE_TYPE       0x35
-#define DHCP_SERVER_ID          0x36 /* by default server's IP */
-#define DHCP_PARAM_REQ          0x37 /* list of options client wants */
-//#define DHCP_ERR_MESSAGE      0x38 /* error message when sending NAK etc */
-#define DHCP_MAX_SIZE           0x39
-#define DHCP_VENDOR             0x3c /* client's vendor (a string) */
-#define DHCP_CLIENT_ID          0x3d /* by default client's MAC addr, but may be arbitrarily long */
-//#define DHCP_TFTP_SERVER_NAME 0x42 /* same as 'sname' field */
-//#define DHCP_BOOT_FILE        0x43 /* same as 'file' field */
-//#define DHCP_USER_CLASS       0x4d /* RFC 3004. set of LASCII strings. "I am a printer" etc */
-#define DHCP_FQDN               0x51 /* client asks to update DNS to map its FQDN to its new IP */
-//#define DHCP_DOMAIN_SEARCH    0x77 /* RFC 3397. set of ASCIZ string, DNS-style compressed */
-//#define DHCP_SIP_SERVERS      0x78 /* RFC 3361. flag byte, then: 0: domain names, 1: IP addrs */
-//#define DHCP_STATIC_ROUTES    0x79 /* RFC 3442. (mask,ip,router) tuples */
-//#define DHCP_VLAN_ID          0x84 /* 802.1P VLAN ID */
-//#define DHCP_VLAN_PRIORITY    0x85 /* 802.1Q VLAN priority */
-//#define DHCP_PXE_CONF_FILE    0xd1 /* RFC 5071 Configuration File */
-//#define DHCP_MS_STATIC_ROUTES 0xf9 /* Microsoft's pre-RFC 3442 code for 0x79? */
-//#define DHCP_WPAD             0xfc /* MSIE's Web Proxy Autodiscovery Protocol */
-#define DHCP_END                0xff
-
-/* Offsets in option byte sequence */
-#define OPT_CODE                0
-#define OPT_LEN                 1
-#define OPT_DATA                2
-/* Bits in "overload" option */
-#define OPTION_FIELD            0
-#define FILE_FIELD              1
-#define SNAME_FIELD             2
-
-/* DHCP_MESSAGE_TYPE values */
-#define DHCPDISCOVER            1 /* client -> server */
-#define DHCPOFFER               2 /* client <- server */
-#define DHCPREQUEST             3 /* client -> server */
-#define DHCPDECLINE             4 /* client -> server */
-#define DHCPACK                 5 /* client <- server */
-#define DHCPNAK                 6 /* client <- server */
-#define DHCPRELEASE             7 /* client -> server */
-#define DHCPINFORM              8 /* client -> server */
-#define DHCP_MINTYPE DHCPDISCOVER
-#define DHCP_MAXTYPE DHCPINFORM
-
-struct dhcp_optflag {
-	uint8_t flags;
-	uint8_t code;
-};
-
-struct option_set {
-	uint8_t *data;
-	struct option_set *next;
-};
-
-extern const struct dhcp_optflag dhcp_optflags[];
-extern const char dhcp_option_strings[];
-extern const uint8_t dhcp_option_lengths[];
-
-unsigned udhcp_option_idx(const char *name);
-
-uint8_t *udhcp_get_option(struct dhcp_packet *packet, int code);
-int udhcp_end_option(uint8_t *optionptr);
-void udhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt);
-void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data);
-#if ENABLE_FEATURE_UDHCP_RFC3397
-char *dname_dec(const uint8_t *cstr, int clen, const char *pre);
-uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen);
-#endif
-struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code);
-
-
-// RFC 2131  Table 5: Fields and options used by DHCP clients
-//
-// Fields 'hops', 'yiaddr', 'siaddr', 'giaddr' are always zero
-//
-// Field      DHCPDISCOVER          DHCPINFORM            DHCPREQUEST           DHCPDECLINE         DHCPRELEASE
-// -----      ------------          ------------          -----------           -----------         -----------
-// 'xid'      selected by client    selected by client    'xid' from server     selected by client  selected by client
-//                                                        DHCPOFFER message
-// 'secs'     0 or seconds since    0 or seconds since    0 or seconds since    0                   0
-//            DHCP process started  DHCP process started  DHCP process started
-// 'flags'    Set 'BROADCAST'       Set 'BROADCAST'       Set 'BROADCAST'       0                   0
-//            flag if client        flag if client        flag if client
-//            requires broadcast    requires broadcast    requires broadcast
-//            reply                 reply                 reply
-// 'ciaddr'   0                     client's IP           0 or client's IP      0                   client's IP
-//                                                        (BOUND/RENEW/REBIND)
-// 'chaddr'   client's MAC          client's MAC          client's MAC          client's MAC        client's MAC
-// 'sname'    options or sname      options or sname      options or sname      (unused)            (unused)
-// 'file'     options or file       options or file       options or file       (unused)            (unused)
-// 'options'  options               options               options               message type opt    message type opt
-//
-// Option                     DHCPDISCOVER  DHCPINFORM  DHCPREQUEST      DHCPDECLINE  DHCPRELEASE
-// ------                     ------------  ----------  -----------      -----------  -----------
-// Requested IP address       MAY           MUST NOT    MUST (in         MUST         MUST NOT
-//                                                      SELECTING or
-//                                                      INIT-REBOOT)
-//                                                      MUST NOT (in
-//                                                      BOUND or
-//                                                      RENEWING)
-// IP address lease time      MAY           MUST NOT    MAY              MUST NOT     MUST NOT
-// Use 'file'/'sname' fields  MAY           MAY         MAY              MAY          MAY
-// Client identifier          MAY           MAY         MAY              MAY          MAY
-// Vendor class identifier    MAY           MAY         MAY              MUST NOT     MUST NOT
-// Server identifier          MUST NOT      MUST NOT    MUST (after      MUST         MUST
-//                                                      SELECTING)
-//                                                      MUST NOT (after
-//                                                      INIT-REBOOT,
-//                                                      BOUND, RENEWING
-//                                                      or REBINDING)
-// Parameter request list     MAY           MAY         MAY              MUST NOT     MUST NOT
-// Maximum message size       MAY           MAY         MAY              MUST NOT     MUST NOT
-// Message                    SHOULD NOT    SHOULD NOT  SHOULD NOT       SHOULD       SHOULD
-// Site-specific              MAY           MAY         MAY              MUST NOT     MUST NOT
-// All others                 MAY           MAY         MAY              MUST NOT     MUST NOT
-
-
-/*** Logging ***/
-
-#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
-# define IF_UDHCP_VERBOSE(...) __VA_ARGS__
-extern unsigned dhcp_verbose;
-# define log1(...) do { if (dhcp_verbose >= 1) bb_info_msg(__VA_ARGS__); } while (0)
-# if CONFIG_UDHCP_DEBUG >= 2
-void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC;
-#  define log2(...) do { if (dhcp_verbose >= 2) bb_info_msg(__VA_ARGS__); } while (0)
-# else
-#  define udhcp_dump_packet(...) ((void)0)
-#  define log2(...) ((void)0)
-# endif
-# if CONFIG_UDHCP_DEBUG >= 3
-#  define log3(...) do { if (dhcp_verbose >= 3) bb_info_msg(__VA_ARGS__); } while (0)
-# else
-#  define log3(...) ((void)0)
-# endif
-#else
-# define IF_UDHCP_VERBOSE(...)
-# define udhcp_dump_packet(...) ((void)0)
-# define log1(...) ((void)0)
-# define log2(...) ((void)0)
-# define log3(...) ((void)0)
-#endif
-
-//#define UDHCP_DBG
-
-#ifdef UDHCP_DBG
-#define UDHCP_DEBUG os_printf
-#else
-#define UDHCP_DEBUG(...)
-#endif
-
-/*** Other shared functions ***/
-
-/* 2nd param is "uint32_t*" */
-int udhcp_str2nip(const char *str, void *arg);
-/* 2nd param is "struct option_set**" */
-int udhcp_str2optset(const char *str, void *arg);
-
-void udhcp_init_header(struct dhcp_packet *packet, char type);
-
-int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd);
-
-//int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
-//		uint32_t source_nip, int source_port,
-//		uint32_t dest_nip, int dest_port, const uint8_t *dest_arp,
-//		int ifindex);
-
-int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
-		uint32_t source_nip, int source_port,
-		uint32_t dest_nip, int dest_port);
-
-void udhcp_sp_setup(void);
-int udhcp_sp_fd_set(fd_set *rfds, int extra_fd);
-int udhcp_sp_read(const fd_set *rfds);
-
-int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac);
-
-int udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf);
-
-/* Returns 1 if no reply received */
-int arpping(uint32_t test_nip,
-		const uint8_t *safe_mac,
-		uint32_t from_ip,
-		uint8_t *from_mac,
-		const char *interface);
-
-/* note: ip is a pointer to an IPv6 in network order, possibly misaliged */
-int sprint_nip6(char *dest, /*const char *pre,*/ const uint8_t *ip);
-
-//POP_SAVED_FUNCTION_VISIBILITY
-
-#endif
diff --git a/include/udhcp/dhcpc.h b/include/udhcp/dhcpc.h
deleted file mode 100644
index 1896d40..0000000
--- a/include/udhcp/dhcpc.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Licensed under GPLv2, see file LICENSE in this source tree.
- */
-#ifndef UDHCP_DHCPC_H
-#define UDHCP_DHCPC_H 1
-
-//PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
-
-struct client_config_t {
-	uint8_t client_mac[6];          /* Our mac address */
-//	IF_FEATURE_UDHCP_PORT(uint16_t port;)
-	int ifindex;                    /* Index number of the interface to use */
-	uint8_t opt_mask[256 / 8];      /* Bitmask of options to send (-O option) */
-	const char *interface;          /* The name of the interface to use */
-	char *pidfile;                  /* Optionally store the process ID */
-	const char *script;             /* User script to run at dhcp events */
-	struct option_set *options;     /* list of DHCP options to send to server */
-	uint8_t *clientid;              /* Optional client id to use */
-	uint8_t *vendorclass;           /* Optional vendor class-id to use */
-	uint8_t *hostname;              /* Optional hostname to use */
-	uint8_t *fqdn;                  /* Optional fully qualified domain name to use */
-
-	uint16_t first_secs;
-	uint16_t last_secs;
-};
-
-/* server_config sits in 1st half of bb_common_bufsiz1 */
-#define client_config (*(struct client_config_t*)(&bb_common_bufsiz1[COMMON_BUFSIZE / 2]))
-
-#if ENABLE_FEATURE_UDHCP_PORT
-#define CLIENT_PORT  (client_config.port)
-#define CLIENT_PORT6 (client_config.port)
-#else
-#define CLIENT_PORT  68
-#define CLIENT_PORT6 546
-#endif
-
-//POP_SAVED_FUNCTION_VISIBILITY
-
-#endif
-
diff --git a/include/udhcp/dhcpd.h b/include/udhcp/dhcpd.h
deleted file mode 100644
index bc5e883..0000000
--- a/include/udhcp/dhcpd.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* vi: set sw=4 ts=4: */
-/*
- * Licensed under GPLv2, see file LICENSE in this source tree.
- */
-#ifndef UDHCP_DHCPD_H
-#define UDHCP_DHCPD_H 1
-
-//PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
-
-/* Defaults you may want to tweak */
-/* Default max_lease_sec */
-#define DEFAULT_LEASE_TIME      (60*60*24 * 10)
-#define LEASES_FILE             CONFIG_DHCPD_LEASES_FILE
-/* Where to find the DHCP server configuration file */
-#define DHCPD_CONF_FILE         "/etc/udhcpd.conf"
-
-#ifndef ENABLE_FEATURE_UDHCP_PORT
-#define ENABLE_FEATURE_UDHCP_PORT 0
-#endif
-
-struct static_lease {
-	struct static_lease *next;
-	uint32_t nip;
-	uint8_t mac[6];
-};
-
-struct server_config_t {
-	char *interface;                /* interface to use */
-//TODO: ifindex, server_nip, server_mac
-// are obtained from interface name.
-// Instead of querying them *once*, create update_server_network_data_cache()
-// and call it before any usage of these fields.
-// update_server_network_data_cache() must re-query data
-// if more than N seconds have passed after last use.
-	int ifindex;
-	uint32_t server_nip;
-#if ENABLE_FEATURE_UDHCP_PORT
-	uint16_t port;
-#endif
-	uint8_t server_mac[6];          /* our MAC address (used only for ARP probing) */
-	struct option_set *options;     /* list of DHCP options loaded from the config file */
-	/* start,end are in host order: we need to compare start <= ip <= end */
-	uint32_t start_ip;              /* start address of leases, in host order */
-	uint32_t end_ip;                /* end of leases, in host order */
-	uint32_t max_lease_sec;         /* maximum lease time (host order) */
-	uint32_t min_lease_sec;         /* minimum lease time a client can request */
-	uint32_t max_leases;            /* maximum number of leases (including reserved addresses) */
-	uint32_t auto_time;             /* how long should udhcpd wait before writing a config file.
-	                                 * if this is zero, it will only write one on SIGUSR1 */
-	uint32_t decline_time;          /* how long an address is reserved if a client returns a
-	                                 * decline message */
-	uint32_t conflict_time;         /* how long an arp conflict offender is leased for */
-	uint32_t offer_time;            /* how long an offered address is reserved */
-	uint32_t siaddr_nip;            /* "next server" bootp option */
-	char *lease_file;
-	char *pidfile;
-	char *notify_file;              /* what to run whenever leases are written */
-	char *sname;                    /* bootp server name */
-	char *boot_file;                /* bootp boot file option */
-	struct static_lease *static_leases; /* List of ip/mac pairs to assign static leases */
-};
-
-#define server_config (*(struct server_config_t*)&bb_common_bufsiz1)
-/* client_config sits in 2nd half of bb_common_bufsiz1 */
-
-#if ENABLE_FEATURE_UDHCP_PORT
-#define SERVER_PORT  (server_config.port)
-#define SERVER_PORT6 (server_config.port)
-#else
-#define SERVER_PORT  67
-#define SERVER_PORT6 547
-#endif
-
-
-typedef uint32_t leasetime_t;
-typedef int32_t signed_leasetime_t;
-
-struct dyn_lease {
-	/* Unix time when lease expires. Kept in memory in host order.
-	 * When written to file, converted to network order
-	 * and adjusted (current time subtracted) */
-	leasetime_t expires;
-	/* "nip": IP in network order */
-	uint32_t lease_nip;
-	/* We use lease_mac[6], since e.g. ARP probing uses
-	 * only 6 first bytes anyway. We check received dhcp packets
-	 * that their hlen == 6 and thus chaddr has only 6 significant bytes
-	 * (dhcp packet has chaddr[16], not [6])
-	 */
-	uint8_t lease_mac[6];
-	char hostname[20];
-	uint8_t pad[2];
-	/* total size is a multiply of 4 */
-};
-
-extern struct dyn_lease *g_leases;
-
-struct dyn_lease *add_lease(
-		const uint8_t *chaddr, uint32_t yiaddr,
-		leasetime_t leasetime,
-		const char *hostname, int hostname_len
-		);
-int is_expired_lease(struct dyn_lease *lease);
-struct dyn_lease *find_lease_by_mac(const uint8_t *mac);
-struct dyn_lease *find_lease_by_nip(uint32_t nip);
-uint32_t find_free_or_expired_nip(const uint8_t *safe_mac);
-
-
-/* Config file parser will pass static lease info to this function
- * which will add it to a data structure that can be searched later */
-void add_static_lease(struct static_lease **st_lease_pp, uint8_t *mac, uint32_t nip);
-/* Find static lease IP by mac */
-uint32_t get_static_nip_by_mac(struct static_lease *st_lease, void *arg);
-/* Check to see if an IP is reserved as a static IP */
-int is_nip_reserved(struct static_lease *st_lease, uint32_t nip);
-/* Print out static leases just to check what's going on (debug code) */
-#ifdef UDHCP_DBG
-void log_static_leases(struct static_lease **st_lease_pp);
-#else
-# define log_static_leases(st_lease_pp) ((void)0)
-#endif
-
-struct dhcp_info{
-	/* start,end are in host order: we need to compare start <= ip <= end */
-	uint32_t start_ip;              /* start address of leases, in host order */
-	uint32_t end_ip;                /* end of leases, in host order */
-
-	uint32_t max_leases;            /* maximum number of leases (including reserved addresses) */
-	uint32_t auto_time;             /* how long should udhcpd wait before writing a config file.
-			                         * if this is zero, it will only write one on SIGUSR1 */
-	uint32_t decline_time;          /* how long an address is reserved if a client returns a
-			                         * decline message */
-	uint32_t conflict_time;         /* how long an arp conflict offender is leased for */
-	uint32_t offer_time;            /* how long an offered address is reserved */
-	uint32_t max_lease_sec;         /* maximum lease time (host order) */
-	uint32_t min_lease_sec;         /* minimum lease time a client can request */
-};
-
-void read_config(const char *file);
-void write_leases(void);
-void read_leases(const char *file);
-
-void udhcpd_start(void);
-//POP_SAVED_FUNCTION_VISIBILITY
-
-#endif
diff --git a/lib/libudhcp.a b/lib/libudhcp.a
deleted file mode 100644
index d3cd28daef8227e63b7357f32ddf84f98bd80bb3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 42930
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
F{{WP~5CQ-I