hostapd: Use separate driver operations abstraction

It would be bettet to avoid including driver_i.h, i.e., direct driver
operation calls from hostapd components. This is an initial step in
that direction for WPS IE updates.
This commit is contained in:
Jouni Malinen 2009-12-24 16:15:22 +02:00
parent 9aca440199
commit bf65bc638f
6 changed files with 59 additions and 7 deletions

View file

@ -39,6 +39,7 @@ OBJS = hostapd.o main.o ieee802_1x.o \
drv_callbacks.o \ drv_callbacks.o \
tkip_countermeasures.o \ tkip_countermeasures.o \
mlme.o wpa_auth_ie.o mlme.o wpa_auth_ie.o
OBJS += ap_drv_ops.o
NEED_RC4=y NEED_RC4=y
NEED_AES=y NEED_AES=y
NEED_MD5=y NEED_MD5=y

39
hostapd/ap_drv_ops.c Normal file
View file

@ -0,0 +1,39 @@
/*
* hostapd - Driver operations
* Copyright (c) 2009, Jouni Malinen <j@w1.fi>
*
* 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.
*/
#include "includes.h"
#include "common.h"
#include "hostapd.h"
#include "driver_i.h"
static int hostapd_set_ap_wps_ie(struct hostapd_data *hapd,
const u8 *beacon_ie, size_t beacon_ie_len,
const u8 *probe_resp_ie,
size_t probe_resp_ie_len)
{
if (hostapd_set_wps_beacon_ie(hapd, hapd->wps_beacon_ie,
hapd->wps_beacon_ie_len) < 0 ||
hostapd_set_wps_probe_resp_ie(hapd, hapd->wps_probe_resp_ie,
hapd->wps_probe_resp_ie_len) < 0)
return -1;
return 0;
}
void hostapd_set_driver_ops(struct hostapd_driver_ops *ops)
{
ops->set_ap_wps_ie = hostapd_set_ap_wps_ie;
}

View file

@ -1384,6 +1384,7 @@ hostapd_alloc_bss_data(struct hostapd_iface *hapd_iface,
if (hapd == NULL) if (hapd == NULL)
return NULL; return NULL;
hostapd_set_driver_ops(&hapd->drv);
hapd->iconf = conf; hapd->iconf = conf;
hapd->conf = bss; hapd->conf = bss;
hapd->iface = hapd_iface; hapd->iface = hapd_iface;

View file

@ -22,6 +22,7 @@ struct wpa_ctrl_dst;
struct radius_server_data; struct radius_server_data;
struct upnp_wps_device_sm; struct upnp_wps_device_sm;
struct hapd_interfaces; struct hapd_interfaces;
struct hostapd_data;
#ifdef CONFIG_FULL_DYNAMIC_VLAN #ifdef CONFIG_FULL_DYNAMIC_VLAN
struct full_dynamic_vlan; struct full_dynamic_vlan;
@ -40,6 +41,13 @@ struct hostapd_rate_data {
}; };
struct hostapd_driver_ops {
int (*set_ap_wps_ie)(struct hostapd_data *hapd,
const u8 *beacon_ie, size_t beacon_ie_len,
const u8 *probe_resp_ie,
size_t probe_resp_ie_len);
};
/** /**
* struct hostapd_data - hostapd per-BSS data structure * struct hostapd_data - hostapd per-BSS data structure
*/ */
@ -67,6 +75,7 @@ struct hostapd_data {
const struct wpa_driver_ops *driver; const struct wpa_driver_ops *driver;
void *drv_priv; void *drv_priv;
struct hostapd_driver_ops drv;
void *msg_ctx; /* ctx for wpa_msg() calls */ void *msg_ctx; /* ctx for wpa_msg() calls */
@ -195,5 +204,6 @@ int hostapd_set_drv_ieee8021x(struct hostapd_data *hapd, const char *ifname,
int hostapd_sta_flags_to_drv(int flags); int hostapd_sta_flags_to_drv(int flags);
int eap_server_register_methods(void); int eap_server_register_methods(void);
void hostapd_set_driver_ops(struct hostapd_driver_ops *ops);
#endif /* HOSTAPD_H */ #endif /* HOSTAPD_H */

View file

@ -27,7 +27,7 @@
#include "wps/wps_defs.h" #include "wps/wps_defs.h"
#include "wps/wps_dev_attr.h" #include "wps/wps_dev_attr.h"
#include "hostapd.h" #include "hostapd.h"
#include "driver_i.h" #include "config.h"
#include "sta_info.h" #include "sta_info.h"
#include "wps_hostapd.h" #include "wps_hostapd.h"
@ -109,8 +109,6 @@ static int hostapd_wps_set_ie_cb(void *ctx, const u8 *beacon_ie,
os_memcpy(hapd->wps_beacon_ie, beacon_ie, beacon_ie_len); os_memcpy(hapd->wps_beacon_ie, beacon_ie, beacon_ie_len);
hapd->wps_beacon_ie_len = beacon_ie_len; hapd->wps_beacon_ie_len = beacon_ie_len;
} }
hostapd_set_wps_beacon_ie(hapd, hapd->wps_beacon_ie,
hapd->wps_beacon_ie_len);
os_free(hapd->wps_probe_resp_ie); os_free(hapd->wps_probe_resp_ie);
if (probe_resp_ie_len == 0) { if (probe_resp_ie_len == 0) {
@ -126,8 +124,10 @@ static int hostapd_wps_set_ie_cb(void *ctx, const u8 *beacon_ie,
probe_resp_ie_len); probe_resp_ie_len);
hapd->wps_probe_resp_ie_len = probe_resp_ie_len; hapd->wps_probe_resp_ie_len = probe_resp_ie_len;
} }
hostapd_set_wps_probe_resp_ie(hapd, hapd->wps_probe_resp_ie, hapd->drv.set_ap_wps_ie(hapd, hapd->wps_beacon_ie,
hapd->wps_probe_resp_ie_len); hapd->wps_beacon_ie_len,
hapd->wps_probe_resp_ie,
hapd->wps_probe_resp_ie_len);
return 0; return 0;
} }
@ -480,12 +480,12 @@ static void hostapd_wps_clear_ies(struct hostapd_data *hapd)
os_free(hapd->wps_beacon_ie); os_free(hapd->wps_beacon_ie);
hapd->wps_beacon_ie = NULL; hapd->wps_beacon_ie = NULL;
hapd->wps_beacon_ie_len = 0; hapd->wps_beacon_ie_len = 0;
hostapd_set_wps_beacon_ie(hapd, NULL, 0);
os_free(hapd->wps_probe_resp_ie); os_free(hapd->wps_probe_resp_ie);
hapd->wps_probe_resp_ie = NULL; hapd->wps_probe_resp_ie = NULL;
hapd->wps_probe_resp_ie_len = 0; hapd->wps_probe_resp_ie_len = 0;
hostapd_set_wps_probe_resp_ie(hapd, NULL, 0);
hapd->drv.set_ap_wps_ie(hapd, NULL, 0, NULL, 0);
} }

View file

@ -597,6 +597,7 @@ OBJS += ../hostapd/ieee802_1x.o
OBJS += ../src/eapol_auth/eapol_auth_sm.o OBJS += ../src/eapol_auth/eapol_auth_sm.o
OBJS += ../hostapd/ieee802_11_auth.o OBJS += ../hostapd/ieee802_11_auth.o
OBJS += ../hostapd/drv_callbacks.o OBJS += ../hostapd/drv_callbacks.o
OBJS += ../hostapd/ap_drv_ops.o
ifdef CONFIG_CTRL_IFACE ifdef CONFIG_CTRL_IFACE
OBJS += ../hostapd/ctrl_iface_ap.o OBJS += ../hostapd/ctrl_iface_ap.o
endif endif