static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8180_priv *priv = ieee80211_priv(dev); int ret; if(priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); #ifdef ENABLE_IPS // printk("set mode ENABLE_IPS\n"); if(priv->bInactivePs){ if(wrqu->mode == IW_MODE_ADHOC) IPSLeave(dev); } #endif ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); //rtl8180_commit(dev); up(&priv->wx_sem); return ret; }
void rtllib_ips_leave(struct net_device *dev) { struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev); down(&priv->rtllib->ips_sem); IPSLeave(dev); up(&priv->rtllib->ips_sem); }
void IPSLeave_wq(void *data) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) struct rtllib_device *ieee = container_of_work_rsl(data,struct rtllib_device,ips_leave_wq); struct net_device *dev = ieee->dev; #else struct net_device *dev = (struct net_device *)data; #endif struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev); down(&priv->rtllib->ips_sem); IPSLeave(dev); up(&priv->rtllib->ips_sem); }
static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8180_priv *priv = ieee80211_priv(dev); int ret; struct ieee80211_device* ieee = priv->ieee80211; if (priv->ieee80211->bHwRadioOff) return 0; if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { struct iw_scan_req* req = (struct iw_scan_req*)b; if (req->essid_len) { ieee->current_network.ssid_len = req->essid_len; memcpy(ieee->current_network.ssid, req->essid, req->essid_len); } } down(&priv->wx_sem); if (priv->up) { priv->ieee80211->actscanning = true; if (priv->bInactivePs && (priv->ieee80211->state != IEEE80211_LINKED)) { IPSLeave(dev); ieee80211_softmac_ips_scan_syncro(priv->ieee80211); ret = 0; } else { /* prevent scan in BusyTraffic */ /* FIXME: Need to consider last scan time */ if ((priv->link_detect.bBusyTraffic) && (true)) { ret = 0; printk("Now traffic is busy, please try later!\n"); } else /* prevent scan in BusyTraffic,end */ ret = ieee80211_wx_set_scan(priv->ieee80211, a, wrqu, b); } } else ret = -1; up(&priv->wx_sem); return ret; }
static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8180_priv *priv = ieee80211_priv(dev); int ret; if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); if (priv->bInactivePs) IPSLeave(dev); ret = ieee80211_wx_set_essid(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); return ret; }
static int r8192_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8192_priv *priv = ieee80211_priv(dev); RT_RF_POWER_STATE rtState; int ret; if (priv->bHwRadioOff) return 0; rtState = priv->eRFPowerState; down(&priv->wx_sem); #ifdef ENABLE_IPS if(wrqu->mode == IW_MODE_ADHOC){ if (priv->PowerSaveControl.bInactivePs) { if(rtState == eRfOff){ if(priv->RfOffReason > RF_CHANGE_BY_IPS) { RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__); up(&priv->wx_sem); return -1; } else{ RT_TRACE(COMP_ERR, "%s(): IPSLeave\n",__FUNCTION__); down(&priv->ieee80211->ips_sem); IPSLeave(priv); up(&priv->ieee80211->ips_sem); } } } } #endif ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); //rtl8187_set_rxconf(dev); up(&priv->wx_sem); return ret; }
static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8180_priv *priv = ieee80211_priv(dev); int ret; if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); /* printk("set essid ENABLE_IPS\n"); */ if (priv->bInactivePs) IPSLeave(dev); /* printk("haha:set essid %s essid_len = %d essid_flgs = %d\n",b, wrqu->essid.length, wrqu->essid.flags); */ ret = ieee80211_wx_set_essid(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); return ret; }
static int r8192_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8192_priv *priv = rtllib_priv(dev); struct rtllib_device *ieee = netdev_priv_rsl(dev); enum rt_rf_power_state rtState; int ret; if (priv->bHwRadioOff == true) return 0; rtState = priv->rtllib->eRFPowerState; down(&priv->wx_sem); if (wrqu->mode == IW_MODE_ADHOC || wrqu->mode == IW_MODE_MONITOR || ieee->bNetPromiscuousMode) { if (priv->rtllib->PowerSaveControl.bInactivePs) { if (rtState == eRfOff) { if (priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS) { RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n", __func__); up(&priv->wx_sem); return -1; } else { printk(KERN_INFO "=========>%s(): " "IPSLeave\n", __func__); down(&priv->rtllib->ips_sem); IPSLeave(dev); up(&priv->rtllib->ips_sem); } } } } ret = rtllib_wx_set_mode(priv->rtllib, a, wrqu, b); up(&priv->wx_sem); return ret; }
static int r8192_wx_set_enc_ext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret = 0; struct r8192_priv *priv = rtllib_priv(dev); struct rtllib_device *ieee = priv->rtllib; if (priv->bHwRadioOff == true) return 0; down(&priv->wx_sem); priv->rtllib->wx_set_enc = 1; down(&priv->rtllib->ips_sem); IPSLeave(dev); up(&priv->rtllib->ips_sem); ret = rtllib_wx_set_encode_ext(ieee, info, wrqu, extra); { u8 broadcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; u8 zero[6] = {0}; u32 key[4] = {0}; struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; struct iw_point *encoding = &wrqu->encoding; u8 idx = 0, alg = 0, group = 0; if ((encoding->flags & IW_ENCODE_DISABLED) || ext->alg == IW_ENCODE_ALG_NONE) { ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA; CamResetAllEntry(dev); memset(priv->rtllib->swcamtable, 0, sizeof(struct sw_cam_table) * 32); goto end_hw_sec; } alg = (ext->alg == IW_ENCODE_ALG_CCMP) ? KEY_TYPE_CCMP : ext->alg; idx = encoding->flags & IW_ENCODE_INDEX; if (idx) idx--; group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY; if ((!group) || (IW_MODE_ADHOC == ieee->iw_mode) || (alg == KEY_TYPE_WEP40)) { if ((ext->key_len == 13) && (alg == KEY_TYPE_WEP40)) alg = KEY_TYPE_WEP104; ieee->pairwise_key_type = alg; EnableHWSecurityConfig8192(dev); } memcpy((u8 *)key, ext->key, 16); if ((alg & KEY_TYPE_WEP40) && (ieee->auth_mode != 2)) { if (ext->key_len == 13) ieee->pairwise_key_type = alg = KEY_TYPE_WEP104; setKey(dev, idx, idx, alg, zero, 0, key); set_swcam(dev, idx, idx, alg, zero, 0, key, 0); } else if (group) { ieee->group_key_type = alg; setKey(dev, idx, idx, alg, broadcast_addr, 0, key); set_swcam(dev, idx, idx, alg, broadcast_addr, 0, key, 0); } else { if ((ieee->pairwise_key_type == KEY_TYPE_CCMP) && ieee->pHTInfo->bCurrentHTSupport) write_nic_byte(dev, 0x173, 1); setKey(dev, 4, idx, alg, (u8 *)ieee->ap_mac_addr, 0, key); set_swcam(dev, 4, idx, alg, (u8 *)ieee->ap_mac_addr, 0, key, 0); } } end_hw_sec: priv->rtllib->wx_set_enc = 0; up(&priv->wx_sem); return ret; }
static int r8192_wx_set_enc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key) { struct r8192_priv *priv = rtllib_priv(dev); int ret; struct rtllib_device *ieee = priv->rtllib; u32 hwkey[4] = {0, 0, 0, 0}; u8 mask = 0xff; u32 key_idx = 0; u8 zero_addr[4][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x03} }; int i; if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) ; /* TODO - get rid of if */ if (priv->bHwRadioOff == true) return 0; if (!priv->up) return -ENETDOWN; priv->rtllib->wx_set_enc = 1; down(&priv->rtllib->ips_sem); IPSLeave(dev); up(&priv->rtllib->ips_sem); down(&priv->wx_sem); RT_TRACE(COMP_SEC, "Setting SW wep key"); ret = rtllib_wx_set_encode(priv->rtllib, info, wrqu, key); up(&priv->wx_sem); if (wrqu->encoding.flags & IW_ENCODE_DISABLED) { ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA; CamResetAllEntry(dev); memset(priv->rtllib->swcamtable, 0, sizeof(struct sw_cam_table) * 32); goto end_hw_sec; } if (wrqu->encoding.length != 0) { for (i = 0; i < 4; i++) { hwkey[i] |= key[4*i+0]&mask; if (i == 1 && (4 * i + 1) == wrqu->encoding.length) mask = 0x00; if (i == 3 && (4 * i + 1) == wrqu->encoding.length) mask = 0x00; hwkey[i] |= (key[4 * i + 1] & mask) << 8; hwkey[i] |= (key[4 * i + 2] & mask) << 16; hwkey[i] |= (key[4 * i + 3] & mask) << 24; } #define CONF_WEP40 0x4 #define CONF_WEP104 0x14 switch (wrqu->encoding.flags & IW_ENCODE_INDEX) { case 0: key_idx = ieee->tx_keyidx; break; case 1: key_idx = 0; break; case 2: key_idx = 1; break; case 3: key_idx = 2; break; case 4: key_idx = 3; break; default: break; } if (wrqu->encoding.length == 0x5) { ieee->pairwise_key_type = KEY_TYPE_WEP40; EnableHWSecurityConfig8192(dev); } else if (wrqu->encoding.length == 0xd) { ieee->pairwise_key_type = KEY_TYPE_WEP104; EnableHWSecurityConfig8192(dev); setKey(dev, key_idx, key_idx, KEY_TYPE_WEP104, zero_addr[key_idx], 0, hwkey); set_swcam(dev, key_idx, key_idx, KEY_TYPE_WEP104, zero_addr[key_idx], 0, hwkey, 0); } else { printk(KERN_INFO "wrong type in WEP, not WEP40 and WEP104\n"); } } end_hw_sec: priv->rtllib->wx_set_enc = 0; return ret; }
static int r8192_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8192_priv *priv = rtllib_priv(dev); struct rtllib_device *ieee = priv->rtllib; enum rt_rf_power_state rtState; int ret; if (!(ieee->softmac_features & IEEE_SOFTMAC_SCAN)) { if ((ieee->state >= RTLLIB_ASSOCIATING) && (ieee->state <= RTLLIB_ASSOCIATING_AUTHENTICATED)) return 0; if ((priv->rtllib->state == RTLLIB_LINKED) && (priv->rtllib->CntAfterLink < 2)) return 0; } if (priv->bHwRadioOff == true) { printk(KERN_INFO "================>%s(): hwradio off\n", __func__); return 0; } rtState = priv->rtllib->eRFPowerState; if (!priv->up) return -ENETDOWN; if (priv->rtllib->LinkDetectInfo.bBusyTraffic == true) return -EAGAIN; if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { struct iw_scan_req *req = (struct iw_scan_req *)b; if (req->essid_len) { ieee->current_network.ssid_len = req->essid_len; memcpy(ieee->current_network.ssid, req->essid, req->essid_len); } } down(&priv->wx_sem); priv->rtllib->FirstIe_InScan = true; if (priv->rtllib->state != RTLLIB_LINKED) { if (priv->rtllib->PowerSaveControl.bInactivePs) { if (rtState == eRfOff) { if (priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS) { RT_TRACE(COMP_ERR, "%s(): RF is " "OFF.\n", __func__); up(&priv->wx_sem); return -1; } else { RT_TRACE(COMP_PS, "=========>%s(): " "IPSLeave\n", __func__); down(&priv->rtllib->ips_sem); IPSLeave(dev); up(&priv->rtllib->ips_sem); } } } rtllib_stop_scan(priv->rtllib); if (priv->rtllib->LedControlHandler) priv->rtllib->LedControlHandler(dev, LED_CTL_SITE_SURVEY); if (priv->rtllib->eRFPowerState != eRfOff) { priv->rtllib->actscanning = true; if (ieee->ScanOperationBackupHandler) ieee->ScanOperationBackupHandler(ieee->dev, SCAN_OPT_BACKUP); rtllib_start_scan_syncro(priv->rtllib, 0); if (ieee->ScanOperationBackupHandler) ieee->ScanOperationBackupHandler(ieee->dev, SCAN_OPT_RESTORE); } ret = 0; } else { priv->rtllib->actscanning = true; ret = rtllib_wx_set_scan(priv->rtllib, a, wrqu, b); } up(&priv->wx_sem); return ret; }
void setKey(struct net_device *dev, u8 EntryNo, u8 KeyIndex, u16 KeyType, u8 *MacAddr, u8 DefaultKey, u32 *KeyContent) { u32 TargetCommand = 0; u32 TargetContent = 0; u16 usConfig = 0; u8 i; struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev); enum rt_rf_power_state rtState; rtState = priv->rtllib->eRFPowerState; if (priv->rtllib->PowerSaveControl.bInactivePs) { if (rtState == eRfOff) { if (priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS) { RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n", __func__); return ; } else { down(&priv->rtllib->ips_sem); IPSLeave(dev); up(&priv->rtllib->ips_sem); } } } priv->rtllib->is_set_key = true; if (EntryNo >= TOTAL_CAM_ENTRY) RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n"); RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d," "KeyType:%d, MacAddr %pM\n", dev, EntryNo, KeyIndex, KeyType, MacAddr); if (DefaultKey) usConfig |= BIT15 | (KeyType<<2); else usConfig |= BIT15 | (KeyType<<2) | KeyIndex; for (i = 0; i < CAM_CONTENT_COUNT; i++) { TargetCommand = i + CAM_CONTENT_COUNT * EntryNo; TargetCommand |= BIT31|BIT16; if (i == 0) { TargetContent = (u32)(*(MacAddr+0)) << 16 | (u32)(*(MacAddr+1)) << 24 | (u32)usConfig; write_nic_dword(dev, WCAMI, TargetContent); write_nic_dword(dev, RWCAM, TargetCommand); } else if (i == 1) { TargetContent = (u32)(*(MacAddr+2)) | (u32)(*(MacAddr+3)) << 8 | (u32)(*(MacAddr+4)) << 16 | (u32)(*(MacAddr+5)) << 24; write_nic_dword(dev, WCAMI, TargetContent); write_nic_dword(dev, RWCAM, TargetCommand); } else { if (KeyContent != NULL) { write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2))); write_nic_dword(dev, RWCAM, TargetCommand); udelay(100); } } } RT_TRACE(COMP_SEC, "=========>after set key, usconfig:%x\n", usConfig); }
static int r8180_wx_set_scan(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8180_priv *priv = ieee80211_priv(dev); int ret; struct ieee80211_device* ieee = priv->ieee80211; if (priv->ieee80211->bHwRadioOff) return 0; /*YJ,add,080819, for hidden ap */ /*printk("==*&*&*&==>%s in\n", __func__); */ /*printk("=*&*&*&*===>flag:%x, %x\n", wrqu->data.flags, IW_SCAN_THIS_ESSID); */ if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { struct iw_scan_req* req = (struct iw_scan_req*)b; if (req->essid_len) { /*printk("==**&*&*&**===>scan set ssid:%s\n", req->essid); */ ieee->current_network.ssid_len = req->essid_len; memcpy(ieee->current_network.ssid, req->essid, req->essid_len); /*printk("=====>network ssid:%s\n", ieee->current_network.ssid); */ } } /*YJ,add,080819, for hidden ap, end */ down(&priv->wx_sem); if (priv->up) { /* printk("set scan ENABLE_IPS\n"); */ priv->ieee80211->actscanning = true; if (priv->bInactivePs && (priv->ieee80211->state != IEEE80211_LINKED)) { IPSLeave(dev); /*down(&priv->ieee80211->wx_sem); */ /* if (priv->ieee80211->iw_mode == IW_MODE_MONITOR || !(priv->ieee80211->proto_started)){ ret = -1; up(&priv->ieee80211->wx_sem); up(&priv->wx_sem); return ret; } */ /* queue_work(priv->ieee80211->wq, &priv->ieee80211->wx_sync_scan_wq); */ /* printk("start scan============================>\n"); */ ieee80211_softmac_ips_scan_syncro(priv->ieee80211); /* ieee80211_rtl_start_scan(priv->ieee80211); */ /* intentionally forget to up sem */ /* up(&priv->ieee80211->wx_sem); */ ret = 0; } else { /* YJ,add,080828, prevent scan in BusyTraffic */ /* FIXME: Need to consider last scan time */ if ((priv->link_detect.bBusyTraffic) && (true)) { ret = 0; printk("Now traffic is busy, please try later!\n"); } else /* YJ,add,080828, prevent scan in BusyTraffic,end */ ret = ieee80211_wx_set_scan(priv->ieee80211, a, wrqu, b); } } else ret = -1; up(&priv->wx_sem); return ret; }