Annotation of embedaddon/coova-chilli/src/dhcp.h, revision 1.1.1.1
1.1 misho 1: /*
2: * DHCP library functions
3: * Copyright (C) 2003, 2004, 2005 Mondru AB.
4: * Copyright (c) 2007 David Bird <david@coova.com>
5: *
6: * The contents of this file may be used under the terms of the GNU
7: * General Public License Version 2, provided that the above copyright
8: * notice and this permission notice is included in all copies or
9: * substantial portions of the software.
10: *
11: * The initial developer of the original code is
12: * Jens Jakobsen <jj@chillispot.org>
13: *
14: */
15:
16:
17: #ifndef _DHCP_H
18: #define _DHCP_H
19:
20: #include "pkt.h"
21: #include "garden.h"
22: #include "net.h"
23:
24: /* Option constants */
25: #define DHCP_OPTION_MAGIC_LEN 4
26:
27: #define DHCP_OPTION_PAD 0
28: #define DHCP_OPTION_SUBNET_MASK 1
29: #define DHCP_OPTION_ROUTER_OPTION 3
30: #define DHCP_OPTION_DNS 6
31: #define DHCP_OPTION_HOSTNAME 12
32: #define DHCP_OPTION_DOMAIN_NAME 15
33: #define DHCP_OPTION_INTERFACE_MTU 26
34: #define DHCP_OPTION_REQUESTED_IP 50
35: #define DHCP_OPTION_LEASE_TIME 51
36: #define DHCP_OPTION_MESSAGE_TYPE 53
37: #define DHCP_OPTION_SERVER_ID 54
38: #define DHCP_OPTION_PARAMETER_REQUEST_LIST 55
39: #define DHCP_OPTION_VENDOR_CLASS_IDENTIFIER 60
40: #define DHCP_OPTION_CLIENT_IDENTIFIER 61
41: #define DHCP_OPTION_CLIENT_FQDN 81
42:
43: /* !!highly experimental!! */
44: #define DHCP_OPTION_CALLED_STATION_ID 197
45: #define DHCP_OPTION_CAPTIVE_PORTAL_ACL 198
46: #define DHCP_OPTION_CAPTIVE_PORTAL_URL 199
47:
48: #define DHCP_OPTION_END 255
49:
50: /* BOOTP Message Types */
51: #define DHCP_BOOTREQUEST 1
52: #define DHCP_BOOTREPLY 2
53:
54: /* DHCP Message Types */
55: #define DHCPDISCOVER 1
56: #define DHCPOFFER 2
57: #define DHCPREQUEST 3
58: #define DHCPDECLINE 4
59: #define DHCPACK 5
60: #define DHCPNAK 6
61: #define DHCPRELEASE 7
62: #define DHCPINFORM 8
63:
64: /* UDP Ports */
65: #define DHCP_BOOTPS 67
66: #define DHCP_BOOTPC 68
67: #define DHCP_DNS 53
68:
69: /* TCP Ports */
70: #define DHCP_HTTP 80
71: #define DHCP_HTTPS 443
72:
73:
74: #define DHCP_ARP_REQUEST 1
75: #define DHCP_ARP_REPLY 2
76:
77: #define DHCP_DNS_HLEN 12
78:
79: struct dhcp_t; /* Forward declaration */
80:
81: /* Authentication states */
82: #define DHCP_AUTH_NONE 0
83: #define DHCP_AUTH_DROP 1
84: #define DHCP_AUTH_PASS 2
85: #define DHCP_AUTH_UNAUTH_TOS 3
86: #define DHCP_AUTH_AUTH_TOS 4
87: #define DHCP_AUTH_DNAT 5
88: #define DHCP_AUTH_SPLASH 6
89:
90: #define DHCP_DOMAIN_LEN 30
91:
92: #define DHCP_DNAT_MAX 64
93:
94: struct dhcp_conn_t {
95: int inuse; /* Free = 0; Inuse = 1 */
96: time_t lasttime; /* Last time we heard anything from client */
97: struct dhcp_conn_t *nexthash; /* Linked list part of hash table */
98: struct dhcp_conn_t *next; /* Next in linked list. 0: Last */
99: struct dhcp_conn_t *prev; /* Previous in linked list. 0: First */
100: struct dhcp_t *parent; /* Parent of all connections */
101: void *peer; /* Peer protocol handler */
102: uint8_t ourmac[PKT_ETH_ALEN]; /* Our MAC address */
103: uint8_t hismac[PKT_ETH_ALEN]; /* Peer's MAC address */
104: struct in_addr ourip; /* IP address to listen to */
105: struct in_addr hisip; /* Client IP address */
106: struct in_addr hismask; /* Client Network Mask */
107: struct in_addr dns1; /* Client DNS address */
108: struct in_addr dns2; /* Client DNS address */
109: char domain[DHCP_DOMAIN_LEN];/* Domain name to use for DNS lookups */
110: int authstate; /* 0: Unauthenticated, 1: Authenticated */
111: uint8_t unauth_cp; /* Unauthenticated codepoint */
112: uint8_t auth_cp; /* Authenticated codepoint */
113: int nextdnat; /* Next location to use for DNAT */
114: uint32_t dnatip[DHCP_DNAT_MAX]; /* Destination NAT destination IP address */
115: uint16_t dnatport[DHCP_DNAT_MAX]; /* Destination NAT source port */
116: uint8_t dnatmac[DHCP_DNAT_MAX][PKT_ETH_ALEN]; /* Destination NAT source mac */
117: /* uint16_t mtu; Maximum transfer unit */
118:
119: /*XXX: optional*/
120: struct {
121: uint8_t sname[DHCP_SNAME_LEN]; /* 64 Optional server host name, null terminated string.*/
122: uint8_t file[DHCP_FILE_LEN]; /* 128 Boot file name, null terminated string; "generic" name */
123: uint8_t options[DHCP_OPTIONS_LEN]; /* var Optional parameters field. */
124: size_t option_length;
125: } dhcp_opts;
126: };
127:
128:
129: /* ***********************************************************
130: * Information storage for each dhcp instance
131: *
132: * Normally each instance of the application corresponds to
133: * one instance of a dhcp instance.
134: *
135: *************************************************************/
136:
137: struct dhcp_t {
138:
139: /* network interfaces */
140: struct _net_interface ipif, arpif, eapif;
141:
142: int numconn; /* Maximum number of connections */
143: #if defined(__FreeBSD__) || defined (__APPLE__) || defined (__OpenBSD__)
144: char *rbuf;
145: size_t rbuf_max;
146: size_t rbuf_offset;
147: size_t rbuf_len;
148: #endif
149:
150: int debug; /* Set to print debug messages */
151: struct in_addr ourip; /* IP address to listen to */
152: int mtu; /* Maximum transfer unit */
153: uint32_t lease; /* Seconds before reneval */
154: int usemac; /* Use given mac address */
155: int promisc; /* Set interface in promisc mode */
156: int allowdyn; /* Allow allocation of IP address on DHCP request */
157: struct in_addr uamlisten; /* IP address to redirect HTTP requests to */
158: uint16_t uamport; /* TCP port to redirect HTTP requests to */
159: struct in_addr *authip; /* IP address of authentication server */
160: int authiplen; /* Number of authentication server IP addresses */
161: int anydns; /* Allow any dns server */
162:
163: int relayfd; /* DHCP relay socket, 0 if not relaying */
164:
165: /* Connection management */
166: struct dhcp_conn_t *conn;
167: struct dhcp_conn_t *firstfreeconn; /* First free in linked list */
168: struct dhcp_conn_t *lastfreeconn; /* Last free in linked list */
169: struct dhcp_conn_t *firstusedconn; /* First used in linked list */
170: struct dhcp_conn_t *lastusedconn; /* Last used in linked list */
171:
172: /* Hash related parameters */
173: int hashsize; /* Size of hash table */
174: int hashlog; /* Log2 size of hash table */
175: int hashmask; /* Bitmask for calculating hash */
176: struct dhcp_conn_t **hash; /* Hashsize array of pointer to member */
177:
178: pass_through pass_throughs[MAX_PASS_THROUGHS];
179: size_t num_pass_throughs;
180:
181: /* Call back functions */
182: int (*cb_data_ind) (struct dhcp_conn_t *conn, void *pack, size_t len);
183: int (*cb_eap_ind) (struct dhcp_conn_t *conn, void *pack, size_t len);
184: int (*cb_request) (struct dhcp_conn_t *conn, struct in_addr *addr, struct dhcp_fullpacket_t *pack, size_t len);
185: int (*cb_connect) (struct dhcp_conn_t *conn);
186: int (*cb_disconnect) (struct dhcp_conn_t *conn, int term_cause);
187: int (*cb_getinfo) (struct dhcp_conn_t *conn, bstring b, int fmt);
188: };
189:
190:
191: const char* dhcp_version();
192:
193: int dhcp_new(struct dhcp_t **dhcp, int numconn, char *interface,
194: int usemac, uint8_t *mac, int promisc,
195: struct in_addr *listen, int lease, int allowdyn,
196: struct in_addr *uamlisten, uint16_t uamport,
197: int useeapol);
198:
199: int dhcp_set(struct dhcp_t *dhcp, int debug);
200:
201: int dhcp_free(struct dhcp_t *dhcp);
202:
203: int dhcp_timeout(struct dhcp_t *this);
204:
205: struct timeval * dhcp_timeleft(struct dhcp_t *this, struct timeval *tvp);
206:
207:
208: int dhcp_validate(struct dhcp_t *this);
209:
210: int dhcp_set_addrs(struct dhcp_conn_t *conn,
211: struct in_addr *hisip, struct in_addr *hismask,
212: struct in_addr *ourip, struct in_addr *ourmask,
213: struct in_addr *dns1, struct in_addr *dns2, char *domain);
214:
215:
216: /* Called whenever a packet arrives */
217: int dhcp_decaps(struct dhcp_t *this);
218: int dhcp_relay_decaps(struct dhcp_t *this);
219: int dhcp_data_req(struct dhcp_conn_t *conn, void *pack, size_t len, int ethhdr);
220:
221: int dhcp_set_cb_data_ind(struct dhcp_t *this,
222: int (*cb_data_ind) (struct dhcp_conn_t *conn, void *pack, size_t len));
223:
224: int dhcp_set_cb_request(struct dhcp_t *this,
225: int (*cb_request) (struct dhcp_conn_t *conn, struct in_addr *addr, struct dhcp_fullpacket_t *pack, size_t len));
226:
227: int dhcp_set_cb_disconnect(struct dhcp_t *this,
228: int (*cb_disconnect) (struct dhcp_conn_t *conn, int term_cause));
229:
230: int dhcp_set_cb_connect(struct dhcp_t *this,
231: int (*cb_connect) (struct dhcp_conn_t *conn));
232:
233: int dhcp_set_cb_eap_ind(struct dhcp_t *this,
234: int (*cb_eap_ind) (struct dhcp_conn_t *conn, void *pack, size_t len));
235:
236: int dhcp_set_cb_getinfo(struct dhcp_t *this,
237: int (*cb_getinfo) (struct dhcp_conn_t *conn, bstring b, int fmt));
238:
239: int dhcp_hashget(struct dhcp_t *this, struct dhcp_conn_t **conn, uint8_t *hwaddr);
240:
241: int dhcp_newconn(struct dhcp_t *this, struct dhcp_conn_t **conn, uint8_t *hwaddr);
242:
243: int dhcp_freeconn(struct dhcp_conn_t *conn, int term_cause);
244:
245:
246: int dhcp_arp_ind(struct dhcp_t *this); /* ARP Indication */
247:
248: int dhcp_sendEAP(struct dhcp_conn_t *conn, void *pack, size_t len);
249:
250: int dhcp_sendEAPreject(struct dhcp_conn_t *conn, void *pack, size_t len);
251:
252: int dhcp_eapol_ind(struct dhcp_t *this);
253:
254: void dhcp_release_mac(struct dhcp_t *this, uint8_t *hwaddr, int term_cause);
255:
256: #define LIST_SHORT_FMT 0
257: #define LIST_LONG_FMT 1
258: #define LIST_JSON_FMT 2
259:
260: void dhcp_list(struct dhcp_t *this, bstring s, bstring pre, bstring post, int listfmt);
261:
262: void dhcp_print(struct dhcp_t *this, bstring s, int listfmt, struct dhcp_conn_t *conn);
263:
264: int dhcp_filterDNS(struct dhcp_conn_t *conn,
265: struct pkt_ippacket_t *pack,
266: size_t *plen);
267:
268: int dhcp_gettag(struct dhcp_packet_t *pack, size_t length,
269: struct dhcp_tag_t **tag, uint8_t tagtype);
270:
271: #endif /* !_DHCP_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>