xref: /openbsd/usr.sbin/hostapd/hostapd.h (revision b9fc9a72)
1*b9fc9a72Sderaadt /*	$OpenBSD: hostapd.h,v 1.21 2015/01/16 06:40:17 deraadt Exp $	*/
2d2b2a2e3Sreyk 
3d2b2a2e3Sreyk /*
42c56d0d6Sreyk  * Copyright (c) 2004, 2005 Reyk Floeter <reyk@openbsd.org>
5d2b2a2e3Sreyk  *
6d2b2a2e3Sreyk  * Permission to use, copy, modify, and distribute this software for any
7d2b2a2e3Sreyk  * purpose with or without fee is hereby granted, provided that the above
8d2b2a2e3Sreyk  * copyright notice and this permission notice appear in all copies.
9d2b2a2e3Sreyk  *
10d2b2a2e3Sreyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11d2b2a2e3Sreyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12d2b2a2e3Sreyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13d2b2a2e3Sreyk  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14d2b2a2e3Sreyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15d2b2a2e3Sreyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16d2b2a2e3Sreyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17d2b2a2e3Sreyk  */
18d2b2a2e3Sreyk 
19d2b2a2e3Sreyk #ifndef _HOSTAPD_H
20d2b2a2e3Sreyk #define _HOSTAPD_H
21d2b2a2e3Sreyk 
22d2b2a2e3Sreyk #include <sys/types.h>
23d2b2a2e3Sreyk #include <sys/socket.h>
249f63336bSreyk #include <sys/tree.h>
25d2b2a2e3Sreyk 
26d2b2a2e3Sreyk #include <net/if.h>
27d2b2a2e3Sreyk #include <netinet/in.h>
28d2b2a2e3Sreyk #include <arpa/inet.h>
29d2b2a2e3Sreyk 
30d2b2a2e3Sreyk #include <errno.h>
31d2b2a2e3Sreyk #include <event.h>
32d2b2a2e3Sreyk #include <syslog.h>
33d2b2a2e3Sreyk 
34d2b2a2e3Sreyk #include <net80211/ieee80211.h>
35d2b2a2e3Sreyk #include <net80211/ieee80211_ioctl.h>
36d2b2a2e3Sreyk 
37d2b2a2e3Sreyk /*
38d2b2a2e3Sreyk  * hostapd (IAPP) <-> Host AP (APME)
39d2b2a2e3Sreyk  */
40d2b2a2e3Sreyk 
41d2b2a2e3Sreyk struct hostapd_node {
42d2b2a2e3Sreyk 	u_int8_t	ni_macaddr[IEEE80211_ADDR_LEN];
43d2b2a2e3Sreyk 	u_int8_t	ni_bssid[IEEE80211_ADDR_LEN];
44d2b2a2e3Sreyk 	u_int32_t	ni_associd;
45d2b2a2e3Sreyk 	u_int16_t	ni_capinfo;
46d2b2a2e3Sreyk 	u_int16_t	ni_flags;
47d2b2a2e3Sreyk 	u_int16_t	ni_rxseq;
48d2b2a2e3Sreyk 	u_int16_t	ni_rssi;
49d2b2a2e3Sreyk };
50d2b2a2e3Sreyk 
51d2b2a2e3Sreyk /*
52d2b2a2e3Sreyk  * IAPP -> switches (LLC)
53d2b2a2e3Sreyk  */
54d2b2a2e3Sreyk 
55d2b2a2e3Sreyk struct hostapd_llc {
56d2b2a2e3Sreyk 	struct ether_header x_hdr;
57d2b2a2e3Sreyk 	struct llc x_llc;
58d2b2a2e3Sreyk } __packed;
59d2b2a2e3Sreyk 
60d2b2a2e3Sreyk #define IAPP_LLC	LLC_XID
61d2b2a2e3Sreyk #define IAPP_LLC_XID	0x81
62d2b2a2e3Sreyk #define IAPP_LLC_CLASS	1
63d2b2a2e3Sreyk #define IAPP_LLC_WINDOW	1 << 1
64d2b2a2e3Sreyk 
65d2b2a2e3Sreyk /*
66d2b2a2e3Sreyk  * hostapd configuration
67d2b2a2e3Sreyk  */
68d2b2a2e3Sreyk 
69d2b2a2e3Sreyk struct hostapd_counter {
70d2b2a2e3Sreyk 	u_int64_t	cn_tx_llc;	/* sent LLC messages */
71d2b2a2e3Sreyk 	u_int64_t	cn_rx_iapp;	/* received IAPP messages */
72d2b2a2e3Sreyk 	u_int64_t	cn_tx_iapp;	/* sent IAPP messages */
73d2b2a2e3Sreyk 	u_int64_t	cn_rx_apme;	/* received Host AP messages */
74d2b2a2e3Sreyk 	u_int64_t	cn_tx_apme;	/* sent Host AP messages */
759a571ad9Sreyk 	u_int64_t	cn_rtap_miss;	/* missing radiotap field */
76d2b2a2e3Sreyk };
77d2b2a2e3Sreyk 
7850ce650fSreyk #define HOSTAPD_ENTRY_MASK_ADD(_a, _m)	do {					\
7950ce650fSreyk 	(_a)[0] &= (_m)[0];							\
8050ce650fSreyk 	(_a)[1] &= (_m)[1];							\
8150ce650fSreyk 	(_a)[2] &= (_m)[2];							\
8250ce650fSreyk 	(_a)[3] &= (_m)[3];							\
8350ce650fSreyk 	(_a)[4] &= (_m)[4];							\
8450ce650fSreyk 	(_a)[5] &= (_m)[5];							\
8550ce650fSreyk } while (0);
8650ce650fSreyk #define HOSTAPD_ENTRY_MASK_MATCH(_e, _b)	(				\
8750ce650fSreyk 	((_e)->e_lladdr[0] == ((_b)[0] & (_e)->e_addr.a_mask[0])) &&		\
8850ce650fSreyk 	((_e)->e_lladdr[1] == ((_b)[1] & (_e)->e_addr.a_mask[1])) &&		\
8950ce650fSreyk 	((_e)->e_lladdr[2] == ((_b)[2] & (_e)->e_addr.a_mask[2])) &&		\
9050ce650fSreyk 	((_e)->e_lladdr[3] == ((_b)[3] & (_e)->e_addr.a_mask[3])) &&		\
9150ce650fSreyk 	((_e)->e_lladdr[4] == ((_b)[4] & (_e)->e_addr.a_mask[4])) &&		\
9250ce650fSreyk 	((_e)->e_lladdr[5] == ((_b)[5] & (_e)->e_addr.a_mask[5]))		\
9350ce650fSreyk )
9450ce650fSreyk 
95d359c216Sreyk struct hostapd_inaddr {
96d359c216Sreyk 	sa_family_t		in_af;
97d359c216Sreyk 	union {
98d359c216Sreyk 		struct in_addr	v4;
99d359c216Sreyk 		struct in6_addr	v6;
100d359c216Sreyk 	} in_v;
101d359c216Sreyk 	int			in_netmask;
102d359c216Sreyk };
103d359c216Sreyk 
104d359c216Sreyk #define in_v4			in_v.v4
105d359c216Sreyk #define in_v6			in_v.v6
106d359c216Sreyk 
10750ce650fSreyk struct hostapd_entry {
10850ce650fSreyk 	u_int8_t			e_lladdr[IEEE80211_ADDR_LEN];
10950ce650fSreyk 	u_int8_t			e_flags;
11050ce650fSreyk 
11150ce650fSreyk #define HOSTAPD_ENTRY_F_LLADDR		0x00
11250ce650fSreyk #define HOSTAPD_ENTRY_F_MASK		0x01
113d359c216Sreyk #define HOSTAPD_ENTRY_F_INADDR		0x02
11450ce650fSreyk 
11550ce650fSreyk 	union {
11650ce650fSreyk 		u_int8_t		a_mask[IEEE80211_ADDR_LEN];
117d359c216Sreyk 		struct hostapd_inaddr	a_inaddr;
11850ce650fSreyk 	}				e_addr;
11950ce650fSreyk 
1209f63336bSreyk 	RB_ENTRY(hostapd_entry)		e_nodes;
12150ce650fSreyk 	TAILQ_ENTRY(hostapd_entry)	e_entries;
12250ce650fSreyk };
12350ce650fSreyk 
12450ce650fSreyk #define e_mask				e_addr.a_mask
125d359c216Sreyk #define e_inaddr			e_addr.a_inaddr
12650ce650fSreyk 
12750ce650fSreyk #define HOSTAPD_TABLE_NAMELEN		32
1289f63336bSreyk 
1299f63336bSreyk RB_HEAD(hostapd_tree, hostapd_entry);
13050ce650fSreyk 
13150ce650fSreyk struct hostapd_table {
13250ce650fSreyk 	char				t_name[HOSTAPD_TABLE_NAMELEN];
13350ce650fSreyk 	u_int8_t			t_flags;
13450ce650fSreyk 
13550ce650fSreyk #define HOSTAPD_TABLE_F_CONST		0x01
13650ce650fSreyk 
1379f63336bSreyk 	struct hostapd_tree		t_tree;
13850ce650fSreyk 	TAILQ_HEAD(, hostapd_entry)	t_mask_head;
13950ce650fSreyk 	TAILQ_ENTRY(hostapd_table)	t_entries;
14050ce650fSreyk };
14150ce650fSreyk 
1429a571ad9Sreyk struct hostapd_radiotap {
1439a571ad9Sreyk 	u_int32_t	r_present;
1449a571ad9Sreyk 	u_int8_t	r_txrate;
1459a571ad9Sreyk 	u_int16_t	r_chan;
1469a571ad9Sreyk 	u_int16_t	r_chan_flags;
1479a571ad9Sreyk 	u_int8_t	r_rssi;
1489a571ad9Sreyk 	u_int8_t	r_max_rssi;
1499a571ad9Sreyk };
1509a571ad9Sreyk #define HOSTAPD_RADIOTAP_F(_x)	(1 << IEEE80211_RADIOTAP_##_x)
1519a571ad9Sreyk 
15250ce650fSreyk struct hostapd_ieee80211_frame {
15350ce650fSreyk 	u_int8_t	i_fc[2];
15450ce650fSreyk 	u_int8_t	i_dur[2];
15550ce650fSreyk 	u_int8_t	i_from[IEEE80211_ADDR_LEN];
15650ce650fSreyk 	u_int8_t	i_to[IEEE80211_ADDR_LEN];
15750ce650fSreyk 	u_int8_t	i_bssid[IEEE80211_ADDR_LEN];
15850ce650fSreyk 	u_int8_t	i_seq[2];
15950ce650fSreyk 	void		*i_data;
16050ce650fSreyk 	u_int		i_data_len;
16150ce650fSreyk };
16250ce650fSreyk 
16350ce650fSreyk enum hostapd_action {
16450ce650fSreyk 	HOSTAPD_ACTION_NONE	= 0,
16550ce650fSreyk 	HOSTAPD_ACTION_LOG	= 1,
16650ce650fSreyk 	HOSTAPD_ACTION_RADIOTAP	= 2,
16750ce650fSreyk 	HOSTAPD_ACTION_FRAME	= 3,
16850ce650fSreyk 	HOSTAPD_ACTION_ADDNODE	= 4,
16950ce650fSreyk 	HOSTAPD_ACTION_DELNODE	= 5,
17050ce650fSreyk 	HOSTAPD_ACTION_RESEND	= 6
17150ce650fSreyk };
17250ce650fSreyk 
1739a571ad9Sreyk enum hostapd_op {
1749a571ad9Sreyk 	HOSTAPD_OP_EQ		= 0,
1759a571ad9Sreyk 	HOSTAPD_OP_NE		= 1,
1769a571ad9Sreyk 	HOSTAPD_OP_LE		= 2,
1779a571ad9Sreyk 	HOSTAPD_OP_LT		= 3,
1789a571ad9Sreyk 	HOSTAPD_OP_GE		= 4,
1799a571ad9Sreyk 	HOSTAPD_OP_GT		= 5
1809a571ad9Sreyk };
1819a571ad9Sreyk 
18250ce650fSreyk struct hostapd_action_data {
18350ce650fSreyk 	union {
18450ce650fSreyk 		struct hostapd_ieee80211_frame	u_frame;
18550ce650fSreyk 		u_int8_t			u_lladdr[IEEE80211_ADDR_LEN];
18650ce650fSreyk 	} a_data;
18750ce650fSreyk 	u_int16_t				a_flags;
18850ce650fSreyk 
18950ce650fSreyk #define HOSTAPD_ACTION_F_REF_FROM		0x0001
1908b938b68Sreyk #define HOSTAPD_ACTION_F_REF_TO			0x0002
1918b938b68Sreyk #define HOSTAPD_ACTION_F_REF_BSSID		0x0004
1928b938b68Sreyk #define HOSTAPD_ACTION_F_REF_RANDOM		0x0008
19350ce650fSreyk #define HOSTAPD_ACTION_F_REF_FROM_M		0x000f
19450ce650fSreyk #define HOSTAPD_ACTION_F_REF_FROM_S		0
19550ce650fSreyk #define HOSTAPD_ACTION_F_REF_TO_M		0x00f0
19650ce650fSreyk #define HOSTAPD_ACTION_F_REF_TO_S		4
19750ce650fSreyk #define HOSTAPD_ACTION_F_REF_BSSID_M		0x0f00
19850ce650fSreyk #define HOSTAPD_ACTION_F_REF_BSSID_S		8
19950ce650fSreyk #define HOSTAPD_ACTION_F_REF_M			0x0fff
20050ce650fSreyk #define HOSTAPD_ACTION_F_OPT_DIR_AUTO		0x1000
20150ce650fSreyk #define HOSTAPD_ACTION_F_OPT_LLADDR		0x2000
20250ce650fSreyk #define HOSTAPD_ACTION_F_OPT_TABLE		0x4000
20350ce650fSreyk };
20450ce650fSreyk 
20550ce650fSreyk #define a_frame					a_data.u_frame
20650ce650fSreyk #define a_lladdr				a_data.u_lladdr
20750ce650fSreyk 
20850ce650fSreyk struct hostapd_frame {
20950ce650fSreyk 	struct hostapd_ieee80211_frame	f_frame;
2109a571ad9Sreyk 	u_int32_t			f_radiotap;
2119a571ad9Sreyk 
21250ce650fSreyk 	u_int32_t			f_flags;
21350ce650fSreyk 
21450ce650fSreyk #define HOSTAPD_FRAME_F_TYPE		0x00000001
21550ce650fSreyk #define HOSTAPD_FRAME_F_TYPE_N		0x00000002
21650ce650fSreyk #define HOSTAPD_FRAME_F_SUBTYPE		0x00000004
21750ce650fSreyk #define HOSTAPD_FRAME_F_SUBTYPE_N	0x00000008
21850ce650fSreyk #define HOSTAPD_FRAME_F_DIR		0x00000010
21950ce650fSreyk #define HOSTAPD_FRAME_F_DIR_N		0x00000020
22050ce650fSreyk #define HOSTAPD_FRAME_F_FROM		0x00000040
22150ce650fSreyk #define HOSTAPD_FRAME_F_FROM_N		0x00000080
22250ce650fSreyk #define HOSTAPD_FRAME_F_FROM_TABLE	0x00000100
22350ce650fSreyk #define HOSTAPD_FRAME_F_FROM_M		0x000001c0
22450ce650fSreyk #define HOSTAPD_FRAME_F_TO		0x00000200
22550ce650fSreyk #define HOSTAPD_FRAME_F_TO_N		0x00000400
22650ce650fSreyk #define HOSTAPD_FRAME_F_TO_TABLE	0x00000800
22750ce650fSreyk #define HOSTAPD_FRAME_F_TO_M		0x00000e00
22850ce650fSreyk #define HOSTAPD_FRAME_F_BSSID		0x00001000
22950ce650fSreyk #define HOSTAPD_FRAME_F_BSSID_N		0x00002000
23050ce650fSreyk #define HOSTAPD_FRAME_F_BSSID_TABLE	0x00004000
23150ce650fSreyk #define HOSTAPD_FRAME_F_BSSID_M		0x00007000
2325058e176Sreyk #define HOSTAPD_FRAME_F_APME		0x00008000
2335058e176Sreyk #define HOSTAPD_FRAME_F_APME_N		0x00010000
2345058e176Sreyk #define HOSTAPD_FRAME_F_APME_M		0x00018000
2359a571ad9Sreyk #define HOSTAPD_FRAME_F_RSSI		0x00020000
2369a571ad9Sreyk #define HOSTAPD_FRAME_F_RATE		0x00040000
2379a571ad9Sreyk #define HOSTAPD_FRAME_F_CHANNEL		0x00080000
2389a571ad9Sreyk #define HOSTAPD_FRAME_F_RADIOTAP_M	0x000e0000
23950ce650fSreyk #define HOSTAPD_FRAME_F_M		0x0fffffff
24050ce650fSreyk #define HOSTAPD_FRAME_F_RET_OK		0x00000000
24150ce650fSreyk #define HOSTAPD_FRAME_F_RET_QUICK	0x10000000
24250ce650fSreyk #define HOSTAPD_FRAME_F_RET_SKIP	0x20000000
24350ce650fSreyk #define HOSTAPD_FRAME_F_RET_M		0xf0000000
24450ce650fSreyk #define HOSTAPD_FRAME_F_RET_S		28
24550ce650fSreyk 
24650ce650fSreyk #define HOSTAPD_FRAME_TABLE						\
24750ce650fSreyk 	(HOSTAPD_FRAME_F_FROM_TABLE | HOSTAPD_FRAME_F_TO_TABLE |	\
24850ce650fSreyk 	HOSTAPD_FRAME_F_BSSID_TABLE)
24950ce650fSreyk #define HOSTAPD_FRAME_N							\
25050ce650fSreyk 	(HOSTAPD_FRAME_F_FROM_N | HOSTAPD_FRAME_F_TO_N |		\
25150ce650fSreyk 	HOSTAPD_FRAME_F_BSSID_N)
25250ce650fSreyk 
2535058e176Sreyk 	struct hostapd_apme		*f_apme;
25450ce650fSreyk 	struct hostapd_table		*f_from, *f_to, *f_bssid;
2559834aad8Sreyk 	struct timeval			f_limit, f_then, f_last;
2569834aad8Sreyk 	long				f_rate, f_rate_intval;
2579834aad8Sreyk 	long				f_rate_cnt, f_rate_delay;
25850ce650fSreyk 
2599a571ad9Sreyk 	enum hostapd_op			f_rssi_op, f_txrate_op, f_chan_op;
2609a571ad9Sreyk 	short				f_rssi, f_txrate, f_chan;
2619a571ad9Sreyk 
26250ce650fSreyk 	enum hostapd_action		f_action;
26350ce650fSreyk 	u_int32_t			f_action_flags;
26450ce650fSreyk 
26550ce650fSreyk #define HOSTAPD_ACTION_VERBOSE		0x00000001
26650ce650fSreyk 
26750ce650fSreyk 	struct hostapd_action_data	f_action_data;
26850ce650fSreyk 
26950ce650fSreyk 	TAILQ_ENTRY(hostapd_frame)	f_entries;
27050ce650fSreyk };
27150ce650fSreyk 
272d01b6ac2Sreyk struct hostapd_apme {
273d01b6ac2Sreyk 	int				a_raw;
274d01b6ac2Sreyk 	u_int				a_rawlen;
275d01b6ac2Sreyk 	struct event			a_ev;
276d01b6ac2Sreyk 	char				a_iface[IFNAMSIZ];
277d01b6ac2Sreyk 	u_int8_t			a_bssid[IEEE80211_ADDR_LEN];
278d01b6ac2Sreyk 	void				*a_cfg;
279d359c216Sreyk 	struct sockaddr_in		a_addr;
280d01b6ac2Sreyk 
28101908219Sreyk 	struct event			a_chanev;
28201908219Sreyk 	u_int8_t			*a_chanavail;
28301908219Sreyk 	u_int8_t			a_curchan;
28401908219Sreyk 	u_int				a_maxchan;
28501908219Sreyk 	struct ieee80211chanreq		a_chanreq;
28601908219Sreyk 
287d01b6ac2Sreyk 	TAILQ_ENTRY(hostapd_apme)	a_entries;
288d01b6ac2Sreyk };
289d01b6ac2Sreyk 
29001908219Sreyk #ifndef IEEE80211_CHAN_MAX
29101908219Sreyk #define IEEE80211_CHAN_MAX	255
29201908219Sreyk #endif
29301908219Sreyk 
29401908219Sreyk #define HOSTAPD_HOPPER_MDELAY	800
29501908219Sreyk 
2967c8c4753Sreyk struct hostapd_iapp {
2977c8c4753Sreyk 	u_int16_t			i_cnt;
2987c8c4753Sreyk 	int				i_raw;
2997c8c4753Sreyk 	char				i_iface[IFNAMSIZ];
3007c8c4753Sreyk 	int				i_udp;
3017c8c4753Sreyk 	struct event			i_udp_ev;
3027c8c4753Sreyk 	u_int16_t			i_udp_port;
3037c8c4753Sreyk 	struct sockaddr_in		i_addr;
3047c8c4753Sreyk 	struct sockaddr_in		i_broadcast;
3057c8c4753Sreyk 	struct sockaddr_in		i_multicast;
30602fe3327Sreyk 	u_int8_t			i_ttl;
3073a61e91cSreyk 	u_int8_t			i_flags;
3083a61e91cSreyk 
3093a61e91cSreyk #define HOSTAPD_IAPP_F_ADD_NOTIFY	0x01
3103a61e91cSreyk #define HOSTAPD_IAPP_F_RADIOTAP		0x02
31174ff1540Sreyk #define HOSTAPD_IAPP_F_ROAMING_ADDRESS	0x04
31274ff1540Sreyk #define HOSTAPD_IAPP_F_ROAMING_ROUTE	0x08
3133a61e91cSreyk #define HOSTAPD_IAPP_F_DEFAULT							\
3143a61e91cSreyk 	(HOSTAPD_IAPP_F_ADD_NOTIFY | HOSTAPD_IAPP_F_RADIOTAP)
31574ff1540Sreyk #define HOSTAPD_IAPP_F_ROAMING							\
31674ff1540Sreyk 	(HOSTAPD_IAPP_F_ROAMING_ROUTE | HOSTAPD_IAPP_F_ROAMING_ADDRESS)
31774ff1540Sreyk #define HOSTAPD_IAPP_F_ADD		\
31874ff1540Sreyk 	(HOSTAPD_IAPP_F_ADD_NOTIFY | HOSTAPD_IAPP_F_ROAMING)
31974ff1540Sreyk 
32074ff1540Sreyk 	struct hostapd_table		*i_addr_tbl;
32174ff1540Sreyk 	struct hostapd_table		*i_route_tbl;
3227c8c4753Sreyk };
3237c8c4753Sreyk 
324d2b2a2e3Sreyk struct hostapd_config {
325d01b6ac2Sreyk 	int				c_apme_ctl;
32650ce650fSreyk 	u_int				c_apme_dlt;
32701908219Sreyk 	struct timeval			c_apme_hopdelay;
328d2b2a2e3Sreyk 
3297c8c4753Sreyk 	struct hostapd_iapp		c_iapp;
330d2b2a2e3Sreyk 
33174ff1540Sreyk 	int				c_rtsock;
33274ff1540Sreyk 	int				c_rtseq;
33374ff1540Sreyk 
334d2b2a2e3Sreyk 	u_int8_t			c_flags;
335d2b2a2e3Sreyk 
336d2b2a2e3Sreyk #define HOSTAPD_CFG_F_APME		0x01
337d2b2a2e3Sreyk #define HOSTAPD_CFG_F_IAPP		0x02
33850ce650fSreyk #define HOSTAPD_CFG_F_IAPP_PASSIVE	0x04
33950ce650fSreyk #define HOSTAPD_CFG_F_RAW		0x08
34050ce650fSreyk #define HOSTAPD_CFG_F_UDP		0x10
34150ce650fSreyk #define HOSTAPD_CFG_F_BRDCAST		0x20
34250ce650fSreyk #define HOSTAPD_CFG_F_PRIV		0x40
343d2b2a2e3Sreyk 
344d2b2a2e3Sreyk 	struct event			c_priv_ev;
345d2b2a2e3Sreyk 
346*b9fc9a72Sderaadt 	char				c_config[PATH_MAX];
347d2b2a2e3Sreyk 
348d2b2a2e3Sreyk 	u_int				c_verbose;
349d2b2a2e3Sreyk 	u_int				c_debug;
35050ce650fSreyk 	u_int				c_id;
351d2b2a2e3Sreyk 
352d2b2a2e3Sreyk 	struct hostapd_counter		c_stats;
35350ce650fSreyk 
354d01b6ac2Sreyk 	TAILQ_HEAD(, hostapd_apme)	c_apmes;
35550ce650fSreyk 	TAILQ_HEAD(, hostapd_table)	c_tables;
35650ce650fSreyk 	TAILQ_HEAD(, hostapd_frame)	c_frames;
357d2b2a2e3Sreyk };
358d2b2a2e3Sreyk 
359d2b2a2e3Sreyk #define	HOSTAPD_USER	"_hostapd"
360d2b2a2e3Sreyk #define HOSTAPD_CONFIG	"/etc/hostapd.conf"
36150ce650fSreyk #define HOSTAPD_DLT	DLT_IEEE802_11
362d2b2a2e3Sreyk 
363d2b2a2e3Sreyk #define HOSTAPD_LOG		0
364d2b2a2e3Sreyk #define HOSTAPD_LOG_VERBOSE	1
365d2b2a2e3Sreyk #define HOSTAPD_LOG_DEBUG	2
366d2b2a2e3Sreyk 
36750ce650fSreyk #define PRINTF			hostapd_printf
36850ce650fSreyk #define etheraddr_string(_s)	ether_ntoa((struct ether_addr*)_s)
36950ce650fSreyk #define TTEST2(var, l)		(						\
37050ce650fSreyk 	snapend - (l) <= snapend && (const u_char *)&(var) <= snapend - (l)	\
37150ce650fSreyk )
37250ce650fSreyk #define TTEST(var)		TTEST2(var, sizeof(var))
37350ce650fSreyk #define TCHECK2(var, l)		if (!TTEST2(var, l)) goto trunc
37450ce650fSreyk #define TCHECK(var)		TCHECK2(var, sizeof(var))
37550ce650fSreyk 
376d2b2a2e3Sreyk __BEGIN_DECLS
377d2b2a2e3Sreyk 
378d2b2a2e3Sreyk void	 hostapd_log(u_int, const char *, ...);
37950ce650fSreyk void	 hostapd_printf(const char *, ...);
380d2b2a2e3Sreyk void	 hostapd_fatal(const char *, ...);
381d2b2a2e3Sreyk int	 hostapd_bpf_open(u_int);
382d2b2a2e3Sreyk void	 hostapd_cleanup(struct hostapd_config *);
383d2b2a2e3Sreyk int	 hostapd_check_file_secrecy(int, const char *);
38441a887d6Sreyk void	 hostapd_randval(u_int8_t *, const u_int)
38541a887d6Sreyk 	    __attribute__((__bounded__(__buffer__, 1, 2)));
386d2b2a2e3Sreyk 
38750ce650fSreyk struct hostapd_table *hostapd_table_add(struct hostapd_config *,
38850ce650fSreyk 	    const char *);
38950ce650fSreyk struct hostapd_table *hostapd_table_lookup(struct hostapd_config *,
39050ce650fSreyk 	    const char *);
39150ce650fSreyk struct hostapd_entry *hostapd_entry_add(struct hostapd_table *,
39250ce650fSreyk 	    u_int8_t *);
39350ce650fSreyk struct hostapd_entry *hostapd_entry_lookup(struct hostapd_table *,
39450ce650fSreyk 	    u_int8_t *);
39550ce650fSreyk void	 hostapd_entry_update(struct hostapd_table *,
39650ce650fSreyk 	    struct hostapd_entry *);
3979f63336bSreyk 
3989f63336bSreyk RB_PROTOTYPE(hostapd_tree, hostapd_entry, e_nodes, hostapd_entry_cmp);
39950ce650fSreyk 
400d2b2a2e3Sreyk int	 hostapd_parse_file(struct hostapd_config *);
401d2b2a2e3Sreyk int	 hostapd_parse_symset(char *);
402d2b2a2e3Sreyk 
403d2b2a2e3Sreyk void	 hostapd_priv_init(struct hostapd_config *);
404d2b2a2e3Sreyk int	 hostapd_priv_llc_xid(struct hostapd_config *, struct hostapd_node *);
405d01b6ac2Sreyk void	 hostapd_priv_apme_bssid(struct hostapd_apme *);
406d01b6ac2Sreyk int	 hostapd_priv_apme_getnode(struct hostapd_apme *,
4079efd6220Shenning 	    struct hostapd_node *);
408d01b6ac2Sreyk int	 hostapd_priv_apme_setnode(struct hostapd_apme *,
40950ce650fSreyk 	    struct hostapd_node *node, int);
41074ff1540Sreyk int	 hostapd_priv_roaming(struct hostapd_apme *, struct hostapd_node *,
41174ff1540Sreyk 	    int);
412d2b2a2e3Sreyk 
413d01b6ac2Sreyk void	 hostapd_apme_init(struct hostapd_apme *);
414de5ff521Sreyk int	 hostapd_apme_deauth(struct hostapd_apme *);
415d01b6ac2Sreyk int	 hostapd_apme_add(struct hostapd_config *, const char *);
416d01b6ac2Sreyk void	 hostapd_apme_term(struct hostapd_apme *);
417d01b6ac2Sreyk struct hostapd_apme *hostapd_apme_lookup(struct hostapd_config *,
418d01b6ac2Sreyk 	    const char *);
419d2b2a2e3Sreyk void	 hostapd_apme_input(int, short, void *);
420d01b6ac2Sreyk int	 hostapd_apme_output(struct hostapd_apme *,
42150ce650fSreyk 	    struct hostapd_ieee80211_frame *);
422d01b6ac2Sreyk int	 hostapd_apme_addnode(struct hostapd_apme *,
42350ce650fSreyk 	    struct hostapd_node *node);
424d01b6ac2Sreyk int	 hostapd_apme_delnode(struct hostapd_apme *,
42550ce650fSreyk 	    struct hostapd_node *node);
426d01b6ac2Sreyk int	 hostapd_apme_offset(struct hostapd_apme *, u_int8_t *,
42750ce650fSreyk 	    const u_int);
42801908219Sreyk struct hostapd_apme *hostapd_apme_addhopper(struct hostapd_config *,
42901908219Sreyk 	    const char *);
43001908219Sreyk void	 hostapd_apme_sethopper(struct hostapd_apme *, int);
431d2b2a2e3Sreyk 
432d2b2a2e3Sreyk void	 hostapd_iapp_init(struct hostapd_config *);
433d2b2a2e3Sreyk void	 hostapd_iapp_term(struct hostapd_config *);
434d01b6ac2Sreyk int	 hostapd_iapp_add_notify(struct hostapd_apme *,
4359efd6220Shenning 	    struct hostapd_node *);
436d01b6ac2Sreyk int	 hostapd_iapp_radiotap(struct hostapd_apme *,
43750ce650fSreyk 	    u_int8_t *, const u_int);
438d2b2a2e3Sreyk void	 hostapd_iapp_input(int, short, void *);
439d2b2a2e3Sreyk 
440d2b2a2e3Sreyk void	 hostapd_llc_init(struct hostapd_config *);
441d2b2a2e3Sreyk int	 hostapd_llc_send_xid(struct hostapd_config *, struct hostapd_node *);
442d2b2a2e3Sreyk 
443d01b6ac2Sreyk int	 hostapd_handle_input(struct hostapd_apme *, u_int8_t *, u_int);
44450ce650fSreyk 
44550ce650fSreyk void	 hostapd_print_ieee80211(u_int, u_int, u_int8_t *, u_int);
44650ce650fSreyk 
44774ff1540Sreyk void	 hostapd_roaming_init(struct hostapd_config *);
44874ff1540Sreyk void	 hostapd_roaming_term(struct hostapd_apme *);
44974ff1540Sreyk int	 hostapd_roaming(struct hostapd_apme *, struct hostapd_node *, int);
45074ff1540Sreyk int	 hostapd_roaming_add(struct hostapd_apme *,
45174ff1540Sreyk 	    struct hostapd_node *node);
45274ff1540Sreyk int	 hostapd_roaming_del(struct hostapd_apme *,
45374ff1540Sreyk 	    struct hostapd_node *node);
45474ff1540Sreyk 
455d2b2a2e3Sreyk __END_DECLS
456d2b2a2e3Sreyk 
457d2b2a2e3Sreyk #endif /* _HOSTAPD_H */
458