diff options
author | Max Khon <fjoe@FreeBSD.org> | 2004-04-17 20:30:05 +0000 |
---|---|---|
committer | Max Khon <fjoe@FreeBSD.org> | 2004-04-17 20:30:05 +0000 |
commit | a59b7fd5a4434a3c8adeab4deca27d138c501cd1 (patch) | |
tree | 2ec94308193d9d4a05c1edfa78932e1eb00c90ef /sys | |
parent | 5564b4b98475a6f29935c360c574957afbef83ec (diff) | |
download | src-a59b7fd5a4434a3c8adeab4deca27d138c501cd1.tar.gz src-a59b7fd5a4434a3c8adeab4deca27d138c501cd1.zip |
Add 354k and 512k support.
Fix quality stats.
Submitted by: Stanislav A Svirid <count@riss-telecom.ru>
Notes
Notes:
svn path=/head/; revision=128369
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/arl/if_arl.c | 45 | ||||
-rw-r--r-- | sys/dev/arl/if_arlreg.h | 3 |
2 files changed, 34 insertions, 14 deletions
diff --git a/sys/dev/arl/if_arl.c b/sys/dev/arl/if_arl.c index 9a69870ad51d..0be53eb636f4 100644 --- a/sys/dev/arl/if_arl.c +++ b/sys/dev/arl/if_arl.c @@ -69,6 +69,9 @@ __FBSDID("$FreeBSD$"); */ #define ARL_CHECKREG(sc) (ar->registrationMode && ar->registrationStatus == 0) +#define GET_ARL_PARAM(name) (arcfg.name = ar->name) +#define SET_ARL_PARAM(name) (ar->name = arcfg.name) + #ifndef BPF_MTAP #define BPF_MTAP(_ifp,_m) \ do { \ @@ -114,6 +117,13 @@ static void arl_read_config (struct arl_softc *); devclass_t arl_devclass; +u_int8_t rate2media[4] = { + IFM_IEEE80211_DS354k, + IFM_IEEE80211_DS512k, + IFM_IEEE80211_DS1, + IFM_IEEE80211_DS2 +}; + /* * Copy config values to local cache */ @@ -194,13 +204,16 @@ arl_attach(dev) ifmedia_init(&sc->arl_ifmedia, 0, arl_media_change, arl_media_status); #define ADD(s, o) ifmedia_add(&sc->arl_ifmedia, \ IFM_MAKEWORD(IFM_IEEE80211, (s), (o), 0), 0, NULL) + ADD(IFM_IEEE80211_DS354k, 0); + ADD(IFM_IEEE80211_DS354k, IFM_IEEE80211_ADHOC); + ADD(IFM_IEEE80211_DS512k, 0); + ADD(IFM_IEEE80211_DS512k, IFM_IEEE80211_ADHOC); ADD(IFM_IEEE80211_DS1, 0); ADD(IFM_IEEE80211_DS1, IFM_IEEE80211_ADHOC); ADD(IFM_IEEE80211_DS2, 0); ADD(IFM_IEEE80211_DS2, IFM_IEEE80211_ADHOC); ifmedia_set(&sc->arl_ifmedia, IFM_MAKEWORD(IFM_IEEE80211, - arcfg.spreadingCode == 4 ? IFM_IEEE80211_DS2 : IFM_IEEE80211_DS1 - , 0, 0)); + rate2media[arcfg.spreadingCode - 1], 0, 0)); #undef ADD /* @@ -1152,16 +1165,19 @@ arl_cache_store(sc, eh, level, quality, dir) int i; static int cache_slot = 0; static int wrapindex = 0; + u_int8_t zero[6] = {0, 0, 0, 0, 0, 0}; + u_char *mac; if ((ntohs(eh->ether_type) != ETHERTYPE_IP)) { return; } + mac = (dir == ARLCACHE_RX ? eh->ether_shost : eh->ether_dhost); + for (i = 0; i < MAXARLCACHE; i++) { - if (!bcmp(dir == ARLCACHE_RX ? eh->ether_shost : eh->ether_dhost, - sc->arl_sigcache[i].macsrc, 6)) { + if (!bcmp(zero, sc->arl_sigcache[i].macsrc, 6) || + !bcmp(mac, sc->arl_sigcache[i].macsrc, 6)) break; - } } if (i < MAXARLCACHE) @@ -1187,12 +1203,19 @@ arl_media_change(ifp) struct arl_softc *sc = ifp->if_softc; int otype = arcfg.registrationMode; int orate = arcfg.spreadingCode; + int nrate, i; + + nrate = IFM_SUBTYPE(sc->arl_ifmedia.ifm_cur->ifm_media); + + for(i = 1; i <= 4; i++) { + if (rate2media[i - 1] == nrate) + break; + } - arcfg.spreadingCode = ieee80211_media2rate( - IFM_SUBTYPE(sc->arl_ifmedia.ifm_cur->ifm_media)); + if (i == 5) + return (EINVAL); - if (arcfg.spreadingCode == 2) - arcfg.spreadingCode = 3; + arcfg.spreadingCode = i; /* XXX Need fix for PSP mode */ if ((sc->arl_ifmedia.ifm_cur->ifm_media & IFM_IEEE80211_ADHOC) != 0) @@ -1213,14 +1236,14 @@ arl_media_status(ifp, imr) struct ifmediareq *imr; { struct arl_softc *sc = ifp->if_softc; - int rate = (arcfg.spreadingCode == 4 ? 4 : 2); imr->ifm_active = IFM_IEEE80211; if (arcfg.registrationMode == 0) imr->ifm_active |= IFM_IEEE80211_ADHOC; - imr->ifm_active |= ieee80211_rate2media(NULL, rate, IEEE80211_T_DS); + imr->ifm_active |= IFM_MAKEWORD(IFM_IEEE80211, + rate2media[arcfg.spreadingCode - 1], 0, 0); imr->ifm_status = IFM_AVALID; if (!ARL_CHECKREG(sc)) imr->ifm_status |= IFM_ACTIVE; diff --git a/sys/dev/arl/if_arlreg.h b/sys/dev/arl/if_arlreg.h index 660f32753c4b..adc95420eb8d 100644 --- a/sys/dev/arl/if_arlreg.h +++ b/sys/dev/arl/if_arlreg.h @@ -299,9 +299,6 @@ struct arl_softc { } \ } while (0); -#define GET_ARL_PARAM(name) (arcfg.name = ar->name) -#define SET_ARL_PARAM(name) (ar->name = arcfg.name) - #ifdef _KERNEL void arl_release_resources (device_t); int arl_alloc_memory (device_t, int, int); |