Date: Mon, 22 Sep 2003 09:01:57 -0700 (PDT) From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 38422 for review Message-ID: <200309221601.h8MG1vRe009992@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=38422 Change 38422 by sam@sam_ebb on 2003/09/22 09:01:36 o allocate node table entries with a specific malloc type o add various statistics (still need per-node stats) o add SIOCG80211STATS ioctl to retrieve statistics o correct spelling of IEEE80211_IOCT_RTSTHRESHOLD Affected files ... .. //depot/projects/netperf/sys/net80211/ieee80211_crypto.c#2 edit .. //depot/projects/netperf/sys/net80211/ieee80211_input.c#7 edit .. //depot/projects/netperf/sys/net80211/ieee80211_ioctl.c#3 edit .. //depot/projects/netperf/sys/net80211/ieee80211_ioctl.h#2 edit .. //depot/projects/netperf/sys/net80211/ieee80211_node.c#8 edit .. //depot/projects/netperf/sys/net80211/ieee80211_output.c#6 edit .. //depot/projects/netperf/sys/net80211/ieee80211_var.h#5 edit Differences ... ==== //depot/projects/netperf/sys/net80211/ieee80211_crypto.c#2 (text+ko) ==== @@ -113,16 +113,23 @@ n0 = NULL; if ((ctx = ic->ic_wep_ctx) == NULL) { ctx = malloc(arc4_ctxlen(), M_DEVBUF, M_NOWAIT); - if (ctx == NULL) + if (ctx == NULL) { + /* XXX statistic */ goto fail; + } ic->ic_wep_ctx = ctx; } m = m0; left = m->m_pkthdr.len; MGET(n, M_DONTWAIT, m->m_type); n0 = n; - if (n == NULL) + if (n == NULL) { + if (txflag) + ic->ic_stats.is_tx_nombuf++; + else + ic->ic_stats.is_rx_nombuf++; goto fail; + } M_MOVE_PKTHDR(n, m); len = IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN; if (txflag) { @@ -188,8 +195,13 @@ len = n->m_len - noff; if (len == 0) { MGET(n->m_next, M_DONTWAIT, n->m_type); - if (n->m_next == NULL) + if (n->m_next == NULL) { + if (txflag) + ic->ic_stats.is_tx_nombuf++; + else + ic->ic_stats.is_rx_nombuf++; goto fail; + } n = n->m_next; n->m_len = MLEN; if (left >= MINCLSIZE) { @@ -223,8 +235,10 @@ else { n->m_len = noff; MGET(n->m_next, M_DONTWAIT, n->m_type); - if (n->m_next == NULL) + if (n->m_next == NULL) { + ic->ic_stats.is_tx_nombuf++; goto fail; + } n = n->m_next; n->m_len = sizeof(crcbuf); noff = 0; @@ -252,6 +266,7 @@ n0->m_len, -1, -1); } #endif + ic->ic_stats.is_rx_decryptcrc++; goto fail; } } ==== //depot/projects/netperf/sys/net80211/ieee80211_input.c#7 (text+ko) ==== @@ -113,6 +113,7 @@ if_printf(ifp, "receive packet with wrong version: %x\n", wh->i_fc[0]); ieee80211_unref_node(&ni); + ic->ic_stats.is_rx_badversion++; goto err; } @@ -125,6 +126,7 @@ */ if (m->m_pkthdr.len < sizeof(struct ieee80211_frame)) { /* XXX statistic */ + ic->ic_stats.is_rx_tooshort++; goto out; /* XXX */ } if (ic->ic_state != IEEE80211_S_SCAN) { @@ -135,6 +137,7 @@ "bss %s\n", __func__, ether_sprintf(wh->i_addr2))); /* not interested in */ + ic->ic_stats.is_rx_wrongbss++; goto out; } break; @@ -150,6 +153,7 @@ /* not interested in */ IEEE80211_DPRINTF2(("%s: other bss %s\n", __func__, ether_sprintf(wh->i_addr3))); + ic->ic_stats.is_rx_wrongbss++; goto out; } break; @@ -168,6 +172,7 @@ if ((wh->i_fc[1] & IEEE80211_FC1_RETRY) && rxseq == ni->ni_rxseq) { /* duplicate, silently discarded */ + ic->ic_stats.is_rx_dup++; /* XXX per-station stat */ goto out; } ni->ni_inact = 0; @@ -177,8 +182,10 @@ case IEEE80211_FC0_TYPE_DATA: switch (ic->ic_opmode) { case IEEE80211_M_STA: - if (dir != IEEE80211_FC1_DIR_FROMDS) + if (dir != IEEE80211_FC1_DIR_FROMDS) { + ic->ic_stats.is_rx_wrongdir++; goto out; + } if ((ifp->if_flags & IFF_SIMPLEX) && IEEE80211_IS_MULTICAST(wh->i_addr1) && IEEE80211_ADDR_EQ(wh->i_addr3, ic->ic_myaddr)) { @@ -188,17 +195,22 @@ * It should be silently discarded for * SIMPLEX interface. */ + ic->ic_stats.is_rx_mcastecho++; goto out; } break; case IEEE80211_M_IBSS: case IEEE80211_M_AHDEMO: - if (dir != IEEE80211_FC1_DIR_NODS) + if (dir != IEEE80211_FC1_DIR_NODS) { + ic->ic_stats.is_rx_wrongdir++; goto out; + } break; case IEEE80211_M_HOSTAP: - if (dir != IEEE80211_FC1_DIR_TODS) + if (dir != IEEE80211_FC1_DIR_TODS) { + ic->ic_stats.is_rx_wrongdir++; goto out; + } /* check if source STA is associated */ if (ni == ic->ic_bss) { IEEE80211_DPRINTF(("%s: data from unknown src " @@ -212,6 +224,7 @@ IEEE80211_REASON_NOT_AUTHED); ieee80211_free_node(ic, ni); } + ic->ic_stats.is_rx_notassoc++; goto err; } if (ni->ni_associd == 0) { @@ -222,6 +235,7 @@ IEEE80211_FC0_SUBTYPE_DISASSOC, IEEE80211_REASON_NOT_ASSOCED); ieee80211_unref_node(&ni); + ic->ic_stats.is_rx_notassoc++; goto err; } break; @@ -231,18 +245,24 @@ if (wh->i_fc[1] & IEEE80211_FC1_WEP) { if (ic->ic_flags & IEEE80211_F_WEPON) { m = ieee80211_wep_crypt(ifp, m, 0); - if (m == NULL) + if (m == NULL) { + ic->ic_stats.is_rx_wepfail++; goto err; + } wh = mtod(m, struct ieee80211_frame *); - } else + } else { + ic->ic_stats.is_rx_nowep++; goto out; + } } /* copy to listener after decrypt */ if (ic->ic_rawbpf) bpf_mtap(ic->ic_rawbpf, m); m = ieee80211_decap(ifp, m); - if (m == NULL) + if (m == NULL) { + ic->ic_stats.is_rx_decap++; goto err; + } ifp->if_ipackets++; /* perform as a bridge within the AP */ @@ -283,21 +303,29 @@ return; case IEEE80211_FC0_TYPE_MGT: - if (dir != IEEE80211_FC1_DIR_NODS) + if (dir != IEEE80211_FC1_DIR_NODS) { + ic->ic_stats.is_rx_wrongdir++; goto err; - if (ic->ic_opmode == IEEE80211_M_AHDEMO) + } + if (ic->ic_opmode == IEEE80211_M_AHDEMO) { + /* XXX statistic */ goto out; + } subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; /* drop frames without interest */ if (ic->ic_state == IEEE80211_S_SCAN) { if (subtype != IEEE80211_FC0_SUBTYPE_BEACON && - subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP) + subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP) { + ic->ic_stats.is_rx_mgtdiscard++; goto out; + } } else { if (ic->ic_opmode != IEEE80211_M_IBSS && - subtype == IEEE80211_FC0_SUBTYPE_BEACON) + subtype == IEEE80211_FC0_SUBTYPE_BEACON) { + ic->ic_stats.is_rx_mgtdiscard++; goto out; + } } if (ifp->if_flags & IFF_DEBUG) { @@ -333,6 +361,7 @@ return; case IEEE80211_FC0_TYPE_CTL: + ic->ic_stats.is_rx_ctl++; goto out; default: IEEE80211_DPRINTF(("%s: bad type %x\n", __func__, type)); @@ -472,6 +501,7 @@ IEEE80211_DPRINTF(("%s: extended rate set too large;" " only using %u of %u rates\n", __func__, nxrates, xrates[1])); + ic->ic_stats.is_rx_rstoobig++; } memcpy(rs->rs_rates + rs->rs_nrates, xrates+2, nxrates); rs->rs_nrates += nxrates; @@ -479,13 +509,13 @@ return ieee80211_fix_rate(ic, ni, flags); } -/* XXX statistics */ /* Verify the existence and length of __elem or get out. */ #define IEEE80211_VERIFY_ELEMENT(__elem, __maxlen) do { \ if ((__elem) == NULL) { \ IEEE80211_DPRINTF(("%s: no " #__elem "in %s frame\n", \ __func__, ieee80211_mgt_subtype_name[subtype >> \ IEEE80211_FC0_SUBTYPE_SHIFT])); \ + ic->ic_stats.is_rx_elem_missing++; \ return; \ } \ if ((__elem)[1] > (__maxlen)) { \ @@ -494,6 +524,7 @@ ieee80211_mgt_subtype_name[subtype >> \ IEEE80211_FC0_SUBTYPE_SHIFT], \ ether_sprintf(wh->i_addr2))); \ + ic->ic_stats.is_rx_elem_toobig++; \ return; \ } \ } while (0) @@ -505,6 +536,7 @@ ieee80211_mgt_subtype_name[subtype >> \ IEEE80211_FC0_SUBTYPE_SHIFT], \ ether_sprintf(wh->i_addr2))); \ + ic->ic_stats.is_rx_elem_toosmall++; \ return; \ } \ } while (0) @@ -595,6 +627,7 @@ IEEE80211_DPRINTF(("%s: invalid ERP " "element; length %u, expecting " "1\n", __func__, frm[1])); + ic->ic_stats.is_rx_elem_toobig++; break; } erp = frm[2]; @@ -602,6 +635,7 @@ default: IEEE80211_DPRINTF(("%s: element id %u/len %u " "ignored\n", __func__, *frm, frm[1])); + ic->ic_stats.is_rx_elem_unknown++; break; } frm += frm[1] + 2; @@ -617,6 +651,7 @@ "%u\n", __func__, ISPROBE(subtype) ? "probe response" : "beacon", chan)); + ic->ic_stats.is_rx_badchan++; return; } if (chan != bchan) { @@ -631,7 +666,7 @@ "for channel %u\n", __func__, ISPROBE(subtype) ? "probe response" : "beacon", bchan, chan)); - /* XXX statistic */ + ic->ic_stats.is_rx_chanmismatch++; return; } @@ -666,8 +701,10 @@ #endif if (ni == NULL) { ni = ieee80211_alloc_node(ic, wh->i_addr2); - if (ni == NULL) + if (ni == NULL) { + ic->ic_stats.is_rx_nodealloc++; return; + } ni->ni_esslen = ssid[1]; memset(ni->ni_essid, 0, sizeof(ni->ni_essid)); memcpy(ni->ni_essid, ssid + 2, ssid[1]); @@ -738,13 +775,16 @@ printf(" from %s\n", ether_sprintf(wh->i_addr2)); } #endif + ic->ic_stats.is_rx_ssidmismatch++; return; } if (ni == ic->ic_bss) { ni = ieee80211_dup_bss(ic, wh->i_addr2); - if (ni == NULL) + if (ni == NULL) { + ic->ic_stats.is_rx_nodealloc++; return; + } IEEE80211_DPRINTF(("%s: new req from %s\n", __func__, ether_sprintf(wh->i_addr2))); allocbs = 1; @@ -789,12 +829,15 @@ /* TODO: shared key auth */ IEEE80211_DPRINTF(("%s: unsupported auth %d from %s\n", __func__, algo, ether_sprintf(wh->i_addr2))); + ic->ic_stats.is_rx_auth_unsupported++; return; } switch (ic->ic_opmode) { case IEEE80211_M_IBSS: - if (ic->ic_state != IEEE80211_S_RUN || seq != 1) + if (ic->ic_state != IEEE80211_S_RUN || seq != 1) { + /* XXX statistic */ return; + } ieee80211_new_state(ic, IEEE80211_S_AUTH, wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK); break; @@ -808,8 +851,10 @@ return; if (ni == ic->ic_bss) { ni = ieee80211_alloc_node(ic, wh->i_addr2); - if (ni == NULL) + if (ni == NULL) { + ic->ic_stats.is_rx_nodealloc++; return; + } IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_bss->ni_bssid); ni->ni_rssi = rssi; ni->ni_rstamp = rstamp; @@ -826,8 +871,10 @@ break; case IEEE80211_M_STA: - if (ic->ic_state != IEEE80211_S_AUTH || seq != 2) + if (ic->ic_state != IEEE80211_S_AUTH || seq != 2) { + /* XXX statistic */ return; + } if (status != 0) { if_printf(&ic->ic_if, "authentication failed (reason %d) for %s\n", @@ -835,6 +882,7 @@ ether_sprintf(wh->i_addr3)); if (ni != ic->ic_bss) ni->ni_fails++; + ic->ic_stats.is_rx_auth_fail++; return; } ieee80211_new_state(ic, IEEE80211_S_ASSOC, @@ -874,6 +922,7 @@ if (!IEEE80211_ADDR_EQ(wh->i_addr3, ic->ic_bss->ni_bssid)) { IEEE80211_DPRINTF(("%s: ignore other bss from %s\n", __func__, ether_sprintf(wh->i_addr2))); + ic->ic_stats.is_rx_assoc_bss++; return; } capinfo = le16toh(*(u_int16_t *)frm); frm += 2; @@ -906,6 +955,7 @@ printf(" from %s\n", ether_sprintf(wh->i_addr2)); } #endif + ic->ic_stats.is_rx_ssidmismatch++; return; } if (ni == ic->ic_bss) { @@ -918,6 +968,7 @@ IEEE80211_REASON_ASSOC_NOT_AUTHED); ieee80211_free_node(ic, ni); } + ic->ic_stats.is_rx_assoc_notauth++; return; } /* XXX per-node cipher suite */ @@ -932,6 +983,7 @@ ni->ni_associd = 0; IEEE80211_SEND_MGMT(ic, ni, resp, IEEE80211_STATUS_CAPINFO); + ic->ic_stats.is_rx_assoc_capmismatch++; return; } ieee80211_setup_rates(ic, ni, rates, xrates, @@ -943,6 +995,7 @@ ni->ni_associd = 0; IEEE80211_SEND_MGMT(ic, ni, resp, IEEE80211_STATUS_BASIC_RATE); + ic->ic_stats.is_rx_assoc_norate++; return; } ni->ni_rssi = rssi; @@ -1000,6 +1053,7 @@ status, ether_sprintf(wh->i_addr3)); if (ni != ic->ic_bss) ni->ni_fails++; + ic->ic_stats.is_rx_auth_fail++; return; } ni->ni_associd = le16toh(*(u_int16_t *)frm); @@ -1036,6 +1090,7 @@ */ IEEE80211_VERIFY_LENGTH(efrm - frm, 2); reason = le16toh(*(u_int16_t *)frm); + ic->ic_stats.is_rx_deauth++; switch (ic->ic_opmode) { case IEEE80211_M_STA: ieee80211_new_state(ic, IEEE80211_S_AUTH, @@ -1065,6 +1120,7 @@ */ IEEE80211_VERIFY_LENGTH(efrm - frm, 2); reason = le16toh(*(u_int16_t *)frm); + ic->ic_stats.is_rx_disassoc++; switch (ic->ic_opmode) { case IEEE80211_M_STA: ieee80211_new_state(ic, IEEE80211_S_ASSOC, @@ -1088,6 +1144,7 @@ default: IEEE80211_DPRINTF(("%s: mgmt frame with subtype 0x%x not " "handled\n", __func__, subtype)); + ic->ic_stats.is_rx_badsubtype++; break; } #undef ISPROBE ==== //depot/projects/netperf/sys/net80211/ieee80211_ioctl.c#3 (text+ko) ==== @@ -720,6 +720,7 @@ int error = 0; u_int kid, len; struct ieee80211req *ireq; + struct ifreq *ifr; u_int8_t tmpkey[IEEE80211_KEYBUF_SIZE]; char tmpssid[IEEE80211_NWID_LEN]; struct ieee80211_channel *chan; @@ -823,7 +824,7 @@ case IEEE80211_IOC_POWERSAVESLEEP: ireq->i_val = ic->ic_lintval; break; - case IEEE80211_IOCT_RTSTHRESHOLD: + case IEEE80211_IOC_RTSTHRESHOLD: ireq->i_val = ic->ic_rtsthreshold; break; default: @@ -958,7 +959,7 @@ ic->ic_lintval = ireq->i_val; error = ENETRESET; break; - case IEEE80211_IOCT_RTSTHRESHOLD: + case IEEE80211_IOC_RTSTHRESHOLD: if (!(IEEE80211_RTS_MIN < ireq->i_val && ireq->i_val < IEEE80211_RTS_MAX)) { error = EINVAL; @@ -981,6 +982,10 @@ break; error = ieee80211_cfgset(ifp, cmd, data); break; + case SIOCG80211STATS: + ifr = (struct ifreq *)data; + copyout(&ic->ic_stats, ifr->ifr_data, sizeof (ic->ic_stats)); + break; default: error = ether_ioctl(ifp, cmd, data); break; ==== //depot/projects/netperf/sys/net80211/ieee80211_ioctl.h#2 (text+ko) ==== @@ -74,11 +74,54 @@ #define IEEE80211_POWERSAVE_PSP_CAM 3 #define IEEE80211_POWERSAVE_ON IEEE80211_POWERSAVE_CAM #define IEEE80211_IOC_POWERSAVESLEEP 11 -#define IEEE80211_IOCT_RTSTHRESHOLD 12 +#define IEEE80211_IOC_RTSTHRESHOLD 12 #ifndef IEEE80211_CHAN_ANY #define IEEE80211_CHAN_ANY 0xffff /* token for ``any channel'' */ #endif + +struct ieee80211_stats { + u_int32_t is_rx_badversion; /* rx frame with bad version */ + u_int32_t is_rx_tooshort; /* rx frame too short */ + u_int32_t is_rx_wrongbss; /* rx from wrong bssid */ + u_int32_t is_rx_dup; /* rx discard 'cuz dup */ + u_int32_t is_rx_wrongdir; /* rx w/ wrong direction */ + u_int32_t is_rx_mcastecho; /* rx discard 'cuz mcast echo */ + u_int32_t is_rx_notassoc; /* rx discard 'cuz sta !assoc */ + u_int32_t is_rx_nowep; /* rx w/ wep but wep !config */ + u_int32_t is_rx_wepfail; /* rx wep processing failed */ + u_int32_t is_rx_decap; /* rx decapsulation failed */ + u_int32_t is_rx_mgtdiscard; /* rx discard mgt frames */ + u_int32_t is_rx_ctl; /* rx discard ctrl frames */ + u_int32_t is_rx_rstoobig; /* rx rate set truncated */ + u_int32_t is_rx_elem_missing; /* rx required element missing*/ + u_int32_t is_rx_elem_toobig; /* rx element too big */ + u_int32_t is_rx_elem_toosmall; /* rx element too small */ + u_int32_t is_rx_elem_unknown; /* rx element unknown */ + u_int32_t is_rx_badchan; /* rx frame w/ invalid chan */ + u_int32_t is_rx_chanmismatch; /* rx frame chan mismatch */ + u_int32_t is_rx_nodealloc; /* rx frame dropped */ + u_int32_t is_rx_ssidmismatch; /* rx frame ssid mismatch */ + u_int32_t is_rx_auth_unsupported; /* rx w/ unsupported auth alg */ + u_int32_t is_rx_auth_fail; /* rx sta auth failure */ + u_int32_t is_rx_assoc_bss; /* rx assoc from wrong bssid */ + u_int32_t is_rx_assoc_notauth; /* rx assoc w/o auth */ + u_int32_t is_rx_assoc_capmismatch;/* rx assoc w/ cap mismatch */ + u_int32_t is_rx_assoc_norate; /* rx assoc w/ no rate match */ + u_int32_t is_rx_deauth; /* rx deauthentication */ + u_int32_t is_rx_disassoc; /* rx disassociation */ + u_int32_t is_rx_badsubtype; /* rx frame w/ unknown subtype*/ + u_int32_t is_rx_nombuf; /* rx failed for lack of mbuf */ + u_int32_t is_rx_decryptcrc; /* rx decrypt failed on crc */ + u_int32_t is_tx_nombuf; /* tx failed for lack of mbuf */ + u_int32_t is_tx_nonode; /* tx failed for no node */ + u_int32_t is_tx_unknownmgt; /* tx of unknown mgt frame */ + u_int32_t is_scan_active; /* active scans started */ + u_int32_t is_scan_passive; /* passive scans started */ + u_int32_t is_node_timeout; /* nodes timed out inactivity */ +}; + +#define SIOCG80211STATS _IOWR('i', 236, struct ifreq) #endif /* __FreeBSD__ */ #endif /* _NET80211_IEEE80211_IOCTL_H_ */ ==== //depot/projects/netperf/sys/net80211/ieee80211_node.c#8 (text+ko) ==== @@ -78,6 +78,8 @@ static void _ieee80211_free_node(struct ieee80211com *, struct ieee80211_node *); +MALLOC_DEFINE(M_80211_NODE, "node", "802.11 node state"); + void ieee80211_node_attach(struct ifnet *ifp) { @@ -145,8 +147,11 @@ * In all but hostap mode scanning starts off in * an active mode before switching to passive. */ - if (ic->ic_opmode != IEEE80211_M_HOSTAP) + if (ic->ic_opmode != IEEE80211_M_HOSTAP) { ic->ic_flags |= IEEE80211_F_ASCAN; + ic->ic_stats.is_scan_active++; + } else + ic->ic_stats.is_scan_passive++; if (ifp->if_flags & IFF_DEBUG) if_printf(ifp, "begin %s scan\n", (ic->ic_flags & IEEE80211_F_ASCAN) ? @@ -393,14 +398,14 @@ static struct ieee80211_node * ieee80211_node_alloc(struct ieee80211com *ic) { - return malloc(sizeof(struct ieee80211_node), M_DEVBUF, + return malloc(sizeof(struct ieee80211_node), M_80211_NODE, M_NOWAIT | M_ZERO); } static void ieee80211_node_free(struct ieee80211com *ic, struct ieee80211_node *ni) { - free(ni, M_DEVBUF); + free(ni, M_80211_NODE); } static void @@ -559,6 +564,7 @@ IEEE80211_FC0_SUBTYPE_DEAUTH, IEEE80211_REASON_AUTH_EXPIRE); ieee80211_free_node(ic, ni); + ic->ic_stats.is_node_timeout++; ni = nextbs; } else ni = TAILQ_NEXT(ni, ni_list); ==== //depot/projects/netperf/sys/net80211/ieee80211_output.c#6 (text+ko) ==== @@ -155,7 +155,7 @@ if (m->m_len < sizeof(struct ether_header)) { m = m_pullup(m, sizeof(struct ether_header)); if (m == NULL) { - /* XXX statistic */ + ic->ic_stats.is_tx_nombuf++; goto bad; } } @@ -171,7 +171,7 @@ * multicast/broadcast frame. */ if (!IEEE80211_IS_MULTICAST(eh.ether_dhost)) { - /* ic->ic_stats.st_tx_nonode++; XXX statistic */ + ic->ic_stats.is_tx_nonode++; goto bad; } ni = ic->ic_bss; @@ -189,8 +189,10 @@ llc->llc_snap.org_code[2] = 0; llc->llc_snap.ether_type = eh.ether_type; M_PREPEND(m, sizeof(struct ieee80211_frame), M_DONTWAIT); - if (m == NULL) + if (m == NULL) { + ic->ic_stats.is_tx_nombuf++; goto bad; + } wh = mtod(m, struct ieee80211_frame *); wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_DATA; *(u_int16_t *)wh->i_dur = 0; @@ -301,7 +303,7 @@ ieee80211_send_mgmt(struct ieee80211com *ic, struct ieee80211_node *ni, int type, int arg) { -#define senderr(_x) do { ret = _x; goto bad; } while (0) +#define senderr(_x, _v) do { ic->ic_stats._v++; ret = _x; goto bad; } while (0) struct ifnet *ifp = &ic->ic_if; struct mbuf *m; u_int8_t *frm; @@ -332,7 +334,7 @@ + 2 + IEEE80211_RATE_SIZE + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)); if (m == NULL) - senderr(ENOMEM); + senderr(ENOMEM, is_tx_nombuf); m->m_data += sizeof(struct ieee80211_frame); frm = mtod(m, u_int8_t *); frm = ieee80211_add_ssid(frm, ic->ic_des_essid, ic->ic_des_esslen); @@ -362,7 +364,7 @@ + 6 + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)); if (m == NULL) - senderr(ENOMEM); + senderr(ENOMEM, is_tx_nombuf); m->m_data += sizeof(struct ieee80211_frame); frm = mtod(m, u_int8_t *); @@ -406,7 +408,7 @@ case IEEE80211_FC0_SUBTYPE_AUTH: MGETHDR(m, M_DONTWAIT, MT_DATA); if (m == NULL) - senderr(ENOMEM); + senderr(ENOMEM, is_tx_nombuf); MH_ALIGN(m, 2 * 3); m->m_pkthdr.len = m->m_len = 6; frm = mtod(m, u_int8_t *); @@ -424,7 +426,7 @@ ether_sprintf(ni->ni_macaddr), arg); MGETHDR(m, M_DONTWAIT, MT_DATA); if (m == NULL) - senderr(ENOMEM); + senderr(ENOMEM, is_tx_nombuf); MH_ALIGN(m, 2); m->m_pkthdr.len = m->m_len = 2; *mtod(m, u_int16_t *) = htole16(arg); /* reason */ @@ -449,7 +451,7 @@ + 2 + IEEE80211_RATE_SIZE + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)); if (m == NULL) - senderr(ENOMEM); + senderr(ENOMEM, is_tx_nombuf); m->m_data += sizeof(struct ieee80211_frame); frm = mtod(m, u_int8_t *); @@ -505,7 +507,7 @@ + 2 + IEEE80211_RATE_SIZE + 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE)); if (m == NULL) - senderr(ENOMEM); + senderr(ENOMEM, is_tx_nombuf); m->m_data += sizeof(struct ieee80211_frame); frm = mtod(m, u_int8_t *); @@ -536,7 +538,7 @@ ether_sprintf(ni->ni_macaddr), arg); MGETHDR(m, M_DONTWAIT, MT_DATA); if (m == NULL) - senderr(ENOMEM); + senderr(ENOMEM, is_tx_nombuf); MH_ALIGN(m, 2); m->m_pkthdr.len = m->m_len = 2; *mtod(m, u_int16_t *) = htole16(arg); /* reason */ @@ -545,7 +547,7 @@ default: IEEE80211_DPRINTF(("%s: invalid mgmt frame type %u\n", __func__, type)); - senderr(EINVAL); + senderr(EINVAL, is_tx_unknownmgt); /* NOTREACHED */ } ==== //depot/projects/netperf/sys/net80211/ieee80211_var.h#5 (text+ko) ==== @@ -40,6 +40,7 @@ #include <net80211/ieee80211.h> #include <net80211/ieee80211_crypto.h> +#include <net80211/ieee80211_ioctl.h> /* for ieee80211_stats */ #include <net80211/ieee80211_node.h> #include <net80211/ieee80211_proto.h> @@ -192,6 +193,7 @@ int ic_wep_txkey; /* default tx key index */ void *ic_wep_ctx; /* wep crypt context */ u_int32_t ic_iv; /* initial vector for wep */ + struct ieee80211_stats ic_stats; /* statistics */ }; #define ic_if ic_ac.ac_if #define ic_softc ic_if.if_softchelp
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309221601.h8MG1vRe009992>
