Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/mac80211/rc80211_minstrel_debugfs.c
15109 views
1
/*
2
* Copyright (C) 2008 Felix Fietkau <[email protected]>
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2 as
6
* published by the Free Software Foundation.
7
*
8
* Based on minstrel.c:
9
* Copyright (C) 2005-2007 Derek Smithies <[email protected]>
10
* Sponsored by Indranet Technologies Ltd
11
*
12
* Based on sample.c:
13
* Copyright (c) 2005 John Bicket
14
* All rights reserved.
15
*
16
* Redistribution and use in source and binary forms, with or without
17
* modification, are permitted provided that the following conditions
18
* are met:
19
* 1. Redistributions of source code must retain the above copyright
20
* notice, this list of conditions and the following disclaimer,
21
* without modification.
22
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
23
* similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
24
* redistribution must be conditioned upon including a substantially
25
* similar Disclaimer requirement for further binary redistribution.
26
* 3. Neither the names of the above-listed copyright holders nor the names
27
* of any contributors may be used to endorse or promote products derived
28
* from this software without specific prior written permission.
29
*
30
* Alternatively, this software may be distributed under the terms of the
31
* GNU General Public License ("GPL") version 2 as published by the Free
32
* Software Foundation.
33
*
34
* NO WARRANTY
35
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
36
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37
* LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
38
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
39
* THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
40
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
41
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
42
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
43
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
44
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
45
* THE POSSIBILITY OF SUCH DAMAGES.
46
*/
47
#include <linux/netdevice.h>
48
#include <linux/types.h>
49
#include <linux/skbuff.h>
50
#include <linux/debugfs.h>
51
#include <linux/ieee80211.h>
52
#include <linux/slab.h>
53
#include <net/mac80211.h>
54
#include "rc80211_minstrel.h"
55
56
int
57
minstrel_stats_open(struct inode *inode, struct file *file)
58
{
59
struct minstrel_sta_info *mi = inode->i_private;
60
struct minstrel_debugfs_info *ms;
61
unsigned int i, tp, prob, eprob;
62
char *p;
63
64
ms = kmalloc(sizeof(*ms) + 4096, GFP_KERNEL);
65
if (!ms)
66
return -ENOMEM;
67
68
file->private_data = ms;
69
p = ms->buf;
70
p += sprintf(p, "rate throughput ewma prob this prob "
71
"this succ/attempt success attempts\n");
72
for (i = 0; i < mi->n_rates; i++) {
73
struct minstrel_rate *mr = &mi->r[i];
74
75
*(p++) = (i == mi->max_tp_rate) ? 'T' : ' ';
76
*(p++) = (i == mi->max_tp_rate2) ? 't' : ' ';
77
*(p++) = (i == mi->max_prob_rate) ? 'P' : ' ';
78
p += sprintf(p, "%3u%s", mr->bitrate / 2,
79
(mr->bitrate & 1 ? ".5" : " "));
80
81
tp = mr->cur_tp / ((18000 << 10) / 96);
82
prob = mr->cur_prob / 18;
83
eprob = mr->probability / 18;
84
85
p += sprintf(p, " %6u.%1u %6u.%1u %6u.%1u "
86
"%3u(%3u) %8llu %8llu\n",
87
tp / 10, tp % 10,
88
eprob / 10, eprob % 10,
89
prob / 10, prob % 10,
90
mr->last_success,
91
mr->last_attempts,
92
(unsigned long long)mr->succ_hist,
93
(unsigned long long)mr->att_hist);
94
}
95
p += sprintf(p, "\nTotal packet count:: ideal %d "
96
"lookaround %d\n\n",
97
mi->packet_count - mi->sample_count,
98
mi->sample_count);
99
ms->len = p - ms->buf;
100
101
return 0;
102
}
103
104
ssize_t
105
minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos)
106
{
107
struct minstrel_debugfs_info *ms;
108
109
ms = file->private_data;
110
return simple_read_from_buffer(buf, len, ppos, ms->buf, ms->len);
111
}
112
113
int
114
minstrel_stats_release(struct inode *inode, struct file *file)
115
{
116
kfree(file->private_data);
117
return 0;
118
}
119
120
static const struct file_operations minstrel_stat_fops = {
121
.owner = THIS_MODULE,
122
.open = minstrel_stats_open,
123
.read = minstrel_stats_read,
124
.release = minstrel_stats_release,
125
.llseek = default_llseek,
126
};
127
128
void
129
minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir)
130
{
131
struct minstrel_sta_info *mi = priv_sta;
132
133
mi->dbg_stats = debugfs_create_file("rc_stats", S_IRUGO, dir, mi,
134
&minstrel_stat_fops);
135
}
136
137
void
138
minstrel_remove_sta_debugfs(void *priv, void *priv_sta)
139
{
140
struct minstrel_sta_info *mi = priv_sta;
141
142
debugfs_remove(mi->dbg_stats);
143
}
144
145