common.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /* vi: set sw=4 ts=4: */
  2. /* common.h
  3. *
  4. * Russ Dill <Russ.Dill@asu.edu> September 2001
  5. * Rewritten by Vladimir Oleynik <dzo@simtreas.ru> (C) 2003
  6. *
  7. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  8. */
  9. #ifndef _COMMON_H
  10. #define _COMMON_H
  11. #include "libbb.h"
  12. #include <netinet/udp.h>
  13. #include <netinet/ip.h>
  14. #if __GNUC_PREREQ(4,1)
  15. # pragma GCC visibility push(hidden)
  16. #endif
  17. #define DEFAULT_SCRIPT CONFIG_UDHCPC_DEFAULT_SCRIPT
  18. extern const uint8_t MAC_BCAST_ADDR[6]; /* six all-ones */
  19. /*** packet.h ***/
  20. #define DHCP_OPTIONS_BUFSIZE 308
  21. struct dhcpMessage {
  22. uint8_t op; /* 1 = BOOTREQUEST, 2 = BOOTREPLY */
  23. uint8_t htype; /* hardware address type. 1 = 10mb ethernet */
  24. uint8_t hlen; /* hardware address length */
  25. uint8_t hops; /* used by relay agents only */
  26. uint32_t xid; /* unique id */
  27. uint16_t secs; /* elapsed since client began acquisition/renewal */
  28. uint16_t flags; /* only one flag so far: */
  29. #define BROADCAST_FLAG 0x8000 /* "I need broadcast replies" */
  30. uint32_t ciaddr; /* client IP (if client is in BOUND, RENEW or REBINDING state) */
  31. uint32_t yiaddr; /* 'your' (client) IP address */
  32. uint32_t siaddr; /* IP address of next server to use in bootstrap,
  33. * returned in DHCPOFFER, DHCPACK by server */
  34. uint32_t giaddr; /* relay agent IP address */
  35. uint8_t chaddr[16];/* link-layer client hardware address (MAC) */
  36. uint8_t sname[64]; /* server host name (ASCIZ) */
  37. uint8_t file[128]; /* boot file name (ASCIZ) */
  38. uint32_t cookie; /* fixed first four option bytes (99,130,83,99 dec) */
  39. uint8_t options[DHCP_OPTIONS_BUFSIZE + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS];
  40. } PACKED;
  41. struct udp_dhcp_packet {
  42. struct iphdr ip;
  43. struct udphdr udp;
  44. struct dhcpMessage data;
  45. } PACKED;
  46. /* Let's see whether compiler understood us right */
  47. struct BUG_bad_sizeof_struct_udp_dhcp_packet {
  48. char BUG_bad_sizeof_struct_udp_dhcp_packet
  49. [(sizeof(struct udp_dhcp_packet) != 576 + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS) ? -1 : 1];
  50. };
  51. uint16_t udhcp_checksum(void *addr, int count) FAST_FUNC;
  52. void udhcp_init_header(struct dhcpMessage *packet, char type) FAST_FUNC;
  53. /*int udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd); - in dhcpc.h */
  54. int udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd) FAST_FUNC;
  55. int udhcp_send_raw_packet(struct dhcpMessage *payload,
  56. uint32_t source_ip, int source_port,
  57. uint32_t dest_ip, int dest_port, const uint8_t *dest_arp,
  58. int ifindex) FAST_FUNC;
  59. int udhcp_send_kernel_packet(struct dhcpMessage *payload,
  60. uint32_t source_ip, int source_port,
  61. uint32_t dest_ip, int dest_port) FAST_FUNC;
  62. /**/
  63. void udhcp_run_script(struct dhcpMessage *packet, const char *name) FAST_FUNC;
  64. // Still need to clean these up...
  65. /* from options.h */
  66. #define get_option udhcp_get_option
  67. #define end_option udhcp_end_option
  68. #define add_option_string udhcp_add_option_string
  69. #define add_simple_option udhcp_add_simple_option
  70. void udhcp_sp_setup(void) FAST_FUNC;
  71. int udhcp_sp_fd_set(fd_set *rfds, int extra_fd) FAST_FUNC;
  72. int udhcp_sp_read(const fd_set *rfds) FAST_FUNC;
  73. int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) FAST_FUNC;
  74. int udhcp_raw_socket(int ifindex) FAST_FUNC;
  75. int udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf) FAST_FUNC;
  76. /* Returns 1 if no reply received */
  77. int arpping(uint32_t test_ip, uint32_t from_ip, uint8_t *from_mac, const char *interface) FAST_FUNC;
  78. #if ENABLE_UDHCP_DEBUG
  79. # define DEBUG(str, args...) bb_info_msg("### " str, ## args)
  80. #else
  81. # define DEBUG(str, args...) do {;} while (0)
  82. #endif
  83. #if __GNUC_PREREQ(4,1)
  84. # pragma GCC visibility pop
  85. #endif
  86. #endif