Changeset 59
- Timestamp:
- 03/15/03 19:32:54 (6 years ago)
- Files:
-
- cvs-import/trunk/wlan/if_ieee80211wireless.c (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
cvs-import/trunk/wlan/if_ieee80211wireless.c
r48 r59 56 56 57 57 ic->ic_iwstats.qual.qual = 0; 58 ic->ic_iwstats.qual.level = 0;58 ic->ic_iwstats.qual.level = ic->ic_bss.ni_rssi; 59 59 ic->ic_iwstats.qual.noise = 0; 60 60 ic->ic_iwstats.qual.updated = 0; … … 178 178 } 179 179 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 182 183 183 184 int … … 187 188 { 188 189 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; 194 198 if (rrq->fixed) { 195 int rate = IFM_AUTO;196 199 /* XXX fudge checking rates */ 197 200 switch (rrq->value / 1000000) { … … 211 214 case 1: rate = IFM_IEEE80211_DS1; break; 212 215 } 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); 244 222 } 245 223 … … 304 282 else 305 283 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 } 308 290 } 309 291 … … 337 319 else 338 320 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 } 340 325 return 0; 341 326 } … … 363 348 364 349 /* 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 366 356 return -EINVAL; 367 368 IEEE80211_ADDR_COPY(ic->ic_des_essid, &ap_addr->sa_data);369 /* XXX kick off scan??? */370 return 0;371 357 } 372 358 … … 378 364 struct ieee80211com *ic = (struct ieee80211com *) dev; 379 365 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); 381 370 ap_addr->sa_family = ARPHRD_ETHER; 382 383 371 return 0; 384 372 } … … 394 382 return -EINVAL; 395 383 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; 399 387 400 388 return 0; … … 408 396 struct ieee80211com *ic = (struct ieee80211com *) dev; 409 397 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); 413 401 nickname[data->length-1] = '\0'; 414 402 … … 423 411 struct ieee80211com *ic = (struct ieee80211com *) dev; 424 412 struct ieee80211channel *c; 413 int error; 425 414 426 415 if (freq->e == 1) … … 428 417 else 429 418 c = NULL; 430 if (c != NULL) { 419 if (c == NULL) 420 error = EINVAL; 421 else if (c != ic->ic_ibss_chan) { 431 422 ic->ic_ibss_chan = c; 432 return 0;423 error = (*ic->ic_init)(dev); 433 424 } else 434 return -EINVAL; 425 error = 0; 426 return -error; 435 427 } 436 428 … … 462 454 ic->ic_des_esslen = 0; 463 455 } 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); 470 468 } 471 469 … … 574 572 __u32 *mode, char *extra) 575 573 { 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); 578 598 } 579 599 … … 588 608 case IEEE80211_M_STA: *mode = IW_MODE_INFRA; break; 589 609 case IEEE80211_M_IBSS: *mode = IW_MODE_ADHOC; break; 590 case IEEE80211_M_AHDEMO:*mode = IW_MODE_ADHOC; break; /* XXX */591 610 case IEEE80211_M_HOSTAP:*mode = IW_MODE_MASTER; break; 592 611 default: … … 631 650 } 632 651 done: 633 (*ic->ic_init)(dev); 634 return 0; 652 return -(*ic->ic_init)(dev); 635 653 } 636 654 … … 688 706 } 689 707 done: 690 (*ic->ic_init)(dev); 691 return 0; 708 return -(*ic->ic_init)(dev); 692 709 } 693 710 … … 762 779 } 763 780 done: 764 (*ic->ic_init)(dev); 765 return 0; 781 return -(*ic->ic_init)(dev); 766 782 } 767 783
