source: MondoRescue/branches/3.3/mindi-busybox/networking/udhcp/common.h@ 3803

Last change on this file since 3803 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 13.6 KB
RevLine 
[1765]1/* vi: set sw=4 ts=4: */
[2725]2/*
[821]3 * Russ Dill <Russ.Dill@asu.edu> September 2001
4 * Rewritten by Vladimir Oleynik <dzo@simtreas.ru> (C) 2003
5 *
[2725]6 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
[821]7 */
[2725]8#ifndef UDHCP_COMMON_H
9#define UDHCP_COMMON_H 1
[821]10
[1765]11#include "libbb.h"
[3621]12#include "common_bufsiz.h"
[2725]13#include <netinet/udp.h>
14#include <netinet/ip.h>
[821]15
[2725]16PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
[821]17
[3232]18extern const uint8_t MAC_BCAST_ADDR[6] ALIGN2; /* six all-ones */
[1765]19
20
[2725]21/*** DHCP packet ***/
[1765]22
[2725]23/* DHCP protocol. See RFC 2131 */
24#define DHCP_MAGIC 0x63825363
25#define DHCP_OPTIONS_BUFSIZE 308
26#define BOOTREQUEST 1
27#define BOOTREPLY 2
[821]28
[2725]29//TODO: rename ciaddr/yiaddr/chaddr
30struct dhcp_packet {
31 uint8_t op; /* BOOTREQUEST or BOOTREPLY */
32 uint8_t htype; /* hardware address type. 1 = 10mb ethernet */
33 uint8_t hlen; /* hardware address length */
34 uint8_t hops; /* used by relay agents only */
35 uint32_t xid; /* unique id */
36 uint16_t secs; /* elapsed since client began acquisition/renewal */
37 uint16_t flags; /* only one flag so far: */
38#define BROADCAST_FLAG 0x8000 /* "I need broadcast replies" */
39 uint32_t ciaddr; /* client IP (if client is in BOUND, RENEW or REBINDING state) */
40 uint32_t yiaddr; /* 'your' (client) IP address */
41 /* IP address of next server to use in bootstrap, returned in DHCPOFFER, DHCPACK by server */
42 uint32_t siaddr_nip;
43 uint32_t gateway_nip; /* relay agent IP address */
44 uint8_t chaddr[16]; /* link-layer client hardware address (MAC) */
45 uint8_t sname[64]; /* server host name (ASCIZ) */
46 uint8_t file[128]; /* boot file name (ASCIZ) */
47 uint32_t cookie; /* fixed first four option bytes (99,130,83,99 dec) */
48 uint8_t options[DHCP_OPTIONS_BUFSIZE + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS];
49} PACKED;
50#define DHCP_PKT_SNAME_LEN 64
51#define DHCP_PKT_FILE_LEN 128
52#define DHCP_PKT_SNAME_LEN_STR "64"
53#define DHCP_PKT_FILE_LEN_STR "128"
54
55struct ip_udp_dhcp_packet {
[1765]56 struct iphdr ip;
57 struct udphdr udp;
[2725]58 struct dhcp_packet data;
59} PACKED;
60
61struct udp_dhcp_packet {
62 struct udphdr udp;
63 struct dhcp_packet data;
64} PACKED;
65
66enum {
67 IP_UDP_DHCP_SIZE = sizeof(struct ip_udp_dhcp_packet) - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
68 UDP_DHCP_SIZE = sizeof(struct udp_dhcp_packet) - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
69 DHCP_SIZE = sizeof(struct dhcp_packet) - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
[1765]70};
[821]71
[2725]72/* Let's see whether compiler understood us right */
73struct BUG_bad_sizeof_struct_ip_udp_dhcp_packet {
74 char c[IP_UDP_DHCP_SIZE == 576 ? 1 : -1];
75};
[821]76
[1765]77
[2725]78/*** Options ***/
[1765]79
[2725]80enum {
81 OPTION_IP = 1,
82 OPTION_IP_PAIR,
83 OPTION_STRING,
[3232]84 /* Opts of STRING_HOST type will be sanitized before they are passed
85 * to udhcpc script's environment: */
86 OPTION_STRING_HOST,
[2725]87// OPTION_BOOLEAN,
88 OPTION_U8,
89 OPTION_U16,
90// OPTION_S16,
91 OPTION_U32,
92 OPTION_S32,
93 OPTION_BIN,
94 OPTION_STATIC_ROUTES,
[3232]95 OPTION_6RD,
[2725]96#if ENABLE_FEATURE_UDHCP_RFC3397
97 OPTION_DNS_STRING, /* RFC1035 compressed domain name list */
98 OPTION_SIP_SERVERS,
99#endif
[1765]100
[2725]101 OPTION_TYPE_MASK = 0x0f,
102 /* Client requests this option by default */
103 OPTION_REQ = 0x10,
104 /* There can be a list of 1 or more of these */
105 OPTION_LIST = 0x20,
106};
[1765]107
[2725]108/* DHCP option codes (partial list). See RFC 2132 and
109 * http://www.iana.org/assignments/bootp-dhcp-parameters/
110 * Commented out options are handled by common option machinery,
[3232]111 * uncommented ones have special cases (grep for them to see).
[2725]112 */
113#define DHCP_PADDING 0x00
114#define DHCP_SUBNET 0x01
115//#define DHCP_TIME_OFFSET 0x02 /* (localtime - UTC_time) in seconds. signed */
116//#define DHCP_ROUTER 0x03
117//#define DHCP_TIME_SERVER 0x04 /* RFC 868 time server (32-bit, 0 = 1.1.1900) */
118//#define DHCP_NAME_SERVER 0x05 /* IEN 116 _really_ ancient kind of NS */
119//#define DHCP_DNS_SERVER 0x06
120//#define DHCP_LOG_SERVER 0x07 /* port 704 UDP log (not syslog)
121//#define DHCP_COOKIE_SERVER 0x08 /* "quote of the day" server */
122//#define DHCP_LPR_SERVER 0x09
123#define DHCP_HOST_NAME 0x0c /* either client informs server or server gives name to client */
124//#define DHCP_BOOT_SIZE 0x0d
125//#define DHCP_DOMAIN_NAME 0x0f /* server gives domain suffix */
126//#define DHCP_SWAP_SERVER 0x10
127//#define DHCP_ROOT_PATH 0x11
128//#define DHCP_IP_TTL 0x17
129//#define DHCP_MTU 0x1a
130//#define DHCP_BROADCAST 0x1c
131//#define DHCP_ROUTES 0x21
132//#define DHCP_NIS_DOMAIN 0x28
133//#define DHCP_NIS_SERVER 0x29
134//#define DHCP_NTP_SERVER 0x2a
135//#define DHCP_WINS_SERVER 0x2c
136#define DHCP_REQUESTED_IP 0x32 /* sent by client if specific IP is wanted */
137#define DHCP_LEASE_TIME 0x33
138#define DHCP_OPTION_OVERLOAD 0x34
139#define DHCP_MESSAGE_TYPE 0x35
140#define DHCP_SERVER_ID 0x36 /* by default server's IP */
141#define DHCP_PARAM_REQ 0x37 /* list of options client wants */
142//#define DHCP_ERR_MESSAGE 0x38 /* error message when sending NAK etc */
143#define DHCP_MAX_SIZE 0x39
144#define DHCP_VENDOR 0x3c /* client's vendor (a string) */
145#define DHCP_CLIENT_ID 0x3d /* by default client's MAC addr, but may be arbitrarily long */
146//#define DHCP_TFTP_SERVER_NAME 0x42 /* same as 'sname' field */
147//#define DHCP_BOOT_FILE 0x43 /* same as 'file' field */
148//#define DHCP_USER_CLASS 0x4d /* RFC 3004. set of LASCII strings. "I am a printer" etc */
149#define DHCP_FQDN 0x51 /* client asks to update DNS to map its FQDN to its new IP */
150//#define DHCP_DOMAIN_SEARCH 0x77 /* RFC 3397. set of ASCIZ string, DNS-style compressed */
151//#define DHCP_SIP_SERVERS 0x78 /* RFC 3361. flag byte, then: 0: domain names, 1: IP addrs */
152//#define DHCP_STATIC_ROUTES 0x79 /* RFC 3442. (mask,ip,router) tuples */
[3621]153//#define DHCP_VLAN_ID 0x84 /* 802.1P VLAN ID */
154//#define DHCP_VLAN_PRIORITY 0x85 /* 802.1Q VLAN priority */
155//#define DHCP_PXE_CONF_FILE 0xd1 /* RFC 5071 Configuration File */
156//#define DHCP_PXE_PATH_PREFIX 0xd2 /* RFC 5071 Configuration File */
[2725]157//#define DHCP_MS_STATIC_ROUTES 0xf9 /* Microsoft's pre-RFC 3442 code for 0x79? */
158//#define DHCP_WPAD 0xfc /* MSIE's Web Proxy Autodiscovery Protocol */
159#define DHCP_END 0xff
[1765]160
[2725]161/* Offsets in option byte sequence */
162#define OPT_CODE 0
163#define OPT_LEN 1
164#define OPT_DATA 2
165/* Bits in "overload" option */
166#define OPTION_FIELD 0
167#define FILE_FIELD 1
168#define SNAME_FIELD 2
[1765]169
[2725]170/* DHCP_MESSAGE_TYPE values */
171#define DHCPDISCOVER 1 /* client -> server */
172#define DHCPOFFER 2 /* client <- server */
173#define DHCPREQUEST 3 /* client -> server */
174#define DHCPDECLINE 4 /* client -> server */
175#define DHCPACK 5 /* client <- server */
176#define DHCPNAK 6 /* client <- server */
177#define DHCPRELEASE 7 /* client -> server */
178#define DHCPINFORM 8 /* client -> server */
179#define DHCP_MINTYPE DHCPDISCOVER
180#define DHCP_MAXTYPE DHCPINFORM
181
182struct dhcp_optflag {
183 uint8_t flags;
184 uint8_t code;
185};
186
187struct option_set {
188 uint8_t *data;
189 struct option_set *next;
190};
191
192extern const struct dhcp_optflag dhcp_optflags[];
[3232]193extern const char dhcp_option_strings[] ALIGN1;
194extern const uint8_t dhcp_option_lengths[] ALIGN1;
[2725]195
196unsigned FAST_FUNC udhcp_option_idx(const char *name);
197
198uint8_t *udhcp_get_option(struct dhcp_packet *packet, int code) FAST_FUNC;
199int udhcp_end_option(uint8_t *optionptr) FAST_FUNC;
200void udhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt) FAST_FUNC;
201void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data) FAST_FUNC;
202#if ENABLE_FEATURE_UDHCP_RFC3397
203char *dname_dec(const uint8_t *cstr, int clen, const char *pre) FAST_FUNC;
204uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen) FAST_FUNC;
205#endif
206struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC;
207
208
209// RFC 2131 Table 5: Fields and options used by DHCP clients
210//
211// Fields 'hops', 'yiaddr', 'siaddr', 'giaddr' are always zero
212//
213// Field DHCPDISCOVER DHCPINFORM DHCPREQUEST DHCPDECLINE DHCPRELEASE
214// ----- ------------ ------------ ----------- ----------- -----------
215// 'xid' selected by client selected by client 'xid' from server selected by client selected by client
216// DHCPOFFER message
217// 'secs' 0 or seconds since 0 or seconds since 0 or seconds since 0 0
218// DHCP process started DHCP process started DHCP process started
219// 'flags' Set 'BROADCAST' Set 'BROADCAST' Set 'BROADCAST' 0 0
220// flag if client flag if client flag if client
221// requires broadcast requires broadcast requires broadcast
222// reply reply reply
223// 'ciaddr' 0 client's IP 0 or client's IP 0 client's IP
224// (BOUND/RENEW/REBIND)
225// 'chaddr' client's MAC client's MAC client's MAC client's MAC client's MAC
226// 'sname' options or sname options or sname options or sname (unused) (unused)
227// 'file' options or file options or file options or file (unused) (unused)
228// 'options' options options options message type opt message type opt
229//
230// Option DHCPDISCOVER DHCPINFORM DHCPREQUEST DHCPDECLINE DHCPRELEASE
231// ------ ------------ ---------- ----------- ----------- -----------
232// Requested IP address MAY MUST NOT MUST (in MUST MUST NOT
233// SELECTING or
234// INIT-REBOOT)
235// MUST NOT (in
236// BOUND or
237// RENEWING)
238// IP address lease time MAY MUST NOT MAY MUST NOT MUST NOT
239// Use 'file'/'sname' fields MAY MAY MAY MAY MAY
240// Client identifier MAY MAY MAY MAY MAY
241// Vendor class identifier MAY MAY MAY MUST NOT MUST NOT
242// Server identifier MUST NOT MUST NOT MUST (after MUST MUST
243// SELECTING)
244// MUST NOT (after
245// INIT-REBOOT,
246// BOUND, RENEWING
247// or REBINDING)
248// Parameter request list MAY MAY MAY MUST NOT MUST NOT
249// Maximum message size MAY MAY MAY MUST NOT MUST NOT
250// Message SHOULD NOT SHOULD NOT SHOULD NOT SHOULD SHOULD
251// Site-specific MAY MAY MAY MUST NOT MUST NOT
252// All others MAY MAY MAY MUST NOT MUST NOT
253
254
255/*** Logging ***/
256
257#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
[3232]258# define IF_UDHCP_VERBOSE(...) __VA_ARGS__
[2725]259extern unsigned dhcp_verbose;
[3621]260# define log1(...) do { if (dhcp_verbose >= 1) bb_error_msg(__VA_ARGS__); } while (0)
[2725]261# if CONFIG_UDHCP_DEBUG >= 2
262void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC;
[3621]263# define log2(...) do { if (dhcp_verbose >= 2) bb_error_msg(__VA_ARGS__); } while (0)
[2725]264# else
265# define udhcp_dump_packet(...) ((void)0)
266# define log2(...) ((void)0)
267# endif
268# if CONFIG_UDHCP_DEBUG >= 3
[3621]269# define log3(...) do { if (dhcp_verbose >= 3) bb_error_msg(__VA_ARGS__); } while (0)
[2725]270# else
271# define log3(...) ((void)0)
272# endif
[821]273#else
[3232]274# define IF_UDHCP_VERBOSE(...)
[2725]275# define udhcp_dump_packet(...) ((void)0)
276# define log1(...) ((void)0)
277# define log2(...) ((void)0)
278# define log3(...) ((void)0)
[821]279#endif
280
[2725]281
282/*** Other shared functions ***/
283
284/* 2nd param is "uint32_t*" */
285int FAST_FUNC udhcp_str2nip(const char *str, void *arg);
286/* 2nd param is "struct option_set**" */
287int FAST_FUNC udhcp_str2optset(const char *str, void *arg);
288
289void udhcp_init_header(struct dhcp_packet *packet, char type) FAST_FUNC;
290
291int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd) FAST_FUNC;
292
293int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
294 uint32_t source_nip, int source_port,
295 uint32_t dest_nip, int dest_port, const uint8_t *dest_arp,
296 int ifindex) FAST_FUNC;
297
298int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
299 uint32_t source_nip, int source_port,
300 uint32_t dest_nip, int dest_port) FAST_FUNC;
301
302void udhcp_sp_setup(void) FAST_FUNC;
303int udhcp_sp_fd_set(fd_set *rfds, int extra_fd) FAST_FUNC;
304int udhcp_sp_read(const fd_set *rfds) FAST_FUNC;
305
306int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) FAST_FUNC;
307
308int udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf) FAST_FUNC;
309
310/* Returns 1 if no reply received */
311int arpping(uint32_t test_nip,
312 const uint8_t *safe_mac,
313 uint32_t from_ip,
314 uint8_t *from_mac,
[3621]315 const char *interface,
316 unsigned timeo) FAST_FUNC;
[2725]317
[3232]318/* note: ip is a pointer to an IPv6 in network order, possibly misaliged */
319int sprint_nip6(char *dest, /*const char *pre,*/ const uint8_t *ip) FAST_FUNC;
320
[2725]321POP_SAVED_FUNCTION_VISIBILITY
322
[821]323#endif
Note: See TracBrowser for help on using the repository browser.