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 */
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;
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;
{
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;
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)
}
-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;
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;
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);
+ }
}
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) {
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)");
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) {
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))
.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,
.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,