10 |
#ifndef _COMMON_H |
#ifndef _COMMON_H |
11 |
#define _COMMON_H |
#define _COMMON_H |
12 |
|
|
13 |
#include "busybox.h" |
#include "libbb.h" |
14 |
|
#include <netinet/udp.h> |
15 |
|
#include <netinet/ip.h> |
16 |
|
|
17 |
#define DEFAULT_SCRIPT "/usr/share/udhcpc/default.script" |
#if __GNUC_PREREQ(4,1) |
18 |
|
# pragma GCC visibility push(hidden) |
19 |
|
#endif |
20 |
|
|
21 |
#define COMBINED_BINARY |
#define DEFAULT_SCRIPT CONFIG_UDHCPC_DEFAULT_SCRIPT |
22 |
|
|
23 |
|
extern const uint8_t MAC_BCAST_ADDR[6]; /* six all-ones */ |
24 |
|
|
25 |
/*** packet.h ***/ |
/*** packet.h ***/ |
26 |
|
|
27 |
#include <netinet/udp.h> |
#define DHCP_OPTIONS_BUFSIZE 308 |
|
#include <netinet/ip.h> |
|
28 |
|
|
29 |
struct dhcpMessage { |
struct dhcpMessage { |
30 |
uint8_t op; |
uint8_t op; /* 1 = BOOTREQUEST, 2 = BOOTREPLY */ |
31 |
uint8_t htype; |
uint8_t htype; /* hardware address type. 1 = 10mb ethernet */ |
32 |
uint8_t hlen; |
uint8_t hlen; /* hardware address length */ |
33 |
uint8_t hops; |
uint8_t hops; /* used by relay agents only */ |
34 |
uint32_t xid; |
uint32_t xid; /* unique id */ |
35 |
uint16_t secs; |
uint16_t secs; /* elapsed since client began acquisition/renewal */ |
36 |
uint16_t flags; |
uint16_t flags; /* only one flag so far: */ |
37 |
uint32_t ciaddr; |
#define BROADCAST_FLAG 0x8000 /* "I need broadcast replies" */ |
38 |
uint32_t yiaddr; |
uint32_t ciaddr; /* client IP (if client is in BOUND, RENEW or REBINDING state) */ |
39 |
uint32_t siaddr; |
uint32_t yiaddr; /* 'your' (client) IP address */ |
40 |
uint32_t giaddr; |
uint32_t siaddr; /* IP address of next server to use in bootstrap, |
41 |
uint8_t chaddr[16]; |
* returned in DHCPOFFER, DHCPACK by server */ |
42 |
uint8_t sname[64]; |
uint32_t giaddr; /* relay agent IP address */ |
43 |
uint8_t file[128]; |
uint8_t chaddr[16];/* link-layer client hardware address (MAC) */ |
44 |
uint32_t cookie; |
uint8_t sname[64]; /* server host name (ASCIZ) */ |
45 |
uint8_t options[308]; /* 312 - cookie */ |
uint8_t file[128]; /* boot file name (ASCIZ) */ |
46 |
}; |
uint32_t cookie; /* fixed first four option bytes (99,130,83,99 dec) */ |
47 |
|
uint8_t options[DHCP_OPTIONS_BUFSIZE + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS]; |
48 |
|
} PACKED; |
49 |
|
|
50 |
struct udp_dhcp_packet { |
struct udp_dhcp_packet { |
51 |
struct iphdr ip; |
struct iphdr ip; |
52 |
struct udphdr udp; |
struct udphdr udp; |
53 |
struct dhcpMessage data; |
struct dhcpMessage data; |
54 |
|
} PACKED; |
55 |
|
|
56 |
|
/* Let's see whether compiler understood us right */ |
57 |
|
struct BUG_bad_sizeof_struct_udp_dhcp_packet { |
58 |
|
char BUG_bad_sizeof_struct_udp_dhcp_packet |
59 |
|
[(sizeof(struct udp_dhcp_packet) != 576 + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS) ? -1 : 1]; |
60 |
}; |
}; |
61 |
|
|
62 |
void udhcp_init_header(struct dhcpMessage *packet, char type); |
uint16_t udhcp_checksum(void *addr, int count) FAST_FUNC; |
63 |
int udhcp_get_packet(struct dhcpMessage *packet, int fd); |
|
64 |
uint16_t udhcp_checksum(void *addr, int count); |
void udhcp_init_header(struct dhcpMessage *packet, char type) FAST_FUNC; |
65 |
int udhcp_raw_packet(struct dhcpMessage *payload, |
|
66 |
|
/*int udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd); - in dhcpc.h */ |
67 |
|
int udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd) FAST_FUNC; |
68 |
|
|
69 |
|
int udhcp_send_raw_packet(struct dhcpMessage *payload, |
70 |
uint32_t source_ip, int source_port, |
uint32_t source_ip, int source_port, |
71 |
uint32_t dest_ip, int dest_port, uint8_t *dest_arp, int ifindex); |
uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, |
72 |
int udhcp_kernel_packet(struct dhcpMessage *payload, |
int ifindex) FAST_FUNC; |
73 |
|
|
74 |
|
int udhcp_send_kernel_packet(struct dhcpMessage *payload, |
75 |
uint32_t source_ip, int source_port, |
uint32_t source_ip, int source_port, |
76 |
uint32_t dest_ip, int dest_port); |
uint32_t dest_ip, int dest_port) FAST_FUNC; |
77 |
|
|
78 |
|
|
79 |
/**/ |
/**/ |
80 |
|
|
81 |
void udhcp_background(const char *pidfile); |
void udhcp_run_script(struct dhcpMessage *packet, const char *name) FAST_FUNC; |
|
void udhcp_start_log_and_pid(const char *pidfile); |
|
|
|
|
|
void udhcp_run_script(struct dhcpMessage *packet, const char *name); |
|
82 |
|
|
83 |
// Still need to clean these up... |
// Still need to clean these up... |
84 |
|
|
|
/* from pidfile.h */ |
|
|
#define pidfile_acquire udhcp_pidfile_acquire |
|
|
#define pidfile_write_release udhcp_pidfile_write_release |
|
85 |
/* from options.h */ |
/* from options.h */ |
86 |
#define get_option udhcp_get_option |
#define get_option udhcp_get_option |
87 |
#define end_option udhcp_end_option |
#define end_option udhcp_end_option |
88 |
#define add_option_string udhcp_add_option_string |
#define add_option_string udhcp_add_option_string |
89 |
#define add_simple_option udhcp_add_simple_option |
#define add_simple_option udhcp_add_simple_option |
|
#define option_lengths udhcp_option_lengths |
|
|
/* from socket.h */ |
|
|
#define listen_socket udhcp_listen_socket |
|
|
#define read_interface udhcp_read_interface |
|
|
/* from dhcpc.h */ |
|
|
#define client_config udhcp_client_config |
|
|
/* from dhcpd.h */ |
|
|
#define server_config udhcp_server_config |
|
|
|
|
|
long uptime(void); |
|
|
void udhcp_sp_setup(void); |
|
|
int udhcp_sp_fd_set(fd_set *rfds, int extra_fd); |
|
|
int udhcp_sp_read(fd_set *rfds); |
|
|
int raw_socket(int ifindex); |
|
|
int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp); |
|
|
int listen_socket(uint32_t ip, int port, char *inf); |
|
|
int pidfile_acquire(const char *pidfile); |
|
|
void pidfile_write_release(int pid_fd); |
|
|
int arpping(uint32_t yiaddr, uint32_t ip, uint8_t *arp, char *interface); |
|
90 |
|
|
91 |
#if ENABLE_FEATURE_UDHCP_DEBUG |
void udhcp_sp_setup(void) FAST_FUNC; |
92 |
# define DEBUG(str, args...) bb_info_msg(str, ## args) |
int udhcp_sp_fd_set(fd_set *rfds, int extra_fd) FAST_FUNC; |
93 |
|
int udhcp_sp_read(const fd_set *rfds) FAST_FUNC; |
94 |
|
int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) FAST_FUNC; |
95 |
|
int udhcp_raw_socket(int ifindex) FAST_FUNC; |
96 |
|
int udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf) FAST_FUNC; |
97 |
|
/* Returns 1 if no reply received */ |
98 |
|
int arpping(uint32_t test_ip, uint32_t from_ip, uint8_t *from_mac, const char *interface) FAST_FUNC; |
99 |
|
|
100 |
|
#if ENABLE_UDHCP_DEBUG |
101 |
|
# define DEBUG(str, args...) bb_info_msg("### " str, ## args) |
102 |
#else |
#else |
103 |
# define DEBUG(str, args...) do {;} while (0) |
# define DEBUG(str, args...) do {;} while (0) |
104 |
#endif |
#endif |
105 |
|
|
106 |
|
#if __GNUC_PREREQ(4,1) |
107 |
|
# pragma GCC visibility pop |
108 |
|
#endif |
109 |
|
|
110 |
#endif |
#endif |