master
  1/* $NetBSD: ieee80211_rssadapt.h,v 1.9 2016/04/08 14:30:47 roy Exp $ */
  2/*-
  3 * Copyright (c) 2003, 2004 David Young.  All rights reserved.
  4 *
  5 * Redistribution and use in source and binary forms, with or
  6 * without modification, are permitted provided that the following
  7 * conditions 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
 11 *    copyright notice, this list of conditions and the following
 12 *    disclaimer in the documentation and/or other materials provided
 13 *    with the distribution.
 14 *
 15 * THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY
 16 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 17 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 18 * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL David
 19 * Young BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 20 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 21 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 26 * OF SUCH DAMAGE.
 27 */
 28
 29#ifndef _NET80211_IEEE80211_RSSADAPT_H_
 30#define _NET80211_IEEE80211_RSSADAPT_H_
 31
 32/* Data-rate adaptation loosely based on "Link Adaptation Strategy
 33 * for IEEE 802.11 WLAN via Received Signal Strength Measurement"
 34 * by Javier del Prado Pavon and Sunghyun Choi.
 35 */
 36
 37/* Buckets for frames 0-128 bytes long, 129-1024, 1025-maximum. */
 38#define	IEEE80211_RSSADAPT_BKTS		3
 39#define IEEE80211_RSSADAPT_BKT0		128
 40#define	IEEE80211_RSSADAPT_BKTPOWER	3	/* 2**_BKTPOWER */
 41
 42#define	ieee80211_rssadapt_thresh_new \
 43    (ieee80211_rssadapt_thresh_denom - ieee80211_rssadapt_thresh_old)
 44#define	ieee80211_rssadapt_decay_new \
 45    (ieee80211_rssadapt_decay_denom - ieee80211_rssadapt_decay_old)
 46#define	ieee80211_rssadapt_avgrssi_new \
 47    (ieee80211_rssadapt_avgrssi_denom - ieee80211_rssadapt_avgrssi_old)
 48
 49struct ieee80211_rssadapt_expavgctl {
 50	/* RSS threshold decay. */
 51	u_int rc_decay_denom;
 52	u_int rc_decay_old;
 53	/* RSS threshold update. */
 54	u_int rc_thresh_denom;
 55	u_int rc_thresh_old;
 56	/* RSS average update. */
 57	u_int rc_avgrssi_denom;
 58	u_int rc_avgrssi_old;
 59};
 60
 61struct ieee80211_rssadapt {
 62	/* exponential average RSSI << 8 */
 63	u_int16_t		ra_avg_rssi;
 64	/* Tx failures in this update interval */
 65	u_int32_t		ra_nfail;
 66	/* Tx successes in this update interval */
 67	u_int32_t		ra_nok;
 68	/* exponential average packets/second */
 69	u_int32_t		ra_pktrate;
 70	/* RSSI threshold for each Tx rate */
 71	u_int16_t		ra_rate_thresh[IEEE80211_RSSADAPT_BKTS]
 72					      [IEEE80211_RATE_SIZE];
 73	struct timeval		ra_last_raise;
 74	struct timeval		ra_raise_interval;
 75};
 76
 77/* Properties of a Tx packet, for link adaptation. */
 78struct ieee80211_rssdesc {
 79	u_int			 id_len;	/* Tx packet length */
 80	u_int			 id_rateidx;	/* index into ni->ni_rates */
 81	struct ieee80211_node	*id_node;	/* destination STA MAC */
 82	u_int8_t		 id_rssi;	/* destination STA avg RSS @
 83						 * Tx time
 84						 */
 85};
 86
 87void	ieee80211_rssadapt_updatestats(struct ieee80211_rssadapt *);
 88void	ieee80211_rssadapt_input(struct ieee80211com *, struct ieee80211_node *,
 89	    struct ieee80211_rssadapt *, int);
 90void	ieee80211_rssadapt_lower_rate(struct ieee80211com *,
 91	    struct ieee80211_node *, struct ieee80211_rssadapt *,
 92	    struct ieee80211_rssdesc *);
 93void	ieee80211_rssadapt_raise_rate(struct ieee80211com *,
 94	    struct ieee80211_rssadapt *, struct ieee80211_rssdesc *);
 95int	ieee80211_rssadapt_choose(struct ieee80211_rssadapt *,
 96	    struct ieee80211_rateset *, struct ieee80211_frame *, u_int, int,
 97	    const char *, int);
 98#ifdef IEEE80211_DEBUG
 99extern int ieee80211_rssadapt_debug;
100#endif /* IEEE80211_DEBUG */
101
102#endif /* !_NET80211_IEEE80211_RSSADAPT_H_ */