📄 rtmp_info.c
字号:
static intrt_ioctl_giwauth(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv; struct iw_param *param = &wrqu->param; int ret = 0; if (pAd->RTUSBCmdThr_pid < 0) return -ENETDOWN;#if 1 switch (param->flags & IW_AUTH_INDEX) { case IW_AUTH_WPA_VERSION: #if 0 if (param->value == IW_AUTH_WPA_VERSION_WPA) //AuthMode = WPA else if (param->value == IW_AUTH_WPA_VERSION_WPA2) // AuthMode= WPA2 else if (param->value == IW_AUTH_WPA_VERSION_DISABLED) // AuthMode= else // #endif break; case IW_AUTH_CIPHER_PAIRWISE: case IW_AUTH_CIPHER_GROUP: case IW_AUTH_KEY_MGMT: /* * wpa_supplicant will control these internally */ ret = -EOPNOTSUPP; break; case IW_AUTH_TKIP_COUNTERMEASURES: param->value = 1; break; case IW_AUTH_DROP_UNENCRYPTED: param->value = 1; break; case IW_AUTH_80211_AUTH_ALG: param->value = pAd->PortCfg.AuthMode; break; case IW_AUTH_WPA_ENABLED: param->value = (pAd->PortCfg.AuthMode > Ndis802_11AuthModeWPA ? 1 : 0); break; case IW_AUTH_RX_UNENCRYPTED_EAPOL: param->value = 1; break; case IW_AUTH_ROAMING_CONTROL: case IW_AUTH_PRIVACY_INVOKED: param->value = 1; break; default: return -EOPNOTSUPP; } return 0;#else return -EOPNOTSUPP;#endif}static intrt_ioctl_siwencodeext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv; struct iw_point *encoding = &wrqu->encoding; struct iw_encode_ext *ext = wrqu->encoding.pointer; unsigned int keyIdx; UCHAR *pBuf = NULL; int bufLen; //check if the interface is down if ((dev->flags & IFF_UP) == 0) return -ENETDOWN; if (pAd->RTUSBCmdThr_pid < 0) return -ENETDOWN; DBGPRINT(RT_DEBUG_TRACE,"%s(): encoding->flags = %x, ext->ext_flags=0x%x, ext->alg=0x%x!\n", __FUNCTION__, encoding->flags, ext->ext_flags, ext->alg); // Get Key Index and convet to our own defined key index keyIdx = (encoding->flags & IW_ENCODE_INDEX); if((keyIdx < 0) || (keyIdx > NR_WEP_KEYS)) return -EINVAL; keyIdx = ((keyIdx > 0) ? (keyIdx - 1) : pAd->PortCfg.DefaultKeyId); if((ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) == 0) keyIdx |= 1 << 30; if(ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) keyIdx |= 1 << 31; if ((encoding->flags & IW_ENCODE_DISABLED) || (ext->alg && IW_ENCODE_ALG_NONE)) { NDIS_802_11_REMOVE_KEY RtmpRmvKey; // Remove key. NdisZeroMemory(&RtmpRmvKey, sizeof(RtmpRmvKey)); NdisMoveMemory(RtmpRmvKey.BSSID, ext->addr.sa_data, ETH_ALEN); RtmpRmvKey.KeyIndex = keyIdx; RtmpRmvKey.Length = sizeof(RtmpRmvKey); DBGPRINT(RT_DEBUG_TRACE, "%s(): Do remove key action! Remove KeyIdx=0x%x!\n", __FUNCTION__, keyIdx); if (NDIS_STATUS_SUCCESS == RTMPRemoveKeySanity(pAd, (PVOID)&RtmpRmvKey)) RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_REMOVE_KEY, TRUE, (PVOID)&RtmpRmvKey, sizeof(RtmpRmvKey)); } else if (ext->key_len == 0) { // Set default key index pAd->PortCfg.DefaultKeyId = keyIdx; DBGPRINT(RT_DEBUG_TRACE, "%s(): Do set default key index action!set default key=0x%x!\n", __FUNCTION__, pAd->PortCfg.DefaultKeyId); return 0; } else { // Add key. if (ext->alg == IW_ENCODE_ALG_WEP) { NDIS_802_11_WEP *pRtmpWepKey; ULONG real_keyIdx; bufLen = (sizeof(NDIS_802_11_WEP)- 1)+ ext->key_len; if((pBuf = kmalloc(bufLen, MEM_ALLOC_FLAG)) == NULL) return -ENOMEM; NdisZeroMemory(pBuf, bufLen); pRtmpWepKey = (NDIS_802_11_WEP *)pBuf; pRtmpWepKey->KeyIndex = keyIdx; pRtmpWepKey->KeyLength = ext->key_len; pRtmpWepKey->Length = bufLen; NdisMoveMemory(&(pRtmpWepKey->KeyMaterial[0]), ext->key, ext->key_len); real_keyIdx = keyIdx & 0x0fffffff; //DBGPRINT(RT_DEBUG_TRACE, "real_keyIdx=0x%x!\n", real_keyIdx); NdisZeroMemory(pAd->SharedKey[real_keyIdx].Key, 16); NdisMoveMemory(pAd->SharedKey[real_keyIdx].Key, ext->key, ext->key_len); pAd->SharedKey[real_keyIdx].KeyLen = ext->key_len; if(ext->key_len == 5) pAd->SharedKey[real_keyIdx].CipherAlg = CIPHER_WEP64; else pAd->SharedKey[real_keyIdx].CipherAlg = CIPHER_WEP128; NdisZeroMemory(pAd->PortCfg.DesireSharedKey[real_keyIdx].Key, 16); NdisMoveMemory(pAd->PortCfg.DesireSharedKey[real_keyIdx].Key, ext->key, ext->key_len); pAd->PortCfg.DesireSharedKey[real_keyIdx].KeyLen = ext->key_len; pAd->PortCfg.DesireSharedKey[real_keyIdx].CipherAlg = pAd->SharedKey[real_keyIdx].CipherAlg; DBGPRINT(RT_DEBUG_TRACE, "%s(): Do add WEP key action! keyIdx=0x%x!KeyLength=%d!\n", __FUNCTION__, keyIdx, ext->key_len); RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_ADD_WEP, TRUE, (PVOID)pRtmpWepKey, pRtmpWepKey->Length); } else if((ext->alg == IW_ENCODE_ALG_TKIP) || (ext->alg == IW_ENCODE_ALG_CCMP)) { NDIS_802_11_KEY *pRtmpKey; int i; bufLen = (sizeof(NDIS_802_11_KEY)- 1)+ ext->key_len; if((pBuf = kmalloc(bufLen, MEM_ALLOC_FLAG)) == NULL) return -ENOMEM; NdisZeroMemory(pBuf, bufLen); pRtmpKey = (NDIS_802_11_KEY *)pBuf; // Set the total structure length. pRtmpKey->Length = bufLen; // Set KeyIdx pRtmpKey->KeyIndex = keyIdx; //Set KeyLength pRtmpKey->KeyLength = ext->key_len; // Get the mac entry to set the key NdisMoveMemory(pRtmpKey->BSSID, ext->addr.sa_data, ETH_ALEN); // Prepare the KeyRSC if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { keyIdx |= 1 << 29; for (i = 0; i < IW_ENCODE_SEQ_MAX_SIZE; i++) pRtmpKey->KeyRSC |= ext->rx_seq[i] << (i * 8); } if (ext->alg == IW_ENCODE_ALG_TKIP && ext->key_len == 32) { NdisMoveMemory(&pRtmpKey->KeyMaterial[0], ext->key, 16); NdisMoveMemory((&pRtmpKey->KeyMaterial[0] + 16), (ext->key + 24), 8); NdisMoveMemory((&pRtmpKey->KeyMaterial[0] + 24), (ext->key + 16), 8); } else { NdisMoveMemory(&pRtmpKey->KeyMaterial[0], ext->key, ext->key_len); } DBGPRINT(RT_DEBUG_TRACE, "%s(): Do add TKIP/AES key action! keyIdx=0x%x!\n", __FUNCTION__, keyIdx); RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_ADD_KEY, TRUE, (PVOID)pRtmpKey, pRtmpKey->Length); } else { DBGPRINT(RT_DEBUG_ERROR, "%s(): Unknown encodeext action!\n", __FUNCTION__); return -EINVAL; } if(pBuf) kfree(pBuf); }#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT if (pAd->PortCfg.bNativeWpa == TRUE) // add by johnli pAd->PortCfg.wx_need_sync |= 1;#endif return 0; }static intrt_ioctl_giwencodeext(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv; if (pAd->RTUSBCmdThr_pid < 0) return -ENETDOWN; return 0;}static intrt_ioctl_siwpmksa(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){#define IW_PMKID_LEN 16 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv; struct iw_pmksa *pmksa = (struct iw_pmksa *)wrqu->data.pointer; ULONG CachedIdx; int found = 0; //check if the interface is down if ((dev->flags & IFF_UP) == 0) return -ENETDOWN; if (pAd->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (pmksa->cmd == IW_PMKSA_FLUSH) { for (CachedIdx = 0; CachedIdx < pAd->PortCfg.SavedPMKNum; CachedIdx++) NdisZeroMemory(&pAd->PortCfg.SavedPMK[CachedIdx], sizeof(BSSID_INFO)); pAd->PortCfg.SavedPMKNum = 0; } else { for (CachedIdx = 0; CachedIdx < pAd->PortCfg.SavedPMKNum; CachedIdx++) { // Find the entry in the saved data base. if (NdisEqualMemory(pmksa->bssid.sa_data, pAd->PortCfg.SavedPMK[CachedIdx].BSSID, ETH_ALEN)) { // compare the BSSID found = 1; break; } } if (pmksa->cmd == IW_PMKSA_ADD) { // If found, replace it, else add to a random index entry. DBGPRINT(RT_DEBUG_OFF, "%s():Update IW_PMKSA_ADD, idx = %d\n", __FUNCTION__, CachedIdx); CachedIdx = (CachedIdx < PMKID_NO) ? CachedIdx : (pmksa->bssid.sa_data[5] % PMKID_NO); DBGPRINT(RT_DEBUG_OFF, "%s():After adjust, IW_PMKSA_ADD, idx = %d\n", __FUNCTION__, CachedIdx); NdisMoveMemory(&pAd->PortCfg.SavedPMK[CachedIdx].BSSID[0], pmksa->bssid.sa_data, ETH_ALEN); NdisMoveMemory(&pAd->PortCfg.SavedPMK[CachedIdx].PMKID[0], pmksa->pmkid, IW_PMKID_LEN); if((!found) && (pAd->PortCfg.SavedPMKNum < PMKID_NO)) pAd->PortCfg.SavedPMKNum++; } else if (pmksa->cmd == IW_PMKSA_REMOVE && found) { DBGPRINT(RT_DEBUG_OFF, "%s():Remove IW_PMKSA_REMOVE, idx = %d\n", __FUNCTION__, CachedIdx); NdisZeroMemory(&pAd->PortCfg.SavedPMK[CachedIdx], sizeof(BSSID_INFO)); pAd->PortCfg.SavedPMKNum--; } } return 0;}static int rt_ioctl_siwgenie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv; //check if the interface is down if ((dev->flags & IFF_UP) == 0) return -ENETDOWN; if (pAd->RTUSBCmdThr_pid < 0) return -ENETDOWN; if ((wrqu->data.length > 44) || ((wrqu->data.length > 0) && (extra == NULL))) return -EINVAL; if (wrqu->data.length) {#if 0 pAd->PortCfg.wx_RSNIE_Len = wrqu->data.length > MAX_WPA_IE_LEN ? MAX_WPA_IE_LEN : wrqu->data.length; NdisMoveMemory(pAd->PortCfg.wx_RSN_IE, extra, pAd->PortCfg.wx_RSNIE_Len);#else pAd->PortCfg.RSN_IELen = wrqu->data.length > 44 ? 44 : wrqu->data.length; NdisMoveMemory(pAd->PortCfg.RSN_IE, extra, pAd->PortCfg.RSN_IELen);#endif printk("%s(): set WPA IE for Association Request!\n", __FUNCTION__); } else { //The wpa ie length is zero, it means didn't enable wpa. printk("wrqu->data.length=%d! Stop wpa!\n", wrqu->data.length); } return 0;}static int rt_ioctl_giwgenie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra){ RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev->priv; if (pAd->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (wrqu->data.length < pAd->PortCfg.RSN_IELen) return -E2BIG; wrqu->data.length = pAd->PortCfg.RSN_IELen; NdisMoveMemory(extra, &pAd->PortCfg.RSN_IE[0], pAd->PortCfg.RSN_IELen); return 0;}#endif // WIRELESS_EXT > 17 //static intrt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info, void *w, char *extra){ PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv; char *this_char = extra; char *value; int Status=0; //check if the interface is down if ((dev->flags & IFF_UP) == 0) return -ENETDOWN; if (pAdapter->RTUSBCmdThr_pid < 0) return -ENETDOWN; if (!*this_char) return Status; if ((value = rtstrchr(this_char, '=')) != NULL) *value++ = 0; if (!value) return Status; // reject setting nothing besides ANY ssid(ssidLen=0) if (!*value && (strcmp(this_char, "SSID") != 0)) return Status; for (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++) { if (strcmp(this_char, PRTMP_PRIVATE_SET_PROC->name) == 0) { if(!PRTMP_PRIVATE_SET_PROC->set_proc(pAdapter, value)) { //FALSE:Set private failed then return Invalid argument Status = -EINVAL; } break; //Exit for loop. } } if(PRTMP_PRIVATE_SET_PROC->name == NULL) { //Not found argument Status = -EINVAL; DBGPRINT(RT_DEBUG_TRACE, "===>rt_ioctl_setparam:: (iwpriv) Not Support Set Command [%s=%s]\n", this_char, value); } return Status;}static const iw_handler rt_handler[] ={ (iw_handler) NULL, /* SIOCSIWCOMMIT */ (iw_handler) rt_ioctl_giwname, /* SIOCGIWNAME 1 */ (iw_handler) NULL, /* SIOCSIWNWID */ (iw_handler) NULL, /* SIOCGIWNWID */ (iw_handler) rt_ioctl_siwfreq, /* SIOCSIWFREQ */ (iw_handler) rt_ioctl_giwfreq, /* SIOCGIWFREQ 5 */ (iw_handler) rt_ioctl_siwmode, /* SIOCSIWMODE */ (iw_handler) rt_ioctl_giwmode, /* SIOCGIWMODE */ (iw_handler) NULL, /* SIOCSIWSENS */ (iw_handler) NULL, /* SIOCGIWSENS */ (iw_handler) NULL /* not used */, /* SIOCSIWRANGE */ (iw_handler) rt_ioctl_giwrange, /* SIOCGIWRANGE 11 */ (iw_handler) NULL /* not used */, /* SIOCSIWPRIV */ (iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */ (iw_handler) NULL /* not used */, /* SIOCSIWSTATS */ (iw_handler) NULL /* kernel code */, /* SIOCGIWSTATS f */ (iw_handler) NULL, /* SIOCSIWSPY */ (iw_handler) NULL, /* SIOCGIWSPY */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) rt_ioctl_siwap, /* SIOCSIWAP */ (iw_handler) rt_ioctl_giwap, /* SIOCGIWAP 0x15*/ (iw_handler) NULL, /* SIOCSIWMLME 0x16 */ //After WIRELESS_EXT > 17, the 0x8b16 used for SIOC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -