The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/net80211/ieee80211_ratectl.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2010 Rui Paulo <rpaulo@FreeBSD.org>
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   24  */
   25 
   26 #include <sys/cdefs.h>
   27 __FBSDID("$FreeBSD: releng/11.0/sys/net80211/ieee80211_ratectl.c 296925 2016-03-16 02:07:04Z adrian $");
   28 
   29 #include <sys/param.h>
   30 #include <sys/kernel.h>
   31 #include <sys/sbuf.h>
   32 #include <sys/systm.h>
   33 #include <sys/socket.h>
   34 #include <sys/malloc.h>
   35 
   36 #include <net/if.h>
   37 #include <net/if_media.h>
   38 #include <net/ethernet.h>
   39 #include <net/route.h>
   40 
   41 #include <net80211/ieee80211_var.h>
   42 #include <net80211/ieee80211_ratectl.h>
   43 
   44 static const struct ieee80211_ratectl *ratectls[IEEE80211_RATECTL_MAX];
   45 
   46 static const char *ratectl_modnames[IEEE80211_RATECTL_MAX] = {
   47         [IEEE80211_RATECTL_AMRR]        = "wlan_amrr",
   48         [IEEE80211_RATECTL_RSSADAPT]    = "wlan_rssadapt",
   49         [IEEE80211_RATECTL_ONOE]        = "wlan_onoe",
   50         [IEEE80211_RATECTL_SAMPLE]      = "wlan_sample",
   51         [IEEE80211_RATECTL_NONE]        = "wlan_none",
   52 };
   53 
   54 MALLOC_DEFINE(M_80211_RATECTL, "80211ratectl", "802.11 rate control");
   55 
   56 void
   57 ieee80211_ratectl_register(int type, const struct ieee80211_ratectl *ratectl)
   58 {
   59         if (type >= IEEE80211_RATECTL_MAX)
   60                 return;
   61         ratectls[type] = ratectl;
   62 }
   63 
   64 void
   65 ieee80211_ratectl_unregister(int type)
   66 {
   67         if (type >= IEEE80211_RATECTL_MAX)
   68                 return;
   69         ratectls[type] = NULL;
   70 }
   71 
   72 static void
   73 ieee80211_ratectl_sysctl_stats_node_iter(void *arg, struct ieee80211_node *ni)
   74 {
   75 
   76         struct sbuf *sb = (struct sbuf *) arg;
   77         sbuf_printf(sb, "MAC: %6D\n", ni->ni_macaddr, ":");
   78         ieee80211_ratectl_node_stats(ni, sb);
   79         sbuf_printf(sb, "\n");
   80 }
   81 
   82 static int
   83 ieee80211_ratectl_sysctl_stats(SYSCTL_HANDLER_ARGS)
   84 {
   85         struct ieee80211vap *vap = arg1;
   86         struct ieee80211com *ic = vap->iv_ic;
   87         struct sbuf sb;
   88         int error;
   89 
   90         error = sysctl_wire_old_buffer(req, 0);
   91         if (error)
   92                 return (error);
   93         sbuf_new_for_sysctl(&sb, NULL, 8, req);
   94         sbuf_clear_flags(&sb, SBUF_INCLUDENUL);
   95 
   96         IEEE80211_LOCK(ic);
   97         ieee80211_iterate_nodes(&ic->ic_sta,
   98             ieee80211_ratectl_sysctl_stats_node_iter,
   99             &sb);
  100         IEEE80211_UNLOCK(ic);
  101 
  102         error = sbuf_finish(&sb);
  103         sbuf_delete(&sb);
  104         return (error);
  105 }
  106 
  107 void
  108 ieee80211_ratectl_init(struct ieee80211vap *vap)
  109 {
  110         if (vap->iv_rate == ratectls[IEEE80211_RATECTL_NONE])
  111                 ieee80211_ratectl_set(vap, IEEE80211_RATECTL_AMRR);
  112         vap->iv_rate->ir_init(vap);
  113 
  114         /* Attach generic stats sysctl */
  115         SYSCTL_ADD_PROC(vap->iv_sysctl, SYSCTL_CHILDREN(vap->iv_oid), OID_AUTO,
  116             "rate_stats", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, vap,
  117             0, ieee80211_ratectl_sysctl_stats, "A", "ratectl node stats");
  118 }
  119 
  120 void
  121 ieee80211_ratectl_set(struct ieee80211vap *vap, int type)
  122 {
  123         if (type >= IEEE80211_RATECTL_MAX)
  124                 return;
  125         if (ratectls[type] == NULL) {
  126                 ieee80211_load_module(ratectl_modnames[type]);
  127                 if (ratectls[type] == NULL) {
  128                         IEEE80211_DPRINTF(vap, IEEE80211_MSG_RATECTL,
  129                             "%s: unable to load algo %u, module %s\n",
  130                             __func__, type, ratectl_modnames[type]);
  131                         vap->iv_rate = ratectls[IEEE80211_RATECTL_NONE];
  132                         return;
  133                 }
  134         }
  135         vap->iv_rate = ratectls[type];
  136 }

Cache object: 79645feadf10e9c225a7b012c525fed0


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.