Fix couple of forgotten wpa_hw_modes -> hostapd_hw_modes
[wpasupplicant] / hostapd / driver_nl80211.c
index 8716a9f..877245d 100644 (file)
@@ -65,7 +65,6 @@ struct i802_driver_data {
        struct hostapd_data *hapd;
 
        char iface[IFNAMSIZ + 1];
-       int bridge;
        int ioctl_sock; /* socket for ioctl() use */
        int wext_sock; /* socket for wireless events */
        int eapol_sock; /* socket for EAPOL frames */
@@ -83,7 +82,6 @@ struct i802_driver_data {
        struct genl_family *nl80211;
        int beacon_int;
        struct i802_bss bss;
-       unsigned int ieee802_1x_active:1;
        unsigned int ht_40mhz_scan:1;
 
        int last_freq;
@@ -116,6 +114,8 @@ static void add_ifidx(struct i802_driver_data *drv, int ifidx)
        int i;
        int *old;
 
+       wpa_printf(MSG_DEBUG, "nl80211: Add own interface ifindex %d",
+                  ifidx);
        for (i = 0; i < drv->num_if_indices; i++) {
                if (drv->if_indices[i] == 0) {
                        drv->if_indices[i] = ifidx;
@@ -162,9 +162,6 @@ static int have_ifidx(struct i802_driver_data *drv, int ifidx)
 {
        int i;
 
-       if (ifidx == drv->bridge)
-               return 1;
-
        for (i = 0; i < drv->num_if_indices; i++)
                if (drv->if_indices[i] == ifidx)
                        return 1;
@@ -875,7 +872,7 @@ static int i802_sta_set_flags(void *priv, const u8 *addr,
                    if_nametoindex(drv->iface));
        NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
 
-       if (total_flags & WLAN_STA_AUTHORIZED || !drv->ieee802_1x_active)
+       if (total_flags & WLAN_STA_AUTHORIZED)
                NLA_PUT_FLAG(flags, NL80211_STA_FLAG_AUTHORIZED);
 
        if (total_flags & WLAN_STA_WMM)
@@ -1153,42 +1150,6 @@ static int i802_del_beacon(struct i802_driver_data *drv)
 }
 
 
-static int i802_set_ieee8021x(const char *ifname, void *priv, int enabled)
-{
-       struct i802_driver_data *drv = priv;
-
-       /*
-        * FIXME: This needs to be per interface (BSS)
-        */
-       drv->ieee802_1x_active = enabled;
-       return 0;
-}
-
-
-static int i802_set_privacy(const char *ifname, void *priv, int enabled)
-{
-       struct i802_driver_data *drv = priv;
-       struct iwreq iwr;
-
-       memset(&iwr, 0, sizeof(iwr));
-
-       os_strlcpy(iwr.ifr_name, ifname, IFNAMSIZ);
-       iwr.u.param.flags = IW_AUTH_PRIVACY_INVOKED;
-       iwr.u.param.value = enabled;
-
-       ioctl(drv->ioctl_sock, SIOCSIWAUTH, &iwr);
-
-       /* ignore errors, the kernel/driver might not care */
-       return 0;
-}
-
-
-static int i802_set_internal_bridge(void *priv, int value)
-{
-       return -1;
-}
-
-
 static int i802_set_beacon_int(void *priv, int value)
 {
        struct i802_driver_data *drv = priv;
@@ -1768,7 +1729,6 @@ static void handle_frame(struct i802_driver_data *drv,
 static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
 {
        struct i802_driver_data *drv = eloop_ctx;
-       struct hostapd_data *hapd = drv->hapd;
        struct sockaddr_ll lladdr;
        unsigned char buf[3000];
        int len;
@@ -1781,8 +1741,13 @@ static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx)
                return;
        }
 
-       if (have_ifidx(drv, lladdr.sll_ifindex))
+       if (have_ifidx(drv, lladdr.sll_ifindex)) {
+               struct hostapd_data *hapd;
+               hapd = hostapd_sta_get_bss(drv->hapd, lladdr.sll_addr);
+               if (!hapd)
+                       return;
                hostapd_eapol_receive(hapd, lladdr.sll_addr, buf, len);
+       }
 }
 
 
@@ -2470,7 +2435,6 @@ static int i802_ht_scan(struct i802_driver_data *drv)
 static int i802_init_sockets(struct i802_driver_data *drv, const u8 *bssid)
 {
        struct ifreq ifr;
-       struct sockaddr_ll addr;
 
        drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
        if (drv->ioctl_sock < 0) {
@@ -2557,12 +2521,6 @@ static int i802_init_sockets(struct i802_driver_data *drv, const u8 *bssid)
        if (hostapd_set_iface_flags(drv, drv->iface, 1))
                goto fail1;
 
-       memset(&addr, 0, sizeof(addr));
-       addr.sll_family = AF_PACKET;
-       addr.sll_ifindex = ifr.ifr_ifindex;
-       wpa_printf(MSG_DEBUG, "Opening raw packet socket for ifindex %d",
-                  addr.sll_ifindex);
-
        drv->eapol_sock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_PAE));
        if (drv->eapol_sock < 0) {
                perror("socket(PF_PACKET, SOCK_DGRAM, ETH_P_PAE)");
@@ -2914,6 +2872,7 @@ i802_get_neighbor_bss(void *priv, size_t *num)
 static void *i802_init_bssid(struct hostapd_data *hapd, const u8 *bssid)
 {
        struct i802_driver_data *drv;
+       size_t i;
 
        drv = os_zalloc(sizeof(struct i802_driver_data));
        if (drv == NULL) {
@@ -2927,7 +2886,11 @@ static void *i802_init_bssid(struct hostapd_data *hapd, const u8 *bssid)
 
        drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int);
        drv->if_indices = drv->default_if_indices;
-       drv->bridge = if_nametoindex(hapd->conf->bridge);
+       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));
+       }
        drv->ht_40mhz_scan = hapd->iconf->secondary_channel != 0;
 
        if (i802_init_sockets(drv, bssid))
@@ -3009,8 +2972,6 @@ const struct hapd_driver_ops wpa_driver_nl80211_ops = {
        .init = i802_init,
        .init_bssid = i802_init_bssid,
        .deinit = i802_deinit,
-       .set_ieee8021x = i802_set_ieee8021x,
-       .set_privacy = i802_set_privacy,
        .set_key = i802_set_key,
        .get_seqnum = i802_get_seqnum,
        .flush = i802_flush,
@@ -3030,7 +2991,6 @@ const struct hapd_driver_ops wpa_driver_nl80211_ops = {
        .set_retry = i802_set_retry,
        .set_rate_sets = i802_set_rate_sets,
        .set_beacon = i802_set_beacon,
-       .set_internal_bridge = i802_set_internal_bridge,
        .set_beacon_int = i802_set_beacon_int,
        .set_cts_protect = i802_set_cts_protect,
        .set_preamble = i802_set_preamble,