Daniel, Thanks for the patch, that's useful. I've reworked it so it can be applied to the HEAD of wireless-testing. Comments in line and reworked patch in a follow-up email. Cheers, Javier > --- > net/mac80211/debugfs_netdev.c | 6 ++++++ > net/mac80211/ieee80211_i.h | 6 +++++- > net/mac80211/mesh_hwmp.c | 4 ++++ > net/mac80211/rx.c | 9 +++++++-- > 4 files changed, 22 insertions(+), 3 deletions(-) > > diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c > index e9ec6ca..00f7c6e 100644 > --- a/net/mac80211/debugfs_netdev.c > +++ b/net/mac80211/debugfs_netdev.c > @@ -116,6 +116,8 @@ IEEE80211_IF_FILE(peer, u.wds.remote_addr, MAC); > > #ifdef CONFIG_MAC80211_MESH > /* Mesh stats attributes */ > +IEEE80211_IF_FILE(fwded_mcast, u.mesh.mshstats.fwded_mcast, DEC); > +IEEE80211_IF_FILE(fwded_unicast, u.mesh.mshstats.fwded_unicast, DEC); > IEEE80211_IF_FILE(fwded_frames, u.mesh.mshstats.fwded_frames, DEC); > IEEE80211_IF_FILE(dropped_frames_ttl, u.mesh.mshstats.dropped_frames_ttl, DEC); > IEEE80211_IF_FILE(dropped_frames_no_route, > @@ -205,6 +207,8 @@ static void add_mesh_stats(struct ieee80211_sub_if_data *sdata) > { > sdata->mesh_stats_dir = debugfs_create_dir("mesh_stats", > sdata->debugfsdir); > + MESHSTATS_ADD(mcast_frames); > + MESHSTATS_ADD(unicast_frames); mcast_frames -> fwded_mcast unicast_frames -> fwded_unicast > MESHSTATS_ADD(fwded_frames); > MESHSTATS_ADD(dropped_frames_ttl); > MESHSTATS_ADD(dropped_frames_no_route); > @@ -327,6 +331,8 @@ static void del_monitor_files(struct ieee80211_sub_if_data *sdata) > > static void del_mesh_stats(struct ieee80211_sub_if_data *sdata) > { > + MESHSTATS_DEL(mcast_frames); > + MESHSTATS_DEL(unicast_frames); Same as previous comment. > MESHSTATS_DEL(fwded_frames); > MESHSTATS_DEL(dropped_frames_ttl); > MESHSTATS_DEL(dropped_frames_no_route); > diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h > index d6bd7dd..82c39d9 100644 > --- a/net/mac80211/ieee80211_i.h > +++ b/net/mac80211/ieee80211_i.h > @@ -212,7 +212,9 @@ struct ieee80211_if_vlan { > }; > > struct mesh_stats { > - __u32 fwded_frames; /* Mesh forwarded frames */ > + __u32 fwded_mcast; /* Mesh forwarded multicast frames */ > + __u32 fwded_unicast; /* Mesh forwarded unicast frames */ > + __u32 fwded_frames; /* Mesh total forwarded frames */ > __u32 dropped_frames_ttl; /* Not transmitted since mesh_ttl == 0*/ > __u32 dropped_frames_no_route; /* Not transmitted, no route found */ > atomic_t estab_plinks; > @@ -506,6 +508,8 @@ struct ieee80211_sub_if_data { > #ifdef CONFIG_MAC80211_MESH > struct dentry *mesh_stats_dir; > struct { > + struct dentry *fwded_mcast; > + struct dentry *fwded_unicast; > struct dentry *fwded_frames; > struct dentry *dropped_frames_ttl; > struct dentry *dropped_frames_no_route; > diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c > index e1a763e..593ea64 100644 > --- a/net/mac80211/mesh_hwmp.c > +++ b/net/mac80211/mesh_hwmp.c > @@ -478,6 +478,8 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, > hopcount, ttl, cpu_to_le32(lifetime), > cpu_to_le32(metric), cpu_to_le32(preq_id), > sdata); > + > + ifmsh->mshstats.fwded_mcast++; > ifmsh->mshstats.fwded_frames++; > } > } > @@ -536,6 +538,8 @@ static void hwmp_prep_frame_process(struct ieee80211_sub_if_data *sdata, > cpu_to_le32(lifetime), cpu_to_le32(metric), > 0, sdata); > rcu_read_unlock(); > + > + sdata->u.mesh.mshstats.fwded_unicast++; > sdata->u.mesh.mshstats.fwded_frames++; > return; > > diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c > index 25a669c..cf21f57 100644 > --- a/net/mac80211/rx.c > +++ b/net/mac80211/rx.c > @@ -1543,16 +1543,21 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) > info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; > info->control.vif = &rx->sdata->vif; > ieee80211_select_queue(local, fwd_skb); > - if (is_multicast_ether_addr(fwd_hdr->addr3)) > + if (is_multicast_ether_addr(fwd_hdr->addr3)) { > memcpy(fwd_hdr->addr1, fwd_hdr->addr3, > ETH_ALEN); > - else { > + IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh, > + fwded_mcast); > + } else { > int err = mesh_nexthop_lookup(fwd_skb, sdata); > /* Failed to immediately resolve next hop: > * fwded frame was dropped or will be added > * later to the pending skb queue. */ > if (err) > return RX_DROP_MONITOR; > + > + IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh, > + fwded_unicast); > } > IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh, > fwded_frames); Hunk will fail due to recent changes to multicast frame format. -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html