Merge hostapd driver init functions into one
authorJouni Malinen <jouni.malinen@atheros.com>
Thu, 9 Apr 2009 20:28:21 +0000 (23:28 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 9 Apr 2009 20:28:21 +0000 (23:28 +0300)
Use a parameter structure to pass in information that can be more easily
extended in the future. Include some of the parameters that were
previously read directly from hapd->conf in order to reduce need for
including hostapd/config.h into driver wrappers.

16 files changed:
hostapd/config.c
hostapd/driver_i.h
hostapd/hostapd.c
src/drivers/driver.h
src/drivers/driver_atheros.c
src/drivers/driver_bsd.c
src/drivers/driver_hostap.c
src/drivers/driver_madwifi.c
src/drivers/driver_ndis.c
src/drivers/driver_nl80211.c
src/drivers/driver_none.c
src/drivers/driver_prism54.c
src/drivers/driver_privsep.c
src/drivers/driver_test.c
src/drivers/driver_wired.c
wpa_supplicant/ap.c

index fae4444..12c15ba 100644 (file)
@@ -2099,13 +2099,7 @@ struct hostapd_config * hostapd_config_read(const char *fname)
                                errors++;
                        }
                } else if (os_strcmp(buf, "bssid") == 0) {
-                       if (bss == conf->bss &&
-                           (!conf->driver || !conf->driver->init_bssid)) {
-                               wpa_printf(MSG_ERROR, "Line %d: bssid item "
-                                          "not allowed for the default "
-                                          "interface and this driver", line);
-                               errors++;
-                       } else if (hwaddr_aton(pos, bss->bssid)) {
+                       if (hwaddr_aton(pos, bss->bssid)) {
                                wpa_printf(MSG_ERROR, "Line %d: invalid bssid "
                                           "item", line);
                                errors++;
index ce1259d..d513502 100644 (file)
 #include "config.h"
 
 static inline void *
-hostapd_driver_init(struct hostapd_data *hapd)
+hostapd_driver_init(struct hostapd_data *hapd, const u8 *bssid)
 {
+       struct wpa_init_params params;
+       void *ret;
+       size_t i;
+
        if (hapd->driver == NULL || hapd->driver->hapd_init == NULL)
                return NULL;
-       return hapd->driver->hapd_init(hapd);
-}
 
-static inline void *
-hostapd_driver_init_bssid(struct hostapd_data *hapd, const u8 *bssid)
-{
-       if (hapd->driver == NULL || hapd->driver->init_bssid == NULL)
+       os_memset(&params, 0, sizeof(params));
+       params.bssid = bssid;
+       params.ifname = hapd->conf->iface;
+       params.ssid = (const u8 *) hapd->conf->ssid.ssid;
+       params.ssid_len = hapd->conf->ssid.ssid_len;
+       params.test_socket = hapd->conf->test_socket;
+       params.use_pae_group_addr = hapd->conf->use_pae_group_addr;
+       params.ht_40mhz_scan = hapd->iconf->secondary_channel != 0;
+
+       params.num_bridge = hapd->iface->num_bss;
+       params.bridge = os_zalloc(hapd->iface->num_bss * sizeof(char *));
+       if (params.bridge == NULL)
                return NULL;
-       return hapd->driver->init_bssid(hapd, bssid);
+       for (i = 0; i < hapd->iface->num_bss; i++) {
+               struct hostapd_data *bss = hapd->iface->bss[i];
+               if (bss->conf->bridge[0])
+                       params.bridge[i] = bss->conf->bridge;
+       }
+       ret = hapd->driver->hapd_init(hapd, &params);
+       os_free(params.bridge);
+
+       return ret;
 }
 
 static inline void
index 2f5a888..379e59c 100644 (file)
@@ -1322,11 +1322,9 @@ static int setup_interface(struct hostapd_iface *iface)
         * Initialize the driver interface and make sure that all BSSes get
         * configured with a pointer to this driver interface.
         */
-       if (b[0] | b[1] | b[2] | b[3] | b[4] | b[5]) {
-               hapd->drv_priv = hostapd_driver_init_bssid(hapd, b);
-       } else {
-               hapd->drv_priv = hostapd_driver_init(hapd);
-       }
+       if (!(b[0] | b[1] | b[2] | b[3] | b[4] | b[5]))
+               b = NULL;
+       hapd->drv_priv = hostapd_driver_init(hapd, b);
 
        if (hapd->drv_priv == NULL) {
                wpa_printf(MSG_ERROR, "%s driver initialization failed.",
index 10afd0d..1b0ac7f 100644 (file)
@@ -502,6 +502,18 @@ struct hostapd_neighbor_bss {
        int sec_chan; /* 0 for 20 MHz channels */
 };
 
+struct wpa_init_params {
+       const u8 *bssid;
+       const char *ifname;
+       const u8 *ssid;
+       size_t ssid_len;
+       const char *test_socket;
+       int use_pae_group_addr;
+       int ht_40mhz_scan;
+       char **bridge;
+       size_t num_bridge;
+};
+
 
 /**
  * struct wpa_driver_ops - Driver interface API definition
@@ -1197,8 +1209,8 @@ struct wpa_driver_ops {
 
        int (*set_beacon_int)(void *priv, int value);
 
-       void * (*hapd_init)(struct hostapd_data *hapd);
-       void * (*init_bssid)(struct hostapd_data *hapd, const u8 *bssid);
+       void * (*hapd_init)(struct hostapd_data *hapd,
+                           struct wpa_init_params *params);
        void (*hapd_deinit)(void *priv);
 
        /**
index 8393b97..55ee613 100644 (file)
@@ -1167,7 +1167,7 @@ handle_read(void *ctx, const u8 *src_addr, const u8 *buf, size_t len)
 }
 
 static void *
-madwifi_init(struct hostapd_data *hapd)
+madwifi_init(struct hostapd_data *hapd, struct wpa_init_params *params)
 {
        struct madwifi_driver_data *drv;
        struct ifreq ifr;
@@ -1185,7 +1185,7 @@ madwifi_init(struct hostapd_data *hapd)
                perror("socket[PF_INET,SOCK_DGRAM]");
                goto bad;
        }
-       memcpy(drv->iface, hapd->conf->iface, sizeof(drv->iface));
+       memcpy(drv->iface, params->ifname, sizeof(drv->iface));
 
        memset(&ifr, 0, sizeof(ifr));
        os_strlcpy(ifr.ifr_name, drv->iface, sizeof(ifr.ifr_name));
@@ -1201,10 +1201,10 @@ madwifi_init(struct hostapd_data *hapd)
                goto bad;
        if (l2_packet_get_own_addr(drv->sock_xmit, hapd->own_addr))
                goto bad;
-       if (hapd->conf->bridge[0] != '\0') {
+       if (params->bridge[0]) {
                wpa_printf(MSG_DEBUG, "Configure bridge %s for EAPOL traffic.",
-                          hapd->conf->bridge);
-               drv->sock_recv = l2_packet_init(hapd->conf->bridge, NULL,
+                          params->bridge[0]);
+               drv->sock_recv = l2_packet_init(params->bridge[0], NULL,
                                                ETH_P_EAPOL, handle_read, drv,
                                                1);
                if (drv->sock_recv == NULL)
index 49e31c2..135706d 100644 (file)
@@ -704,7 +704,7 @@ bsd_set_ssid(const char *ifname, void *priv, const u8 *buf, int len)
 }
 
 static void *
-bsd_init(struct hostapd_data *hapd)
+bsd_init(struct hostapd_data *hapd, struct wpa_init_params *params)
 {
        struct bsd_driver_data *drv;
 
index 80d2b61..ad9fbfe 100644 (file)
@@ -31,7 +31,6 @@
 #include "priv_netlink.h"
 #include "ieee802_11_defs.h"
 #include "../../hostapd/hostapd.h"
-#include "../../hostapd/config.h"
 #include "../../hostapd/hw_features.h"
 #include "../../hostapd/sta_flags.h"
 
@@ -1071,7 +1070,8 @@ static void hostap_wireless_event_deinit(struct hostap_driver_data *drv)
 }
 
 
-static void * hostap_init(struct hostapd_data *hapd)
+static void * hostap_init(struct hostapd_data *hapd,
+                         struct wpa_init_params *params)
 {
        struct hostap_driver_data *drv;
 
@@ -1083,7 +1083,7 @@ static void * hostap_init(struct hostapd_data *hapd)
 
        drv->hapd = hapd;
        drv->ioctl_sock = drv->sock = -1;
-       memcpy(drv->iface, hapd->conf->iface, sizeof(drv->iface));
+       memcpy(drv->iface, params->ifname, sizeof(drv->iface));
 
        drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
        if (drv->ioctl_sock < 0) {
index 19ae616..eb00b0d 100644 (file)
@@ -1230,7 +1230,7 @@ handle_read(void *ctx, const u8 *src_addr, const u8 *buf, size_t len)
 }
 
 static void *
-madwifi_init(struct hostapd_data *hapd)
+madwifi_init(struct hostapd_data *hapd, struct wpa_init_params *params)
 {
        struct madwifi_driver_data *drv;
        struct ifreq ifr;
@@ -1248,7 +1248,7 @@ madwifi_init(struct hostapd_data *hapd)
                perror("socket[PF_INET,SOCK_DGRAM]");
                goto bad;
        }
-       memcpy(drv->iface, hapd->conf->iface, sizeof(drv->iface));
+       memcpy(drv->iface, params->ifname, sizeof(drv->iface));
 
        memset(&ifr, 0, sizeof(ifr));
        os_strlcpy(ifr.ifr_name, drv->iface, sizeof(ifr.ifr_name));
@@ -1264,10 +1264,10 @@ madwifi_init(struct hostapd_data *hapd)
                goto bad;
        if (l2_packet_get_own_addr(drv->sock_xmit, hapd->own_addr))
                goto bad;
-       if (hapd->conf->bridge[0] != '\0') {
+       if (params->bridge[0]) {
                wpa_printf(MSG_DEBUG, "Configure bridge %s for EAPOL traffic.",
-                          hapd->conf->bridge);
-               drv->sock_recv = l2_packet_init(hapd->conf->bridge, NULL,
+                          params->bridge[0]);
+               drv->sock_recv = l2_packet_init(params->bridge[0], NULL,
                                                ETH_P_EAPOL, handle_read, drv,
                                                1);
                if (drv->sock_recv == NULL)
index 6a7f887..f642db4 100644 (file)
@@ -3218,6 +3218,8 @@ const struct wpa_driver_ops wpa_driver_ndis_ops = {
        NULL /* authenticate */,
        NULL /* set_beacon */,
        NULL /* set_beacon_int */,
+       NULL /* hapd_init */,
+       NULL /* hapd_deinit */,
        NULL /* set_ieee8021x */,
        NULL /* set_privacy */,
        NULL /* hapd_set_key */,
index c181987..0bb2caa 100644 (file)
@@ -54,7 +54,6 @@
 #include <net/if_arp.h>
 
 #include "../../hostapd/hostapd.h"
-#include "../../hostapd/config.h"
 #include "../../hostapd/sta_flags.h"
 #include "ieee802_11_common.h"
 
@@ -4453,7 +4452,8 @@ i802_get_neighbor_bss(void *priv, size_t *num)
 }
 
 
-static void *i802_init_bssid(struct hostapd_data *hapd, const u8 *bssid)
+static void *i802_init(struct hostapd_data *hapd,
+                      struct wpa_init_params *params)
 {
        struct wpa_driver_nl80211_data *drv;
        size_t i;
@@ -4465,20 +4465,19 @@ static void *i802_init_bssid(struct hostapd_data *hapd, const u8 *bssid)
        }
 
        drv->hapd = hapd;
-       memcpy(drv->ifname, hapd->conf->iface, sizeof(drv->ifname));
-       memcpy(drv->bss.ifname, hapd->conf->iface, sizeof(drv->bss.ifname));
+       memcpy(drv->ifname, params->ifname, sizeof(drv->ifname));
+       memcpy(drv->bss.ifname, params->ifname, sizeof(drv->bss.ifname));
        drv->ifindex = if_nametoindex(drv->ifname);
 
        drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
        drv->if_indices = drv->default_if_indices;
-       for (i = 0; i < hapd->iface->num_bss; i++) {
-               struct hostapd_data *bss = hapd->iface->bss[i];
-               if (bss->conf->bridge)
-                       add_ifidx(drv, if_nametoindex(bss->conf->bridge));
+       for (i = 0; i < params->num_bridge; i++) {
+               if (params->bridge[i])
+                       add_ifidx(drv, if_nametoindex(params->bridge[i]));
        }
-       drv->ht_40mhz_scan = hapd->iconf->secondary_channel != 0;
+       drv->ht_40mhz_scan = params->ht_40mhz_scan;
 
-       if (i802_init_sockets(drv, bssid))
+       if (i802_init_sockets(drv, params->bssid))
                goto failed;
 
        return drv;
@@ -4489,12 +4488,6 @@ failed:
 }
 
 
-static void *i802_init(struct hostapd_data *hapd)
-{
-       return i802_init_bssid(hapd, NULL);
-}
-
-
 static void i802_deinit(void *priv)
 {
        struct wpa_driver_nl80211_data *drv = priv;
@@ -4577,7 +4570,6 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
 #endif /* CONFIG_AP || HOSTAPD */
 #ifdef HOSTAPD
        .hapd_init = i802_init,
-       .init_bssid = i802_init_bssid,
        .hapd_deinit = i802_deinit,
        .hapd_set_key = i802_set_key,
        .get_seqnum = i802_get_seqnum,
index 56fb344..31b1076 100644 (file)
@@ -23,7 +23,8 @@ struct none_driver_data {
 };
 
 
-static void * none_driver_init(struct hostapd_data *hapd)
+static void * none_driver_init(struct hostapd_data *hapd,
+                              struct wpa_init_params *params)
 {
        struct none_driver_data *drv;
 
index 148460a..cc56d52 100644 (file)
@@ -1030,7 +1030,8 @@ static int prism54_init_sockets(struct prism54_driver_data *drv)
 }
 
 
-static void * prism54_driver_init(struct hostapd_data *hapd)
+static void * prism54_driver_init(struct hostapd_data *hapd,
+                                 struct wpa_init_params *params)
 {
        struct prism54_driver_data *drv;
 
@@ -1043,7 +1044,7 @@ static void * prism54_driver_init(struct hostapd_data *hapd)
 
        drv->hapd = hapd;
        drv->pim_sock = drv->sock = -1;
-       memcpy(drv->iface, hapd->conf->iface, sizeof(drv->iface));
+       memcpy(drv->iface, params->ifname, sizeof(drv->iface));
 
        if (prism54_init_sockets(drv)) {
                free(drv);
index 2ea6766..39991e2 100644 (file)
@@ -814,6 +814,8 @@ struct wpa_driver_ops wpa_driver_privsep_ops = {
        NULL /* authenticate */,
        NULL /* set_beacon */,
        NULL /* set_beacon_int */,
+       NULL /* hapd_init */,
+       NULL /* hapd_deinit */,
        NULL /* set_ieee8021x */,
        NULL /* set_privacy */,
        NULL /* hapd_set_key */,
index 8ec9592..185a1c6 100644 (file)
@@ -38,7 +38,6 @@
 #ifdef HOSTAPD
 
 #include "../../hostapd/hostapd.h"
-#include "../../hostapd/config.h"
 #include "../../hostapd/wpa.h"
 #include "../../hostapd/hw_features.h"
 #include "../../hostapd/wps_hostapd.h"
@@ -1066,7 +1065,8 @@ static int test_driver_sta_add(const char *ifname, void *priv,
 }
 
 
-static void * test_driver_init(struct hostapd_data *hapd)
+static void * test_driver_init(struct hostapd_data *hapd,
+                              struct wpa_init_params *params)
 {
        struct test_driver_data *drv;
        struct sockaddr_un addr_un;
@@ -1090,35 +1090,35 @@ static void * test_driver_init(struct hostapd_data *hapd)
 
        /* Generate a MAC address to help testing with multiple APs */
        hapd->own_addr[0] = 0x02; /* locally administered */
-       sha1_prf((const u8 *) hapd->conf->iface, strlen(hapd->conf->iface),
+       sha1_prf((const u8 *) params->ifname, strlen(params->ifname),
                 "hostapd test bssid generation",
-                (const u8 *) hapd->conf->ssid.ssid, hapd->conf->ssid.ssid_len,
+                params->ssid, params->ssid_len,
                 hapd->own_addr + 1, ETH_ALEN - 1);
 
-       os_strlcpy(drv->bss->ifname, hapd->conf->iface, IFNAMSIZ);
+       os_strlcpy(drv->bss->ifname, params->ifname, IFNAMSIZ);
        memcpy(drv->bss->bssid, hapd->own_addr, ETH_ALEN);
 
-       if (hapd->conf->test_socket) {
-               if (strlen(hapd->conf->test_socket) >=
+       if (params->test_socket) {
+               if (os_strlen(params->test_socket) >=
                    sizeof(addr_un.sun_path)) {
                        printf("Too long test_socket path\n");
                        test_driver_free_priv(drv);
                        return NULL;
                }
-               if (strncmp(hapd->conf->test_socket, "DIR:", 4) == 0) {
-                       size_t len = strlen(hapd->conf->test_socket) + 30;
-                       drv->socket_dir = strdup(hapd->conf->test_socket + 4);
+               if (strncmp(params->test_socket, "DIR:", 4) == 0) {
+                       size_t len = strlen(params->test_socket) + 30;
+                       drv->socket_dir = strdup(params->test_socket + 4);
                        drv->own_socket_path = malloc(len);
                        if (drv->own_socket_path) {
                                snprintf(drv->own_socket_path, len,
                                         "%s/AP-" MACSTR,
-                                        hapd->conf->test_socket + 4,
+                                        params->test_socket + 4,
                                         MAC2STR(hapd->own_addr));
                        }
-               } else if (strncmp(hapd->conf->test_socket, "UDP:", 4) == 0) {
-                       drv->udp_port = atoi(hapd->conf->test_socket + 4);
+               } else if (strncmp(params->test_socket, "UDP:", 4) == 0) {
+                       drv->udp_port = atoi(params->test_socket + 4);
                } else {
-                       drv->own_socket_path = strdup(hapd->conf->test_socket);
+                       drv->own_socket_path = strdup(params->test_socket);
                }
                if (drv->own_socket_path == NULL && drv->udp_port == 0) {
                        test_driver_free_priv(drv);
@@ -2520,7 +2520,6 @@ const struct wpa_driver_ops wpa_driver_test_ops = {
        NULL /* set_beacon */,
        NULL /* set_beacon_int */,
        NULL /* hapd_init */,
-       NULL /* init_bssid */,
        NULL /* hapd_deinit */,
        NULL /* set_ieee8021x */,
        NULL /* set_privacy */,
index 200a2b3..be8cc8f 100644 (file)
@@ -31,7 +31,6 @@
 #ifdef HOSTAPD
 #include "eloop.h"
 #include "../../hostapd/hostapd.h"
-#include "../../hostapd/config.h"
 #include "../../hostapd/sta_info.h"
 #include "../../hostapd/accounting.h"
 #endif /* HOSTAPD */
@@ -336,7 +335,8 @@ static int wired_send_eapol(void *priv, const u8 *addr,
 }
 
 
-static void * wired_driver_hapd_init(struct hostapd_data *hapd)
+static void * wired_driver_hapd_init(struct hostapd_data *hapd,
+                                    struct wpa_init_params *params)
 {
        struct wpa_driver_wired_data *drv;
 
@@ -347,8 +347,8 @@ static void * wired_driver_hapd_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;
+       os_strlcpy(drv->iface, params->ifname, sizeof(drv->iface));
+       drv->use_pae_group_addr = params->use_pae_group_addr;
 
        if (wired_init_sockets(drv)) {
                free(drv);
index 2ea6867..dd5ab01 100644 (file)
@@ -54,7 +54,8 @@ struct ap_driver_data {
 };
 
 
-static void * ap_driver_init(struct hostapd_data *hapd)
+static void * ap_driver_init(struct hostapd_data *hapd,
+                            struct wpa_init_params *params)
 {
        struct ap_driver_data *drv;
        struct wpa_supplicant *wpa_s = hapd->iface->owner;