📄 iwctl.c
字号:
PSMgmtObject pMgmt = &(pDevice->sMgmtObj); int ret=0; if(wrq->length){ if ((wrq->length < 2) || (extra[1]+2 != wrq->length)) { ret = -EINVAL; goto out; } if(wrq->length > MAX_WPA_IE_LEN){ ret = -ENOMEM; goto out; } memset(pMgmt->abyWPAIE, 0, MAX_WPA_IE_LEN); if(copy_from_user(pMgmt->abyWPAIE, extra, wrq->length)){ ret = -EFAULT; goto out; } pMgmt->wWPAIELen = wrq->length; }else { memset(pMgmt->abyWPAIE, 0, MAX_WPA_IE_LEN); pMgmt->wWPAIELen = 0; } out://not completely ...not necessary in wpa_supplicant 0.5.8 return 0;}int iwctl_giwgenie(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 ret=0; int space = wrq->length; wrq->length = 0; if(pMgmt->wWPAIELen > 0){ wrq->length = pMgmt->wWPAIELen; if(pMgmt->wWPAIELen <= space){ if(copy_to_user(extra, pMgmt->abyWPAIE, pMgmt->wWPAIELen)){ ret = -EFAULT; } }else ret = -E2BIG; } return ret;}int iwctl_siwencodeext(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrq, char *extra){ PSDevice pDevice = (PSDevice)dev->priv; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); struct iw_encode_ext *ext = (struct iw_encode_ext*)extra; struct viawget_wpa_param *param=NULL;//original member wpa_alg alg_name; u8 addr[6]; int key_idx, set_tx; u8 seq[IW_ENCODE_SEQ_MAX_SIZE]; u8 key[64]; size_t seq_len,key_len=0;// // int ii; u8 *buf; size_t blen; u8 key_array[64]; int ret=0;printk("SIOCSIWENCODEEXT...... \n");blen = sizeof(*param);buf = kmalloc((int)blen, (int)GFP_KERNEL);if (buf == NULL) return -ENOMEM;memset(buf, 0, blen);param = (struct viawget_wpa_param *) buf;//recover alg_nameswitch (ext->alg) { case IW_ENCODE_ALG_NONE: alg_name = WPA_ALG_NONE; break; case IW_ENCODE_ALG_WEP: alg_name = WPA_ALG_WEP; break; case IW_ENCODE_ALG_TKIP: alg_name = WPA_ALG_TKIP; break; case IW_ENCODE_ALG_CCMP: alg_name = WPA_ALG_CCMP; break; default: printk("Unknown alg = %d\n",ext->alg); ret= -ENOMEM; goto error; }//recover addr memcpy(addr, ext->addr.sa_data, ETH_ALEN);//recover key_idx key_idx = (wrq->flags&IW_ENCODE_INDEX) - 1;//recover set_txif(ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) set_tx = 1;//recover seq,seq_len if(ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { seq_len=IW_ENCODE_SEQ_MAX_SIZE; memcpy(seq, ext->rx_seq, seq_len); }//recover key,key_lenif(ext->key_len) { key_len=ext->key_len; memcpy(key, &ext->key[0], key_len); }memset(key_array, 0, 64); if ( key_len > 0) { memcpy(key_array, key, key_len); if (key_len == 32) { // notice ! the oder memcpy(&key_array[16], &key[24], 8); memcpy(&key_array[24], &key[16], 8); } }/**************Translate iw_encode_ext to viawget_wpa_param****************/memcpy(param->addr, addr, ETH_ALEN);param->u.wpa_key.alg_name = (int)alg_name;param->u.wpa_key.set_tx = set_tx;param->u.wpa_key.key_index = key_idx;param->u.wpa_key.key_len = key_len;param->u.wpa_key.key = (u8 *)key_array; param->u.wpa_key.seq = (u8 *)seq;param->u.wpa_key.seq_len = seq_len;#if 0printk("param->u.wpa_key.alg_name =%d\n",param->u.wpa_key.alg_name);printk("param->addr=%02x:%02x:%02x:%02x:%02x:%02x\n", param->addr[0],param->addr[1],param->addr[2], param->addr[3],param->addr[4],param->addr[5]);printk("param->u.wpa_key.set_tx =%d\n",param->u.wpa_key.set_tx);printk("param->u.wpa_key.key_index =%d\n",param->u.wpa_key.key_index);printk("param->u.wpa_key.key_len =%d\n",param->u.wpa_key.key_len);printk("param->u.wpa_key.key =");for(ii=0;ii<param->u.wpa_key.key_len;ii++) printk("%02x:",param->u.wpa_key.key[ii]); printk("\n");printk("param->u.wpa_key.seq_len =%d\n",param->u.wpa_key.seq_len);printk("param->u.wpa_key.seq =");for(ii=0;ii<param->u.wpa_key.seq_len;ii++) printk("%02x:",param->u.wpa_key.seq[ii]); printk("\n");printk("...........\n");#endif//****set if current action is Network Manager count??//****this method is so foolish,but there is no other way???if(param->u.wpa_key.alg_name == WPA_ALG_NONE) { if(param->u.wpa_key.key_index ==0) { pDevice->bwextstep0 = TRUE; } if((pDevice->bwextstep0 = TRUE)&&(param->u.wpa_key.key_index ==1)) { pDevice->bwextstep0 = FALSE; pDevice->bwextstep1 = TRUE; } if((pDevice->bwextstep1 = TRUE)&&(param->u.wpa_key.key_index ==2)) { pDevice->bwextstep1 = FALSE; pDevice->bwextstep2 = TRUE; } if((pDevice->bwextstep2 = TRUE)&&(param->u.wpa_key.key_index ==3)) { pDevice->bwextstep2 = FALSE; pDevice->bwextstep3 = TRUE; } } if(pDevice->bwextstep3 == TRUE) { printk("SIOCSIWENCODEEXT:Enable WPA WEXT SUPPORT!!!!!\n"); pDevice->bwextstep0 = FALSE; pDevice->bwextstep1 = FALSE; pDevice->bwextstep2 = FALSE; pDevice->bwextstep3 = FALSE; pDevice->bWPASuppWextEnabled = TRUE; memset(pMgmt->abyDesireBSSID, 0xFF,6); KeyvInitTable(pDevice,&pDevice->sKey); }//****** spin_lock_irq(&pDevice->lock); ret = wpa_set_keys(pDevice, param, TRUE); spin_unlock_irq(&pDevice->lock);error:kfree(param); return ret;}int iwctl_giwencodeext(struct net_device *dev, struct iw_request_info *info, struct iw_point *wrq, char *extra){ return -EOPNOTSUPP;;}int iwctl_siwmlme(struct net_device *dev, struct iw_request_info * info, struct iw_point *wrq, char *extra){ PSDevice pDevice = (PSDevice)dev->priv; PSMgmtObject pMgmt = &(pDevice->sMgmtObj); struct iw_mlme *mlme = (struct iw_mlme *)extra; //u16 reason = cpu_to_le16(mlme->reason_code); int ret = 0; if(memcmp(pMgmt->abyCurrBSSID, mlme->addr.sa_data, ETH_ALEN)){ ret = -EINVAL; return ret; } switch(mlme->cmd){ case IW_MLME_DEAUTH: //this command seems to be not complete,please test it --einsnliu //printk("iwctl_siwmlme--->send DEAUTH\n"); //bScheduleCommand((HANDLE) pDevice, WLAN_CMD_DEAUTH, (PBYTE)&reason); //break; case IW_MLME_DISASSOC: if(pDevice->bLinkPass == TRUE){ printk("iwctl_siwmlme--->send DISASSOCIATE\n"); bScheduleCommand((HANDLE)pDevice, WLAN_CMD_DISASSOCIATE, NULL); } break; default: ret = -EOPNOTSUPP; } return ret;}#endif //End Add --//2008-0409-07, <Add> by Einsn Liu/*------------------------------------------------------------------*//* * 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 //2008-0409-07, <Add> by Einsn Liu#if WIRELESS_EXT > 17 (iw_handler) NULL, // -- hole -- (iw_handler) NULL, // -- hole -- (iw_handler) NULL, // SIOCSIWGENIE (iw_handler) NULL, // SIOCGIWGENIE (iw_handler) NULL, // SIOCSIWAUTH (iw_handler) NULL, // SIOCGIWAUTH (iw_handler) NULL, // SIOCSIWENCODEEXT (iw_handler) NULL, // SIOCGIWENCODEEXT (iw_handler) NULL, // SIOCSIWPMKSA (iw_handler) NULL, // -- hole -- #endif // WIRELESS_EXT > 17 };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 + -