Move hostapd global callback functions into hapd_interfaces
authorJouni Malinen <j@w1.fi>
Sat, 25 Aug 2012 09:43:27 +0000 (12:43 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 25 Aug 2012 10:47:05 +0000 (13:47 +0300)
These function pointers are going to be the same for each interface so
there is no need to keep them in struct hostapd_iface. Moving them to
struct hapd_interfaces makes it easier to add interfaces at run time.

Signed-hostap: Jouni Malinen <j@w1.fi>

hostapd/main.c
src/ap/hostapd.c
src/ap/hostapd.h
src/ap/utils.c
src/ap/wpa_auth_glue.c
src/ap/wps_hostapd.c

index 35b4da9..d1790a4 100644 (file)
@@ -166,14 +166,9 @@ static struct hostapd_iface * hostapd_init(const char *config_file)
        if (hapd_iface == NULL)
                goto fail;
 
-       hapd_iface->reload_config = hostapd_reload_config;
-       hapd_iface->config_read_cb = hostapd_config_read;
        hapd_iface->config_fname = os_strdup(config_file);
        if (hapd_iface->config_fname == NULL)
                goto fail;
-       hapd_iface->ctrl_iface_init = hostapd_ctrl_iface_init;
-       hapd_iface->ctrl_iface_deinit = hostapd_ctrl_iface_deinit;
-       hapd_iface->for_each_interface = hostapd_for_each_interface;
 
        conf = hostapd_config_read(hapd_iface->config_fname);
        if (conf == NULL)
@@ -540,6 +535,13 @@ int main(int argc, char *argv[])
        if (os_program_init())
                return -1;
 
+       os_memset(&interfaces, 0, sizeof(interfaces));
+       interfaces.reload_config = hostapd_reload_config;
+       interfaces.config_read_cb = hostapd_config_read;
+       interfaces.for_each_interface = hostapd_for_each_interface;
+       interfaces.ctrl_iface_init = hostapd_ctrl_iface_init;
+       interfaces.ctrl_iface_deinit = hostapd_ctrl_iface_deinit;
+
        for (;;) {
                c = getopt(argc, argv, "Bde:f:hKP:tv");
                if (c < 0)
index ba8d832..9c0bd9b 100644 (file)
@@ -113,9 +113,10 @@ int hostapd_reload_config(struct hostapd_iface *iface)
        struct hostapd_config *newconf, *oldconf;
        size_t j;
 
-       if (iface->config_read_cb == NULL)
+       if (iface->interfaces == NULL ||
+           iface->interfaces->config_read_cb == NULL)
                return -1;
-       newconf = iface->config_read_cb(iface->config_fname);
+       newconf = iface->interfaces->config_read_cb(iface->config_fname);
        if (newconf == NULL)
                return -1;
 
@@ -286,8 +287,9 @@ static void hostapd_free_hapd_data(struct hostapd_data *hapd)
  */
 static void hostapd_cleanup(struct hostapd_data *hapd)
 {
-       if (hapd->iface->ctrl_iface_deinit)
-               hapd->iface->ctrl_iface_deinit(hapd);
+       if (hapd->iface->interfaces &&
+           hapd->iface->interfaces->ctrl_iface_deinit)
+               hapd->iface->interfaces->ctrl_iface_deinit(hapd);
        hostapd_free_hapd_data(hapd);
 }
 
@@ -770,8 +772,9 @@ static int hostapd_setup_bss(struct hostapd_data *hapd, int first)
        }
 #endif /* CONFIG_INTERWORKING */
 
-       if (hapd->iface->ctrl_iface_init &&
-           hapd->iface->ctrl_iface_init(hapd)) {
+       if (hapd->iface->interfaces &&
+           hapd->iface->interfaces->ctrl_iface_init &&
+           hapd->iface->interfaces->ctrl_iface_init(hapd)) {
                wpa_printf(MSG_ERROR, "Failed to setup control interface");
                return -1;
        }
index f7ed311..05e349f 100644 (file)
@@ -23,7 +23,17 @@ struct full_dynamic_vlan;
 enum wps_event;
 union wps_event_data;
 
+struct hostapd_iface;
+
 struct hapd_interfaces {
+       int (*reload_config)(struct hostapd_iface *iface);
+       struct hostapd_config * (*config_read_cb)(const char *config_fname);
+       int (*ctrl_iface_init)(struct hostapd_data *hapd);
+       void (*ctrl_iface_deinit)(struct hostapd_data *hapd);
+       int (*for_each_interface)(struct hapd_interfaces *interfaces,
+                                 int (*cb)(struct hostapd_iface *iface,
+                                           void *ctx), void *ctx);
+
        size_t count;
        struct hostapd_iface **iface;
 };
@@ -182,8 +192,6 @@ struct hostapd_data {
 struct hostapd_iface {
        struct hapd_interfaces *interfaces;
        void *owner;
-       int (*reload_config)(struct hostapd_iface *iface);
-       struct hostapd_config * (*config_read_cb)(const char *config_fname);
        char *config_fname;
        struct hostapd_config *conf;
 
@@ -241,13 +249,6 @@ struct hostapd_iface {
 
        u16 ht_op_mode;
        void (*scan_cb)(struct hostapd_iface *iface);
-
-       int (*ctrl_iface_init)(struct hostapd_data *hapd);
-       void (*ctrl_iface_deinit)(struct hostapd_data *hapd);
-
-       int (*for_each_interface)(struct hapd_interfaces *interfaces,
-                                 int (*cb)(struct hostapd_iface *iface,
-                                           void *ctx), void *ctx);
 };
 
 /* hostapd.c */
index 07e289d..931968c 100644 (file)
@@ -78,7 +78,8 @@ void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr)
        struct prune_data data;
        data.hapd = hapd;
        data.addr = addr;
-       if (hapd->iface->for_each_interface)
-               hapd->iface->for_each_interface(hapd->iface->interfaces,
-                                               prune_associations, &data);
+       if (hapd->iface->interfaces &&
+           hapd->iface->interfaces->for_each_interface)
+               hapd->iface->interfaces->for_each_interface(
+                       hapd->iface->interfaces, prune_associations, &data);
 }
index edcdf60..bdc89e4 100644 (file)
@@ -303,12 +303,13 @@ static int hostapd_wpa_auth_for_each_auth(
 {
        struct hostapd_data *hapd = ctx;
        struct wpa_auth_iface_iter_data data;
-       if (hapd->iface->for_each_interface == NULL)
+       if (hapd->iface->interfaces == NULL ||
+           hapd->iface->interfaces->for_each_interface == NULL)
                return -1;
        data.cb = cb;
        data.cb_ctx = cb_ctx;
-       return hapd->iface->for_each_interface(hapd->iface->interfaces,
-                                              wpa_auth_iface_iter, &data);
+       return hapd->iface->interfaces->for_each_interface(
+               hapd->iface->interfaces, wpa_auth_iface_iter, &data);
 }
 
 
@@ -360,16 +361,17 @@ static int hostapd_wpa_auth_send_ether(void *ctx, const u8 *dst, u16 proto,
        int ret;
 
 #ifdef CONFIG_IEEE80211R
-       if (proto == ETH_P_RRB && hapd->iface->for_each_interface) {
+       if (proto == ETH_P_RRB && hapd->iface->interfaces &&
+           hapd->iface->interfaces->for_each_interface) {
                int res;
                struct wpa_auth_ft_iface_iter_data idata;
                idata.src_hapd = hapd;
                idata.dst = dst;
                idata.data = data;
                idata.data_len = data_len;
-               res = hapd->iface->for_each_interface(hapd->iface->interfaces,
-                                                     hostapd_wpa_auth_ft_iter,
-                                                     &idata);
+               res = hapd->iface->interfaces->for_each_interface(
+                       hapd->iface->interfaces, hostapd_wpa_auth_ft_iter,
+                       &idata);
                if (res == 1)
                        return data_len;
        }
index 506de54..74b637e 100644 (file)
@@ -76,10 +76,11 @@ static int hostapd_wps_for_each(struct hostapd_data *hapd,
        struct wps_for_each_data data;
        data.func = func;
        data.ctx = ctx;
-       if (iface->for_each_interface == NULL)
+       if (iface->interfaces == NULL ||
+           iface->interfaces->for_each_interface == NULL)
                return wps_for_each(iface, &data);
-       return iface->for_each_interface(iface->interfaces, wps_for_each,
-                                        &data);
+       return iface->interfaces->for_each_interface(iface->interfaces,
+                                                    wps_for_each, &data);
 }
 
 
@@ -256,7 +257,8 @@ static void wps_reload_config(void *eloop_data, void *user_ctx)
        struct hostapd_iface *iface = eloop_data;
 
        wpa_printf(MSG_DEBUG, "WPS: Reload configuration data");
-       if (iface->reload_config(iface) < 0) {
+       if (iface->interfaces == NULL ||
+           iface->interfaces->reload_config(iface) < 0) {
                wpa_printf(MSG_WARNING, "WPS: Failed to reload the updated "
                           "configuration");
        }
@@ -717,10 +719,12 @@ static int get_uuid_cb(struct hostapd_iface *iface, void *ctx)
 static const u8 * get_own_uuid(struct hostapd_iface *iface)
 {
        const u8 *uuid;
-       if (iface->for_each_interface == NULL)
+       if (iface->interfaces == NULL ||
+           iface->interfaces->for_each_interface == NULL)
                return NULL;
        uuid = NULL;
-       iface->for_each_interface(iface->interfaces, get_uuid_cb, &uuid);
+       iface->interfaces->for_each_interface(iface->interfaces, get_uuid_cb,
+                                             &uuid);
        return uuid;
 }
 
@@ -736,10 +740,11 @@ static int count_interface_cb(struct hostapd_iface *iface, void *ctx)
 static int interface_count(struct hostapd_iface *iface)
 {
        int count = 0;
-       if (iface->for_each_interface == NULL)
+       if (iface->interfaces == NULL ||
+           iface->interfaces->for_each_interface == NULL)
                return 0;
-       iface->for_each_interface(iface->interfaces, count_interface_cb,
-                                 &count);
+       iface->interfaces->for_each_interface(iface->interfaces,
+                                             count_interface_cb, &count);
        return count;
 }