summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Schmidt <bschmidt@FreeBSD.org>2010-10-19 18:49:26 +0000
committerBernhard Schmidt <bschmidt@FreeBSD.org>2010-10-19 18:49:26 +0000
commit9a9a302fcd8434664f14ac0916b108a05574bdce (patch)
tree33f777815db8c2eb73f826a9b1aaacb61bf26baa
parentedc0cb7dc8bd6ae652c01411c1d3a7f18399a0bd (diff)
Notes
-rw-r--r--sys/conf/files1
-rw-r--r--sys/modules/wlan/Makefile2
-rw-r--r--sys/net80211/ieee80211_ratectl.c18
-rw-r--r--sys/net80211/ieee80211_ratectl.h3
-rw-r--r--sys/net80211/ieee80211_ratectl_none.c113
5 files changed, 135 insertions, 2 deletions
diff --git a/sys/conf/files b/sys/conf/files
index c1bc03a0c4e0..75f16e549136 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -2453,6 +2453,7 @@ net80211/ieee80211_power.c optional wlan
net80211/ieee80211_proto.c optional wlan
net80211/ieee80211_radiotap.c optional wlan
net80211/ieee80211_ratectl.c optional wlan
+net80211/ieee80211_ratectl_none.c optional wlan
net80211/ieee80211_regdomain.c optional wlan
net80211/ieee80211_rssadapt.c optional wlan wlan_rssadapt
net80211/ieee80211_scan.c optional wlan
diff --git a/sys/modules/wlan/Makefile b/sys/modules/wlan/Makefile
index 34a4f0d31126..682aab3cfa9c 100644
--- a/sys/modules/wlan/Makefile
+++ b/sys/modules/wlan/Makefile
@@ -9,7 +9,7 @@ SRCS= ieee80211.c ieee80211_action.c ieee80211_ageq.c \
ieee80211_mesh.c ieee80211_node.c ieee80211_output.c ieee80211_phy.c \
ieee80211_power.c ieee80211_proto.c ieee80211_scan.c \
ieee80211_scan_sta.c ieee80211_radiotap.c ieee80211_ratectl.c \
- ieee80211_regdomain.c \
+ ieee80211_ratectl_none.c ieee80211_regdomain.c \
ieee80211_ht.c ieee80211_hwmp.c ieee80211_adhoc.c ieee80211_hostap.c \
ieee80211_monitor.c ieee80211_sta.c ieee80211_wds.c ieee80211_ddb.c
SRCS+= bus_if.h device_if.h opt_inet.h opt_inet6.h opt_ipx.h opt_wlan.h \
diff --git a/sys/net80211/ieee80211_ratectl.c b/sys/net80211/ieee80211_ratectl.c
index 2e8eb7e21535..ea3d8d412c5d 100644
--- a/sys/net80211/ieee80211_ratectl.c
+++ b/sys/net80211/ieee80211_ratectl.c
@@ -39,6 +39,14 @@ __FBSDID("$FreeBSD$");
static const struct ieee80211_ratectl *ratectls[IEEE80211_RATECTL_MAX];
+static const char *ratectl_modnames[IEEE80211_RATECTL_MAX] = {
+ [IEEE80211_RATECTL_AMRR] = "wlan_amrr",
+ [IEEE80211_RATECTL_RSSADAPT] = "wlan_rssadapt",
+ [IEEE80211_RATECTL_ONOE] = "wlan_onoe",
+ [IEEE80211_RATECTL_SAMPLE] = "wlan_sample",
+ [IEEE80211_RATECTL_NONE] = "wlan_none",
+};
+
MALLOC_DEFINE(M_80211_RATECTL, "80211ratectl", "802.11 rate control");
void
@@ -62,5 +70,15 @@ ieee80211_ratectl_set(struct ieee80211vap *vap, int type)
{
if (type >= IEEE80211_RATECTL_MAX)
return;
+ if (ratectls[type] == NULL) {
+ ieee80211_load_module(ratectl_modnames[type]);
+ if (ratectls[type] == NULL) {
+ IEEE80211_DPRINTF(vap, IEEE80211_MSG_RATECTL,
+ "%s: unable to load algo %u, module %s\n",
+ __func__, type, ratectl_modnames[type]);
+ vap->iv_rate = ratectls[IEEE80211_RATECTL_NONE];
+ return;
+ }
+ }
vap->iv_rate = ratectls[type];
}
diff --git a/sys/net80211/ieee80211_ratectl.h b/sys/net80211/ieee80211_ratectl.h
index 73b4f3216505..87b26984dc04 100644
--- a/sys/net80211/ieee80211_ratectl.h
+++ b/sys/net80211/ieee80211_ratectl.h
@@ -26,10 +26,11 @@
*/
enum ieee80211_ratealgs {
- IEEE80211_RATECTL_AMRR = 0,
+ IEEE80211_RATECTL_AMRR = 0,
IEEE80211_RATECTL_RSSADAPT = 1,
IEEE80211_RATECTL_ONOE = 2,
IEEE80211_RATECTL_SAMPLE = 3,
+ IEEE80211_RATECTL_NONE = 4,
IEEE80211_RATECTL_MAX
};
diff --git a/sys/net80211/ieee80211_ratectl_none.c b/sys/net80211/ieee80211_ratectl_none.c
new file mode 100644
index 000000000000..0979e9d942c9
--- /dev/null
+++ b/sys/net80211/ieee80211_ratectl_none.c
@@ -0,0 +1,113 @@
+/*-
+ * Copyright (c) 2010 Bernhard Schmidt <bschmidt@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_wlan.h"
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/socket.h>
+#include <sys/sysctl.h>
+
+#include <net/if.h>
+#include <net/if_media.h>
+
+#ifdef INET
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+#endif
+
+#include <net80211/ieee80211_var.h>
+#include <net80211/ieee80211_ratectl.h>
+
+static void
+none_init(struct ieee80211vap *vap)
+{
+}
+
+static void
+none_deinit(struct ieee80211vap *vap)
+{
+ free(vap->iv_rs, M_80211_RATECTL);
+}
+
+static void
+none_node_init(struct ieee80211_node *ni)
+{
+}
+
+static void
+none_node_deinit(struct ieee80211_node *ni)
+{
+}
+
+static int
+none_rate(struct ieee80211_node *ni, void *arg __unused, uint32_t iarg __unused)
+{
+ int rix = 0;
+
+ ni->ni_txrate = ni->ni_rates.rs_rates[rix] & IEEE80211_RATE_VAL;
+ return rix;
+}
+
+static void
+none_tx_complete(const struct ieee80211vap *vap,
+ const struct ieee80211_node *ni, int ok,
+ void *arg1, void *arg2 __unused)
+{
+}
+
+static void
+none_tx_update(const struct ieee80211vap *vap, const struct ieee80211_node *ni,
+ void *arg1, void *arg2, void *arg3)
+{
+}
+
+static void
+none_setinterval(const struct ieee80211vap *vap, int msecs)
+{
+}
+
+/* number of references from net80211 layer */
+static int nrefs = 0;
+
+static const struct ieee80211_ratectl none = {
+ .ir_name = "none",
+ .ir_attach = NULL,
+ .ir_detach = NULL,
+ .ir_init = none_init,
+ .ir_deinit = none_deinit,
+ .ir_node_init = none_node_init,
+ .ir_node_deinit = none_node_deinit,
+ .ir_rate = none_rate,
+ .ir_tx_complete = none_tx_complete,
+ .ir_tx_update = none_tx_update,
+ .ir_setinterval = none_setinterval,
+};
+IEEE80211_RATECTL_MODULE(ratectl_none, 1);
+IEEE80211_RATECTL_ALG(none, IEEE80211_RATECTL_NONE, none);