1*9efd6220Shenning /* $OpenBSD: hostapd.h,v 1.2 2005/04/13 18:31:38 henning Exp $ */ 2d2b2a2e3Sreyk 3d2b2a2e3Sreyk /* 4d2b2a2e3Sreyk * Copyright (c) 2004, 2005 Reyk Floeter <reyk@vantronix.net> 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/param.h> 23d2b2a2e3Sreyk #include <sys/types.h> 24d2b2a2e3Sreyk #include <sys/socket.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 #define IEEE80211_IAPP_VERSION 0 38d2b2a2e3Sreyk 39d2b2a2e3Sreyk /* 40d2b2a2e3Sreyk * hostapd (IAPP) <-> Host AP (APME) 41d2b2a2e3Sreyk */ 42d2b2a2e3Sreyk 43d2b2a2e3Sreyk #define SIOCS80211IAPP 0 44d2b2a2e3Sreyk #define SIOCG80211IAPP 1 45d2b2a2e3Sreyk 46d2b2a2e3Sreyk struct hostapd_node { 47d2b2a2e3Sreyk u_int8_t ni_macaddr[IEEE80211_ADDR_LEN]; 48d2b2a2e3Sreyk u_int8_t ni_bssid[IEEE80211_ADDR_LEN]; 49d2b2a2e3Sreyk u_int32_t ni_associd; 50d2b2a2e3Sreyk u_int16_t ni_capinfo; 51d2b2a2e3Sreyk u_int16_t ni_flags; 52d2b2a2e3Sreyk u_int16_t ni_rxseq; 53d2b2a2e3Sreyk u_int16_t ni_rssi; 54d2b2a2e3Sreyk }; 55d2b2a2e3Sreyk 56d2b2a2e3Sreyk /* 57d2b2a2e3Sreyk * IAPP <-> IAPP 58d2b2a2e3Sreyk */ 59d2b2a2e3Sreyk 60d2b2a2e3Sreyk struct ieee80211_iapp_frame { 61d2b2a2e3Sreyk u_int8_t i_version; 62d2b2a2e3Sreyk u_int8_t i_command; 63d2b2a2e3Sreyk u_int16_t i_identifier; 64d2b2a2e3Sreyk u_int16_t i_length; 65d2b2a2e3Sreyk } __packed; 66d2b2a2e3Sreyk 67d2b2a2e3Sreyk enum ieee80211_iapp_frame_type { 68d2b2a2e3Sreyk IEEE80211_IAPP_FRAME_ADD_NOTIFY = 0, 69d2b2a2e3Sreyk IEEE80211_IAPP_FRAME_MOVE_NOTIFY = 1, 70d2b2a2e3Sreyk IEEE80211_IAPP_FRAME_MOVE_RESPONSE = 2, 71d2b2a2e3Sreyk IEEE80211_IAPP_FRAME_SEND_SECURITY_BLOCK = 3, 72d2b2a2e3Sreyk IEEE80211_IAPP_FRAME_ACK_SECURITY_BLOCK = 4, 73d2b2a2e3Sreyk IEEE80211_IAPP_FRAME_CACHE_NOTIFY = 5, 74d2b2a2e3Sreyk IEEE80211_IAPP_FRAME_CACHE_RESPONSE = 6 75d2b2a2e3Sreyk }; 76d2b2a2e3Sreyk 77d2b2a2e3Sreyk struct ieee80211_iapp_add_notify { 78d2b2a2e3Sreyk u_int8_t a_length; 79d2b2a2e3Sreyk u_int8_t a_reserved; 80d2b2a2e3Sreyk u_int8_t a_macaddr[IEEE80211_ADDR_LEN]; 81d2b2a2e3Sreyk u_int16_t a_seqnum; 82d2b2a2e3Sreyk } __packed; 83d2b2a2e3Sreyk 84d2b2a2e3Sreyk /* 85d2b2a2e3Sreyk * IAPP -> switches (LLC) 86d2b2a2e3Sreyk */ 87d2b2a2e3Sreyk 88d2b2a2e3Sreyk struct hostapd_llc { 89d2b2a2e3Sreyk struct ether_header x_hdr; 90d2b2a2e3Sreyk struct llc x_llc; 91d2b2a2e3Sreyk } __packed; 92d2b2a2e3Sreyk 93d2b2a2e3Sreyk #define IAPP_LLC LLC_XID 94d2b2a2e3Sreyk #define IAPP_LLC_XID 0x81 95d2b2a2e3Sreyk #define IAPP_LLC_CLASS 1 96d2b2a2e3Sreyk #define IAPP_LLC_WINDOW 1 << 1 97d2b2a2e3Sreyk 98d2b2a2e3Sreyk /* 99d2b2a2e3Sreyk * hostapd configuration 100d2b2a2e3Sreyk */ 101d2b2a2e3Sreyk 102d2b2a2e3Sreyk struct hostapd_counter { 103d2b2a2e3Sreyk u_int64_t cn_tx_llc; /* sent LLC messages */ 104d2b2a2e3Sreyk u_int64_t cn_rx_iapp; /* received IAPP messages */ 105d2b2a2e3Sreyk u_int64_t cn_tx_iapp; /* sent IAPP messages */ 106d2b2a2e3Sreyk u_int64_t cn_rx_apme; /* received Host AP messages */ 107d2b2a2e3Sreyk u_int64_t cn_tx_apme; /* sent Host AP messages */ 108d2b2a2e3Sreyk }; 109d2b2a2e3Sreyk 110d2b2a2e3Sreyk struct hostapd_config { 111d2b2a2e3Sreyk int c_apme; 112d2b2a2e3Sreyk int c_apme_raw; 113d2b2a2e3Sreyk u_int c_apme_rawlen; 114d2b2a2e3Sreyk struct event c_apme_ev; 115d2b2a2e3Sreyk char c_apme_iface[IFNAMSIZ]; 116d2b2a2e3Sreyk int c_apme_n; 117d2b2a2e3Sreyk u_int8_t c_apme_bssid[IEEE80211_ADDR_LEN]; 118d2b2a2e3Sreyk 119d2b2a2e3Sreyk u_int16_t c_iapp; 120d2b2a2e3Sreyk int c_iapp_raw; 121d2b2a2e3Sreyk char c_iapp_iface[IFNAMSIZ]; 122d2b2a2e3Sreyk int c_iapp_udp; 123d2b2a2e3Sreyk struct event c_iapp_udp_ev; 124d2b2a2e3Sreyk u_int16_t c_iapp_udp_port; 125d2b2a2e3Sreyk struct sockaddr_in c_iapp_addr; 126d2b2a2e3Sreyk struct sockaddr_in c_iapp_broadcast; 127d2b2a2e3Sreyk struct sockaddr_in c_iapp_multicast; 128d2b2a2e3Sreyk 129d2b2a2e3Sreyk u_int8_t c_flags; 130d2b2a2e3Sreyk 131d2b2a2e3Sreyk #define HOSTAPD_CFG_F_APME 0x01 132d2b2a2e3Sreyk #define HOSTAPD_CFG_F_IAPP 0x02 133d2b2a2e3Sreyk #define HOSTAPD_CFG_F_RAW 0x04 134d2b2a2e3Sreyk #define HOSTAPD_CFG_F_UDP 0x08 135d2b2a2e3Sreyk #define HOSTAPD_CFG_F_BRDCAST 0x10 136d2b2a2e3Sreyk #define HOSTAPD_CFG_F_PRIV 0x20 137d2b2a2e3Sreyk 138d2b2a2e3Sreyk struct event c_priv_ev; 139d2b2a2e3Sreyk 140d2b2a2e3Sreyk char c_config[MAXPATHLEN]; 141d2b2a2e3Sreyk 142d2b2a2e3Sreyk u_int c_verbose; 143d2b2a2e3Sreyk u_int c_debug; 144d2b2a2e3Sreyk 145d2b2a2e3Sreyk struct hostapd_counter c_stats; 146d2b2a2e3Sreyk }; 147d2b2a2e3Sreyk 148d2b2a2e3Sreyk #define IAPP_PORT 3517 /* XXX this should be added to /etc/services */ 149d2b2a2e3Sreyk #define IAPP_MCASTADDR "224.0.1.178" 150d2b2a2e3Sreyk #define IAPP_DLT DLT_IEEE802_11 151d2b2a2e3Sreyk #define IAPP_MAXSIZE 512 152d2b2a2e3Sreyk 153d2b2a2e3Sreyk #define HOSTAPD_USER "_hostapd" 154d2b2a2e3Sreyk 155d2b2a2e3Sreyk #define HOSTAPD_CONFIG "/etc/hostapd.conf" 156d2b2a2e3Sreyk 157d2b2a2e3Sreyk #define HOSTAPD_LOG 0 158d2b2a2e3Sreyk #define HOSTAPD_LOG_VERBOSE 1 159d2b2a2e3Sreyk #define HOSTAPD_LOG_DEBUG 2 160d2b2a2e3Sreyk 161d2b2a2e3Sreyk __BEGIN_DECLS 162d2b2a2e3Sreyk 163d2b2a2e3Sreyk void hostapd_log(u_int, const char *, ...); 164d2b2a2e3Sreyk void hostapd_fatal(const char *, ...); 165d2b2a2e3Sreyk int hostapd_bpf_open(u_int); 166d2b2a2e3Sreyk void hostapd_cleanup(struct hostapd_config *); 167d2b2a2e3Sreyk int hostapd_check_file_secrecy(int, const char *); 168d2b2a2e3Sreyk 169d2b2a2e3Sreyk int hostapd_parse_file(struct hostapd_config *); 170d2b2a2e3Sreyk int hostapd_parse_symset(char *); 171d2b2a2e3Sreyk 172d2b2a2e3Sreyk void hostapd_priv_init(struct hostapd_config *); 173d2b2a2e3Sreyk int hostapd_priv_llc_xid(struct hostapd_config *, struct hostapd_node *); 174d2b2a2e3Sreyk void hostapd_priv_apme_bssid(struct hostapd_config *); 175*9efd6220Shenning int hostapd_priv_apme_getnode(struct hostapd_config *, 176*9efd6220Shenning struct hostapd_node *); 177*9efd6220Shenning int hostapd_priv_apme_delnode(struct hostapd_config *, 178*9efd6220Shenning struct hostapd_node *); 179d2b2a2e3Sreyk 180d2b2a2e3Sreyk void hostapd_apme_init(struct hostapd_config *); 181d2b2a2e3Sreyk void hostapd_apme_input(int, short, void *); 182d2b2a2e3Sreyk 183d2b2a2e3Sreyk void hostapd_iapp_init(struct hostapd_config *); 184d2b2a2e3Sreyk void hostapd_iapp_term(struct hostapd_config *); 185*9efd6220Shenning int hostapd_iapp_add_notify(struct hostapd_config *, 186*9efd6220Shenning struct hostapd_node *); 187d2b2a2e3Sreyk void hostapd_iapp_input(int, short, void *); 188d2b2a2e3Sreyk 189d2b2a2e3Sreyk void hostapd_llc_init(struct hostapd_config *); 190d2b2a2e3Sreyk int hostapd_llc_send_xid(struct hostapd_config *, struct hostapd_node *); 191d2b2a2e3Sreyk 192d2b2a2e3Sreyk __END_DECLS 193d2b2a2e3Sreyk 194d2b2a2e3Sreyk #endif /* _HOSTAPD_H */ 195