Commit 6d488517 authored by Thomas Huehn's avatar Thomas Huehn Committed by Johannes Berg
Browse files

mac80211: add new Minstrel statistic output via csv



This patch adds a new debugfs file "rc_stats_csv" to output Minstrels
statistics in a common csv format that is easy to parse.

Signed-off-by: default avatarThomas Huehn <thomas@net.t-labs.tu-berlin.de>
Signed-off-by: default avatarStefan Venz <ikstream86@gmail.com>
Acked-by: default avatarFelix Fietkau <nbd@openwrt.org>
[remove printing current time of day]
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 9c00bb72
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -13,7 +13,6 @@
#define EWMA_DIV	128
#define EWMA_DIV	128
#define SAMPLE_COLUMNS	10	/* number of columns in sample table */
#define SAMPLE_COLUMNS	10	/* number of columns in sample table */



/* scaled fraction values */
/* scaled fraction values */
#define MINSTREL_SCALE  16
#define MINSTREL_SCALE  16
#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
#define MINSTREL_FRAC(val, div) (((val) << MINSTREL_SCALE) / div)
@@ -95,6 +94,7 @@ struct minstrel_sta_info {


#ifdef CONFIG_MAC80211_DEBUGFS
#ifdef CONFIG_MAC80211_DEBUGFS
	struct dentry *dbg_stats;
	struct dentry *dbg_stats;
	struct dentry *dbg_stats_csv;
#endif
#endif
};
};


@@ -121,7 +121,6 @@ struct minstrel_priv {
	u32 fixed_rate_idx;
	u32 fixed_rate_idx;
	struct dentry *dbg_fixed_rate;
	struct dentry *dbg_fixed_rate;
#endif
#endif

};
};


struct minstrel_debugfs_info {
struct minstrel_debugfs_info {
@@ -135,6 +134,7 @@ void minstrel_remove_sta_debugfs(void *priv, void *priv_sta);


/* debugfs */
/* debugfs */
int minstrel_stats_open(struct inode *inode, struct file *file);
int minstrel_stats_open(struct inode *inode, struct file *file);
int minstrel_stats_csv_open(struct inode *inode, struct file *file);
ssize_t minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos);
ssize_t minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos);
int minstrel_stats_release(struct inode *inode, struct file *file);
int minstrel_stats_release(struct inode *inode, struct file *file);


+79 −11
Original line number Original line Diff line number Diff line
@@ -54,6 +54,22 @@
#include <net/mac80211.h>
#include <net/mac80211.h>
#include "rc80211_minstrel.h"
#include "rc80211_minstrel.h"


ssize_t
minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos)
{
	struct minstrel_debugfs_info *ms;

	ms = file->private_data;
	return simple_read_from_buffer(buf, len, ppos, ms->buf, ms->len);
}

int
minstrel_stats_release(struct inode *inode, struct file *file)
{
	kfree(file->private_data);
	return 0;
}

int
int
minstrel_stats_open(struct inode *inode, struct file *file)
minstrel_stats_open(struct inode *inode, struct file *file)
{
{
@@ -115,25 +131,72 @@ minstrel_stats_open(struct inode *inode, struct file *file)
	return 0;
	return 0;
}
}


ssize_t
static const struct file_operations minstrel_stat_fops = {
minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos)
	.owner = THIS_MODULE,
	.open = minstrel_stats_open,
	.read = minstrel_stats_read,
	.release = minstrel_stats_release,
	.llseek = default_llseek,
};

int
minstrel_stats_csv_open(struct inode *inode, struct file *file)
{
{
	struct minstrel_sta_info *mi = inode->i_private;
	struct minstrel_debugfs_info *ms;
	struct minstrel_debugfs_info *ms;
	unsigned int i, tp, prob, eprob;
	char *p;

	ms = kmalloc(2048, GFP_KERNEL);
	if (!ms)
		return -ENOMEM;

	file->private_data = ms;
	p = ms->buf;

	for (i = 0; i < mi->n_rates; i++) {
		struct minstrel_rate *mr = &mi->r[i];
		struct minstrel_rate_stats *mrs = &mi->r[i].stats;

		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[0]) ? "A" : ""));
		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[1]) ? "B" : ""));
		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[2]) ? "C" : ""));
		p += sprintf(p, "%s" ,((i == mi->max_tp_rate[3]) ? "D" : ""));
		p += sprintf(p, "%s" ,((i == mi->max_prob_rate) ? "P" : ""));

		p += sprintf(p, ",%u%s", mr->bitrate / 2,
				(mr->bitrate & 1 ? ".5," : ","));
		p += sprintf(p, "%u,", i);
		p += sprintf(p, "%u,",mr->perfect_tx_time);

		tp = MINSTREL_TRUNC(mrs->cur_tp / 10);
		prob = MINSTREL_TRUNC(mrs->cur_prob * 1000);
		eprob = MINSTREL_TRUNC(mrs->probability * 1000);

		p += sprintf(p, "%u.%u,%u.%u,%u.%u,%u,%u,%u,"
				"%llu,%llu,%d,%d\n",
				tp / 10, tp % 10,
				eprob / 10, eprob % 10,
				prob / 10, prob % 10,
				mrs->retry_count,
				mrs->last_success,
				mrs->last_attempts,
				(unsigned long long)mrs->succ_hist,
				(unsigned long long)mrs->att_hist,
				mi->total_packets - mi->sample_packets,
				mi->sample_packets);


	ms = file->private_data;
	return simple_read_from_buffer(buf, len, ppos, ms->buf, ms->len);
	}
	}
	ms->len = p - ms->buf;

	WARN_ON(ms->len + sizeof(*ms) > 2048);


int
minstrel_stats_release(struct inode *inode, struct file *file)
{
	kfree(file->private_data);
	return 0;
	return 0;
}
}


static const struct file_operations minstrel_stat_fops = {
static const struct file_operations minstrel_stat_csv_fops = {
	.owner = THIS_MODULE,
	.owner = THIS_MODULE,
	.open = minstrel_stats_open,
	.open = minstrel_stats_csv_open,
	.read = minstrel_stats_read,
	.read = minstrel_stats_read,
	.release = minstrel_stats_release,
	.release = minstrel_stats_release,
	.llseek = default_llseek,
	.llseek = default_llseek,
@@ -146,6 +209,9 @@ minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir)


	mi->dbg_stats = debugfs_create_file("rc_stats", S_IRUGO, dir, mi,
	mi->dbg_stats = debugfs_create_file("rc_stats", S_IRUGO, dir, mi,
			&minstrel_stat_fops);
			&minstrel_stat_fops);

	mi->dbg_stats_csv = debugfs_create_file("rc_stats_csv", S_IRUGO, dir,
			mi, &minstrel_stat_csv_fops);
}
}


void
void
@@ -154,4 +220,6 @@ minstrel_remove_sta_debugfs(void *priv, void *priv_sta)
	struct minstrel_sta_info *mi = priv_sta;
	struct minstrel_sta_info *mi = priv_sta;


	debugfs_remove(mi->dbg_stats);
	debugfs_remove(mi->dbg_stats);

	debugfs_remove(mi->dbg_stats_csv);
}
}