X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fudhcp%2Fcommon.h;h=73f860a77dda228dce04cc453e5bda36d6ca02b6;hb=0cad5f9b6dd80858c3ebb3893e04d2378eddc872;hp=a526494d7c5df0e75b27d3a975e393b485c88744;hpb=e6a2f4cc5a47d3022bdf5ca2cacbaa5a8c5baf7a;p=oweals%2Fbusybox.git diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h index a526494d7..73f860a77 100644 --- a/networking/udhcp/common.h +++ b/networking/udhcp/common.h @@ -40,7 +40,7 @@ struct dhcp_packet { 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 */ + uint32_t gateway_nip; /* aka 'giaddr': 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) */ @@ -93,8 +93,10 @@ enum { OPTION_BIN, OPTION_STATIC_ROUTES, OPTION_6RD, -#if ENABLE_FEATURE_UDHCP_RFC3397 +#if ENABLE_FEATURE_UDHCP_RFC3397 || ENABLE_FEATURE_UDHCPC6_RFC3646 || ENABLE_FEATURE_UDHCPC6_RFC4704 OPTION_DNS_STRING, /* RFC1035 compressed domain name list */ +#endif +#if ENABLE_FEATURE_UDHCP_RFC3397 OPTION_SIP_SERVERS, #endif @@ -117,12 +119,12 @@ enum { //#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_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_HOST_NAME 0x0c /* 12: 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_DOMAIN_NAME 0x0f /* 15: server gives domain suffix */ //#define DHCP_SWAP_SERVER 0x10 //#define DHCP_ROOT_PATH 0x11 //#define DHCP_IP_TTL 0x17 @@ -133,35 +135,42 @@ enum { //#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_PXE_PATH_PREFIX 0xd2 /* 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 +#define DHCP_REQUESTED_IP 0x32 /* 50: sent by client if specific IP is wanted */ +#define DHCP_LEASE_TIME 0x33 /* 51: */ +#define DHCP_OPTION_OVERLOAD 0x34 /* 52: */ +#define DHCP_MESSAGE_TYPE 0x35 /* 53: */ +#define DHCP_SERVER_ID 0x36 /* 54: server's IP */ +#define DHCP_PARAM_REQ 0x37 /* 55: list of options client wants */ +//#define DHCP_ERR_MESSAGE 0x38 /* 56: error message when sending NAK etc */ +#define DHCP_MAX_SIZE 0x39 /* 57: */ +#define DHCP_VENDOR 0x3c /* 60: client's vendor (a string) */ +#define DHCP_CLIENT_ID 0x3d /* 61: by default client's MAC addr, but may be arbitrarily long */ +//#define DHCP_TFTP_SERVER_NAME 0x42 /* 66: same as 'sname' field */ +//#define DHCP_BOOT_FILE 0x43 /* 67: same as 'file' field */ +//#define DHCP_USER_CLASS 0x4d /* 77: RFC 3004. set of LASCII strings. "I am a printer" etc */ +#define DHCP_FQDN 0x51 /* 81: client asks to update DNS to map its FQDN to its new IP */ +//#define DHCP_PCODE 0x64 /* 100: RFC 4833. IEEE 1003.1 TZ string */ +//#define DHCP_TCODE 0x65 /* 101: RFC 4833. Reference to the TZ database string */ +//#define DHCP_DOMAIN_SEARCH 0x77 /* 119: RFC 3397. set of ASCIZ string, DNS-style compressed */ +//#define DHCP_SIP_SERVERS 0x78 /* 120: RFC 3361. flag byte, then: 0: domain names, 1: IP addrs */ +//#define DHCP_STATIC_ROUTES 0x79 /* 121: RFC 3442. (mask,ip,router) tuples */ +//#define DHCP_VLAN_ID 0x84 /* 132: 802.1P VLAN ID */ +//#define DHCP_VLAN_PRIORITY 0x85 /* 133: 802.1Q VLAN priority */ +//#define DHCP_PXE_CONF_FILE 0xd1 /* 209: RFC 5071 Configuration file */ +//#define DHCP_PXE_PATH_PREFIX 0xd2 /* 210: RFC 5071 Path prefix */ +//#define DHCP_REBOOT_TIME 0xd3 /* 211: RFC 5071 Reboot time */ +//#define DHCP_MS_STATIC_ROUTES 0xf9 /* 249: Microsoft's pre-RFC 3442 code for 0x79? */ +//#define DHCP_WPAD 0xfc /* 252: MSIE's Web Proxy Autodiscovery Protocol */ +#define DHCP_END 0xff /* 255: */ /* Offsets in option byte sequence */ #define OPT_CODE 0 #define OPT_LEN 1 #define OPT_DATA 2 +/* Offsets in option byte sequence for DHCPv6 */ +#define D6_OPT_CODE 0 +#define D6_OPT_LEN 2 +#define D6_OPT_DATA 4 /* Bits in "overload" option */ #define OPTION_FIELD 0 #define FILE_FIELD 1 @@ -189,26 +198,33 @@ struct option_set { struct option_set *next; }; +#if ENABLE_UDHCPC || ENABLE_UDHCPD extern const struct dhcp_optflag dhcp_optflags[]; extern const char dhcp_option_strings[] ALIGN1; +#endif extern const uint8_t dhcp_option_lengths[] ALIGN1; -unsigned FAST_FUNC udhcp_option_idx(const char *name); +unsigned FAST_FUNC udhcp_option_idx(const char *name, const char *option_strings); uint8_t *udhcp_get_option(struct dhcp_packet *packet, int code) FAST_FUNC; +/* Same as above + ensures that option length is 4 bytes + * (returns NULL if size is different) + */ +uint8_t *udhcp_get_option32(struct dhcp_packet *packet, int code) FAST_FUNC; int udhcp_end_option(uint8_t *optionptr) FAST_FUNC; void udhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt) FAST_FUNC; +#if ENABLE_UDHCPC || ENABLE_UDHCPD void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data) FAST_FUNC; -#if ENABLE_FEATURE_UDHCP_RFC3397 +#endif +#if ENABLE_FEATURE_UDHCP_RFC3397 || ENABLE_FEATURE_UDHCPC6_RFC3646 || ENABLE_FEATURE_UDHCPC6_RFC4704 char *dname_dec(const uint8_t *cstr, int clen, const char *pre) FAST_FUNC; -uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen) FAST_FUNC; +uint8_t *dname_enc(/*const uint8_t *cstr, int clen,*/ const char *src, int *retlen) FAST_FUNC; #endif struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC; - // RFC 2131 Table 5: Fields and options used by DHCP clients // -// Fields 'hops', 'yiaddr', 'siaddr', 'giaddr' are always zero +// Fields 'hops', 'yiaddr', 'siaddr', 'giaddr' are always zero, 'chaddr' is always client's MAC // // Field DHCPDISCOVER DHCPINFORM DHCPREQUEST DHCPDECLINE DHCPRELEASE // ----- ------------ ------------ ----------- ----------- ----------- @@ -217,76 +233,98 @@ struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code) // '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 +// flag if client needs flag if client needs flag if client needs +// broadcast reply broadcast reply broadcast 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) +// Option DHCPDISCOVER DHCPINFORM DHCPREQUEST DHCPDECLINE DHCPRELEASE +// ------ ------------ ---------- ----------- ----------- ----------- +// Requested IP address MAY MUST NOT MUST (in SELECTING MUST MUST NOT +// 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 SELECTING) MUST MUST // 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 - +// 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_error_msg(__VA_ARGS__); } while (0) +# define log1(...) do { if (dhcp_verbose >= 1) bb_info_msg(__VA_ARGS__); } while (0) +# define log1s(msg) do { if (dhcp_verbose >= 1) bb_simple_info_msg(msg); } 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_error_msg(__VA_ARGS__); } while (0) +# define log2(...) do { if (dhcp_verbose >= 2) bb_info_msg(__VA_ARGS__); } while (0) +# define log2s(msg) do { if (dhcp_verbose >= 2) bb_simple_info_msg(msg); } while (0) # else # define udhcp_dump_packet(...) ((void)0) # define log2(...) ((void)0) +# define log2s(msg) ((void)0) # endif # if CONFIG_UDHCP_DEBUG >= 3 -# define log3(...) do { if (dhcp_verbose >= 3) bb_error_msg(__VA_ARGS__); } while (0) +# define log3(...) do { if (dhcp_verbose >= 3) bb_info_msg(__VA_ARGS__); } while (0) +# define log3s(msg) do { if (dhcp_verbose >= 3) bb_simple_info_msg(msg); } while (0) # else # define log3(...) ((void)0) +# define log3s(msg) ((void)0) # endif #else # define IF_UDHCP_VERBOSE(...) # define udhcp_dump_packet(...) ((void)0) # define log1(...) ((void)0) +# define log1s(msg) ((void)0) # define log2(...) ((void)0) +# define log2s(msg) ((void)0) # define log3(...) ((void)0) +# define log3s(msg) ((void)0) #endif +#if defined(__mips__) +/* + * The 'simple' message functions have a negative impact on the size of the + * DHCP code when compiled for MIPS, so don't use them in this case. + */ +#define bb_simple_info_msg bb_info_msg +#define bb_simple_error_msg bb_error_msg +#define bb_simple_perror_msg_and_die bb_perror_msg_and_die +#undef log1s +#define log1s log1 +#endif /*** Other shared functions ***/ /* 2nd param is "uint32_t*" */ int FAST_FUNC udhcp_str2nip(const char *str, void *arg); /* 2nd param is "struct option_set**" */ -int FAST_FUNC udhcp_str2optset(const char *str, void *arg); +#if !ENABLE_UDHCPC6 +#define udhcp_str2optset(str, arg, optflags, option_strings, dhcpv6) \ + udhcp_str2optset(str, arg, optflags, option_strings) +#endif +int FAST_FUNC udhcp_str2optset(const char *str, + void *arg, + const struct dhcp_optflag *optflags, + const char *option_strings, + bool dhcpv6); +#if ENABLE_UDHCPC || ENABLE_UDHCPD void udhcp_init_header(struct dhcp_packet *packet, char type) FAST_FUNC; +#endif int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd) FAST_FUNC; @@ -300,8 +338,8 @@ int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, uint32_t dest_nip, int dest_port) FAST_FUNC; void udhcp_sp_setup(void) FAST_FUNC; -int udhcp_sp_fd_set(fd_set *rfds, int extra_fd) FAST_FUNC; -int udhcp_sp_read(const fd_set *rfds) FAST_FUNC; +void udhcp_sp_fd_set(struct pollfd *pfds, int extra_fd) FAST_FUNC; +int udhcp_sp_read(void) FAST_FUNC; int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) FAST_FUNC;