1 /* 2 * Copyright (c) 2006 The DragonFly Project. All rights reserved. 3 * 4 * This code is derived from software contributed to The DragonFly Project 5 * by Sepherosa Ziehau <sepherosa@gmail.com> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 3. Neither the name of The DragonFly Project nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific, prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * $DragonFly: src/sys/netproto/802_11/ieee80211_ratectl.h,v 1.7 2008/01/15 09:01:13 sephe Exp $ 35 */ 36 37 #ifndef _NET80211_IEEE80211_RATECTL_H 38 #define _NET80211_IEEE80211_RATECTL_H 39 40 #ifdef _KERNEL 41 42 struct ieee80211_ratectl_stats; 43 44 struct ieee80211_ratectl_state { 45 void *rc_st_ctx; 46 uint32_t rc_st_flags; /* see IEEE80211_RATECTL_F_ */ 47 u_int rc_st_ratectl; /* see IEEE80211_RATECTL_ */ 48 uint32_t rc_st_ratectl_cap; /* see IEEE80211_RATECTL_CAP_ */ 49 void *(*rc_st_attach)(struct ieee80211com *, u_int); 50 void (*rc_st_stats)(struct ieee80211com *, 51 struct ieee80211_node *, 52 struct ieee80211_ratectl_stats *); 53 }; 54 55 #define IEEE80211_RATECTL_F_RSDESC 0x1 /* Rate set must be descendant. */ 56 #define IEEE80211_RATECTL_F_MRR 0x2 /* Support multi-rate-retry. */ 57 58 struct ieee80211_ratectl_res { 59 int rc_res_rateidx; 60 int rc_res_tries; 61 }; 62 63 #define IEEE80211_RATEIDX_MAX 5 64 65 struct ieee80211_ratectl_stats { 66 int stats_pkt_noretry; 67 int stats_pkt_ok; 68 int stats_pkt_err; 69 int stats_retries; 70 }; 71 72 struct ieee80211_ratectl { 73 const char *rc_name; 74 u_int rc_ratectl; /* see IEEE80211_RATECTL_ */ 75 76 void *(*rc_attach)(struct ieee80211com *); 77 void (*rc_detach)(void *); 78 79 void (*rc_data_alloc)(struct ieee80211_node *); 80 void (*rc_data_free)(struct ieee80211_node *); 81 void (*rc_data_dup)(const struct ieee80211_node *, 82 struct ieee80211_node *); 83 84 void (*rc_newstate)(void *, enum ieee80211_state); 85 void (*rc_tx_complete)(void *, struct ieee80211_node *, int, 86 const struct ieee80211_ratectl_res[], 87 int, int, int, int); 88 void (*rc_newassoc)(void *, struct ieee80211_node *, int); 89 int (*rc_findrate)(void *, struct ieee80211_node *, int, 90 int[], int); 91 }; 92 93 #endif /* _KERNEL */ 94 95 #define IEEE80211_RATECTL_NONE 0 96 #define IEEE80211_RATECTL_ONOE 1 97 #define IEEE80211_RATECTL_AMRR 2 98 #define IEEE80211_RATECTL_SAMPLE 3 99 #define IEEE80211_RATECTL_MAX 4 100 101 #ifdef _KERNEL 102 103 #define IEEE80211_RATECTL_CAP(v) (1 << (v)) 104 105 #define _IEEE80211_RATECTL_CAP(n) \ 106 IEEE80211_RATECTL_CAP(IEEE80211_RATECTL_##n) 107 108 #define IEEE80211_RATECTL_CAP_NONE _IEEE80211_RATECTL_CAP(NONE) 109 #define IEEE80211_RATECTL_CAP_ONOE _IEEE80211_RATECTL_CAP(ONOE) 110 #define IEEE80211_RATECTL_CAP_AMRR _IEEE80211_RATECTL_CAP(AMRR) 111 #define IEEE80211_RATECTL_CAP_SAMPLE _IEEE80211_RATECTL_CAP(SAMPLE) 112 113 extern const struct ieee80211_ratectl ieee80211_ratectl_none; 114 115 void ieee80211_ratectl_attach(struct ieee80211com *); 116 void ieee80211_ratectl_detach(struct ieee80211com *); 117 118 void ieee80211_ratectl_register(const struct ieee80211_ratectl *); 119 void ieee80211_ratectl_unregister(const struct ieee80211_ratectl *); 120 121 int ieee80211_ratectl_change(struct ieee80211com *, u_int); 122 123 void ieee80211_ratectl_data_alloc(struct ieee80211_node *); 124 void ieee80211_ratectl_data_dup(const struct ieee80211_node *, 125 struct ieee80211_node *); 126 void ieee80211_ratectl_data_free(struct ieee80211_node *); 127 128 void ieee80211_ratectl_newstate(struct ieee80211com *, 129 enum ieee80211_state); 130 void ieee80211_ratectl_tx_complete(struct ieee80211_node *, int, 131 const struct ieee80211_ratectl_res[], 132 int, int, int, int); 133 void ieee80211_ratectl_newassoc(struct ieee80211_node *, int); 134 int ieee80211_ratectl_findrate(struct ieee80211_node *, int, int[], int); 135 136 #endif /* _KERNEL */ 137 138 #endif /* !_NET80211_IEEE80211_RATECTL_H */ 139