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