X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=hostapd%2Fdriver_nl80211.c;h=877245de96ebfb85df93b05229a6845ba0f90792;hb=c2220ec0b7f47841fbec71d9f4626e2705a03a89;hp=8716a9f01d6a52e05f6798a1bd6193e906e03858;hpb=6de726abb5b6aa75ccfe30e07189ef3931c66a01;p=wpasupplicant diff --git a/hostapd/driver_nl80211.c b/hostapd/driver_nl80211.c index 8716a9f..877245d 100644 --- a/hostapd/driver_nl80211.c +++ b/hostapd/driver_nl80211.c @@ -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,