static int bsd_set_ieee8021x(void *priv, int enabled) { struct bsd_driver_data *drv = priv; hostapd *hapd = drv->hapd; struct hostapd_config *conf = hapd->conf; HOSTAPD_DEBUG(HOSTAPD_DEBUG_VERBOSE, "%s: enabled=%d\n", __func__, enabled); if (!enabled) { /* XXX restore state */ return set80211param(priv, IEEE80211_IOC_AUTHMODE, IEEE80211_AUTH_AUTO); } if (!conf->wpa && !conf->ieee802_1x) { hostapd_logger(hapd, NULL, HOSTAPD_MODULE_DRIVER, HOSTAPD_LEVEL_WARNING, "No 802.1x or WPA enabled!"); return -1; } if (conf->wpa && bsd_configure_wpa(drv) != 0) { hostapd_logger(hapd, NULL, HOSTAPD_MODULE_DRIVER, HOSTAPD_LEVEL_WARNING, "Error configuring WPA state!"); return -1; } if (set80211param(priv, IEEE80211_IOC_AUTHMODE, (conf->wpa ? IEEE80211_AUTH_WPA : IEEE80211_AUTH_8021X))) { hostapd_logger(hapd, NULL, HOSTAPD_MODULE_DRIVER, HOSTAPD_LEVEL_WARNING, "Error enabling WPA/802.1x!"); return -1; } return bsd_set_iface_flags(priv, 1); }
static void bsd_deinit(void *priv) { struct bsd_driver_data *drv = priv; (void) bsd_set_iface_flags(drv, 0); if (drv->ioctl_sock >= 0) close(drv->ioctl_sock); if (drv->sock_xmit != NULL) l2_packet_deinit(drv->sock_xmit); free(drv); }
static int bsd_init(struct hostapd_data *hapd) { struct bsd_driver_data *drv; drv = malloc(sizeof(struct bsd_driver_data)); if (drv == NULL) { printf("Could not allocate memory for bsd driver data\n"); goto bad; } memset(drv, 0, sizeof(*drv)); drv->ops = bsd_driver_ops; drv->hapd = hapd; drv->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0); if (drv->ioctl_sock < 0) { perror("socket[PF_INET,SOCK_DGRAM]"); goto bad; } memcpy(drv->iface, hapd->conf->iface, sizeof(drv->iface)); drv->sock_xmit = l2_packet_init(drv->iface, NULL, ETH_P_EAPOL, handle_read, drv); if (drv->sock_xmit == NULL) goto bad; if (l2_packet_get_own_addr(drv->sock_xmit, hapd->own_addr)) goto bad; bsd_set_iface_flags(drv, 0); /* mark down during setup */ hapd->driver = &drv->ops; return 0; bad: if (drv->sock_xmit != NULL) l2_packet_deinit(drv->sock_xmit); if (drv->ioctl_sock >= 0) close(drv->ioctl_sock); if (drv != NULL) free(drv); return -1; }