//hw security need to reorganized. 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 = ieee80211_priv(dev); struct ieee80211_device *ieee = priv->ieee80211; //printk("===>%s()\n", __FUNCTION__); down(&priv->wx_sem); ret = ieee80211_wx_set_encode_ext(priv->ieee80211, 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) //none is not allowed to use hwsec WB 2008.07.01 goto end_hw_sec; alg = (ext->alg == IW_ENCODE_ALG_CCMP)?KEY_TYPE_CCMP:ext->alg; // as IW_ENCODE_ALG_CCMP is defined to be 3 and KEY_TYPE_CCMP is defined to 4; 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); //we only get 16 bytes key.why? WB 2008.7.1 if ((alg & KEY_TYPE_WEP40) && (ieee->auth_mode !=2) ) { setKey( dev, idx,//EntryNo idx, //KeyIndex alg, //KeyType zero, //MacAddr 0, //DefaultKey key); //KeyContent } else if (group) { ieee->group_key_type = alg; setKey( dev, idx,//EntryNo idx, //KeyIndex alg, //KeyType broadcast_addr, //MacAddr 0, //DefaultKey key); //KeyContent } else //pairwise key { setKey( dev, 4,//EntryNo idx, //KeyIndex alg, //KeyType (u8 *)ieee->ap_mac_addr, //MacAddr 0, //DefaultKey key); //KeyContent } } end_hw_sec: 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 = ieee80211_priv(dev); struct ieee80211_device *ieee = priv->ieee80211; int ret; //u32 TargetContent; u32 hwkey[4]={0,0,0,0}; u8 mask=0xff; u32 key_idx=0; //u8 broadcast_addr[6] ={ 0xff,0xff,0xff,0xff,0xff,0xff}; 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(!priv->up) return -ENETDOWN; down(&priv->wx_sem); RT_TRACE(COMP_SEC, "Setting SW wep key"); ret = ieee80211_wx_set_encode(priv->ieee80211,info,wrqu,key); up(&priv->wx_sem); //sometimes, the length is zero while we do not type key value 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); setKey( dev, key_idx, //EntryNo key_idx, //KeyIndex KEY_TYPE_WEP40, //KeyType zero_addr[key_idx], 0, //DefaultKey hwkey); //KeyContent } else if(wrqu->encoding.length==0xd){ ieee->pairwise_key_type = KEY_TYPE_WEP104; EnableHWSecurityConfig8192(dev); setKey( dev, key_idx, //EntryNo key_idx, //KeyIndex KEY_TYPE_WEP104, //KeyType zero_addr[key_idx], 0, //DefaultKey hwkey); //KeyContent } else printk("wrong type in WEP, not WEP40 and WEP104\n"); } 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_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; }
/* hw security need to reorganized. */ 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 = ieee80211_priv(dev); struct ieee80211_device *ieee = priv->ieee80211; mutex_lock(&priv->wx_mutex); ret = ieee80211_wx_set_encode_ext(priv->ieee80211, 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) /* none is not allowed to use hwsec WB 2008.07.01 */ goto end_hw_sec; /* as IW_ENCODE_ALG_CCMP is defined to be 3 and KEY_TYPE_CCMP is defined to 4; */ 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); /* we only get 16 bytes key.why? WB 2008.7.1 */ if ((alg & KEY_TYPE_WEP40) && (ieee->auth_mode != 2)) { setKey(dev, idx, /* EntryNao */ idx, /* KeyIndex */ alg, /* KeyType */ zero, /* MacAddr */ 0, /* DefaultKey */ key); /* KeyContent */ } else if (group) { ieee->group_key_type = alg; setKey(dev, idx, /* EntryNo */ idx, /* KeyIndex */ alg, /* KeyType */ broadcast_addr, /* MacAddr */ 0, /* DefaultKey */ key); /* KeyContent */ } else { /* pairwise key */ setKey(dev, 4, /* EntryNo */ idx, /* KeyIndex */ alg, /* KeyType */ (u8 *)ieee->ap_mac_addr,/* MacAddr */ 0, /* DefaultKey */ key); /* KeyContent */ } } end_hw_sec: mutex_unlock(&priv->wx_mutex); return ret; }