void * (*init_bssid)(struct hostapd_data *hapd, const u8 *bssid);
void (*deinit)(void *priv);
- int (*wireless_event_init)(void *priv);
- void (*wireless_event_deinit)(void *priv);
-
/**
* set_8021x - enable/disable IEEE 802.1X support
* @ifname: Interface name (for multi-SSID/VLAN support)
static int
-madwifi_wireless_event_init(void *priv)
+madwifi_wireless_event_init(struct madwifi_driver_data *drv)
{
- struct madwifi_driver_data *drv = priv;
int s;
struct sockaddr_nl local;
static void
-madwifi_wireless_event_deinit(void *priv)
+madwifi_wireless_event_deinit(struct madwifi_driver_data *drv)
{
- struct madwifi_driver_data *drv = priv;
-
- if (drv != NULL) {
- if (drv->wext_sock < 0)
- return;
- eloop_unregister_read_sock(drv->wext_sock);
- close(drv->wext_sock);
- }
+ if (drv->wext_sock < 0)
+ return;
+ eloop_unregister_read_sock(drv->wext_sock);
+ close(drv->wext_sock);
}
madwifi_receive_probe_req(drv);
+ if (madwifi_wireless_event_init(drv))
+ goto bad;
+
return drv;
bad:
if (drv->sock_xmit != NULL)
{
struct madwifi_driver_data *drv = priv;
+ madwifi_wireless_event_deinit(drv);
(void) madwifi_set_iface_flags(drv, 0);
if (drv->ioctl_sock >= 0)
close(drv->ioctl_sock);
.get_seqnum = madwifi_get_seqnum,
.flush = madwifi_flush,
.set_generic_elem = madwifi_set_opt_ie,
- .wireless_event_init = madwifi_wireless_event_init,
- .wireless_event_deinit = madwifi_wireless_event_deinit,
.sta_set_flags = madwifi_sta_set_flags,
.read_sta_data = madwifi_read_sta_driver_data,
.send_eapol = madwifi_send_eapol,
}
static int
-bsd_wireless_event_init(void *priv)
+bsd_wireless_event_init(struct bsd_driver_data *drv)
{
- struct bsd_driver_data *drv = priv;
int s;
drv->wext_sock = -1;
}
static void
-bsd_wireless_event_deinit(void *priv)
+bsd_wireless_event_deinit(struct bsd_driver_data *drv)
{
- struct bsd_driver_data *drv = priv;
-
- if (drv != NULL) {
- if (drv->wext_sock < 0)
- return;
- eloop_unregister_read_sock(drv->wext_sock);
- close(drv->wext_sock);
- }
+ if (drv->wext_sock < 0)
+ return;
+ eloop_unregister_read_sock(drv->wext_sock);
+ close(drv->wext_sock);
}
goto bad;
bsd_set_iface_flags(drv, 0); /* mark down during setup */
+ if (bsd_wireless_event_init(drv))
+ goto bad;
return drv;
bad:
{
struct bsd_driver_data *drv = priv;
+ bsd_wireless_event_deinit(drv);
(void) bsd_set_iface_flags(drv, 0);
if (drv->ioctl_sock >= 0)
close(drv->ioctl_sock);
.get_seqnum = bsd_get_seqnum,
.flush = bsd_flush,
.set_generic_elem = bsd_set_opt_ie,
- .wireless_event_init = bsd_wireless_event_init,
- .wireless_event_deinit = bsd_wireless_event_deinit,
.sta_set_flags = bsd_sta_set_flags,
.read_sta_data = bsd_read_sta_driver_data,
.send_eapol = bsd_send_eapol,
}
-static int hostap_wireless_event_init(void *priv)
+static int hostap_wireless_event_init(struct hostap_driver_data *drv)
{
- struct hostap_driver_data *drv = priv;
int s;
struct sockaddr_nl local;
}
-static void hostap_wireless_event_deinit(void *priv)
+static void hostap_wireless_event_deinit(struct hostap_driver_data *drv)
{
- struct hostap_driver_data *drv = priv;
if (drv->wext_sock < 0)
return;
eloop_unregister_read_sock(drv->wext_sock);
return NULL;
}
- if (hostap_init_sockets(drv)) {
+ if (hostap_init_sockets(drv) || hostap_wireless_event_init(drv)) {
close(drv->ioctl_sock);
free(drv);
return NULL;
{
struct hostap_driver_data *drv = priv;
+ hostap_wireless_event_deinit(drv);
(void) hostap_set_iface_flags(drv, 0);
(void) hostap_ioctl_prism2param(drv, PRISM2_PARAM_HOSTAPD, 0);
(void) hostap_ioctl_prism2param(drv, PRISM2_PARAM_HOSTAPD_STA, 0);
.name = "hostap",
.init = hostap_init,
.deinit = hostap_driver_deinit,
- .wireless_event_init = hostap_wireless_event_init,
- .wireless_event_deinit = hostap_wireless_event_deinit,
.set_ieee8021x = hostap_set_ieee8021x,
.set_privacy = hostap_set_privacy,
.set_key = hostap_set_key,
}
static inline int
-hostapd_wireless_event_init(struct hostapd_data *hapd)
-{
- if (hapd->driver == NULL ||
- hapd->driver->wireless_event_init == NULL)
- return 0;
- return hapd->driver->wireless_event_init(hapd->drv_priv);
-}
-
-static inline void
-hostapd_wireless_event_deinit(struct hostapd_data *hapd)
-{
- if (hapd->driver == NULL ||
- hapd->driver->wireless_event_deinit == NULL)
- return;
- hapd->driver->wireless_event_deinit(hapd->drv_priv);
-}
-
-static inline int
hostapd_set_ieee8021x(const char *ifname, struct hostapd_data *hapd,
int enabled)
{
static int
-madwifi_wireless_event_init(void *priv)
+madwifi_wireless_event_init(struct madwifi_driver_data *drv)
{
- struct madwifi_driver_data *drv = priv;
int s;
struct sockaddr_nl local;
static void
-madwifi_wireless_event_deinit(void *priv)
+madwifi_wireless_event_deinit(struct madwifi_driver_data *drv)
{
- struct madwifi_driver_data *drv = priv;
-
- if (drv != NULL) {
- if (drv->wext_sock < 0)
- return;
- eloop_unregister_read_sock(drv->wext_sock);
- close(drv->wext_sock);
- }
+ if (drv->wext_sock < 0)
+ return;
+ eloop_unregister_read_sock(drv->wext_sock);
+ close(drv->wext_sock);
}
madwifi_receive_probe_req(drv);
+ if (madwifi_wireless_event_init(drv))
+ goto bad;
+
return drv;
bad:
if (drv->sock_xmit != NULL)
{
struct madwifi_driver_data *drv = priv;
+ madwifi_wireless_event_deinit(drv);
(void) madwifi_set_iface_flags(drv, 0);
if (drv->ioctl_sock >= 0)
close(drv->ioctl_sock);
.get_seqnum = madwifi_get_seqnum,
.flush = madwifi_flush,
.set_generic_elem = madwifi_set_opt_ie,
- .wireless_event_init = madwifi_wireless_event_init,
- .wireless_event_deinit = madwifi_wireless_event_deinit,
.sta_set_flags = madwifi_sta_set_flags,
.read_sta_data = madwifi_read_sta_driver_data,
.send_eapol = madwifi_send_eapol,
}
-static int i802_wireless_event_init(void *priv)
+static int i802_wireless_event_init(struct i802_driver_data *drv)
{
- struct i802_driver_data *drv = priv;
int s;
struct sockaddr_nl local;
}
-static void i802_wireless_event_deinit(void *priv)
+static void i802_wireless_event_deinit(struct i802_driver_data *drv)
{
- struct i802_driver_data *drv = priv;
if (drv->wext_sock < 0)
return;
eloop_unregister_read_sock(drv->wext_sock);
if (i802_init_sockets(drv, bssid))
goto failed;
+ if (i802_wireless_event_init(drv))
+ goto failed;
+
return drv;
failed:
struct i802_driver_data *drv = priv;
struct i802_bss *bss, *prev;
+ i802_wireless_event_deinit(drv);
+
if (drv->last_freq_ht) {
/* Clear HT flags from the driver */
struct hostapd_freq_params freq;
.init = i802_init,
.init_bssid = i802_init_bssid,
.deinit = i802_deinit,
- .wireless_event_init = i802_wireless_event_init,
- .wireless_event_deinit = i802_wireless_event_deinit,
.set_ieee8021x = i802_set_ieee8021x,
.set_privacy = i802_set_privacy,
.set_key = i802_set_key,
hostapd_deinit_wps(hapd);
- hostapd_wireless_event_deinit(hapd);
-
#ifdef EAP_TLS_FUNCS
if (hapd->ssl_ctx) {
tls_deinit(hapd->ssl_ctx);
return -1;
}
- /* TODO: merge with hostapd_driver_init() ? */
- if (hostapd_wireless_event_init(hapd) < 0)
- return -1;
-
if (hostapd_get_hw_features(iface)) {
/* Not all drivers support this yet, so continue without hw
* feature data. */