int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); if (wrqu->mode == ieee->iw_mode) goto out; if (wrqu->mode == IW_MODE_MONITOR){ ieee->dev->type = ARPHRD_IEEE80211; }else{ ieee->dev->type = ARPHRD_ETHER; } if (!ieee->proto_started){ ieee->iw_mode = wrqu->mode; }else{ ieee80211_stop_protocol(ieee); ieee->iw_mode = wrqu->mode; ieee80211_start_protocol(ieee); } out: up(&ieee->wx_sem); return 0; }
int ieee80211_wx_set_essid(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { int ret=0,len; short proto_started; unsigned long flags; ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); proto_started = ieee->proto_started; if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } if(proto_started) ieee80211_stop_protocol(ieee); /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); if (wrqu->essid.flags && wrqu->essid.length) { len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; #else strncpy(ieee->current_network.ssid, extra, len+1); ieee->current_network.ssid_len = len+1; #endif ieee->ssid_set = 1; } else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } spin_unlock_irqrestore(&ieee->lock, flags); if (proto_started) ieee80211_start_protocol(ieee); out: up(&ieee->wx_sem); return ret; }
int ieee80211_wx_set_wap(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { int ret = 0; u8 zero[] = {0,0,0,0,0,0}; unsigned long flags; short ifup = ieee->proto_started;//dev->flags & IFF_UP; struct sockaddr *temp = (struct sockaddr *)awrq; //printk("=======Set WAP:"); ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER){ ret = -1; goto out; } if (temp->sa_family != ARPHRD_ETHER){ ret = -EINVAL; goto out; } if (ifup) ieee80211_stop_protocol(ieee); /* just to avoid to give inconsistent infos in the * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0; //printk(" %x:%x:%x:%x:%x:%x\n", ieee->current_network.bssid[0],ieee->current_network.bssid[1],ieee->current_network.bssid[2],ieee->current_network.bssid[3],ieee->current_network.bssid[4],ieee->current_network.bssid[5]); spin_unlock_irqrestore(&ieee->lock, flags); if (ifup) ieee80211_start_protocol(ieee); out: up(&ieee->wx_sem); return ret; }
static int r8180_wx_set_iwmode(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct r8180_priv *priv = ieee80211_priv(dev); struct ieee80211_device *ieee = priv->ieee80211; int *param = (int *)extra; int ret = 0; int modulation = 0, mode = 0; if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); if (*param == 1) { modulation |= IEEE80211_CCK_MODULATION; mode = IEEE_B; printk(KERN_INFO "B mode!\n"); } else if (*param == 2) { modulation |= IEEE80211_OFDM_MODULATION; mode = IEEE_G; printk(KERN_INFO "G mode!\n"); } else if (*param == 3) { modulation |= IEEE80211_CCK_MODULATION; modulation |= IEEE80211_OFDM_MODULATION; mode = IEEE_B|IEEE_G; printk(KERN_INFO "B/G mode!\n"); } if (ieee->proto_started) { ieee80211_stop_protocol(ieee); ieee->mode = mode; ieee->modulation = modulation; ieee80211_start_protocol(ieee); } else { ieee->mode = mode; ieee->modulation = modulation; /* ieee80211_start_protocol(ieee); */ } up(&priv->wx_sem); return ret; }
int ieee80211_wx_set_wap(struct ieee80211_device *ieee, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { int ret = 0; unsigned long flags; short ifup = ieee->proto_started; /* dev->flags & IFF_UP; */ struct sockaddr *temp = (struct sockaddr *)awrq; ieee->sync_scan_hurryup = 1; mutex_lock(&ieee->wx_mutex); /* use ifconfig hw ether */ if (ieee->iw_mode == IW_MODE_MASTER) { ret = -1; goto out; } if (temp->sa_family != ARPHRD_ETHER) { ret = -EINVAL; goto out; } if (ifup) ieee80211_stop_protocol(ieee); /* just to avoid to give inconsistent infos in the * get wx method. not really needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN); ieee->wap_set = !is_zero_ether_addr(temp->sa_data); spin_unlock_irqrestore(&ieee->lock, flags); if (ifup) ieee80211_start_protocol(ieee); out: mutex_unlock(&ieee->wx_mutex); return ret; }
int ieee80211_wx_set_essid(struct ieee80211_device *ieee, struct iw_request_info *a, union iwreq_data *wrqu, char *extra) { int ret=0,len; short proto_started; unsigned long flags; ieee->sync_scan_hurryup = 1; down(&ieee->wx_sem); proto_started = ieee->proto_started; if (wrqu->essid.length > IW_ESSID_MAX_SIZE){ ret= -E2BIG; goto out; } if (ieee->iw_mode == IW_MODE_MONITOR){ ret= -1; goto out; } if(proto_started) ieee80211_stop_protocol(ieee); /* this is just to be sure that the GET wx callback * has consisten infos. not needed otherwise */ spin_lock_irqsave(&ieee->lock, flags); if (wrqu->essid.flags && wrqu->essid.length) { //YJ,modified,080819 len = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length) : IW_ESSID_MAX_SIZE; memset(ieee->current_network.ssid, 0, ieee->current_network.ssid_len); //YJ,add,080819 strncpy(ieee->current_network.ssid, extra, len); ieee->current_network.ssid_len = len; ieee->ssid_set = 1; //YJ,modified,080819,end //YJ,add,080819,for hidden ap if(len == 0){ memset(ieee->current_network.bssid, 0, ETH_ALEN); ieee->current_network.capability = 0; } //YJ,add,080819,for hidden ap,end } else{ ieee->ssid_set = 0; ieee->current_network.ssid[0] = '\0'; ieee->current_network.ssid_len = 0; } //printk("==========set essid %s!\n",ieee->current_network.ssid); spin_unlock_irqrestore(&ieee->lock, flags); if (proto_started) ieee80211_start_protocol(ieee); out: up(&ieee->wx_sem); return ret; }