svn commit: r283313 - head/sys/net80211
Andrey V. Elsukov
ae at FreeBSD.org
Sat May 23 09:49:41 UTC 2015
Author: ae
Date: Sat May 23 09:49:40 2015
New Revision: 283313
URL: https://svnweb.freebsd.org/changeset/base/283313
Log:
Properly update TX statistics for wlan(4).
ieee80211_pwrsave() can fail due to queue overflow, check its return code
and increment oerrors counter when it fails. Also handle more error cases
and update oerrors counter when we don't send mbuf due to some errors.
Return ENETDOWN when parent interface isn't ready. Update obytes and omcasts
counters in corresponding places.
PR: 184626
Differential Revision: https://reviews.freebsd.org/D2621
Reviewed by: adrian
MFC after: 1 week
Modified:
head/sys/net80211/ieee80211_output.c
head/sys/net80211/ieee80211_wds.c
Modified: head/sys/net80211/ieee80211_output.c
==============================================================================
--- head/sys/net80211/ieee80211_output.c Sat May 23 09:48:59 2015 (r283312)
+++ head/sys/net80211/ieee80211_output.c Sat May 23 09:49:40 2015 (r283313)
@@ -132,7 +132,7 @@ ieee80211_vap_pkt_send_dest(struct ieee8
{
struct ieee80211com *ic = vap->iv_ic;
struct ifnet *ifp = vap->iv_ifp;
- int error;
+ int error, len, mcast;
if ((ni->ni_flags & IEEE80211_NODE_PWR_MGT) &&
(m->m_flags & M_PWR_SAV) == 0) {
@@ -142,7 +142,8 @@ ieee80211_vap_pkt_send_dest(struct ieee8
* the frame back when the time is right.
* XXX lose WDS vap linkage?
*/
- (void) ieee80211_pwrsave(ni, m);
+ if (ieee80211_pwrsave(ni, m) != 0)
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
ieee80211_free_node(ni);
/*
@@ -171,6 +172,8 @@ ieee80211_vap_pkt_send_dest(struct ieee8
* interface it (might have been) received on.
*/
m->m_pkthdr.rcvif = (void *)ni;
+ mcast = (m->m_flags & (M_MCAST | M_BCAST)) ? 1: 0;
+ len = m->m_pkthdr.len;
BPF_MTAP(ifp, m); /* 802.3 tx */
@@ -236,7 +239,7 @@ ieee80211_vap_pkt_send_dest(struct ieee8
/* NB: stat+msg handled in ieee80211_encap */
IEEE80211_TX_UNLOCK(ic);
ieee80211_free_node(ni);
- /* XXX better status? */
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
return (ENOBUFS);
}
}
@@ -250,8 +253,11 @@ ieee80211_vap_pkt_send_dest(struct ieee8
if (error != 0) {
/* NB: IFQ_HANDOFF reclaims mbuf */
ieee80211_free_node(ni);
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
} else {
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
+ if_inc_counter(ifp, IFCOUNTER_OMCASTS, mcast);
+ if_inc_counter(ifp, IFCOUNTER_OBYTES, len);
}
ic->ic_lastdata = ticks;
@@ -315,6 +321,7 @@ ieee80211_start_pkt(struct ieee80211vap
eh->ether_dhost, "mcast", "%s", "on DWDS");
vap->iv_stats.is_dwds_mcast++;
m_freem(m);
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
/* XXX better status? */
return (ENOBUFS);
}
@@ -397,7 +404,8 @@ ieee80211_start_pkt(struct ieee80211vap
* for transmit.
*/
ic->ic_lastdata = ticks;
- (void) ieee80211_pwrsave(ni, m);
+ if (ieee80211_pwrsave(ni, m) != 0)
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
ieee80211_free_node(ni);
ieee80211_new_state(vap, IEEE80211_S_RUN, 0);
return (0);
@@ -429,9 +437,9 @@ ieee80211_vap_transmit(struct ifnet *ifp
IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT,
"%s: ignore queue, parent %s not up+running\n",
__func__, parent->if_xname);
- /* XXX stat */
m_freem(m);
- return (EINVAL);
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
+ return (ENETDOWN);
}
/*
@@ -453,7 +461,8 @@ ieee80211_vap_transmit(struct ifnet *ifp
IEEE80211_UNLOCK(ic);
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
m_freem(m);
- return (EINVAL);
+ if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
+ return (ENETDOWN);
}
IEEE80211_UNLOCK(ic);
}
Modified: head/sys/net80211/ieee80211_wds.c
==============================================================================
--- head/sys/net80211/ieee80211_wds.c Sat May 23 09:48:59 2015 (r283312)
+++ head/sys/net80211/ieee80211_wds.c Sat May 23 09:49:40 2015 (r283313)
@@ -301,8 +301,12 @@ ieee80211_dwds_mcast(struct ieee80211vap
/* NB: IFQ_HANDOFF reclaims mbuf */
if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
ieee80211_free_node(ni);
- } else
+ } else {
if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
+ if_inc_counter(ifp, IFCOUNTER_OMCASTS, 1);
+ if_inc_counter(ifp, IFCOUNTER_OBYTES,
+ m->m_pkthdr.len);
+ }
}
}
More information about the svn-src-head
mailing list