From owner-p4-projects@FreeBSD.ORG Tue May 20 22:58:13 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 344FB106567C; Tue, 20 May 2008 22:58:13 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B6350106567A for ; Tue, 20 May 2008 22:58:12 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id ACD6D8FC20 for ; Tue, 20 May 2008 22:58:12 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m4KMwCuV088144 for ; Tue, 20 May 2008 22:58:12 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m4KMwCkT088142 for perforce@freebsd.org; Tue, 20 May 2008 22:58:12 GMT (envelope-from sam@freebsd.org) Date: Tue, 20 May 2008 22:58:12 GMT Message-Id: <200805202258.m4KMwCkT088142@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Cc: Subject: PERFORCE change 141937 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 May 2008 22:58:13 -0000 http://perforce.freebsd.org/chv.cgi?CH=141937 Change 141937 by sam@sam_ebb on 2008/05/20 22:58:08 Handle broadcast probe request frames specially when locating a node on packet receive. If the sender is associated then we were sending the packet only to the vap it was associated to but we need to spam all vap's so probe responses are generated; otherwise the sta's scan cache won't show all our vap's. Noticed by: Jared Go MFP4 after: 1 week Affected files ... .. //depot/projects/vap/sys/net80211/ieee80211_node.c#33 edit Differences ... ==== //depot/projects/vap/sys/net80211/ieee80211_node.c#33 (text+ko) ==== @@ -1311,6 +1311,24 @@ ((wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == IEEE80211_FC0_SUBTYPE_PS_POLL) #define IS_BAR(wh) \ ((wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == IEEE80211_FC0_SUBTYPE_BAR) +#define IS_PROBEREQ(wh) \ + ((wh->i_fc[0] & (IEEE80211_FC0_TYPE_MASK|IEEE80211_FC0_SUBTYPE_MASK)) \ + == (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_REQ)) +#define IS_BCAST_PROBEREQ(wh) \ + (IS_PROBEREQ(wh) && IEEE80211_IS_MULTICAST( \ + ((const struct ieee80211_frame *)(wh))->i_addr3)) + +static __inline struct ieee80211_node * +_find_rxnode(struct ieee80211_node_table *nt, + const struct ieee80211_frame_min *wh) +{ + /* XXX 4-address frames? */ + if (IS_CTL(wh) && !IS_PSPOLL(wh) && !IS_BAR(wh) /*&& !IS_RTS(ah)*/) + return ieee80211_find_node_locked(nt, wh->i_addr1); + if (IS_BCAST_PROBEREQ(wh)) + return NULL; /* spam bcast probe req to all vap's */ + return ieee80211_find_node_locked(nt, wh->i_addr2); +} /* * Locate the node for sender, track state, and then pass the @@ -1329,13 +1347,9 @@ struct ieee80211_node_table *nt; struct ieee80211_node *ni; - /* XXX 4-address frames? */ nt = &ic->ic_sta; IEEE80211_NODE_LOCK(nt); - if (IS_CTL(wh) && !IS_PSPOLL(wh) && !IS_BAR(wh) /*&& !IS_RTS(ah)*/) - ni = ieee80211_find_node_locked(nt, wh->i_addr1); - else - ni = ieee80211_find_node_locked(nt, wh->i_addr2); + ni = _find_rxnode(nt, wh); IEEE80211_NODE_UNLOCK(nt); return ni; @@ -1369,10 +1383,7 @@ else ni = NULL; if (ni == NULL) { - if (IS_CTL(wh) && !IS_PSPOLL(wh) && !IS_BAR(wh) /*&& !IS_RTS(ah)*/) - ni = ieee80211_find_node_locked(nt, wh->i_addr1); - else - ni = ieee80211_find_node_locked(nt, wh->i_addr2); + ni = _find_rxnode(nt, wh); if (ni != NULL && nt->nt_keyixmap != NULL) { /* * If the station has a unicast key cache slot @@ -1390,12 +1401,18 @@ nt->nt_keyixmap[keyix] = ieee80211_ref_node(ni); } } - } else - ieee80211_ref_node(ni); + } else { + if (IS_BCAST_PROBEREQ(wh)) + ni = NULL; /* spam bcast probe req to all vap's */ + else + ieee80211_ref_node(ni); + } IEEE80211_NODE_UNLOCK(nt); return ni; } +#undef IS_BCAST_PROBEREQ +#undef IS_PROBEREQ #undef IS_BAR #undef IS_PSPOLL #undef IS_CTL