mac80211: New stat counters for multicast and unicast forwarded frames
authorDaniel Walker <dwalker@fifo99.com>
Tue, 18 Aug 2009 17:59:00 +0000 (10:59 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 20 Aug 2009 15:36:04 +0000 (11:36 -0400)
This expands on the current fwded_frames stat counter which should be equal to
the total of these two new counters.  The new counters are called "fwded_mcast"
and "fwded_unicast".

Signed-off-by: Daniel Walker <dwalker@fifo99.com>
Signed-off-by: Javier Cardona <javier@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/debugfs_netdev.c
net/mac80211/ieee80211_i.h
net/mac80211/mesh_hwmp.c
net/mac80211/rx.c

index e9ec6ca..61234e7 100644 (file)
@@ -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(fwded_mcast);
+       MESHSTATS_ADD(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(fwded_mcast);
+       MESHSTATS_DEL(fwded_unicast);
        MESHSTATS_DEL(fwded_frames);
        MESHSTATS_DEL(dropped_frames_ttl);
        MESHSTATS_DEL(dropped_frames_no_route);
index a07f017..93e618a 100644 (file)
@@ -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;
index 7aeba00..e12a786 100644 (file)
@@ -497,6 +497,7 @@ 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++;
        }
 }
@@ -555,6 +556,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;
 
index 4cd9e45..7065fd7 100644 (file)
@@ -1550,7 +1550,10 @@ 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->addr1)) {
+                       if (is_multicast_ether_addr(fwd_hdr->addr1))
+                               IEEE80211_IFSTA_MESH_CTR_INC(&sdata->u.mesh,
+                                                               fwded_mcast);
+                       else {
                                int err;
                                /*
                                 * Save TA to addr1 to send TA a path error if a
@@ -1564,6 +1567,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
                                 * 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);