Changeset 59

Show
Ignore:
Timestamp:
03/15/03 19:32:54 (6 years ago)
Author:
sam
Message:

Replicated Change 114 by sam@borg_greg on 2003/03/09 21:12:42<<<

o add rssi to wireless stats
o correct set/get essid
o correct set rate
o correct set mode
o change set/get nickname to use new nickname storage
o add some missing init callbacks for set operations

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • cvs-import/trunk/wlan/if_ieee80211wireless.c

    r48 r59  
    5656 
    5757        ic->ic_iwstats.qual.qual = 0; 
    58         ic->ic_iwstats.qual.level = 0
     58        ic->ic_iwstats.qual.level = ic->ic_bss.ni_rssi
    5959        ic->ic_iwstats.qual.noise = 0; 
    6060        ic->ic_iwstats.qual.updated = 0; 
     
    178178} 
    179179 
    180 extern  struct ifmedia_entry * ifmedia_match(struct ifmedia *, 
    181                                         int target, int mask); 
     180#ifndef ifr_media 
     181#define ifr_media       ifr_ifru.ifru_ivalue 
     182#endif 
    182183 
    183184int 
     
    187188{ 
    188189        struct ieee80211com *ic = (struct ieee80211com *) dev; 
    189         struct ifmedia *ifm = &ic->ic_media; 
    190         struct ifmedia_entry *oldentry; 
    191         struct ifmedia_entry *match; 
    192         int oldmedia, newmedia, error; 
    193  
     190        struct ifmediareq ifmr; 
     191        struct ifreq ifr; 
     192        int rate; 
     193 
     194        memset(&ifmr, 0, sizeof(ifmr)); 
     195        (*ic->ic_media.ifm_status)(dev, &ifmr); 
     196 
     197        rate = IFM_AUTO; 
    194198        if (rrq->fixed) { 
    195                 int rate = IFM_AUTO; 
    196199                /* XXX fudge checking rates */ 
    197200                switch (rrq->value / 1000000) { 
     
    211214                case 1:         rate = IFM_IEEE80211_DS1; break; 
    212215                } 
    213                 newmedia = IFM_MAKEWORD(IFM_IEEE80211, rate, 0, 0); 
    214         } else { 
    215                 /* XXX cheat */ 
    216                 newmedia = IFM_MAKEWORD(IFM_IEEE80211, IFM_AUTO, 0, 0); 
    217         } 
    218         match = ifmedia_match(ifm, newmedia, ifm->ifm_mask); 
    219         if (match == NULL) 
    220                 return -ENXIO; 
    221         /* 
    222          * If no change, we're done. 
    223          */ 
    224         if (IFM_SUBTYPE(newmedia) != IFM_AUTO && 
    225             newmedia == ifm->ifm_media && match == ifm->ifm_cur) 
    226                 return 0; 
    227         /* 
    228          * We found a match, now make the driver switch to it. 
    229          * Make sure to preserve our old media type in case the 
    230          * driver can't switch. 
    231          */ 
    232         oldentry = ifm->ifm_cur; 
    233         oldmedia = ifm->ifm_media; 
    234         ifm->ifm_cur = match; 
    235         ifm->ifm_media = newmedia; 
    236         error = (*ifm->ifm_change)(dev); 
    237         if (error) { 
    238                 ifm->ifm_cur = oldentry; 
    239                 ifm->ifm_media = oldmedia; 
    240         } else { 
    241                 error = (*ic->ic_init)(dev);    /* reset mode */ 
    242         } 
    243         return -error; 
     216        } 
     217 
     218        memset(&ifr, 0, sizeof(ifr)); 
     219        ifr.ifr_media = (ifmr.ifm_active & ~IFM_TMASK) | IFM_SUBTYPE(rate); 
     220 
     221        return -ifmedia_ioctl(dev, &ifr, &ic->ic_media, SIOCSIFMEDIA); 
    244222} 
    245223 
     
    304282        else 
    305283                val = __cpu_to_le16(rts->value); 
    306         ic->ic_rtsthreshold = val; 
    307         return 0; 
     284        if (val != ic->ic_rtsthreshold) { 
     285                ic->ic_rtsthreshold = val; 
     286                return -(*ic->ic_init)(dev); 
     287        } else { 
     288                return 0; 
     289        } 
    308290} 
    309291 
     
    337319        else 
    338320                val = __cpu_to_le16(rts->value & ~0x1); /* even numbers only */ 
    339         ic->ic_fragthreshold = val; 
     321        if (val != ic->ic_fragthreshold) { 
     322                ic->ic_fragthreshold = val; 
     323                return -(*ic->ic_init)(dev); 
     324        } 
    340325        return 0; 
    341326} 
     
    363348 
    364349        /* NB: should only be set when in STA mode */ 
    365         if ((ic->ic_flags & IEEE80211_F_ROAMING) == 0) 
     350        /* XXX how is this disabled? */ 
     351        if (ic->ic_opmode == IEEE80211_M_STA) { 
     352                IEEE80211_ADDR_COPY(ic->ic_des_bssid, &ap_addr->sa_data); 
     353                ic->ic_flags |= IEEE80211_F_DESBSSID; 
     354                return -(*ic->ic_init)(dev); 
     355        } else 
    366356                return -EINVAL; 
    367  
    368         IEEE80211_ADDR_COPY(ic->ic_des_essid, &ap_addr->sa_data); 
    369         /* XXX kick off scan??? */ 
    370         return 0; 
    371357} 
    372358 
     
    378364        struct ieee80211com *ic = (struct ieee80211com *) dev; 
    379365 
    380         IEEE80211_ADDR_COPY(&ap_addr->sa_data, ic->ic_bss.ni_bssid); 
     366        if (ic->ic_flags & IEEE80211_F_DESBSSID) 
     367                IEEE80211_ADDR_COPY(&ap_addr->sa_data, ic->ic_des_bssid); 
     368        else 
     369                IEEE80211_ADDR_COPY(&ap_addr->sa_data, ic->ic_bss.ni_bssid); 
    381370        ap_addr->sa_family = ARPHRD_ETHER; 
    382  
    383371        return 0; 
    384372} 
     
    394382                return -EINVAL; 
    395383 
    396         memset(ic->ic_des_essid, 0, IEEE80211_NWID_LEN); 
    397         memcpy(ic->ic_des_essid, nickname, data->length); 
    398         ic->ic_des_esslen = data->length; 
     384        memset(ic->ic_nickname, 0, IEEE80211_NWID_LEN); 
     385        memcpy(ic->ic_nickname, nickname, data->length); 
     386        ic->ic_nicknamelen = data->length; 
    399387 
    400388        return 0; 
     
    408396        struct ieee80211com *ic = (struct ieee80211com *) dev; 
    409397 
    410         if (data->length > ic->ic_des_esslen + 1) 
    411                 data->length = ic->ic_des_esslen + 1; 
    412         memcpy(nickname, ic->ic_des_essid, data->length-1); 
     398        if (data->length > ic->ic_nicknamelen + 1) 
     399                data->length = ic->ic_nicknamelen + 1; 
     400        memcpy(nickname, ic->ic_nickname, data->length-1); 
    413401        nickname[data->length-1] = '\0'; 
    414402 
     
    423411        struct ieee80211com *ic = (struct ieee80211com *) dev; 
    424412        struct ieee80211channel *c; 
     413        int error; 
    425414 
    426415        if (freq->e == 1) 
     
    428417        else 
    429418                c = NULL; 
    430         if (c != NULL) { 
     419        if (c == NULL) 
     420                error = EINVAL; 
     421        else if (c != ic->ic_ibss_chan) { 
    431422                ic->ic_ibss_chan = c; 
    432                 return 0
     423                error = (*ic->ic_init)(dev)
    433424        } else 
    434                 return -EINVAL; 
     425                error = 0; 
     426        return -error; 
    435427} 
    436428 
     
    462454                ic->ic_des_esslen = 0; 
    463455        } else { 
    464                 ic->ic_des_esslen = IW_ESSID_MAX_SIZE; 
    465                 if (ic->ic_des_esslen > IEEE80211_NWID_LEN) 
    466                         ic->ic_des_esslen = IEEE80211_NWID_LEN; 
    467                 memcpy(ic->ic_des_essid, ssid, ic->ic_des_esslen); 
    468         } 
    469         return 0; 
     456                int i, len; 
     457 
     458                len = IW_ESSID_MAX_SIZE; 
     459                if (len > IEEE80211_NWID_LEN) 
     460                        len = IEEE80211_NWID_LEN; 
     461                memcpy(ic->ic_des_essid, ssid, len); 
     462                /* XXX: scan for \0 to calculate the length */ 
     463                for (i = 0; i < len && ic->ic_des_essid[i] != '\0'; i++) 
     464                        ; 
     465                ic->ic_des_esslen = i; 
     466        } 
     467        return -(*ic->ic_init)(dev); 
    470468} 
    471469 
     
    574572                        __u32 *mode, char *extra) 
    575573{ 
    576         /* XXX nothing to do */ 
    577         return 0; 
     574        struct ieee80211com *ic = (struct ieee80211com *) dev; 
     575        struct ifmediareq ifmr; 
     576        struct ifreq ifr; 
     577 
     578        memset(&ifmr, 0, sizeof(ifmr)); 
     579        (*ic->ic_media.ifm_status)(dev, &ifmr); 
     580 
     581        memset(&ifr, 0, sizeof(ifr)); 
     582        ifr.ifr_media = ifmr.ifm_active &~ IFM_OMASK; 
     583        switch (*mode) { 
     584        case IW_MODE_INFRA: 
     585                /* NB: this is the default */ 
     586                break; 
     587        case IW_MODE_ADHOC: 
     588                ifr.ifr_media |= IFM_TYPE_OPTIONS(IFM_IEEE80211_IBSS); 
     589                break; 
     590        case IW_MODE_MASTER: 
     591                ifr.ifr_media |= IFM_TYPE_OPTIONS(IFM_IEEE80211_HOSTAP); 
     592                break; 
     593        default: 
     594                return -EINVAL; 
     595        } 
     596 
     597        return -ifmedia_ioctl(dev, &ifr, &ic->ic_media, SIOCSIFMEDIA); 
    578598} 
    579599 
     
    588608        case IEEE80211_M_STA:   *mode = IW_MODE_INFRA; break; 
    589609        case IEEE80211_M_IBSS:  *mode = IW_MODE_ADHOC; break; 
    590         case IEEE80211_M_AHDEMO:*mode = IW_MODE_ADHOC; break;   /* XXX */ 
    591610        case IEEE80211_M_HOSTAP:*mode = IW_MODE_MASTER; break; 
    592611        default: 
     
    631650        } 
    632651done: 
    633         (*ic->ic_init)(dev); 
    634         return 0; 
     652        return -(*ic->ic_init)(dev); 
    635653} 
    636654 
     
    688706        } 
    689707done: 
    690         (*ic->ic_init)(dev); 
    691         return 0; 
     708        return -(*ic->ic_init)(dev); 
    692709} 
    693710 
     
    762779        } 
    763780done: 
    764         (*ic->ic_init)(dev); 
    765         return 0; 
     781        return -(*ic->ic_init)(dev); 
    766782} 
    767783