summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Bergamini <damien@cvs.openbsd.org>2009-11-21 18:09:32 +0000
committerDamien Bergamini <damien@cvs.openbsd.org>2009-11-21 18:09:32 +0000
commitde0b3a2e6a6b34cccd85cb32440a23dd84e38835 (patch)
treea476c2129b9f0c0b5557c3d64082d1fee63da743
parent8647edfb6c950d5a05866d7b141b8524000760d7 (diff)
when wpa is enabled, defer setting the link up until the 802.1X
port is valid (keys have been successfully exchanged.) this avoids dhclient timeouts when wpa is enabled.
-rw-r--r--sys/net80211/ieee80211.c7
-rw-r--r--sys/net80211/ieee80211_proto.c11
-rw-r--r--sys/net80211/ieee80211_proto.h3
3 files changed, 15 insertions, 6 deletions
diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c
index c5b476165e3..6899fdd13a1 100644
--- a/sys/net80211/ieee80211.c
+++ b/sys/net80211/ieee80211.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ieee80211.c,v 1.37 2009/11/02 22:31:50 sobrado Exp $ */
+/* $OpenBSD: ieee80211.c,v 1.38 2009/11/21 18:09:31 damien Exp $ */
/* $NetBSD: ieee80211.c,v 1.19 2004/06/06 05:45:29 dyoung Exp $ */
/*-
@@ -547,7 +547,10 @@ ieee80211_media_status(struct ifnet *ifp, struct ifmediareq *imr)
imr->ifm_status = IFM_AVALID;
imr->ifm_active = IFM_IEEE80211;
- if (ic->ic_state == IEEE80211_S_RUN)
+ if (ic->ic_state == IEEE80211_S_RUN &&
+ (ic->ic_opmode != IEEE80211_M_STA ||
+ !(ic->ic_flags & IEEE80211_F_RSNON) ||
+ ic->ic_bss->ni_port_valid))
imr->ifm_status |= IFM_ACTIVE;
imr->ifm_active |= IFM_AUTO;
switch (ic->ic_opmode) {
diff --git a/sys/net80211/ieee80211_proto.c b/sys/net80211/ieee80211_proto.c
index d8db4dc8f31..c3a6a5a99c5 100644
--- a/sys/net80211/ieee80211_proto.c
+++ b/sys/net80211/ieee80211_proto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ieee80211_proto.c,v 1.40 2009/03/26 20:34:54 damien Exp $ */
+/* $OpenBSD: ieee80211_proto.c,v 1.41 2009/11/21 18:09:31 damien Exp $ */
/* $NetBSD: ieee80211_proto.c,v 1.8 2004/04/30 23:58:20 dyoung Exp $ */
/*-
@@ -89,7 +89,6 @@ const char * const ieee80211_phymode_name[] = {
};
int ieee80211_newstate(struct ieee80211com *, enum ieee80211_state, int);
-void ieee80211_set_link_state(struct ieee80211com *, int);
void
ieee80211_proto_attach(struct ifnet *ifp)
@@ -949,7 +948,6 @@ ieee80211_newstate(struct ieee80211com *ic, enum ieee80211_state nstate,
}
break;
case IEEE80211_S_RUN:
- ieee80211_set_link_state(ic, LINK_STATE_UP);
switch (ostate) {
case IEEE80211_S_INIT:
case IEEE80211_S_AUTH:
@@ -982,6 +980,13 @@ ieee80211_newstate(struct ieee80211com *ic, enum ieee80211_state nstate,
(ic->ic_flags & IEEE80211_F_USEPROT) ?
" protection enabled" : "");
}
+ if (!(ic->ic_flags & IEEE80211_F_RSNON)) {
+ /*
+ * NB: When RSN is enabled, we defer setting
+ * the link up until the port is valid.
+ */
+ ieee80211_set_link_state(ic, LINK_STATE_UP);
+ }
ic->ic_mgt_timer = 0;
(*ifp->if_start)(ifp);
break;
diff --git a/sys/net80211/ieee80211_proto.h b/sys/net80211/ieee80211_proto.h
index ba94c86c9e9..1322ec8a4fa 100644
--- a/sys/net80211/ieee80211_proto.h
+++ b/sys/net80211/ieee80211_proto.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ieee80211_proto.h,v 1.38 2009/01/28 18:55:18 damien Exp $ */
+/* $OpenBSD: ieee80211_proto.h,v 1.39 2009/11/21 18:09:31 damien Exp $ */
/* $NetBSD: ieee80211_proto.h,v 1.3 2003/10/13 04:23:56 dyoung Exp $ */
/*-
@@ -63,6 +63,7 @@ extern void ieee80211_proto_detach(struct ifnet *);
struct ieee80211_node;
struct ieee80211_rxinfo;
struct ieee80211_rsnparams;
+extern void ieee80211_set_link_state(struct ieee80211com *, int);
extern u_int ieee80211_get_hdrlen(const struct ieee80211_frame *);
extern void ieee80211_input(struct ifnet *, struct mbuf *,
struct ieee80211_node *, struct ieee80211_rxinfo *);