u8 createbss_cmd(_adapter *padapter) { struct cmd_obj *pcmd; struct cmd_priv *pcmdpriv=&padapter->cmdpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; WLAN_BSSID_EX *pdev_network = &padapter->registrypriv.dev_network; u8 res = _SUCCESS; _func_enter_; padapter->ledpriv.LedControlHandler(padapter, LED_CTL_START_TO_LINK); if (pmlmepriv->assoc_ssid.SsidLength == 0) { RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for Any SSid:%s\n",pmlmepriv->assoc_ssid.Ssid)); } else { RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,(" createbss for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); } pcmd = (struct cmd_obj*)_malloc(sizeof(struct cmd_obj)); if (pcmd == NULL) { res = _FAIL; goto exit; } _init_listhead(&pcmd->list); pcmd->cmdcode = _CreateBss_CMD_; pcmd->parmbuf = (unsigned char *)pdev_network; pcmd->cmdsz = get_NDIS_WLAN_BSSID_EX_sz((NDIS_WLAN_BSSID_EX*)pdev_network); pcmd->rsp = NULL; pcmd->rspsz = 0; //notes: translate IELength & Length after assign the Length to cmdsz; pdev_network->Length = cpu_to_le32(pcmd->cmdsz); pdev_network->IELength = cpu_to_le32(pdev_network->IELength); pdev_network->Ssid.SsidLength = cpu_to_le32(pdev_network->Ssid.SsidLength); enqueue_cmd(pcmdpriv, pcmd); exit: _func_exit_; return res; }
u8 joinbss_cmd(_adapter *padapter, struct wlan_network* pnetwork) { u8 *auth, res=_SUCCESS; uint t_len=0; NDIS_WLAN_BSSID_EX *psecnetwork; struct cmd_obj* pcmd; struct cmd_priv *pcmdpriv=&padapter->cmdpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct qos_priv *pqospriv= &pmlmepriv->qospriv; struct security_priv *psecuritypriv=&padapter->securitypriv; struct registry_priv *pregistrypriv = &padapter->registrypriv; NDIS_802_11_NETWORK_INFRASTRUCTURE ndis_network_mode = pnetwork->network.InfrastructureMode; _func_enter_; if (pmlmepriv->assoc_ssid.SsidLength == 0){ RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("@@@@@ Join cmd for Any SSid\n")); } else{ RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("@@@@@ Join cmd for SSid:%s\n", pmlmepriv->assoc_ssid.Ssid)); } pcmd = (struct cmd_obj*)_malloc(sizeof(struct cmd_obj)); if(pcmd==NULL){ res=_FAIL; RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("\n joinbss_cmd :memory allocate for cmd_obj fail!!!\n")); goto exit; } t_len = sizeof (ULONG) + sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) + sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION) + sizeof (NDIS_802_11_NETWORK_INFRASTRUCTURE) + sizeof (NDIS_802_11_RATES_EX)+ sizeof (ULONG) + MAX_IE_SZ; //for hidden ap to set fw_state here if(check_fwstate(pmlmepriv, (WIFI_STATION_STATE|WIFI_ADHOC_STATE))!= _TRUE) { switch(ndis_network_mode) { case Ndis802_11IBSS: pmlmepriv->fw_state |=WIFI_ADHOC_STATE; break; case Ndis802_11Infrastructure: pmlmepriv->fw_state |= WIFI_STATION_STATE; break; case Ndis802_11APMode: case Ndis802_11AutoUnknown: case Ndis802_11InfrastructureMax: break; } } psecnetwork=(NDIS_WLAN_BSSID_EX *)&psecuritypriv->sec_bss; if(psecnetwork==NULL) { if(pcmd !=NULL) _mfree((unsigned char *)pcmd, sizeof(struct cmd_obj)); res=_FAIL; RT_TRACE(_module_rtl871x_cmd_c_,_drv_info_,("\n joinbss_cmd :psecnetwork==NULL!!!\n")); goto exit; } _memset(psecnetwork, 0, t_len); _memcpy(psecnetwork, &pnetwork->network, t_len); auth=&psecuritypriv->authenticator_ie[0]; psecuritypriv->authenticator_ie[0]=(unsigned char)psecnetwork->IELength; if((psecnetwork->IELength-12) < (256-1)) { _memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength-12); } else { _memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], (256-1)); } psecnetwork->IELength = 0; // Added by Albert 2009/02/18 // If the the driver wants to use the bssid to create the connection. // If not, we have to copy the connecting AP's MAC address to it so that // the driver just has the bssid information for PMKIDList searching. if ( pmlmepriv->assoc_by_bssid == _FALSE ) { _memcpy( &pmlmepriv->assoc_bssid[ 0 ], &pnetwork->network.MacAddress[ 0 ], ETH_ALEN ); } psecnetwork->IELength = restruct_sec_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength); pqospriv->qos_option = 0; if(pregistrypriv->wmm_enable) { u32 tmp_len; tmp_len = restruct_wmm_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, psecnetwork->IELength); if (psecnetwork->IELength != tmp_len) { psecnetwork->IELength = tmp_len; pqospriv->qos_option = 1; //There is WMM IE in this corresp. beacon } else { pqospriv->qos_option = 0;//There is no WMM IE in this corresp. beacon } } #ifdef CONFIG_80211N_HT if(pregistrypriv->ht_enable) { //restructure_ht_ie restructure_ht_ie(padapter, &pnetwork->network.IEs[0], &psecnetwork->IEs[0], pnetwork->network.IELength, &psecnetwork->IELength); } #endif psecuritypriv->supplicant_ie[0]=(u8)psecnetwork->IELength; if(psecnetwork->IELength < (256-1)) { _memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], psecnetwork->IELength); } else { _memcpy(&psecuritypriv->supplicant_ie[1], &psecnetwork->IEs[0], (256-1)); } pcmd->cmdsz = (get_NDIS_WLAN_BSSID_EX_sz(psecnetwork));//get cmdsz before endian conversion //wlan_network endian conversion psecnetwork->Length = cpu_to_le32(psecnetwork->Length); psecnetwork->Ssid.SsidLength= cpu_to_le32(psecnetwork->Ssid.SsidLength); psecnetwork->Privacy = cpu_to_le32(psecnetwork->Privacy); psecnetwork->Rssi = cpu_to_le32(psecnetwork->Rssi); psecnetwork->NetworkTypeInUse = cpu_to_le32(psecnetwork->NetworkTypeInUse); psecnetwork->Configuration.ATIMWindow = cpu_to_le32(psecnetwork->Configuration.ATIMWindow); psecnetwork->Configuration.BeaconPeriod = cpu_to_le32(psecnetwork->Configuration.BeaconPeriod); psecnetwork->Configuration.DSConfig = cpu_to_le32(psecnetwork->Configuration.DSConfig); psecnetwork->Configuration.FHConfig.DwellTime=cpu_to_le32(psecnetwork->Configuration.FHConfig.DwellTime); psecnetwork->Configuration.FHConfig.HopPattern=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopPattern); psecnetwork->Configuration.FHConfig.HopSet=cpu_to_le32(psecnetwork->Configuration.FHConfig.HopSet); psecnetwork->Configuration.FHConfig.Length=cpu_to_le32(psecnetwork->Configuration.FHConfig.Length); psecnetwork->Configuration.Length = cpu_to_le32(psecnetwork->Configuration.Length); psecnetwork->InfrastructureMode = cpu_to_le32(psecnetwork->InfrastructureMode); psecnetwork->IELength = cpu_to_le32(psecnetwork->IELength); _init_listhead(&pcmd->list); pcmd->cmdcode = _JoinBss_CMD_; pcmd->parmbuf = (unsigned char *)psecnetwork; pcmd->rsp = NULL; pcmd->rspsz = 0; enqueue_cmd(pcmdpriv, pcmd); exit: _func_exit_; return res; }
void createbss_cmd_callback(_adapter *padapter, struct cmd_obj *pcmd) { _irqL irqL; u8 timer_cancelled; struct sta_info *psta = NULL; struct wlan_network *pwlan = NULL; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; NDIS_WLAN_BSSID_EX *pnetwork = (NDIS_WLAN_BSSID_EX *)pcmd->parmbuf; struct wlan_network *tgt_network = &(pmlmepriv->cur_network); _func_enter_; if((pcmd->res != H2C_SUCCESS)) { RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n ********Error: createbss_cmd_callback Fail ************\n\n.")); _set_timer(&pmlmepriv->assoc_timer, 1 ); } _cancel_timer(&pmlmepriv->assoc_timer, &timer_cancelled); //endian_convert pnetwork->Length = le32_to_cpu(pnetwork->Length); pnetwork->Ssid.SsidLength = le32_to_cpu(pnetwork->Ssid.SsidLength); pnetwork->Privacy =le32_to_cpu(pnetwork->Privacy); pnetwork->Rssi = le32_to_cpu(pnetwork->Rssi); pnetwork->NetworkTypeInUse =le32_to_cpu(pnetwork->NetworkTypeInUse); pnetwork->Configuration.ATIMWindow = le32_to_cpu(pnetwork->Configuration.ATIMWindow); pnetwork->Configuration.BeaconPeriod = le32_to_cpu(pnetwork->Configuration.BeaconPeriod); pnetwork->Configuration.DSConfig =le32_to_cpu(pnetwork->Configuration.DSConfig); pnetwork->Configuration.FHConfig.DwellTime=le32_to_cpu(pnetwork->Configuration.FHConfig.DwellTime); pnetwork->Configuration.FHConfig.HopPattern=le32_to_cpu(pnetwork->Configuration.FHConfig.HopPattern); pnetwork->Configuration.FHConfig.HopSet=le32_to_cpu(pnetwork->Configuration.FHConfig.HopSet); pnetwork->Configuration.FHConfig.Length=le32_to_cpu(pnetwork->Configuration.FHConfig.Length); pnetwork->Configuration.Length = le32_to_cpu(pnetwork->Configuration.Length); pnetwork->InfrastructureMode = le32_to_cpu(pnetwork->InfrastructureMode); pnetwork->IELength = le32_to_cpu(pnetwork->IELength); _enter_critical(&pmlmepriv->lock, &irqL); { pwlan = _alloc_network(pmlmepriv); if ( pwlan == NULL) { pwlan = get_oldest_wlan_network(&pmlmepriv->scanned_queue); if( pwlan == NULL) { RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\n Error: can't get pwlan in joinbss_event_callback \n")); goto createbss_cmd_fail; } pwlan->last_scanned = get_current_time(); } else { list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); } pnetwork->Length = get_NDIS_WLAN_BSSID_EX_sz(pnetwork); _memcpy(&(pwlan->network), pnetwork, pnetwork->Length); pwlan->fixed = _TRUE; //list_insert_tail(&(pwlan->list), &pmlmepriv->scanned_queue.queue); // copy pdev_network information to pmlmepriv->cur_network _memcpy(&tgt_network->network, pnetwork, (get_NDIS_WLAN_BSSID_EX_sz(pnetwork))); // reset DSConfig //tgt_network->network.Configuration.DSConfig = (u32)ch2freq(pnetwork->Configuration.DSConfig); if(pmlmepriv->fw_state & _FW_UNDER_LINKING) pmlmepriv->fw_state ^= _FW_UNDER_LINKING; if((pmlmepriv->fw_state) & WIFI_AP_STATE) { psta = alloc_stainfo(&padapter->stapriv, pnetwork->MacAddress); if (psta == NULL) { // for AP Mode & Adhoc Master Mode RT_TRACE(_module_rtl871x_cmd_c_,_drv_err_,("\nCan't alloc sta_info when createbss_cmd_callback\n")); goto createbss_cmd_fail ; } indicate_connect( padapter); } else { //indicate_disconnect(dev); } // we will set _FW_LINKED when there is one more sat to join us (stassoc_event_callback) } createbss_cmd_fail: _exit_critical(&pmlmepriv->lock, &irqL); free_cmd_obj(pcmd); _func_exit_; }