/* ======================================================================== Routine Description: Connect to the ESS with the specified parameters. When connected, call cfg80211_connect_result() with status code %WLAN_STATUS_SUCCESS. If the connection fails for some reason, call cfg80211_connect_result() with the status from the AP. Arguments: pWiphy - Wireless hardware description pNdev - Network device interface pSme - Return Value: 0 - success -x - fail Note: For iw utility: connect You must use "iw ra0 connect xxx", then "iw ra0 disconnect"; You can not use "iw ra0 connect xxx" twice without disconnect; Or you will suffer "command failed: Operation already in progress (-114)". You must support add_key and set_default_key function; Or kernel will crash without any error message in linux 2.6.32. ======================================================================== */ static int CFG80211_OpsConnect( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN struct cfg80211_connect_params *pSme) { struct rtmp_adapter *pAd; CMD_RTPRIV_IOCTL_80211_CONNECT ConnInfo; struct ieee80211_channel *pChannel = pSme->channel; INT32 Pairwise = 0; INT32 Groupwise = 0; INT32 Keymgmt = 0; // INT32 WpaVersion = NL80211_WPA_VERSION_2; INT32 WpaVersion = 0; INT32 Chan = -1, Idx; CFG80211DBG(RT_DEBUG_ERROR, ("80211 [CONNECT TEST]> %s ==>\n", __FUNCTION__)); /* init */ MAC80211_PAD_GET(pAd, pWiphy); if (pChannel != NULL) Chan = ieee80211_frequency_to_channel(pChannel->center_freq); /*Groupwise = pSme->crypto.cipher_group; for(Idx=0; Idx<pSme->crypto.n_ciphers_pairwise; Idx++) Pairwise |= pSme->crypto.ciphers_pairwise[Idx];*/ /* End of for */ CFG80211DBG(RT_DEBUG_ERROR, ("Groupwise: %x\n", pSme->crypto.cipher_group)); Groupwise = pSme->crypto.cipher_group; //for(Idx=0; Idx<pSme->crypto.n_ciphers_pairwise; Idx++) Pairwise |= pSme->crypto.ciphers_pairwise[0]; CFG80211DBG(RT_DEBUG_ERROR, ("Pairwise %x\n", pSme->crypto.ciphers_pairwise[0])); for(Idx=0; Idx<pSme->crypto.n_akm_suites; Idx++) Keymgmt |= pSme->crypto.akm_suites[Idx]; /* End of for */ WpaVersion = pSme->crypto.wpa_versions; CFG80211DBG(RT_DEBUG_ERROR, ("Wpa_versions %x\n", WpaVersion)); memset(&ConnInfo, 0, sizeof(ConnInfo)); ConnInfo.WpaVer = 0; /* if (WpaVersion & NL80211_WPA_VERSION_2) ConnInfo.WpaVer = 2; else if (WpaVersion & NL80211_WPA_VERSION_1) ConnInfo.WpaVer = 1; else ConnInfo.WpaVer = 0; if (Keymgmt & WLAN_AKM_SUITE_8021X) ConnInfo.FlgIs8021x = true; else ConnInfo.FlgIs8021x = false; if (pSme->auth_type == NL80211_AUTHTYPE_SHARED_KEY) ConnInfo.FlgIsAuthOpen = false; else ConnInfo.FlgIsAuthOpen = true; if (Pairwise & WLAN_CIPHER_SUITE_CCMP) ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP; else if (Pairwise & WLAN_CIPHER_SUITE_TKIP) ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP; else if ((Pairwise & WLAN_CIPHER_SUITE_WEP40) || (Pairwise & WLAN_CIPHER_SUITE_WEP104)) { ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_WEP; } else ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE; if (Groupwise & WLAN_CIPHER_SUITE_CCMP) ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP; else if (Groupwise & WLAN_CIPHER_SUITE_TKIP) ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP; else ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE; */ if (WpaVersion & NL80211_WPA_VERSION_1) { ConnInfo.WpaVer = 1; } if (WpaVersion & NL80211_WPA_VERSION_2) { ConnInfo.WpaVer = 2; } CFG80211DBG(RT_DEBUG_ERROR, ("Keymgmt %x\n", Keymgmt)); if (Keymgmt == WLAN_AKM_SUITE_8021X) ConnInfo.FlgIs8021x = true; else ConnInfo.FlgIs8021x = false; CFG80211DBG(RT_DEBUG_ERROR, ("Auth_type %x\n", pSme->auth_type)); if (pSme->auth_type == NL80211_AUTHTYPE_SHARED_KEY) ConnInfo.AuthType = Ndis802_11AuthModeShared; else if (pSme->auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM) ConnInfo.AuthType = Ndis802_11AuthModeOpen; else ConnInfo.AuthType = Ndis802_11AuthModeAutoSwitch; if (Pairwise == WLAN_CIPHER_SUITE_CCMP) { CFG80211DBG(RT_DEBUG_ERROR, ("WLAN_CIPHER_SUITE_CCMP...\n")); ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP; } else if (Pairwise == WLAN_CIPHER_SUITE_TKIP) { CFG80211DBG(RT_DEBUG_ERROR, ("WLAN_CIPHER_SUITE_TKIP...\n")); ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP; } else if ((Pairwise == WLAN_CIPHER_SUITE_WEP40) || (Pairwise & WLAN_CIPHER_SUITE_WEP104)) { CFG80211DBG(RT_DEBUG_ERROR, ("WLAN_CIPHER_SUITE_WEP...\n")); ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_WEP; } else { CFG80211DBG(RT_DEBUG_ERROR, ("NONE...\n")); ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE; } if (Groupwise == WLAN_CIPHER_SUITE_CCMP) { ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP; } else if (Groupwise == WLAN_CIPHER_SUITE_TKIP) { ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP; } else { ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE; } CFG80211DBG(RT_DEBUG_ERROR, ("ConnInfo.KeyLen ===> %d\n", pSme->key_len)); CFG80211DBG(RT_DEBUG_ERROR, ("ConnInfo.KeyIdx ===> %d\n", pSme->key_idx)); /* ConnInfo.pKey = (u8 *)(pSme->key); ConnInfo.KeyLen = pSme->key_len; ConnInfo.pSsid = pSme->ssid; ConnInfo.SsidLen = pSme->ssid_len;*/ memcpy(ConnInfo.Key, pSme->key, pSme->key_len); ConnInfo.KeyLen = pSme->key_len; ConnInfo.pSsid = (char *) pSme->ssid; ConnInfo.SsidLen = pSme->ssid_len; ConnInfo.KeyIdx = pSme->key_idx; /* YF@20120328: Reset to default */ ConnInfo.bWpsConnection= false; /* YF@20120328: Use SIOCSIWGENIE to make out the WPA/WPS IEs in AssocReq. */ { if (pSme->ie_len > 0) { char *ie = (char *) pSme->ie; RTMP_DRIVER_80211_GEN_IE_SET(pAd, ie, pSme->ie_len); } else { RTMP_DRIVER_80211_GEN_IE_SET(pAd, NULL, 0); } } //CFG80211DBG(RT_DEBUG_ERROR, ("80211> SME %x\n", pSme->auth_type)); if ((pSme->ie_len > 6) /* EID(1) + LEN(1) + OUI(4) */ && (pSme->ie[0] == WLAN_EID_VENDOR_SPECIFIC && pSme->ie[1] >= 4 && pSme->ie[2] == 0x00 && pSme->ie[3] == 0x50 && pSme->ie[4] == 0xf2 && pSme->ie[5] == 0x04)) { ConnInfo.bWpsConnection= true; } /* %NULL if not specified (auto-select based on scan)*/ if (pSme->bssid != NULL) { CFG80211DBG(RT_DEBUG_ERROR, ("80211> Connect bssid %02x:%02x:%02x:%02x:%02x:%02x\n", PRINT_MAC(pSme->bssid))); memcpy(ConnInfo.Bssid, pSme->bssid, ETH_ALEN); } RTMP_DRIVER_80211_CONNECT(pAd, &ConnInfo); return 0; } /* End of CFG80211_OpsConnect */
/* ======================================================================== Routine Description: Connect to the ESS with the specified parameters. When connected, call cfg80211_connect_result() with status code %WLAN_STATUS_SUCCESS. If the connection fails for some reason, call cfg80211_connect_result() with the status from the AP. Arguments: pWiphy - Wireless hardware description pNdev - Network device interface pSme - Return Value: 0 - success -x - fail Note: For iw utility: connect You must use "iw ra0 connect xxx", then "iw ra0 disconnect"; You can not use "iw ra0 connect xxx" twice without disconnect; Or you will suffer "command failed: Operation already in progress (-114)". You must support add_key and set_default_key function; Or kernel will crash without any error message in linux 2.6.32. ======================================================================== */ static int CFG80211_OpsConnect( IN struct wiphy *pWiphy, IN struct net_device *pNdev, IN struct cfg80211_connect_params *pSme) { VOID *pAd; CMD_RTPRIV_IOCTL_80211_CONNECT ConnInfo; struct ieee80211_channel *pChannel = pSme->channel; INT32 Pairwise = 0; INT32 Groupwise = 0; INT32 Keymgmt = 0; INT32 WpaVersion = NL80211_WPA_VERSION_2; INT32 Chan = -1, Idx; CFG80211DBG(RT_DEBUG_ERROR, ("80211> %s ==>\n", __FUNCTION__)); /* init */ MAC80211_PAD_GET(pAd, pWiphy); if (pChannel != NULL) Chan = ieee80211_frequency_to_channel(pChannel->center_freq); Groupwise = pSme->crypto.cipher_group; for(Idx=0; Idx<pSme->crypto.n_ciphers_pairwise; Idx++) Pairwise |= pSme->crypto.ciphers_pairwise[Idx]; /* End of for */ for(Idx=0; Idx<pSme->crypto.n_akm_suites; Idx++) Keymgmt |= pSme->crypto.akm_suites[Idx]; /* End of for */ WpaVersion = pSme->crypto.wpa_versions; memset(&ConnInfo, 0, sizeof(ConnInfo)); if (WpaVersion & NL80211_WPA_VERSION_2) ConnInfo.WpaVer = 2; else if (WpaVersion & NL80211_WPA_VERSION_1) ConnInfo.WpaVer = 1; else ConnInfo.WpaVer = 0; if (Keymgmt & WLAN_AKM_SUITE_8021X) ConnInfo.FlgIs8021x = TRUE; else ConnInfo.FlgIs8021x = FALSE; if (pSme->auth_type == NL80211_AUTHTYPE_SHARED_KEY) ConnInfo.FlgIsAuthOpen = FALSE; else ConnInfo.FlgIsAuthOpen = TRUE; if (Pairwise & WLAN_CIPHER_SUITE_CCMP) ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP; else if (Pairwise & WLAN_CIPHER_SUITE_TKIP) ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP; else if ((Pairwise & WLAN_CIPHER_SUITE_WEP40) || (Pairwise & WLAN_CIPHER_SUITE_WEP104)) { ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_WEP; } else ConnInfo.PairwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE; if (Groupwise & WLAN_CIPHER_SUITE_CCMP) ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_CCMP; else if (Groupwise & WLAN_CIPHER_SUITE_TKIP) ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_TKIP; else ConnInfo.GroupwiseEncrypType |= RT_CMD_80211_CONN_ENCRYPT_NONE; /* End of if */ ConnInfo.pKey = (UINT8 *)(pSme->key); ConnInfo.KeyLen = pSme->key_len; ConnInfo.pSsid = pSme->ssid; ConnInfo.SsidLen = pSme->ssid_len; CFG80211DBG(RT_DEBUG_ERROR, ("80211> SME %x\n", pSme->auth_type)); RTMP_DRIVER_80211_CONNECT(pAd, &ConnInfo); return 0; } /* End of CFG80211_OpsConnect */