diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c index 7afd85962..82c3d5151 100644 --- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -30,6 +30,7 @@ #include "sta_info.h" #include "accounting.h" #include "wps_hostapd.h" +#include "driver.h" struct wpa_ctrl_dst { diff --git a/hostapd/driver.h b/hostapd/driver.h index 8a6d91b36..edf12e33a 100644 --- a/hostapd/driver.h +++ b/hostapd/driver.h @@ -16,6 +16,20 @@ #ifndef DRIVER_H #define DRIVER_H +struct hostapd_data; + +struct hostap_sta_driver_data { + unsigned long rx_packets, tx_packets, rx_bytes, tx_bytes; + unsigned long current_tx_rate; + unsigned long inactive_msec; + unsigned long flags; + unsigned long num_ps_buf_frames; + unsigned long tx_retry_failed; + unsigned long tx_retry_count; + int last_rssi; + int last_ack_rssi; +}; + struct hostapd_sta_add_params { const u8 *addr; u16 aid; @@ -197,4 +211,7 @@ struct wpa_driver_ops { const u8 *ie, size_t len); }; +void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, + int reassoc); + #endif /* DRIVER_H */ diff --git a/hostapd/driver_nl80211.c b/hostapd/driver_nl80211.c index 9f26d5dd3..3ed7652db 100644 --- a/hostapd/driver_nl80211.c +++ b/hostapd/driver_nl80211.c @@ -529,7 +529,7 @@ static int i802_set_rts(void *priv, int rts) struct iwreq iwr; memset(&iwr, 0, sizeof(iwr)); - os_strlcpy(iwr.ifr_name, drv->hapd->conf->iface, IFNAMSIZ); + os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ); iwr.u.rts.value = rts; iwr.u.rts.fixed = 1; @@ -548,7 +548,7 @@ static int i802_get_rts(void *priv, int *rts) struct iwreq iwr; memset(&iwr, 0, sizeof(iwr)); - os_strlcpy(iwr.ifr_name, drv->hapd->conf->iface, IFNAMSIZ); + os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ); if (ioctl(drv->ioctl_sock, SIOCGIWRTS, &iwr) < 0) { perror("ioctl[SIOCGIWRTS]"); @@ -567,7 +567,7 @@ static int i802_set_frag(void *priv, int frag) struct iwreq iwr; memset(&iwr, 0, sizeof(iwr)); - os_strlcpy(iwr.ifr_name, drv->hapd->conf->iface, IFNAMSIZ); + os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ); iwr.u.frag.value = frag; iwr.u.frag.fixed = 1; @@ -586,7 +586,7 @@ static int i802_get_frag(void *priv, int *frag) struct iwreq iwr; memset(&iwr, 0, sizeof(iwr)); - os_strlcpy(iwr.ifr_name, drv->hapd->conf->iface, IFNAMSIZ); + os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ); if (ioctl(drv->ioctl_sock, SIOCGIWFRAG, &iwr) < 0) { perror("ioctl[SIOCGIWFRAG]"); @@ -605,7 +605,7 @@ static int i802_set_retry(void *priv, int short_retry, int long_retry) struct iwreq iwr; memset(&iwr, 0, sizeof(iwr)); - os_strlcpy(iwr.ifr_name, drv->hapd->conf->iface, IFNAMSIZ); + os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ); iwr.u.retry.value = short_retry; iwr.u.retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN; @@ -631,7 +631,7 @@ static int i802_get_retry(void *priv, int *short_retry, int *long_retry) struct iwreq iwr; memset(&iwr, 0, sizeof(iwr)); - os_strlcpy(iwr.ifr_name, drv->hapd->conf->iface, IFNAMSIZ); + os_strlcpy(iwr.ifr_name, drv->iface, IFNAMSIZ); iwr.u.retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN; if (ioctl(drv->ioctl_sock, SIOCGIWRETRY, &iwr) < 0) { @@ -1009,8 +1009,7 @@ static int nl80211_create_iface(struct i802_driver_data *drv, genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0, NL80211_CMD_NEW_INTERFACE, 0); - NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, - if_nametoindex(drv->hapd->conf->iface)); + NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, if_nametoindex(drv->iface)); NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, ifname); NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, iftype); diff --git a/hostapd/driver_wired.c b/hostapd/driver_wired.c index 61cb667cc..60b036e3e 100644 --- a/hostapd/driver_wired.c +++ b/hostapd/driver_wired.c @@ -38,6 +38,7 @@ struct wired_driver_data { struct hostapd_data *hapd; + char iface[IFNAMSIZ + 1]; int sock; /* raw packet socket for driver access */ int dhcp_sock; /* socket for dhcp packets */ @@ -197,7 +198,7 @@ static int wired_init_sockets(struct wired_driver_data *drv) } memset(&ifr, 0, sizeof(ifr)); - os_strlcpy(ifr.ifr_name, hapd->conf->iface, sizeof(ifr.ifr_name)); + os_strlcpy(ifr.ifr_name, drv->iface, sizeof(ifr.ifr_name)); if (ioctl(drv->sock, SIOCGIFINDEX, &ifr) != 0) { perror("ioctl(SIOCGIFINDEX)"); return -1; @@ -229,7 +230,7 @@ static int wired_init_sockets(struct wired_driver_data *drv) } memset(&ifr, 0, sizeof(ifr)); - os_strlcpy(ifr.ifr_name, hapd->conf->iface, sizeof(ifr.ifr_name)); + os_strlcpy(ifr.ifr_name, drv->iface, sizeof(ifr.ifr_name)); if (ioctl(drv->sock, SIOCGIFHWADDR, &ifr) != 0) { perror("ioctl(SIOCGIFHWADDR)"); return -1; @@ -271,7 +272,7 @@ static int wired_init_sockets(struct wired_driver_data *drv) } memset(&ifr, 0, sizeof(ifr)); - os_strlcpy(ifr.ifr_ifrn.ifrn_name, hapd->conf->iface, IFNAMSIZ); + os_strlcpy(ifr.ifr_ifrn.ifrn_name, drv->iface, IFNAMSIZ); if (setsockopt(drv->dhcp_sock, SOL_SOCKET, SO_BINDTODEVICE, (char *) &ifr, sizeof(ifr)) < 0) { perror("setsockopt[SOL_SOCKET,SO_BINDTODEVICE]"); @@ -339,6 +340,7 @@ static void * wired_driver_init(struct hostapd_data *hapd) } drv->hapd = hapd; + os_strlcpy(drv->iface, hapd->conf->iface, sizeof(drv->iface)); drv->use_pae_group_addr = hapd->conf->use_pae_group_addr; if (wired_init_sockets(drv)) { diff --git a/hostapd/hostapd.h b/hostapd/hostapd.h index 85bcf0b16..e368aae42 100644 --- a/hostapd/hostapd.h +++ b/hostapd/hostapd.h @@ -19,84 +19,11 @@ #include "common.h" #include "ap.h" - -#ifndef ETH_ALEN -#define ETH_ALEN 6 -#endif -#ifndef IFNAMSIZ -#define IFNAMSIZ 16 -#endif -#ifndef ETH_P_ALL -#define ETH_P_ALL 0x0003 -#endif -#ifndef ETH_P_PAE -#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ -#endif /* ETH_P_PAE */ -#ifndef ETH_P_EAPOL -#define ETH_P_EAPOL ETH_P_PAE -#endif /* ETH_P_EAPOL */ - -#ifndef ETH_P_RRB -#define ETH_P_RRB 0x890D -#endif /* ETH_P_RRB */ - +#include "hostapd_defs.h" #include "config.h" -#ifdef _MSC_VER -#pragma pack(push, 1) -#endif /* _MSC_VER */ - -#define MAX_VLAN_ID 4094 - -struct ieee8023_hdr { - u8 dest[6]; - u8 src[6]; - u16 ethertype; -} STRUCT_PACKED; - - -struct ieee80211_hdr { - le16 frame_control; - le16 duration_id; - u8 addr1[6]; - u8 addr2[6]; - u8 addr3[6]; - le16 seq_ctrl; - /* followed by 'u8 addr4[6];' if ToDS and FromDS is set in data frame - */ -} STRUCT_PACKED; - -#ifdef _MSC_VER -#pragma pack(pop) -#endif /* _MSC_VER */ - -#define IEEE80211_DA_FROMDS addr1 -#define IEEE80211_BSSID_FROMDS addr2 -#define IEEE80211_SA_FROMDS addr3 - -#define IEEE80211_HDRLEN (sizeof(struct ieee80211_hdr)) - -#define IEEE80211_FC(type, stype) host_to_le16((type << 2) | (stype << 4)) - -/* MTU to be set for the wlan#ap device; this is mainly needed for IEEE 802.1X - * frames that might be longer than normal default MTU and they are not - * fragmented */ -#define HOSTAPD_MTU 2290 - extern unsigned char rfc1042_header[6]; -struct hostap_sta_driver_data { - unsigned long rx_packets, tx_packets, rx_bytes, tx_bytes; - unsigned long current_tx_rate; - unsigned long inactive_msec; - unsigned long flags; - unsigned long num_ps_buf_frames; - unsigned long tx_retry_failed; - unsigned long tx_retry_count; - int last_rssi; - int last_ack_rssi; -}; - struct wpa_driver_ops; struct wpa_ctrl_dst; struct radius_server_data; @@ -228,8 +155,6 @@ struct hostapd_iface { #endif /* CONFIG_IEEE80211N */ }; -void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, - int reassoc); int hostapd_reload_config(struct hostapd_iface *iface); #endif /* HOSTAPD_H */ diff --git a/hostapd/hostapd_defs.h b/hostapd/hostapd_defs.h new file mode 100644 index 000000000..d18483ae8 --- /dev/null +++ b/hostapd/hostapd_defs.h @@ -0,0 +1,80 @@ +/* + * hostapd / Initialization and configuration + * Host AP kernel driver + * Copyright (c) 2002-2009, Jouni Malinen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Alternatively, this software may be distributed under the terms of BSD + * license. + * + * See README and COPYING for more details. + */ + +#ifndef HOSTAPD_DEFS_H +#define HOSTAPD_DEFS_H + +#ifndef ETH_ALEN +#define ETH_ALEN 6 +#endif +#ifndef IFNAMSIZ +#define IFNAMSIZ 16 +#endif +#ifndef ETH_P_ALL +#define ETH_P_ALL 0x0003 +#endif +#ifndef ETH_P_PAE +#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ +#endif /* ETH_P_PAE */ +#ifndef ETH_P_EAPOL +#define ETH_P_EAPOL ETH_P_PAE +#endif /* ETH_P_EAPOL */ + +#ifndef ETH_P_RRB +#define ETH_P_RRB 0x890D +#endif /* ETH_P_RRB */ + +#ifdef _MSC_VER +#pragma pack(push, 1) +#endif /* _MSC_VER */ + +#define MAX_VLAN_ID 4094 + +struct ieee8023_hdr { + u8 dest[6]; + u8 src[6]; + u16 ethertype; +} STRUCT_PACKED; + + +struct ieee80211_hdr { + le16 frame_control; + le16 duration_id; + u8 addr1[6]; + u8 addr2[6]; + u8 addr3[6]; + le16 seq_ctrl; + /* followed by 'u8 addr4[6];' if ToDS and FromDS is set in data frame + */ +} STRUCT_PACKED; + +#ifdef _MSC_VER +#pragma pack(pop) +#endif /* _MSC_VER */ + +#define IEEE80211_DA_FROMDS addr1 +#define IEEE80211_BSSID_FROMDS addr2 +#define IEEE80211_SA_FROMDS addr3 + +#define IEEE80211_HDRLEN (sizeof(struct ieee80211_hdr)) + +#define IEEE80211_FC(type, stype) host_to_le16((type << 2) | (stype << 4)) + +/* MTU to be set for the wlan#ap device; this is mainly needed for IEEE 802.1X + * frames that might be longer than normal default MTU and they are not + * fragmented */ +#define HOSTAPD_MTU 2290 + +#endif /* HOSTAPD_DEFS_H */