Refactor ieee80211_match_ess() and ieee80211_set_ess():
nwids are binary data with an explicit length, so treat them as such
instead of treating them like strings with a fixed len of
IEEE80211_NWID_LEN.
To avoid two searches in a row ieee80211_set_ess() accepts a struct
ieee80211_ess which ieee80211_match_ess() just found for us. That way
we also avoid passing in a length parameter.
ieee80211_ioctl() needs to do it's own search though.
Do it only in the add path since we already know that we won't find
the node if we are deleting the nwid.
OK?
diff --git ieee80211_ioctl.c ieee80211_ioctl.c
index 8155ca6a943..d4215ad6f9e 100644
--- ieee80211_ioctl.c
+++ ieee80211_ioctl.c
@@ -467,9 +467,17 @@ ieee80211_ioctl(struct ifnet *ifp, u_long cmd, caddr_t
data)
ieee80211_disable_rsn(ic);
ieee80211_disable_wep(ic);
/* save nwid for auto-join */
- if (!(join.i_flags & IEEE80211_JOIN_DEL))
+ if (!(join.i_flags & IEEE80211_JOIN_DEL)) {
ieee80211_add_ess(ic, 0, 0);
- ieee80211_set_ess(ic, ic->ic_des_essid);
+ TAILQ_FOREACH(ess, &ic->ic_ess, ess_next) {
+ if (ess->esslen == ic->ic_des_esslen &&
+ memcmp(ess->essid, ic->ic_des_essid,
+ ess->esslen) == 0) {
+ ieee80211_set_ess(ic, ess);
+ break;
+ }
+ }
+ }
error = ENETRESET;
break;
case SIOCG80211JOIN:
diff --git ieee80211_node.c ieee80211_node.c
index 528ac3a7fb0..98b6f0394d5 100644
--- ieee80211_node.c
+++ ieee80211_node.c
@@ -360,7 +360,7 @@ ieee80211_match_ess(struct ieee80211com *ic)
if (LINK_STATE_IS_UP(ifp->if_link_state) &&
ess->esslen == ic->ic_des_esslen &&
(memcmp(ic->ic_des_essid, ess->essid,
- IEEE80211_NWID_LEN) == 0)) {
+ ic->ic_des_esslen) == 0)) {
if (ifp->if_flags & IFF_DEBUG) {
printf(" %s: staying on ",
ifp->if_xname);
@@ -373,8 +373,8 @@ ieee80211_match_ess(struct ieee80211com *ic)
TAILQ_FOREACH(ess, &ic->ic_ess, ess_next) {
RBT_FOREACH(ni, ieee80211_tree, &ic->ic_tree) {
- if (memcmp(ess->essid, ni->ni_essid,
- IEEE80211_NWID_LEN) != 0 ||
+ if (ess->esslen != ni->ni_esslen || memcmp(ess->essid,
+ ni->ni_essid, ni->ni_esslen) != 0 ||
ni->ni_fails != 0)
continue;
@@ -402,25 +402,17 @@ ieee80211_match_ess(struct ieee80211com *ic)
if (seless && !(seless->esslen == ic->ic_des_esslen &&
(memcmp(ic->ic_des_essid, seless->essid,
- IEEE80211_NWID_LEN) == 0))) {
- ieee80211_set_ess(ic, seless->essid);
+ ic->ic_des_esslen) == 0))) {
+ ieee80211_set_ess(ic, seless);
return (1);
}
return (0);
}
void
-ieee80211_set_ess(struct ieee80211com *ic, char *nwid)
+ieee80211_set_ess(struct ieee80211com *ic, struct ieee80211_ess *ess)
{
- struct ieee80211_ess *ess;
-
- TAILQ_FOREACH(ess, &ic->ic_ess, ess_next) {
- if (memcmp(ess->essid, nwid, IEEE80211_NWID_LEN) == 0)
- break;
- }
-
- if (ess == NULL)
- return;
+ KASSERT(ess != NULL);
memset(ic->ic_des_essid, 0, IEEE80211_NWID_LEN);
ic->ic_des_esslen = ess->esslen;
diff --git ieee80211_var.h ieee80211_var.h
index 47408f4b6da..deb0e226e4d 100644
--- ieee80211_var.h
+++ ieee80211_var.h
@@ -453,7 +453,7 @@ void ieee80211_disable_wep(struct ieee80211com *);
void ieee80211_disable_rsn(struct ieee80211com *);
int ieee80211_add_ess(struct ieee80211com *, int, int);
void ieee80211_del_ess(struct ieee80211com *, u_int8_t *, int);
-void ieee80211_set_ess(struct ieee80211com *, char *);
+void ieee80211_set_ess(struct ieee80211com *, struct ieee80211_ess *);
extern int ieee80211_cache_size;
--
I'm not entirely sure you are real.