コード例 #1
0
ファイル: r8180_wx.c プロジェクト: johnny/CobraDroidBeta
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;
}
コード例 #2
0
ファイル: rtl_ps.c プロジェクト: UNwS/rtl8192su
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);	
}
コード例 #3
0
ファイル: rtl_ps.c プロジェクト: UNwS/rtl8192su
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);	
}
コード例 #4
0
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;
}
コード例 #5
0
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;
}
コード例 #6
0
ファイル: r8192E_wx.c プロジェクト: CSCLOG/beaglebone
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;
}
コード例 #7
0
ファイル: r8180_wx.c プロジェクト: CSCLOG/beaglebone
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;
}
コード例 #8
0
ファイル: rtl_wx.c プロジェクト: 454053205/linux
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;
}
コード例 #9
0
ファイル: rtl_wx.c プロジェクト: 454053205/linux
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;

}
コード例 #10
0
ファイル: rtl_wx.c プロジェクト: 454053205/linux
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;
}
コード例 #11
0
ファイル: rtl_wx.c プロジェクト: 454053205/linux
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;
}
コード例 #12
0
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);
}
コード例 #13
0
ファイル: r8180_wx.c プロジェクト: CSCLOG/beaglebone
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;
}