Date: Fri, 3 Dec 2004 22:34:31 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 66366 for review Message-ID: <200412032234.iB3MYVrT002972@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=66366 Change 66366 by sam@sam_ebb on 2004/12/03 22:34:02 overhaul debugging msgs for consistency and to shrink code size a bit Affected files ... .. //depot/projects/wifi/sys/net80211/ieee80211_input.c#22 edit .. //depot/projects/wifi/sys/net80211/ieee80211_node.c#23 edit Differences ... ==== //depot/projects/wifi/sys/net80211/ieee80211_input.c#22 (text+ko) ==== @@ -51,14 +51,9 @@ #include <net/bpf.h> -static struct mbuf *ieee80211_defrag(struct ieee80211com *, - struct ieee80211_node *, struct mbuf *); -static struct mbuf *ieee80211_decap(struct ieee80211com *, struct mbuf *); -static void ieee80211_node_pwrsave(struct ieee80211_node *, int enable); -static void ieee80211_recv_pspoll(struct ieee80211com *, - struct ieee80211_node *, struct mbuf *); +#ifdef IEEE80211_DEBUG +#include <machine/stdarg.h> -#ifdef IEEE80211_DEBUG /* * Decide if a received management frame should be * printed when debugging is enabled. This filters some @@ -76,22 +71,47 @@ } return 1; } -#endif /* - * Return the bssid of a frame. + * Emit a debug message about discarding a frame or information + * element. One format is for extracting the mac address from + * the frame header; the other is for when a header is not + * available or otherwise appropriate. */ -static const u_int8_t * -ieee80211_getbssid(struct ieee80211com *ic, const struct ieee80211_frame *wh) -{ - if (ic->ic_opmode == IEEE80211_M_STA) - return wh->i_addr2; - if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) != IEEE80211_FC1_DIR_NODS) - return wh->i_addr1; - if ((wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == IEEE80211_FC0_SUBTYPE_PS_POLL) - return wh->i_addr1; - return wh->i_addr3; -} +#define IEEE80211_DISCARD(_ic, _m, _wh, _type, _fmt, ...) do { \ + if ((_ic)->ic_debug & (_m)) \ + ieee80211_discard_frame(_ic, _wh, _type, _fmt, __VA_ARGS__);\ +} while (0) +#define IEEE80211_DISCARD_IE(_ic, _m, _wh, _type, _fmt, ...) do { \ + if ((_ic)->ic_debug & (_m)) \ + ieee80211_discard_ie(_ic, _wh, _type, _fmt, __VA_ARGS__);\ +} while (0) +#define IEEE80211_DISCARD_MAC(_ic, _m, _mac, _type, _fmt, ...) do { \ + if ((_ic)->ic_debug & (_m)) \ + ieee80211_discard_mac(_ic, _mac, _type, _fmt, __VA_ARGS__);\ +} while (0) + +static const u_int8_t *ieee80211_getbssid(struct ieee80211com *, + const struct ieee80211_frame *); +static void ieee80211_discard_frame(struct ieee80211com *, + const struct ieee80211_frame *, const char *type, const char *fmt, ...); +static void ieee80211_discard_ie(struct ieee80211com *, + const struct ieee80211_frame *, const char *type, const char *fmt, ...); +static void ieee80211_discard_mac(struct ieee80211com *, + const u_int8_t mac[IEEE80211_ADDR_LEN], const char *type, + const char *fmt, ...); +#else +#define IEEE80211_DISCARD(_ic, _m, _wh, _type, _fmt, ...) +#define IEEE80211_DISCARD_IE(_ic, _m, _wh, _type, _fmt, ...) +#define IEEE80211_DISCARD_MAC(_ic, _m, _mac, _type, _fmt, ...) +#endif /* IEEE80211_DEBUG */ + +static struct mbuf *ieee80211_defrag(struct ieee80211com *, + struct ieee80211_node *, struct mbuf *); +static struct mbuf *ieee80211_decap(struct ieee80211com *, struct mbuf *); +static void ieee80211_node_pwrsave(struct ieee80211_node *, int enable); +static void ieee80211_recv_pspoll(struct ieee80211com *, + struct ieee80211_node *, struct mbuf *); /* * Process a received frame. The node associated with the sender @@ -137,9 +157,9 @@ goto out; if (m->m_pkthdr.len < sizeof(struct ieee80211_frame_min)) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, - "%s: frame too short, len %u\n", - __func__, m->m_pkthdr.len); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_ANY, + ni->ni_macaddr, NULL, + "too short (1): len %u", m->m_pkthdr.len); ic->ic_stats.is_rx_tooshort++; goto out; } @@ -153,8 +173,8 @@ if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) != IEEE80211_FC0_VERSION_0) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, - "receive packet with wrong version: %x\n", wh->i_fc[0]); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_ANY, + ni->ni_macaddr, NULL, "wrong version %x", wh->i_fc[0]); ic->ic_stats.is_rx_badversion++; goto err; } @@ -168,9 +188,8 @@ bssid = wh->i_addr2; if (!IEEE80211_ADDR_EQ(bssid, ni->ni_bssid)) { /* not interested in */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard frame not to bss\n", - ether_sprintf(bssid)); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_INPUT, + bssid, NULL, "%s", "not to bss"); ic->ic_stats.is_rx_wrongbss++; goto out; } @@ -184,9 +203,10 @@ bssid = wh->i_addr1; else { if (m->m_pkthdr.len < sizeof(struct ieee80211_frame)) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, - "%s: frame too short, len %u\n", - __func__, m->m_pkthdr.len); + IEEE80211_DISCARD_MAC(ic, + IEEE80211_MSG_ANY, ni->ni_macaddr, + NULL, "too short (2): len %u", + m->m_pkthdr.len); ic->ic_stats.is_rx_tooshort++; goto out; } @@ -200,9 +220,8 @@ if (!IEEE80211_ADDR_EQ(bssid, ic->ic_bss->ni_bssid) && !IEEE80211_ADDR_EQ(bssid, ifp->if_broadcastaddr)) { /* not interested in */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard data frame not to bss\n", - ether_sprintf(bssid)); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_INPUT, + bssid, NULL, "%s", "not to bss"); ic->ic_stats.is_rx_wrongbss++; goto out; } @@ -244,18 +263,16 @@ if ((wh->i_fc[1] & IEEE80211_FC1_RETRY) && SEQ_LEQ(rxseq, ni->ni_rxseqs[tid])) { /* duplicate, discard */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard duplicate frame, " - "seqno <%u,%u> fragno <%u,%u> tid %u\n" - , ether_sprintf(bssid) - , rxseq >> IEEE80211_SEQ_SEQ_SHIFT - , ni->ni_rxseqs[tid] >> - IEEE80211_SEQ_SEQ_SHIFT - , rxseq & IEEE80211_SEQ_FRAG_MASK - , ni->ni_rxseqs[tid] & - IEEE80211_SEQ_FRAG_MASK - , tid - ); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_INPUT, + bssid, "duplicate", + "seqno <%u,%u> fragno <%u,%u> tid %u", + rxseq >> IEEE80211_SEQ_SEQ_SHIFT, + ni->ni_rxseqs[tid] >> + IEEE80211_SEQ_SEQ_SHIFT, + rxseq & IEEE80211_SEQ_FRAG_MASK, + ni->ni_rxseqs[tid] & + IEEE80211_SEQ_FRAG_MASK, + tid); ic->ic_stats.is_rx_dup++; IEEE80211_NODE_STAT(ni, rx_dup); goto out; @@ -271,9 +288,8 @@ hdrsize = roundup(hdrsize, sizeof(u_int32_t)); if (m->m_len < hdrsize && (m = m_pullup(m, hdrsize)) == NULL) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, - "[%s] data frame too short, len %u, expecting %u\n", - ether_sprintf(ieee80211_getbssid(ic, wh)), + IEEE80211_DISCARD(ic, IEEE80211_MSG_ANY, + wh, "data", "too short: len %u, expecting %u", m->m_pkthdr.len, hdrsize); ic->ic_stats.is_rx_tooshort++; goto out; /* XXX */ @@ -309,8 +325,8 @@ * It should be silently discarded for * SIMPLEX interface. */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "%s: discard multicast echo\n", __func__); + IEEE80211_DISCARD(ic, IEEE80211_MSG_INPUT, + wh, NULL, "%s", "multicast echo"); ic->ic_stats.is_rx_mcastecho++; goto out; } @@ -330,9 +346,8 @@ } /* check if source STA is associated */ if (ni == ic->ic_bss) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard data from unknown src\n", - ether_sprintf(wh->i_addr2)); + IEEE80211_DISCARD(ic, IEEE80211_MSG_INPUT, + wh, "data", "%s", "unknown src"); /* NB: caller deals with reference */ ni = ieee80211_dup_bss(ic->ic_sta, wh->i_addr2); if (ni != NULL) { @@ -345,9 +360,8 @@ goto err; } if (ni->ni_associd == 0) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard data from unassoc src\n", - ether_sprintf(wh->i_addr2)); + IEEE80211_DISCARD(ic, IEEE80211_MSG_INPUT, + wh, "data", "%s", "unassoc src"); IEEE80211_SEND_MGMT(ic, ni, IEEE80211_FC0_SUBTYPE_DISASSOC, IEEE80211_REASON_NOT_ASSOCED); @@ -381,9 +395,8 @@ /* * Discard encrypted frames when privacy is off. */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard WEP frame 'cuz PRIVACY " - "off\n", ether_sprintf(wh->i_addr2)); + IEEE80211_DISCARD(ic, IEEE80211_MSG_INPUT, + wh, "WEP", "%s", "PRIVACY off"); ic->ic_stats.is_rx_noprivacy++; IEEE80211_NODE_STAT(ni, rx_noprivacy); goto out; @@ -415,8 +428,8 @@ * Next strip any MSDU crypto bits. */ if (key != NULL && !ieee80211_crypto_demic(ic, key, m)) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "%s: discard frame on demic error\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_INPUT, + ni->ni_macaddr, "data", "%s", "demic error"); IEEE80211_NODE_STAT(ni, rx_demicfail); goto out; } @@ -433,8 +446,8 @@ /* don't count Null data frames as errors */ if (subtype == IEEE80211_FC0_SUBTYPE_NODATA) goto out; - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "%s: decapsulation error\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_INPUT, + ni->ni_macaddr, "data", "%s", "decap error"); ic->ic_stats.is_rx_decap++; IEEE80211_NODE_STAT(ni, rx_decap); goto err; @@ -450,10 +463,9 @@ * authenticator until the handshake has completed. */ if (eh->ether_type != htons(ETHERTYPE_PAE)) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard data (ether type 0x%x len %u)" - " on unauthorized port\n", - ether_sprintf(eh->ether_shost), + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_INPUT, + eh->ether_shost, "data", + "unauthorized port: ether type 0x%x len %u", eh->ether_type, m->m_pkthdr.len); ic->ic_stats.is_rx_unauth++; IEEE80211_NODE_STAT(ni, rx_unauth); @@ -531,9 +543,9 @@ goto err; } if (m->m_pkthdr.len < sizeof(struct ieee80211_frame)) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, - "%s: mgt data frame too short, len %u\n", - __func__, m->m_pkthdr.len); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_ANY, + ni->ni_macaddr, "mgt", "too short: len %u", + m->m_pkthdr.len); ic->ic_stats.is_rx_tooshort++; goto out; } @@ -552,11 +564,10 @@ * Only shared key auth frames with a challenge * should be encrypted, discard all others. */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard %s with WEP\n", - ether_sprintf(wh->i_addr2), - ieee80211_mgt_subtype_name[subtype >> - IEEE80211_FC0_SUBTYPE_SHIFT]); + IEEE80211_DISCARD(ic, IEEE80211_MSG_INPUT, + wh, ieee80211_mgt_subtype_name[subtype >> + IEEE80211_FC0_SUBTYPE_SHIFT], + "%s", "WEP set but not permitted"); ic->ic_stats.is_rx_mgtdiscard++; /* XXX */ goto out; } @@ -564,10 +575,8 @@ /* * Discard encrypted frames when privacy is off. */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_INPUT, - "[%s] discard WEP mgt frame 'cuz " - "PRIVACY off\n", - ether_sprintf(wh->i_addr2)); + IEEE80211_DISCARD(ic, IEEE80211_MSG_INPUT, + wh, "mgt", "%s", "WEP set but PRIVACY off"); ic->ic_stats.is_rx_noprivacy++; goto out; } @@ -595,8 +604,8 @@ } goto out; default: - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, - "%s: bad frame type %x\n", __func__, type); + IEEE80211_DISCARD(ic, IEEE80211_MSG_ANY, + wh, NULL, "bad frame type 0x%x", type); /* should not come here */ break; } @@ -737,8 +746,8 @@ break; case IEEE80211_FC1_DIR_DSTODS: /* not yet supported */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ANY, - "%s: discard DS to DS frame\n", __func__); + IEEE80211_DISCARD(ic, IEEE80211_MSG_ANY, + &wh, "data", "%s", "DS to DS not supported"); m_freem(m); return NULL; } @@ -821,9 +830,9 @@ if (rs->rs_nrates + nxrates > IEEE80211_RATE_MAXSIZE) { nxrates = IEEE80211_RATE_MAXSIZE - rs->rs_nrates; IEEE80211_DPRINTF(ic, IEEE80211_MSG_XRATE, - "%s: extended rate set too large;" - " only using %u of %u rates\n", - __func__, nxrates, xrates[1]); + "[%s] extended rate set too large;" + " only using %u of %u rates\n", + ether_sprintf(ni->ni_macaddr), nxrates, xrates[1]); ic->ic_stats.is_rx_rstoobig++; } memcpy(rs->rs_rates + rs->rs_nrates, xrates+2, nxrates); @@ -869,8 +878,8 @@ IEEE80211_SEND_MGMT(ic, ni, IEEE80211_FC0_SUBTYPE_AUTH, seq + 1); IEEE80211_DPRINTF(ic, IEEE80211_MSG_DEBUG | IEEE80211_MSG_AUTH, - "station %s authenticated (open)\n", - ether_sprintf(ni->ni_macaddr)); + "[%s] station authenticated (open)\n", + ether_sprintf(ni->ni_macaddr)); break; case IEEE80211_M_STA: @@ -882,9 +891,8 @@ if (status != 0) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_DEBUG | IEEE80211_MSG_AUTH, - "open authentication failed (reason %d) for %s\n", - status, - ether_sprintf(wh->i_addr3)); + "[%s] open authentication failed (reason %d)\n", + ether_sprintf(ni->ni_macaddr), status); /* XXX can this happen? */ if (ni != ic->ic_bss) ni->ni_fails++; @@ -907,7 +915,8 @@ M_DEVBUF, M_NOWAIT); if (ni->ni_challenge == NULL) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_DEBUG | IEEE80211_MSG_AUTH, - "%s: challenge alloc failed\n", __func__); + "[%s] shared key challenge alloc failed\n", + ether_sprintf(ni->ni_macaddr)); /* XXX statistic */ } return (ni->ni_challenge != NULL); @@ -931,8 +940,9 @@ * for sanity/consistency. */ if ((ic->ic_flags & IEEE80211_F_PRIVACY) == 0) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: WEP is off\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key auth", + "%s", " PRIVACY is disabled"); estatus = IEEE80211_STATUS_ALG; goto bad; } @@ -943,9 +953,9 @@ */ if (ni->ni_authmode != IEEE80211_AUTH_AUTO && ni->ni_authmode != IEEE80211_AUTH_SHARED) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: operating in %u mode, reject\n", - __func__, ni->ni_authmode); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key auth", + "bad sta auth mode %u", ni->ni_authmode); ic->ic_stats.is_rx_bad_auth++; /* XXX maybe a unique error? */ estatus = IEEE80211_STATUS_ALG; goto bad; @@ -954,9 +964,10 @@ challenge = NULL; if (frm + 1 < efrm) { if ((frm[1] + 2) > (efrm - frm)) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: elt %d %d bytes too long\n", __func__, - frm[0], (frm[1] + 2) - (efrm - frm)); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key auth", + "ie %d/%d too long", + frm[0], (frm[1] + 2) - (efrm - frm)); ic->ic_stats.is_rx_bad_auth++; estatus = IEEE80211_STATUS_CHALLENGE; goto bad; @@ -969,16 +980,17 @@ case IEEE80211_AUTH_SHARED_CHALLENGE: case IEEE80211_AUTH_SHARED_RESPONSE: if (challenge == NULL) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: no challenge sent\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key auth", + "%s", "no challenge"); ic->ic_stats.is_rx_bad_auth++; estatus = IEEE80211_STATUS_CHALLENGE; goto bad; } if (challenge[1] != IEEE80211_CHALLENGE_LEN) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: bad challenge len %d\n", - __func__, challenge[1]); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key auth", + "bad challenge len %d", challenge[1]); ic->ic_stats.is_rx_bad_auth++; estatus = IEEE80211_STATUS_CHALLENGE; goto bad; @@ -990,13 +1002,15 @@ case IEEE80211_M_MONITOR: case IEEE80211_M_AHDEMO: case IEEE80211_M_IBSS: - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: unexpected operating mode\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key auth", + "bad operating mode %u", ic->ic_opmode); return; case IEEE80211_M_HOSTAP: if (ic->ic_state != IEEE80211_S_RUN) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: not running\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key auth", + "bad state %u", ic->ic_state); estatus = IEEE80211_STATUS_ALG; /* XXX */ goto bad; } @@ -1021,42 +1035,45 @@ IEEE80211_CHALLENGE_LEN); IEEE80211_DPRINTF(ic, IEEE80211_MSG_DEBUG | IEEE80211_MSG_AUTH, - "shared key %sauth request from station %s\n", + "[%s] shared key %sauth request\n", ether_sprintf(ni->ni_macaddr), allocbs ? "" : "re"); break; case IEEE80211_AUTH_SHARED_RESPONSE: if (ni == ic->ic_bss) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: unknown STA\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key response", + "%s", "unknown station"); /* NB: don't send a response */ return; } if (ni->ni_challenge == NULL) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: no challenge recorded\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key response", + "%s", "no challenge recorded"); ic->ic_stats.is_rx_bad_auth++; estatus = IEEE80211_STATUS_CHALLENGE; goto bad; } if (memcmp(ni->ni_challenge, &challenge[2], challenge[1]) != 0) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: challenge mismatch\n", __func__); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key response", + "%s", "challenge mismatch"); ic->ic_stats.is_rx_auth_fail++; estatus = IEEE80211_STATUS_CHALLENGE; goto bad; } ni->ni_inact_reload = ic->ic_inact_auth; IEEE80211_DPRINTF(ic, - IEEE80211_MSG_DEBUG | IEEE80211_MSG_AUTH, - "station %s authenticated (shared key)\n", - ether_sprintf(ni->ni_macaddr)); + IEEE80211_MSG_DEBUG | IEEE80211_MSG_AUTH, + "[%s] station authenticated (shared key)\n", + ether_sprintf(ni->ni_macaddr)); break; default: - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: bad shared key auth seq %d from %s\n", - __func__, seq, ether_sprintf(wh->i_addr2)); + IEEE80211_DISCARD_MAC(ic, IEEE80211_MSG_AUTH, + ni->ni_macaddr, "shared key auth", + "bad seq %d", seq); ic->ic_stats.is_rx_bad_auth++; estatus = IEEE80211_STATUS_SEQUENCE; goto bad; @@ -1077,9 +1094,9 @@ if (status != 0) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_DEBUG | IEEE80211_MSG_AUTH, - "%s: auth failed (reason %d) for %s\n", - __func__, status, - ether_sprintf(wh->i_addr3)); + "[%s] shared key auth failed (reason %d)\n", + ether_sprintf(ieee80211_getbssid(ic, wh)), + status); /* XXX can this happen? */ if (ni != ic->ic_bss) ni->ni_fails++; @@ -1098,9 +1115,8 @@ IEEE80211_FC0_SUBTYPE_AUTH, seq + 1); break; default: - IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: bad seq %d from %s\n", - __func__, seq, ether_sprintf(wh->i_addr2)); + IEEE80211_DISCARD(ic, IEEE80211_MSG_AUTH, + wh, "shared key auth", "bad seq %d", seq); ic->ic_stats.is_rx_bad_auth++; return; } @@ -1122,20 +1138,18 @@ /* Verify the existence and length of __elem or get out. */ #define IEEE80211_VERIFY_ELEMENT(__elem, __maxlen) do { \ if ((__elem) == NULL) { \ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID, \ - "%s: no " #__elem "in %s frame\n", \ - __func__, ieee80211_mgt_subtype_name[subtype >> \ - IEEE80211_FC0_SUBTYPE_SHIFT]); \ + IEEE80211_DISCARD(ic, IEEE80211_MSG_ELEMID, \ + wh, ieee80211_mgt_subtype_name[subtype >> \ + IEEE80211_FC0_SUBTYPE_SHIFT], \ + "%s", "no " #__elem ); \ ic->ic_stats.is_rx_elem_missing++; \ return; \ } \ if ((__elem)[1] > (__maxlen)) { \ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID, \ - "%s: bad " #__elem " len %d in %s frame from %s\n",\ - __func__, (__elem)[1], \ - ieee80211_mgt_subtype_name[subtype >> \ - IEEE80211_FC0_SUBTYPE_SHIFT], \ - ether_sprintf(wh->i_addr2)); \ + IEEE80211_DISCARD(ic, IEEE80211_MSG_ELEMID, \ + wh, ieee80211_mgt_subtype_name[subtype >> \ + IEEE80211_FC0_SUBTYPE_SHIFT], \ + "bad " #__elem " len %d", (__elem)[1]); \ ic->ic_stats.is_rx_elem_toobig++; \ return; \ } \ @@ -1143,12 +1157,10 @@ #define IEEE80211_VERIFY_LENGTH(_len, _minlen) do { \ if ((_len) < (_minlen)) { \ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID, \ - "%s: %s frame too short from %s\n", \ - __func__, \ - ieee80211_mgt_subtype_name[subtype >> \ - IEEE80211_FC0_SUBTYPE_SHIFT], \ - ether_sprintf(wh->i_addr2)); \ + IEEE80211_DISCARD(ic, IEEE80211_MSG_ELEMID, \ + wh, ieee80211_mgt_subtype_name[subtype >> \ + IEEE80211_FC0_SUBTYPE_SHIFT], \ + "%s", "ie too short"); \ ic->ic_stats.is_rx_elem_toosmall++; \ return; \ } \ @@ -1159,24 +1171,27 @@ ieee80211_ssid_mismatch(struct ieee80211com *ic, const char *tag, u_int8_t mac[IEEE80211_ADDR_LEN], u_int8_t *ssid) { - printf("[%s] %s req ssid mismatch: ", ether_sprintf(mac), tag); + printf("[%s] discard %s frame, ssid mismatch: ", + ether_sprintf(mac), tag); ieee80211_print_essid(ssid + 2, ssid[1]); printf("\n"); } -#define IEEE80211_VERIFY_SSID(_ni, _ssid, _packet_type) do { \ +#define IEEE80211_VERIFY_SSID(_ni, _ssid) do { \ if ((_ssid)[1] != 0 && \ ((_ssid)[1] != (_ni)->ni_esslen || \ memcmp((_ssid) + 2, (_ni)->ni_essid, (_ssid)[1]) != 0)) { \ if (ieee80211_msg_input(ic)) \ - ieee80211_ssid_mismatch(ic, _packet_type, \ + ieee80211_ssid_mismatch(ic, \ + ieee80211_mgt_subtype_name[subtype >> \ + IEEE80211_FC0_SUBTYPE_SHIFT], \ wh->i_addr2, _ssid); \ ic->ic_stats.is_rx_ssidmismatch++; \ return; \ } \ } while (0) #else /* !IEEE80211_DEBUG */ -#define IEEE80211_VERIFY_SSID(_ni, _ssid, _packet_type) do { \ +#define IEEE80211_VERIFY_SSID(_ni, _ssid) do { \ if ((_ssid)[1] != 0 && \ ((_ssid)[1] != (_ni)->ni_esslen || \ memcmp((_ssid) + 2, (_ni)->ni_essid, (_ssid)[1]) != 0)) { \ @@ -1289,7 +1304,8 @@ * configured for the system. */ static int -ieee80211_parse_wpa(struct ieee80211com *ic, u_int8_t *frm, struct ieee80211_rsnparms *rsn) +ieee80211_parse_wpa(struct ieee80211com *ic, u_int8_t *frm, + struct ieee80211_rsnparms *rsn, const struct ieee80211_frame *wh) { u_int8_t len = frm[1]; u_int32_t w; @@ -1303,16 +1319,18 @@ KASSERT(ic->ic_flags & IEEE80211_F_WPA1, ("not WPA, flags 0x%x", ic->ic_flags)); if (len < 14) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: length %u too short\n", __func__, len); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "WPA", "too short, len %u", len); return IEEE80211_REASON_IE_INVALID; } frm += 6, len -= 4; /* NB: len is payload only */ /* NB: iswapoui already validated the OUI and type */ w = LE_READ_2(frm); if (w != WPA_VERSION) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: bad version %u\n", __func__, w); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "WPA", "bad version %u", w); return IEEE80211_REASON_IE_INVALID; } frm += 2, len -= 2; @@ -1320,9 +1338,10 @@ /* multicast/group cipher */ w = wpa_cipher(frm, &rsn->rsn_mcastkeylen); if (w != rsn->rsn_mcastcipher) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: mcast cipher mismatch; got %u, expected %u\n", - __func__, w, rsn->rsn_mcastcipher); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "WPA", "mcast cipher mismatch; got %u, expected %u", + w, rsn->rsn_mcastcipher); return IEEE80211_REASON_IE_INVALID; } frm += 4, len -= 4; @@ -1331,9 +1350,10 @@ n = LE_READ_2(frm); frm += 2, len -= 2; if (len < n*4+2) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: not enough data for ucast ciphers; len %u, n %u\n", - __func__, len, n); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "WPA", "ucast cipher data too short; len %u, n %u", + len, n); return IEEE80211_REASON_IE_INVALID; } w = 0; @@ -1343,8 +1363,9 @@ } w &= rsn->rsn_ucastcipherset; if (w == 0) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: ucast cipher set empty\n", __func__); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "WPA", "%s", "ucast cipher set empty"); return IEEE80211_REASON_IE_INVALID; } if (w & (1<<IEEE80211_CIPHER_TKIP)) @@ -1356,9 +1377,10 @@ n = LE_READ_2(frm); frm += 2, len -= 2; if (len < n*4) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: not enough data for key mgmt algorithms; len %u, n %u\n", - __func__, len, n); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "WPA", "key mgmt alg data too short; len %u, n %u", + len, n); return IEEE80211_REASON_IE_INVALID; } w = 0; @@ -1368,8 +1390,9 @@ } w &= rsn->rsn_keymgmtset; if (w == 0) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: no acceptable key mgmt algorithms\n", __func__); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "WPA", "%s", "no acceptable key mgmt alg"); return IEEE80211_REASON_IE_INVALID; } if (w & WPA_ASE_8021X_UNSPEC) @@ -1444,7 +1467,8 @@ * configured for the system. */ static int -ieee80211_parse_rsn(struct ieee80211com *ic, u_int8_t *frm, struct ieee80211_rsnparms *rsn) +ieee80211_parse_rsn(struct ieee80211com *ic, u_int8_t *frm, + struct ieee80211_rsnparms *rsn, const struct ieee80211_frame *wh) { u_int8_t len = frm[1]; u_int32_t w; @@ -1458,14 +1482,16 @@ KASSERT(ic->ic_flags & IEEE80211_F_WPA2, ("not RSN, flags 0x%x", ic->ic_flags)); if (len < 10) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: length %u too short\n", __func__, len); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "RSN", "too short, len %u", len); return IEEE80211_REASON_IE_INVALID; } w = LE_READ_2(frm); if (w != RSN_VERSION) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: bad version %u\n", __func__, w); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "RSN", "bad version %u", w); return IEEE80211_REASON_IE_INVALID; } frm += 2, len -= 2; @@ -1473,9 +1499,10 @@ /* multicast/group cipher */ w = rsn_cipher(frm, &rsn->rsn_mcastkeylen); if (w != rsn->rsn_mcastcipher) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: mcast cipher mismatch; got %u, expected %u\n", - __func__, w, rsn->rsn_mcastcipher); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "RSN", "mcast cipher mismatch; got %u, expected %u", + w, rsn->rsn_mcastcipher); return IEEE80211_REASON_IE_INVALID; } frm += 4, len -= 4; @@ -1484,9 +1511,10 @@ n = LE_READ_2(frm); frm += 2, len -= 2; if (len < n*4+2) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: not enough data for ucast ciphers; len %u, n %u\n", - __func__, len, n); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "RSN", "ucast cipher data too short; len %u, n %u", + len, n); return IEEE80211_REASON_IE_INVALID; } w = 0; @@ -1496,8 +1524,9 @@ } w &= rsn->rsn_ucastcipherset; if (w == 0) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: ucast cipher set empty\n", __func__); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "RSN", "%s", "ucast cipher set empty"); return IEEE80211_REASON_IE_INVALID; } if (w & (1<<IEEE80211_CIPHER_TKIP)) @@ -1509,9 +1538,10 @@ n = LE_READ_2(frm); frm += 2, len -= 2; if (len < n*4) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: not enough data for key mgmt algorithms; len %u, n %u\n", - __func__, len, n); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "RSN", "key mgmt alg data too short; len %u, n %u", + len, n); return IEEE80211_REASON_IE_INVALID; } w = 0; @@ -1521,8 +1551,9 @@ } w &= rsn->rsn_keymgmtset; if (w == 0) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, - "%s: no acceptable key mgmt algorithms\n", __func__); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WPA, + wh, "RSN", "%s", "no acceptable key mgmt alg"); return IEEE80211_REASON_IE_INVALID; } if (w & RSN_ASE_8021X_UNSPEC) @@ -1539,7 +1570,8 @@ } static int -ieee80211_parse_wmeparams(struct ieee80211com *ic, u_int8_t *frm) +ieee80211_parse_wmeparams(struct ieee80211com *ic, u_int8_t *frm, + const struct ieee80211_frame *wh) { #define MS(_v, _f) (((_v) & _f) >> _f##_S) struct ieee80211_wme_state *wme = &ic->ic_wme; @@ -1547,8 +1579,9 @@ int i; if (len < sizeof(struct ieee80211_wme_param)-2) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID | IEEE80211_MSG_WME, - "%s: length %u too short\n", __func__, len); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID | IEEE80211_MSG_WME, + wh, "WME", "too short, len %u", len); return 0; } qosinfo = frm[__offsetof(struct ieee80211_wme_param, param_qosInfo)]; @@ -1587,6 +1620,7 @@ } if (*iep != NULL) memcpy(*iep, ie, ielen); + /* XXX note failure */ } #ifdef IEEE80211_DEBUG @@ -1598,7 +1632,7 @@ { printf("[%s] %s%s on chan %u (bss chan %u) ", ether_sprintf(mac), isnew ? "new " : "", - (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) ? "probe response" : "beacon", + ieee80211_mgt_subtype_name[subtype >> IEEE80211_FC0_SUBTYPE_SHIFT], chan, bchan); ieee80211_print_essid(ssid + 2, ssid[1]); printf("\n"); @@ -1729,11 +1763,9 @@ break; case IEEE80211_ELEMID_ERP: if (frm[1] != 1) { - IEEE80211_DPRINTF(ic, - IEEE80211_MSG_ELEMID, - "%s: invalid ERP element; " - "length %u, expecting 1\n", - __func__, frm[1]); + IEEE80211_DISCARD_IE(ic, + IEEE80211_MSG_ELEMID, wh, "ERP", + "bad len %u", frm[1]); ic->ic_stats.is_rx_elem_toobig++; break; } @@ -1750,9 +1782,9 @@ /* XXX Atheros OUI support */ break; default: - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID, - "%s: element id %u/len %u ignored\n", - __func__, *frm, frm[1]); + IEEE80211_DISCARD_IE(ic, IEEE80211_MSG_ELEMID, + wh, "unhandled", + "id %u, len %u", *frm, frm[1]); ic->ic_stats.is_rx_elem_unknown++; break; } @@ -1765,11 +1797,10 @@ chan > IEEE80211_CHAN_MAX || #endif isclr(ic->ic_chan_active, chan)) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID, - "%s: ignore %s with invalid channel %u\n", - __func__, - ISPROBE(subtype) ? "probe response" : "beacon", - chan); + IEEE80211_DISCARD(ic, IEEE80211_MSG_ELEMID, + wh, ieee80211_mgt_subtype_name[subtype >> + IEEE80211_FC0_SUBTYPE_SHIFT], + "invalid channel %u", chan); ic->ic_stats.is_rx_badchan++; return; } @@ -1784,11 +1815,10 @@ * the rssi value should be correct even for * different hop pattern in FH. */ - IEEE80211_DPRINTF(ic, IEEE80211_MSG_ELEMID, - "%s: ignore %s on channel %u marked " - "for channel %u\n", __func__, - ISPROBE(subtype) ? "probe response" : "beacon", - bchan, chan); + IEEE80211_DISCARD(ic, IEEE80211_MSG_ELEMID, + wh, ieee80211_mgt_subtype_name[subtype >> + IEEE80211_FC0_SUBTYPE_SHIFT], + "for off-channel %u\n", chan); ic->ic_stats.is_rx_chanmismatch++; return; } @@ -1804,7 +1834,7 @@ IEEE80211_ADDR_EQ(wh->i_addr2, ni->ni_bssid))) { if (ni->ni_erp != erp) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC, - "erp change from %s: was 0x%x, now 0x%x\n", + "[%s] erp change: was 0x%x, now 0x%x\n", ether_sprintf(wh->i_addr2), ni->ni_erp, erp); if (erp & IEEE80211_ERP_USE_PROTECTION) @@ -1816,8 +1846,9 @@ } if ((ni->ni_capinfo ^ capinfo) & IEEE80211_CAPINFO_SHORT_SLOTTIME) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC, - "capabilities change from %s: before 0x%x," - " now 0x%x\n", ether_sprintf(wh->i_addr2), + "[%s] capabilities change: before 0x%x," + " now 0x%x\n", + ether_sprintf(wh->i_addr2), ni->ni_capinfo, capinfo); /* * NB: we assume short preamble doesn't @@ -1829,7 +1860,8 @@ ni->ni_capinfo = capinfo; /* XXX statistic */ } - if (wme != NULL && ieee80211_parse_wmeparams(ic, wme)) + if (wme != NULL && + ieee80211_parse_wmeparams(ic, wme, wh)) ieee80211_wme_updateparams(ic); /* NB: don't need the rest of this */ return; @@ -1947,7 +1979,7 @@ } IEEE80211_VERIFY_ELEMENT(rates, IEEE80211_RATE_MAXSIZE); IEEE80211_VERIFY_ELEMENT(ssid, IEEE80211_NWID_LEN); - IEEE80211_VERIFY_SSID(ic->ic_bss, ssid, "probe"); + IEEE80211_VERIFY_SSID(ic->ic_bss, ssid); if (ni == ic->ic_bss) { if (ic->ic_opmode == IEEE80211_M_IBSS) { @@ -1967,17 +1999,17 @@ } else allocbs = 0; IEEE80211_DPRINTF(ic, IEEE80211_MSG_ASSOC, - "%s: probe req from %s\n", __func__, - ether_sprintf(wh->i_addr2)); + "[%s] recv probe req\n", ether_sprintf(wh->i_addr2)); ni->ni_rssi = rssi; ni->ni_rstamp = rstamp; rate = ieee80211_setup_rates(ic, ni, rates, xrates, IEEE80211_F_DOSORT | IEEE80211_F_DOFRATE | IEEE80211_F_DONEGO | IEEE80211_F_DODEL); if (rate & IEEE80211_RATE_BASIC) { - IEEE80211_DPRINTF(ic, IEEE80211_MSG_XRATE, - "[%s] received rate set invalid\n", - ether_sprintf(wh->i_addr2)); + IEEE80211_DISCARD(ic, IEEE80211_MSG_XRATE, + wh, ieee80211_mgt_subtype_name[subtype >> + IEEE80211_FC0_SUBTYPE_SHIFT], + "%s", "recv'd rate set invalid"); if (allocbs) /* reclaim immediately */ ieee80211_free_node(ni); } else { @@ -2001,26 +2033,22 @@ seq = le16toh(*(u_int16_t *)(frm + 2)); status = le16toh(*(u_int16_t *)(frm + 4)); IEEE80211_DPRINTF(ic, IEEE80211_MSG_AUTH, - "%s: algorithm %d seq %d from %s\n", - __func__, algo, seq, ether_sprintf(wh->i_addr2)); + "[%s] recv auth frame with algorithm %d seq %d\n", + ether_sprintf(wh->i_addr2), algo, seq); /* * Consult the ACL policy module if setup. >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200412032234.iB3MYVrT002972>
