00001
00002
00003
00004
00005
00006 #define nil ((void*)0)
00007
00008 #include <minix/paths.h>
00009
00010
00011 #define PATH_DHCPCONF _PATH_DHCPCONF
00012 #define PATH_DHCPPID _PATH_DHCPPID
00013 #define PATH_DHCPCACHE _PATH_DHCPCACHE
00014 #define PATH_DHCPPOOL _PATH_DHCPPOOL
00015
00016 #define CLID_MAX 32
00017
00018 #ifndef EXTERN
00019 #define EXTERN extern
00020 #endif
00021
00022 EXTERN char *program;
00023 extern char *configfile;
00024 extern char *poolfile;
00025 EXTERN int serving;
00026 EXTERN unsigned test;
00027 EXTERN unsigned debug;
00028 EXTERN asynchio_t asyn;
00029
00030
00031 EXTERN u16_t port_server;
00032 EXTERN u16_t port_client;
00033
00034 #define arraysize(a) (sizeof(a) / sizeof((a)[0]))
00035 #define arraylimit(a) ((a) + arraysize(a))
00036 #define between(a,c,z) (sizeof(c) <= sizeof(unsigned) ? \
00037 (unsigned) (c) - (a) <= (unsigned) (z) - (a) : \
00038 (unsigned long) (c) - (a) <= (unsigned long) (z) - (a))
00039
00040
00041 #define B(a) ((u8_t *) (a))
00042
00043
00044 EXTERN time_t start, now;
00045 EXTERN time_t event;
00046
00047
00048 #define NEVER (sizeof(time_t) <= sizeof(int) ? INT_MAX : LONG_MAX)
00049 #define DELTA_FIRST 4
00050 #define DELTA_FAST 64
00051 #define DELTA_SLOW 512
00052 #define N_SOLICITS 3
00053 #define DELTA_SOL 3
00054 #define DELTA_ADV 2048
00055
00056
00057 typedef struct buf {
00058 eth_hdr_t *eth;
00059 ip_hdr_t *ip;
00060 udp_hdr_t *udp;
00061 udp_io_hdr_t *udpio;
00062 dhcp_t *dhcp;
00063 u8_t pad[2];
00064
00065 u8_t buf[ETH_MAX_PACK_SIZE];
00066 } buf_t;
00067
00068 #define BUF_ETH_SIZE (ETH_MAX_PACK_SIZE)
00069 #define BUF_IP_SIZE (BUF_ETH_SIZE - sizeof(eth_hdr_t))
00070 #define BUF_UDP_SIZE (BUF_IP_SIZE - sizeof(ip_hdr_t) - sizeof(udp_hdr_t) \
00071 + sizeof(udp_io_hdr_t))
00072
00073
00074 typedef enum { FT_CLOSED, FT_ETHERNET, FT_ICMP, FT_BOOTPC, FT_BOOTPS } fdtype_t;
00075
00076 #define FT_ALL FT_CLOSED
00077
00078 typedef struct fd {
00079 i8_t fd;
00080 u8_t fdtype;
00081 char device[sizeof("/dev/eth###")];
00082 u8_t n;
00083 buf_t *bp;
00084 time_t since;
00085 } fd_t;
00086
00087
00088 typedef enum { NT_IP, NT_SINK, NT_ETHERNET } nettype_t;
00089
00090 typedef struct network {
00091 u8_t n;
00092 ether_addr_t eth;
00093 u8_t type;
00094 i8_t sol_ct;
00095 ether_addr_t conflict;
00096 unsigned flags;
00097 fd_t *fdp;
00098 struct network *wait;
00099 ipaddr_t ip;
00100 ipaddr_t mask;
00101 ipaddr_t gateway;
00102 ipaddr_t server;
00103 const char *hostname;
00104 time_t start;
00105 time_t delta;
00106 time_t renew;
00107 time_t rebind;
00108 time_t lease;
00109 time_t solicit;
00110 } network_t;
00111
00112
00113 #define NF_NEGOTIATING 0x001
00114 #define NF_BOUND 0x002
00115 #define NF_SERVING 0x004
00116 #define NF_RELAYING 0x008
00117 #define NF_WAIT 0x010
00118 #define NF_IRDP 0x020
00119 #define NF_CONFLICT 0x040
00120 #define NF_POSSESSIVE 0x080
00121 #define NF_INFORM 0x100
00122
00123
00124 void report(const char *label);
00125 void fatal(const char *label);
00126 void *allocate(size_t size);
00127 int ifname2if(const char *name);
00128 network_t *if2net(int n);
00129
00130
00131 void get_buf(buf_t **bp);
00132 void put_buf(buf_t **bp);
00133 void give_buf(buf_t **dbp, buf_t **sbp);
00134 network_t *newnetwork(void);
00135 void closefd(fd_t *fdp);
00136 int opendev(network_t *np, fdtype_t fdtype, int compete);
00137 void closedev(network_t *np, fdtype_t fdtype);
00138 char *ipdev(int n);
00139 void set_ipconf(char *device, ipaddr_t ip, ipaddr_t mask, unsigned mtu);
00140
00141
00142 void udp2ether(buf_t *bp, network_t *np);
00143 int ether2udp(buf_t *bp);
00144 void make_arp(buf_t *bp, network_t *np);
00145 int is_arp_me(buf_t *bp, network_t *np);
00146 void icmp_solicit(buf_t *bp);
00147 void icmp_advert(buf_t *bp, network_t *np);
00148 ipaddr_t icmp_is_advert(buf_t *bp);
00149
00150
00151 #define gettag(dp, st, pd, pl) dhcp_gettag((dp), (st), (pd), (pl))
00152 void settag(dhcp_t *dp, int tag, void *data, size_t len);
00153 char *cidr_ntoa(ipaddr_t addr, ipaddr_t mask);
00154 void ether2clid(u8_t *clid, ether_addr_t *eth);
00155 void initdhcpconf(void);
00156 int makedhcp(dhcp_t *dp, u8_t *class, size_t calen, u8_t *client, size_t cilen,
00157 ipaddr_t ip, ipaddr_t ifip, network_t *np);
00158 char *dhcptypename(int type);
00159 void printdhcp(dhcp_t *dp);