static int wpa_driver_bsd_associate(void *priv, struct wpa_driver_associate_params *params) { struct wpa_driver_bsd_data *drv = priv; struct ieee80211req_mlme mlme; int privacy; wpa_printf(MSG_DEBUG, "%s: ssid '%.*s' wpa ie len %u pairwise %u group %u key mgmt %u" , __func__ , params->ssid_len, params->ssid , params->wpa_ie_len , params->pairwise_suite , params->group_suite , params->key_mgmt_suite ); /* XXX error handling is wrong but unclear what to do... */ if (wpa_driver_bsd_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) < 0) return -1; #ifndef NEW_FREEBSD_MLME_ASSOC if (wpa_driver_bsd_set_ssid(drv, params->ssid, params->ssid_len) < 0) return -1; #endif privacy = !(params->pairwise_suite == CIPHER_NONE && params->group_suite == CIPHER_NONE && params->key_mgmt_suite == KEY_MGMT_NONE && params->wpa_ie_len == 0); wpa_printf(MSG_DEBUG, "%s: set PRIVACY %u", __func__, privacy); if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0) return -1; if (params->wpa_ie_len && set80211param(drv, IEEE80211_IOC_WPA, params->wpa_ie[0] == RSN_INFO_ELEM ? 2 : 1) < 0) return -1; memset(&mlme, 0, sizeof(mlme)); mlme.im_op = IEEE80211_MLME_ASSOC; #ifdef NEW_FREEBSD_MLME_ASSOC if (params->ssid != NULL) memcpy(mlme.im_ssid, params->ssid, params->ssid_len); mlme.im_ssid_len = params->ssid_len; #endif if (params->bssid != NULL) memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN); if (set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme)) < 0) return -1; return 0; }
static int wpa_driver_bsd_set_wpa_internal(void *priv, int wpa, int privacy) { int ret = 0; wpa_printf(MSG_DEBUG, "%s: wpa=%d privacy=%d", __FUNCTION__, wpa, privacy); if (!wpa && wpa_driver_bsd_set_wpa_ie(priv, NULL, 0) < 0) ret = -1; if (set80211param(priv, IEEE80211_IOC_PRIVACY, privacy) < 0) ret = -1; if (set80211param(priv, IEEE80211_IOC_WPA, wpa) < 0) ret = -1; return ret; }
static int wpa_driver_bsd_set_wpa_internal(void *priv, int wpa, int privacy) { struct wpa_driver_bsd_data *drv = priv; int ret = 0; wpa_printf(MSG_DEBUG, "%s: wpa=%d privacy=%d", __func__, wpa, privacy); if (!wpa && wpa_driver_bsd_set_wpa_ie(drv, NULL, 0) < 0) ret = -1; if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0) ret = -1; if (set80211param(drv, IEEE80211_IOC_WPA, wpa) < 0) ret = -1; return ret; }
static int wpa_driver_bsd_associate(void *priv, struct wpa_driver_associate_params *params) { struct bsd_driver_data *drv = priv; struct ieee80211req_mlme mlme; u32 mode; int privacy; int ret = 0; wpa_printf(MSG_DEBUG, "%s: ssid '%.*s' wpa ie len %u pairwise %u group %u key mgmt %u" , __func__ , (unsigned int) params->ssid_len, params->ssid , (unsigned int) params->wpa_ie_len , params->pairwise_suite , params->group_suite , params->key_mgmt_suite ); switch (params->mode) { case IEEE80211_MODE_INFRA: mode = 0 /* STA */; break; case IEEE80211_MODE_IBSS: mode = IFM_IEEE80211_IBSS; break; case IEEE80211_MODE_AP: mode = IFM_IEEE80211_HOSTAP; break; default: wpa_printf(MSG_ERROR, "%s: unknown operation mode", __func__); return -1; } if (bsd_set_mediaopt(drv, IFM_OMASK, mode) < 0) { wpa_printf(MSG_ERROR, "%s: failed to set operation mode", __func__); return -1; } if (params->mode == IEEE80211_MODE_AP) { drv->sock_xmit = l2_packet_init(drv->ifname, NULL, ETH_P_EAPOL, handle_read, drv, 0); if (drv->sock_xmit == NULL) return -1; drv->is_ap = 1; return 0; } if (wpa_driver_bsd_set_drop_unencrypted(drv, params->drop_unencrypted) < 0) ret = -1; if (wpa_driver_bsd_set_auth_alg(drv, params->auth_alg) < 0) ret = -1; /* XXX error handling is wrong but unclear what to do... */ if (wpa_driver_bsd_set_wpa_ie(drv, params->wpa_ie, params->wpa_ie_len) < 0) return -1; privacy = !(params->pairwise_suite == CIPHER_NONE && params->group_suite == CIPHER_NONE && params->key_mgmt_suite == KEY_MGMT_NONE && params->wpa_ie_len == 0); wpa_printf(MSG_DEBUG, "%s: set PRIVACY %u", __func__, privacy); if (set80211param(drv, IEEE80211_IOC_PRIVACY, privacy) < 0) return -1; if (params->wpa_ie_len && set80211param(drv, IEEE80211_IOC_WPA, params->wpa_ie[0] == WLAN_EID_RSN ? 2 : 1) < 0) return -1; os_memset(&mlme, 0, sizeof(mlme)); mlme.im_op = IEEE80211_MLME_ASSOC; if (params->ssid != NULL) os_memcpy(mlme.im_ssid, params->ssid, params->ssid_len); mlme.im_ssid_len = params->ssid_len; if (params->bssid != NULL) os_memcpy(mlme.im_macaddr, params->bssid, IEEE80211_ADDR_LEN); if (set80211var(drv, IEEE80211_IOC_MLME, &mlme, sizeof(mlme)) < 0) return -1; return ret; }