⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iwctl.c

📁 VIA VT6655 x86下的Linux Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
    PSDevice	        pDevice = (PSDevice)dev->priv;
    
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWFRAG \n");
	wrq->value = pDevice->wFragmentationThreshold;
	wrq->disabled = (wrq->value >= 2312);
	wrq->fixed = 1;    
	
	return 0;
}



/*
 * Wireless Handler : set retry threshold
 */
int iwctl_siwretry(struct net_device *dev,
             struct iw_request_info *info,
			 struct iw_param *wrq,             
             char *extra)
{
    PSDevice	        pDevice = (PSDevice)dev->priv;
    int rc = 0;    
    
        
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWRETRY \n");	
			
	if (wrq->disabled) {
		rc = -EINVAL;
		return rc;
	}
	
	if (wrq->flags & IW_RETRY_LIMIT) {
		if(wrq->flags & IW_RETRY_MAX)
			pDevice->byLongRetryLimit = wrq->value;
		else if (wrq->flags & IW_RETRY_MIN)
			pDevice->byShortRetryLimit = wrq->value;
		else {
			// No modifier : set both 
			pDevice->byShortRetryLimit = wrq->value;
			pDevice->byLongRetryLimit = wrq->value;
		}
	}
	if (wrq->flags & IW_RETRY_LIFETIME) {
		pDevice->wMaxTransmitMSDULifetime = wrq->value;
	}	
	
	
	return rc;
}

/*
 * Wireless Handler : get retry threshold
 */
int iwctl_giwretry(struct net_device *dev,
             struct iw_request_info *info,
			 struct iw_param *wrq,
             char *extra)
{
    PSDevice	        pDevice = (PSDevice)dev->priv;    
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWRETRY \n");	
	wrq->disabled = 0;      // Can't be disabled 

	// Note : by default, display the min retry number 
	if((wrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) {
		wrq->flags = IW_RETRY_LIFETIME;
		wrq->value = (int)pDevice->wMaxTransmitMSDULifetime; //ms
	} else if((wrq->flags & IW_RETRY_MAX)) {
		wrq->flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
		wrq->value = (int)pDevice->byLongRetryLimit;
	} else {
		wrq->flags = IW_RETRY_LIMIT;
		wrq->value = (int)pDevice->byShortRetryLimit;
		if((int)pDevice->byShortRetryLimit != (int)pDevice->byLongRetryLimit)
			wrq->flags |= IW_RETRY_MIN;
	}


	return 0;
}


/*
 * Wireless Handler : set encode mode
 */
int iwctl_siwencode(struct net_device *dev,
             struct iw_request_info *info,
             struct iw_point *wrq,
             char *extra)
{
    PSDevice	        pDevice = (PSDevice)dev->priv;        
    PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);
	DWORD dwKeyIndex = (DWORD)(wrq->flags & IW_ENCODE_INDEX);
	int ii,uu, rc = 0;
	int index = (wrq->flags & IW_ENCODE_INDEX);	
	
	
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODE \n");	
	
	// Check the size of the key 
	if (wrq->length > WLAN_WEP232_KEYLEN) {
		rc = -EINVAL;
        return rc;
	}
	
	if (dwKeyIndex > WLAN_WEP_NKEYS) {
		rc = -EINVAL;
        return rc;
    }   

    if (dwKeyIndex > 0)
		dwKeyIndex--;
			
	// Send the key to the card 
	if (wrq->length > 0) {	
	    
        if (wrq->length ==  WLAN_WEP232_KEYLEN) {
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set 232 bit wep key\n");
        }
        else if (wrq->length ==  WLAN_WEP104_KEYLEN) {
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set 104 bit wep key\n");
        }
        else if (wrq->length == WLAN_WEP40_KEYLEN) {
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set 40 bit wep key, index= %d\n", (int)dwKeyIndex);
        }
        memset(pDevice->abyKey, 0, WLAN_WEP232_KEYLEN);
        memcpy(pDevice->abyKey, extra, wrq->length);
        
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO"abyKey: ");
        for (ii = 0; ii < wrq->length; ii++) {
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", pDevice->abyKey[ii]);
        }  
        
        if (pDevice->flags & DEVICE_FLAGS_OPENED) {
            spin_lock_irq(&pDevice->lock);                  
            KeybSetDefaultKey(&(pDevice->sKey),
                            (DWORD)(pDevice->byKeyIndex | (1 << 31)),
                            pDevice->uKeyLength,
                            NULL,
                            pDevice->abyKey,
                            KEY_CTL_WEP,
                            pDevice->PortOffset,
                            pDevice->byLocalID
                          );            
            spin_unlock_irq(&pDevice->lock);
        }
        pDevice->byKeyIndex = (BYTE)dwKeyIndex;
        pDevice->uKeyLength = wrq->length;
        pDevice->bTransmitKey = TRUE;
        pDevice->bEncryptionEnable = TRUE;
        pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;

		// Do we want to just set the transmit key index ? 
		if ( index < 4 ) {
		    pDevice->byKeyIndex = index;
		}
		else if(!wrq->flags & IW_ENCODE_MODE) {
				rc = -EINVAL;
				return rc;
	    }
	}
	// Read the flags 
	if(wrq->flags & IW_ENCODE_DISABLED){
				    
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Disable WEP function\n");
		pMgmt->bShareKeyAlgorithm = FALSE;
        pDevice->bEncryptionEnable = FALSE;
        pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled;
        if (pDevice->flags & DEVICE_FLAGS_OPENED) {
            spin_lock_irq(&pDevice->lock);
            for(uu=0;uu<MAX_KEY_TABLE;uu++) 
                MACvDisableKeyEntry(pDevice->PortOffset, uu);
            spin_unlock_irq(&pDevice->lock);
        }        
	}	
	if(wrq->flags & IW_ENCODE_RESTRICTED) {
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable WEP & ShareKey System\n");		    
		pMgmt->bShareKeyAlgorithm = TRUE;
	}	
	if(wrq->flags & IW_ENCODE_OPEN) {
	    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable WEP & Open System\n");
		pMgmt->bShareKeyAlgorithm = FALSE;
	}			        
    
	return rc;
}

/*
 * Wireless Handler : get encode mode
 */
int iwctl_giwencode(struct net_device *dev,
             struct iw_request_info *info,
             struct iw_point *wrq,
             char *extra)
{
    PSDevice	        pDevice = (PSDevice)dev->priv;
    PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);    
    int rc = 0;
    char abyKey[WLAN_WEP232_KEYLEN];
	UINT index = (UINT)(wrq->flags & IW_ENCODE_INDEX);    
	PSKeyItem   pKey = NULL;
    
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODE\n");


	memset(abyKey, 0, sizeof(abyKey));
	// Check encryption mode 
	wrq->flags = IW_ENCODE_NOKEY;
	// Is WEP enabled ??? 
	if (pDevice->bEncryptionEnable) 
		wrq->flags |=  IW_ENCODE_ENABLED;
    else
		wrq->flags |=  IW_ENCODE_DISABLED;
     		
    if (pMgmt->bShareKeyAlgorithm)
		wrq->flags |=  IW_ENCODE_RESTRICTED;
	else
		wrq->flags |=  IW_ENCODE_OPEN;
		
	if (KeybGetKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, (BYTE)index , &pKey)){ 
        wrq->length = pKey->uKeyLength;
        memcpy(abyKey, pKey->abyKey,  pKey->uKeyLength);
    }
    else {
        rc = -EINVAL;
        return rc;                       
    }        
	wrq->flags |= index;
	// Copy the key to the user buffer 
	memcpy(extra,  abyKey, WLAN_WEP232_KEYLEN);
	return 0;
}

/*
 * Wireless Handler : set power mode
 */
int iwctl_siwpower(struct net_device *dev,
             struct iw_request_info *info,
			 struct iw_param *wrq,
             char *extra)
{
    PSDevice            pDevice = (PSDevice)dev->priv;
    PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);    
    int rc = 0;        
    
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWPOWER \n");	
    
    if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) {
		 rc = -EINVAL;
		 return rc;
	}        

	if (wrq->disabled) {
		pDevice->ePSMode = WMAC_POWER_CAM;
		PSvDisablePowerSaving(pDevice);
		return rc;
	}
	if ((wrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
         pDevice->ePSMode = WMAC_POWER_FAST;
         PSvEnablePowerSaving((HANDLE)pDevice, pMgmt->wListenInterval);
         
	} else if ((wrq->flags & IW_POWER_TYPE) == IW_POWER_PERIOD) {
	     pDevice->ePSMode = WMAC_POWER_FAST;
         PSvEnablePowerSaving((HANDLE)pDevice, pMgmt->wListenInterval);
	}
	switch (wrq->flags & IW_POWER_MODE) {
	case IW_POWER_UNICAST_R:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWPOWER: IW_POWER_UNICAST_R \n");	
		rc = -EINVAL;
		break;
	case IW_POWER_ALL_R:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWPOWER: IW_POWER_ALL_R \n");	
		rc = -EINVAL;
	case IW_POWER_ON:
        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWPOWER: IW_POWER_ON \n");			
		break;
	default:
		rc = -EINVAL;
	}                               
    
	return rc;
}

/*
 * Wireless Handler : get power mode
 */
int iwctl_giwpower(struct net_device *dev,
             struct iw_request_info *info,
			 struct iw_param *wrq,             
             char *extra)
{
    PSDevice            pDevice = (PSDevice)dev->priv;
    PSMgmtObject        pMgmt = &(pDevice->sMgmtObj);    
    int mode = pDevice->ePSMode;

    
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPOWER \n");	

		
	if ((wrq->disabled = (mode == WMAC_POWER_CAM)))
	    return 0;
		
	if ((wrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
		wrq->value = (int)((pMgmt->wListenInterval * pMgmt->wCurrBeaconPeriod) << 10);
		wrq->flags = IW_POWER_TIMEOUT;
	} else {
		wrq->value = (int)((pMgmt->wListenInterval * pMgmt->wCurrBeaconPeriod) << 10);    		    
		wrq->flags = IW_POWER_PERIOD;
	}
	wrq->flags |= IW_POWER_ALL_R;

	return 0;
}


/*
 * Wireless Handler : get Sensitivity
 */
int iwctl_giwsens(struct net_device *dev,
			 struct iw_request_info *info,
			 struct iw_param *wrq,
			 char *extra)
{
    PSDevice	        pDevice = (PSDevice)dev->priv;
    long ldBm;
    
    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWSENS \n");	
    if (pDevice->bLinkPass == TRUE) {        
        RFvRSSITodBm(pDevice, (BYTE)(pDevice->uCurrRSSI), &ldBm);
	    wrq->value = ldBm;
	}
	else {
	    wrq->value = 0;  
    };		
	wrq->disabled = (wrq->value == 0);
	wrq->fixed = 1;    


	return 0;
}


/*------------------------------------------------------------------*/
/*
 * Structures to export the Wireless Handlers
 */


#if WIRELESS_EXT > 12

/*
static const iw_handler		iwctl_handler[] =
{
	(iw_handler) iwctl_commit,      // SIOCSIWCOMMIT 
	(iw_handler) iwctl_giwname,     // SIOCGIWNAME     
	(iw_handler) NULL,				// SIOCSIWNWID 
	(iw_handler) NULL,				// SIOCGIWNWID 
	(iw_handler) iwctl_siwfreq,		// SIOCSIWFREQ 
	(iw_handler) iwctl_giwfreq,		// SIOCGIWFREQ
	(iw_handler) iwctl_siwmode,		// SIOCSIWMODE 
	(iw_handler) iwctl_giwmode,		// SIOCGIWMODE 
	(iw_handler) NULL,		        // SIOCSIWSENS 
	(iw_handler) iwctl_giwsens,		        // SIOCGIWSENS 
	(iw_handler) NULL, 		        // SIOCSIWRANGE 
	(iw_handler) iwctl_giwrange,		// SIOCGIWRANGE 
	(iw_handler) NULL,         		    // SIOCSIWPRIV 
	(iw_handler) NULL,             		// SIOCGIWPRIV 
	(iw_handler) NULL,             		// SIOCSIWSTATS 
	(iw_handler) NULL,                  // SIOCGIWSTATS 
    (iw_handler) NULL,                  // SIOCSIWSPY 
	(iw_handler) NULL,		            // SIOCGIWSPY 
	(iw_handler) NULL,				    // -- hole -- 
	(iw_handler) NULL,				    // -- hole -- 
	(iw_handler) iwctl_siwap,		    // SIOCSIWAP 
	(iw_handler) iwctl_giwap,		    // SIOCGIWAP 
	(iw_handler) NULL,				    // -- hole -- 0x16
	(iw_handler) iwctl_giwaplist,       // SIOCGIWAPLIST 
#if WIRELESS_EXT > 13	
	(iw_handler) iwctl_siwscan,         // SIOCSIWSCAN 	
	(iw_handler) iwctl_giwscan,         // SIOCGIWSCAN 		
#else 
	(iw_handler) NULL,
	(iw_handler) NULL,
#endif	
	(iw_handler) iwctl_siwessid,		// SIOCSIWESSID 
	(iw_handler) iwctl_giwessid,		// SIOCGIWESSID 
	(iw_handler) NULL,		// SIOCSIWNICKN 
	(iw_handler) NULL,		// SIOCGIWNICKN 
	(iw_handler) NULL,				    // -- hole -- 
	(iw_handler) NULL,				    // -- hole -- 
	(iw_handler) iwctl_siwrate,		// SIOCSIWRATE 0x20
	(iw_handler) iwctl_giwrate,		// SIOCGIWRATE 
	(iw_handler) iwctl_siwrts,		// SIOCSIWRTS 
	(iw_handler) iwctl_giwrts,		// SIOCGIWRTS 
	(iw_handler) iwctl_siwfrag,		// SIOCSIWFRAG 
	(iw_handler) iwctl_giwfrag,		// SIOCGIWFRAG 
	(iw_handler) NULL,		// SIOCSIWTXPOW 
	(iw_handler) NULL,		// SIOCGIWTXPOW 
	(iw_handler) iwctl_siwretry,		// SIOCSIWRETRY 
	(iw_handler) iwctl_giwretry,		// SIOCGIWRETRY 
	(iw_handler) iwctl_siwencode,		// SIOCSIWENCODE 
	(iw_handler) iwctl_giwencode,		// SIOCGIWENCODE 
	(iw_handler) iwctl_siwpower,		// SIOCSIWPOWER 
	(iw_handler) iwctl_giwpower,		// SIOCGIWPOWER 
#if WIRELESS_EXT > 17
	(iw_handler) NULL,			// -- hole -- 
	(iw_handler) NULL,			// -- hole -- 
	(iw_handler) iwctl_siwgenie,    // SIOCSIWGENIE 
	(iw_handler) iwctl_giwgenie,    // SIOCGIWGENIE 	
	(iw_handler) iwctl_siwauth,		// SIOCSIWAUTH 
	(iw_handler) iwctl_giwauth,		// SIOCGIWAUTH 
	(iw_handler) iwctl_siwencodeext,		// SIOCSIWENCODEEXT 
	(iw_handler) iwctl_giwencodeext,		// SIOCGIWENCODEEXT 
	(iw_handler) NULL,				// SIOCSIWPMKSA 
	(iw_handler) NULL,				// -- hole -- 
#endif // WIRELESS_EXT > 17 
	
};
*/

static const iw_handler		iwctl_handler[] =
{
	(iw_handler) iwctl_commit,      // SIOCSIWCOMMIT     
	(iw_handler) NULL,      // SIOCGIWNAME     
	(iw_handler) NULL,				// SIOCSIWNWID 
	(iw_handler) NULL,				// SIOCGIWNWID 
	(iw_handler) NULL,		// SIOCSIWFREQ 
	(iw_handler) NULL,		// SIOCGIWFREQ
	(iw_handler) NULL,		// SIOCSIWMODE 
	(iw_handler) NULL,		// SIOCGIWMODE 
	(iw_handler) NULL,		        // SIOCSIWSENS 
	(iw_handler) NULL,		        // SIOCGIWSENS 
	(iw_handler) NULL, 		        // SIOCSIWRANGE 
	(iw_handler) iwctl_giwrange,		// SIOCGIWRANGE 
	(iw_handler) NULL,         		    // SIOCSIWPRIV 
	(iw_handler) NULL,             		// SIOCGIWPRIV 
	(iw_handler) NULL,             		// SIOCSIWSTATS 
	(iw_handler) NULL,                  // SIOCGIWSTATS 
    (iw_handler) NULL,                  // SIOCSIWSPY 
	(iw_handler) NULL,		            // SIOCGIWSPY 
	(iw_handler) NULL,				    // -- hole -- 
	(iw_handler) NULL,				    // -- hole -- 
	(iw_handler) NULL,		    // SIOCSIWAP 
	(iw_handler) NULL,		    // SIOCGIWAP 
	(iw_handler) NULL,				    // -- hole -- 0x16
	(iw_handler) NULL,       // SIOCGIWAPLIST 
#if WIRELESS_EXT > 13	
	(iw_handler) iwctl_siwscan,         // SIOCSIWSCAN 	
	(iw_handler) iwctl_giwscan,         // SIOCGIWSCAN 		
#else 
	(iw_handler) NULL,
	(iw_handler) NULL,
#endif	
	(iw_handler) NULL,		// SIOCSIWESSID 
	(iw_handler) NULL,		// SIOCGIWESSID 
	(iw_handler) NULL,		// SIOCSIWNICKN 
	(iw_handler) NULL,		// SIOCGIWNICKN 
	(iw_handler) NULL,		// -- hole -- 
	(iw_handler) NULL,		// -- hole -- 
	(iw_handler) NULL,		// SIOCSIWRATE 0x20
	(iw_handler) NULL,		// SIOCGIWRATE 
	(iw_handler) NULL,		// SIOCSIWRTS 
	(iw_handler) NULL,		// SIOCGIWRTS 
	(iw_handler) NULL,		// SIOCSIWFRAG 
	(iw_handler) NULL,		// SIOCGIWFRAG 
	(iw_handler) NULL,		// SIOCSIWTXPOW 
	(iw_handler) NULL,		// SIOCGIWTXPOW 
	(iw_handler) NULL,		// SIOCSIWRETRY 
	(iw_handler) NULL,		// SIOCGIWRETRY 
	(iw_handler) NULL,		// SIOCSIWENCODE 
	(iw_handler) NULL,		// SIOCGIWENCODE 
	(iw_handler) NULL,		// SIOCSIWPOWER 
	(iw_handler) NULL,		// SIOCGIWPOWER 
};


static const iw_handler		iwctl_private_handler[] =
{
	NULL,				// SIOCIWFIRSTPRIV 
};

    
struct iw_priv_args iwctl_private_args[] = {
{ IOCTL_CMD_SET, 
  IW_PRIV_TYPE_CHAR | 1024, 0,
  "set"},  
};    
    


const struct iw_handler_def	iwctl_handler_def =
{
#if WIRELESS_EXT > 16
	.get_wireless_stats = &iwctl_get_wireless_stats,
#endif    
	.num_standard	= sizeof(iwctl_handler)/sizeof(iw_handler),	
//	.num_private	= sizeof(iwctl_private_handler)/sizeof(iw_handler),
//	.num_private_args = sizeof(iwctl_private_args)/sizeof(struct iw_priv_args),
	.num_private	= 0,
	.num_private_args = 0,	
	.standard	= (iw_handler *) iwctl_handler,
//	.private	= (iw_handler *) iwctl_private_handler,
//	.private_args	= (struct iw_priv_args *)iwctl_private_args,
	.private	= NULL,
	.private_args	= NULL,	
};


#endif // WIRELESS_EXT > 12 


#endif // WIRELESS_EXT 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -