| /*- |
| * Copyright (c) 2004 Sam Leffler, Errno Consulting |
| * Copyright (c) 2004 Video54 Technologies, Inc. |
| * 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, |
| without modification. |
| * 2. Redistributions in binary form must reproduce at minimum a disclaimer |
| * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any |
| * redistribution must be conditioned upon including a substantially |
| * similar Disclaimer requirement for further binary redistribution. |
| * 3. Neither the names of the above-listed copyright holders nor the names |
| * of any contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * Alternatively, this software may be distributed under the terms of the |
| * GNU General Public License ("GPL") version 2 as published by the Free |
| * Software Foundation. |
| * |
| * NO WARRANTY |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY |
| * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL |
| * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. |
| * |
| * $Id: if_athrate.h 1667 2006-07-04 10:23:35Z kelmo $ |
| */ |
| #ifndef _ATH_RATECTRL_H_ |
| #define _ATH_RATECTRL_H_ |
| |
| /* |
| * Interface definitions for transmit rate control modules for the |
| * Atheros driver. |
| * |
| * A rate control module is responsible for choosing the transmit rate |
| * for each data frame. Management+control frames are always sent at |
| * a fixed rate. |
| * |
| * An instance of the rate control module is attached to each device |
| * at attach time and detached when the device is destroyed. The module |
| * may associate data with each device and each node (station). Both |
| * sets of storage are opaque except for the size of the per-node storage |
| * which must be provided when the module is attached. |
| * |
| * The rate control module is notified for each state transition and |
| * station association/reassociation. Otherwise it is queried for a |
| * rate for each outgoing frame and provided status from each transmitted |
| * frame. Any ancillary processing is the responsibility of the module |
| * (e.g. if periodic processing is required then the module should setup |
| * it's own timer). |
| * |
| * In addition to the transmit rate for each frame the module must also |
| * indicate the number of attempts to make at the specified rate. If this |
| * number is != ATH_TXMAXTRY then an additional callback is made to setup |
| * additional transmit state. The rate control code is assumed to write |
| * this additional data directly to the transmit descriptor. |
| */ |
| |
| enum { |
| IEEE80211_RATE_AMRR, |
| IEEE80211_RATE_ONOE, |
| IEEE80211_RATE_SAMPLE, |
| IEEE80211_RATE_MAX |
| }; |
| |
| struct ath_softc; |
| struct ath_node; |
| struct ath_desc; |
| struct ieee80211vap; |
| |
| struct ieee80211_rate_ops { |
| int ratectl_id; |
| |
| /* Attach/detach a rate control module */ |
| struct ath_ratectrl *(*attach)(struct ath_softc *sc); |
| void (*detach)(struct ath_ratectrl *arc); |
| |
| /* Register proc entries with a VAP */ |
| void (*dynamic_proc_register)(struct ieee80211vap *vap); |
| |
| /* *** State storage handling *** */ |
| |
| /* Initialize per-node state already allocated for the specified |
| * node; this space can be assumed initialized to zero */ |
| void (*node_init)(struct ath_softc *sc, struct ath_node *an); |
| |
| /* Cleanup any per-node state prior to the node being reclaimed */ |
| void (*node_cleanup)(struct ath_softc *sc, struct ath_node *an); |
| |
| /* Update rate control state on station associate/reassociate |
| * (when operating as an ap or for nodes discovered when operating |
| * in ibss mode) */ |
| void (*newassoc)(struct ath_softc *sc, struct ath_node *an, |
| int isnew); |
| |
| /* Update/reset rate control state for 802.11 state transitions. |
| * Important mostly as the analog to newassoc when operating |
| * in station mode */ |
| void (*newstate)(struct ieee80211vap *vap, |
| enum ieee80211_state state); |
| |
| /* *** Transmit handling *** */ |
| |
| /* Return the transmit info for a data packet. If multi-rate state |
| * is to be setup then try0 should contain a value other than ATH_TXMATRY |
| * and setupxtxdesc will be called after deciding if the frame |
| * can be transmitted with multi-rate retry. */ |
| void (*findrate)(struct ath_softc *sc, struct ath_node *an, |
| int shortPreamble, size_t frameLen, |
| u_int8_t *rix, int *try0, u_int8_t *txrate); |
| |
| /* Setup any extended (multi-rate) descriptor state for a data packet. |
| * The rate index returned by findrate is passed back in. */ |
| void (*setupxtxdesc)(struct ath_softc *sc, struct ath_node *an, |
| struct ath_desc *ds, int shortPreamble, |
| size_t frame_size, u_int8_t rix); |
| |
| /* Update rate control state for a packet associated with the |
| * supplied transmit descriptor. The routine is invoked both |
| * for packets that were successfully sent and for those that |
| * failed (consult the descriptor for details). */ |
| void (*tx_complete)(struct ath_softc *sc, struct ath_node *an, |
| const struct ath_desc *ds); |
| }; |
| |
| struct ath_ratectrl { |
| struct ieee80211_rate_ops *ops; |
| size_t arc_space; /* space required for per-node state */ |
| size_t arc_vap_space; /* space required for per-vap state */ |
| }; |
| |
| int ieee80211_rate_register(struct ieee80211_rate_ops *ops); |
| void ieee80211_rate_unregister(struct ieee80211_rate_ops *ops); |
| |
| struct ath_ratectrl *ieee80211_rate_attach(struct ath_softc *sc, const char *name); |
| void ieee80211_rate_detach(struct ath_ratectrl *); |
| #endif /* _ATH_RATECTRL_H_ */ |