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.5 2007/04/01 13:59:40 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 void *rc_st_param; 47 uint32_t rc_st_flags; /* see IEEE80211_RATECTL_F_ */ 48 u_int rc_st_ratectl; /* see IEEE80211_RATECTL_ */ 49 uint32_t rc_st_ratectl_cap; /* see IEEE80211_RATECTL_CAP_ */ 50 uint64_t rc_st_valid_stats; /* see IEEE80211_RATECTL_STATS_ */ 51 void (*rc_st_change)(struct ieee80211com *, u_int, u_int); 52 void (*rc_st_stats)(struct ieee80211com *, 53 struct ieee80211_node *, 54 struct ieee80211_ratectl_stats *); 55 }; 56 57 #define IEEE80211_RATECTL_F_RSDESC 0x1 /* Rate set must be descendant. */ 58 #define IEEE80211_RATECTL_F_MRR 0x2 /* Support multi-rate-retry. */ 59 60 struct ieee80211_ratectl_res { 61 int rc_res_rateidx; 62 int rc_res_tries; 63 }; 64 65 #define IEEE80211_RATECTL_STATS_RES 0x1 66 #define IEEE80211_RATECTL_STATS_PKT_NORETRY 0x2 67 #define IEEE80211_RATECTL_STATS_PKT_OK 0x4 68 #define IEEE80211_RATECTL_STATS_PKT_ERR 0x8 69 #define IEEE80211_RATECTL_STATS_RETRIES 0x10 70 71 #define IEEE80211_RATEIDX_MAX 5 72 73 struct ieee80211_ratectl_stats { 74 struct ieee80211_ratectl_res stats_res[IEEE80211_RATEIDX_MAX]; 75 int stats_res_len; 76 int stats_pkt_noretry; 77 int stats_pkt_ok; 78 int stats_pkt_err; 79 int stats_retries; 80 }; 81 82 struct ieee80211_ratectl { 83 const char *rc_name; 84 u_int rc_ratectl; /* see IEEE80211_RATECTL_ */ 85 86 void *(*rc_attach)(struct ieee80211com *); 87 void (*rc_detach)(void *); 88 89 void (*rc_data_alloc)(struct ieee80211_node *); 90 void (*rc_data_free)(struct ieee80211_node *); 91 void (*rc_data_dup)(const struct ieee80211_node *, 92 struct ieee80211_node *); 93 94 void (*rc_newstate)(void *, enum ieee80211_state); 95 void (*rc_tx_complete)(void *, struct ieee80211_node *, int, 96 const struct ieee80211_ratectl_res[], 97 int, int, int, int); 98 void (*rc_newassoc)(void *, struct ieee80211_node *, int); 99 int (*rc_findrate)(void *, struct ieee80211_node *, int, 100 int[], int); 101 }; 102 103 #endif /* _KERNEL */ 104 105 #define IEEE80211_RATECTL_NONE 0 106 #define IEEE80211_RATECTL_ONOE 1 107 #define IEEE80211_RATECTL_AMRR 2 108 #define IEEE80211_RATECTL_SAMPLE 3 109 #define IEEE80211_RATECTL_MAX 4 110 111 #ifdef _KERNEL 112 113 #define IEEE80211_RATECTL_CAP(v) (1 << (v)) 114 115 #define _IEEE80211_RATECTL_CAP(n) \ 116 IEEE80211_RATECTL_CAP(IEEE80211_RATECTL_##n) 117 118 #define IEEE80211_RATECTL_CAP_NONE _IEEE80211_RATECTL_CAP(NONE) 119 #define IEEE80211_RATECTL_CAP_ONOE _IEEE80211_RATECTL_CAP(ONOE) 120 #define IEEE80211_RATECTL_CAP_AMRR _IEEE80211_RATECTL_CAP(AMRR) 121 #define IEEE80211_RATECTL_CAP_SAMPLE _IEEE80211_RATECTL_CAP(SAMPLE) 122 123 extern const struct ieee80211_ratectl ieee80211_ratectl_none; 124 125 void ieee80211_ratectl_attach(struct ieee80211com *); 126 void ieee80211_ratectl_detach(struct ieee80211com *); 127 128 void ieee80211_ratectl_register(const struct ieee80211_ratectl *); 129 void ieee80211_ratectl_unregister(const struct ieee80211_ratectl *); 130 131 int ieee80211_ratectl_change(struct ieee80211com *, u_int); 132 133 void ieee80211_ratectl_data_alloc(struct ieee80211_node *); 134 void ieee80211_ratectl_data_dup(const struct ieee80211_node *, 135 struct ieee80211_node *); 136 void ieee80211_ratectl_data_free(struct ieee80211_node *); 137 138 void ieee80211_ratectl_newstate(struct ieee80211com *, 139 enum ieee80211_state); 140 void ieee80211_ratectl_tx_complete(struct ieee80211_node *, int, 141 const struct ieee80211_ratectl_res[], 142 int, int, int, int); 143 void ieee80211_ratectl_newassoc(struct ieee80211_node *, int); 144 int ieee80211_ratectl_findrate(struct ieee80211_node *, int, int[], int); 145 146 #endif /* _KERNEL */ 147 148 #endif /* !_NET80211_IEEE80211_RATECTL_H */ 149