e07d9cb85217949d497b02d7211de8a197d2f2ebzf/*
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * Use is subject to license terms.
e07d9cb85217949d497b02d7211de8a197d2f2ebzf */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf/*
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * Copyright (c) 2003, 2004 David Young. All rights reserved.
e07d9cb85217949d497b02d7211de8a197d2f2ebzf *
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * Redistribution and use in source and binary forms, with or
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * without modification, are permitted provided that the following
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * conditions are met:
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * 1. Redistributions of source code must retain the above copyright
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * notice, this list of conditions and the following disclaimer.
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * 2. Redistributions in binary form must reproduce the above
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * copyright notice, this list of conditions and the following
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * disclaimer in the documentation and/or other materials provided
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * with the distribution.
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * 3. The name of David Young may not be used to endorse or promote
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * products derived from this software without specific prior
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * written permission.
e07d9cb85217949d497b02d7211de8a197d2f2ebzf *
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL David
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * Young BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * OF SUCH DAMAGE.
e07d9cb85217949d497b02d7211de8a197d2f2ebzf */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#ifndef _RAL_RATE_H
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#define _RAL_RATE_H
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#pragma ident "%Z%%M% %I% %E% SMI"
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#ifdef __cplusplus
e07d9cb85217949d497b02d7211de8a197d2f2ebzfextern "C" {
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#endif
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf/*
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * Data-rate adaptation loosely based on "Link Adaptation Strategy
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * for IEEE 802.11 WLAN via Received Signal Strength Measurement"
e07d9cb85217949d497b02d7211de8a197d2f2ebzf * by Javier del Prado Pavon and Sunghyun Choi.
e07d9cb85217949d497b02d7211de8a197d2f2ebzf */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf/* Buckets for frames 0-128 bytes long, 129-1024, 1025-maximum. */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#define RAL_RSSADAPT_BKTS 3
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#define RAL_RSSADAPT_BKT0 128
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#define RAL_RSSADAPT_BKTPOWER 3 /* 2**_BKTPOWER */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#define ral_rssadapt_thresh_new \
e07d9cb85217949d497b02d7211de8a197d2f2ebzf (ral_rssadapt_thresh_denom - ral_rssadapt_thresh_old)
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#define ral_rssadapt_decay_new \
e07d9cb85217949d497b02d7211de8a197d2f2ebzf (ral_rssadapt_decay_denom - ral_rssadapt_decay_old)
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#define ral_rssadapt_avgrssi_new \
e07d9cb85217949d497b02d7211de8a197d2f2ebzf (ral_rssadapt_avgrssi_denom - ral_rssadapt_avgrssi_old)
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzfstruct ral_rssadapt_expavgctl {
e07d9cb85217949d497b02d7211de8a197d2f2ebzf /* RSS threshold decay. */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t rc_decay_denom;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t rc_decay_old;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf /* RSS threshold update. */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t rc_thresh_denom;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t rc_thresh_old;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf /* RSS average update. */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t rc_avgrssi_denom;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t rc_avgrssi_old;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf};
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzfstruct ral_rssadapt {
e07d9cb85217949d497b02d7211de8a197d2f2ebzf /* exponential average RSSI << 8 */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint16_t ra_avg_rssi;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf /* Tx failures in this update interval */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t ra_nfail;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf /* Tx successes in this update interval */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t ra_nok;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf /* exponential average packets/second */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t ra_pktrate;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf /* RSSI threshold for each Tx rate */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint16_t ra_rate_thresh[RAL_RSSADAPT_BKTS]
e07d9cb85217949d497b02d7211de8a197d2f2ebzf [IEEE80211_RATE_SIZE];
e07d9cb85217949d497b02d7211de8a197d2f2ebzf struct timeval ra_last_raise;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf struct timeval ra_raise_interval;
e07d9cb85217949d497b02d7211de8a197d2f2ebzf};
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf/* Properties of a Tx packet, for link adaptation. */
e07d9cb85217949d497b02d7211de8a197d2f2ebzfstruct ral_rssdesc {
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t id_len; /* Tx packet length */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint32_t id_rateidx; /* index into ni->ni_rates */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf struct ieee80211_node *id_node; /* destination STA MAC */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf uint8_t id_rssi; /* dest STA avg RSS @Tx time */
e07d9cb85217949d497b02d7211de8a197d2f2ebzf};
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzfvoid ral_rate_init(void);
e07d9cb85217949d497b02d7211de8a197d2f2ebzfvoid ral_rssadapt_updatestats(struct ral_rssadapt *);
e07d9cb85217949d497b02d7211de8a197d2f2ebzfvoid ral_rssadapt_input(struct ieee80211com *, struct ieee80211_node *,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf struct ral_rssadapt *, int);
e07d9cb85217949d497b02d7211de8a197d2f2ebzfvoid ral_rssadapt_lower_rate(struct ieee80211com *,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf struct ieee80211_node *, struct ral_rssadapt *,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf struct ral_rssdesc *);
e07d9cb85217949d497b02d7211de8a197d2f2ebzfvoid ral_rssadapt_raise_rate(struct ieee80211com *,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf struct ral_rssadapt *, struct ral_rssdesc *);
e07d9cb85217949d497b02d7211de8a197d2f2ebzfint ral_rssadapt_choose(struct ral_rssadapt *,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf struct ieee80211_rateset *, struct ieee80211_frame *, uint_t,
e07d9cb85217949d497b02d7211de8a197d2f2ebzf const char *, int);
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#ifdef __cplusplus
e07d9cb85217949d497b02d7211de8a197d2f2ebzf}
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#endif
e07d9cb85217949d497b02d7211de8a197d2f2ebzf
e07d9cb85217949d497b02d7211de8a197d2f2ebzf#endif /* _RAL_RATE_H */