From owner-p4-projects@FreeBSD.ORG Mon Jul 18 18:26:55 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id AE7CA16A420; Mon, 18 Jul 2005 18:26:54 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 845F416A41C for ; Mon, 18 Jul 2005 18:26:54 +0000 (GMT) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 2FBAB43D53 for ; Mon, 18 Jul 2005 18:26:54 +0000 (GMT) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j6IIQsQE069444 for ; Mon, 18 Jul 2005 18:26:54 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j6IIQrjN069441 for perforce@freebsd.org; Mon, 18 Jul 2005 18:26:53 GMT (envelope-from sam@freebsd.org) Date: Mon, 18 Jul 2005 18:26:53 GMT Message-Id: <200507181826.j6IIQrjN069441@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Cc: Subject: PERFORCE change 80471 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jul 2005 18:26:55 -0000 http://perforce.freebsd.org/chv.cgi?CH=80471 Change 80471 by sam@sam_ebb on 2005/07/18 18:25:53 add separate tx rate for mcast traffic Affected files ... .. //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#42 edit .. //depot/projects/wifi/sys/dev/ath/if_ath.c#88 edit .. //depot/projects/wifi/sys/dev/ath/if_athvar.h#38 edit .. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#41 edit .. //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#26 edit .. //depot/projects/wifi/sys/net80211/ieee80211_proto.c#29 edit .. //depot/projects/wifi/sys/net80211/ieee80211_var.h#29 edit Differences ... ==== //depot/projects/wifi/sbin/ifconfig/ifieee80211.c#42 (text+ko) ==== @@ -696,6 +696,12 @@ set80211(s, IEEE80211_IOC_ROAM_RATE_11G, 2*atoi(val), 0, NULL); } +static +DECL_CMD_FUNC(set80211mcastrate, val, d) +{ + set80211(s, IEEE80211_IOC_MCAST_RATE, 2*atoi(val), 0, NULL); +} + static int getmaxrate(uint8_t rates[15], uint8_t nrates) { @@ -1581,6 +1587,12 @@ LINE_CHECK("%crtsthreshold %d", spacer, ireq.i_val); } + ireq.i_type = IEEE80211_IOC_MCAST_RATE; + if (ioctl(s, SIOCG80211, &ireq) != -1) { + if (ireq.i_val != 2*1 || verbose) + LINE_CHECK("%cmcastrate %d", spacer, ireq.i_val/2); + } + ireq.i_type = IEEE80211_IOC_BGSCAN; if (ioctl(s, SIOCG80211, &ireq) != -1) { bgscan = ireq.i_val; @@ -1954,6 +1966,7 @@ DEF_CMD_ARG("roam:rate11a", set80211roamrate11a), DEF_CMD_ARG("roam:rate11b", set80211roamrate11b), DEF_CMD_ARG("roam:rate11g", set80211roamrate11g), + DEF_CMD_ARG("mcastrate", set80211mcastrate), }; static struct afswtch af_ieee80211 = { .af_name = "af_ieee80211", ==== //depot/projects/wifi/sys/dev/ath/if_ath.c#88 (text+ko) ==== @@ -3549,6 +3549,20 @@ return NULL; } +/* + * Return h/w rate index for an IEEE rate (w/o basic rate bit). + */ +static int +ath_tx_findrix(const HAL_RATE_TABLE *rt, int rate) +{ + int i; + + for (i = 0; i < rt->rateCount; i++) + if ((rt->info[i].dot11Rate & IEEE80211_RATE_VAL) == rate) + return i; + return 0; /* NB: lowest rate */ +} + static int ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_buf *bf, struct mbuf *m0) @@ -3752,12 +3766,29 @@ case IEEE80211_FC0_TYPE_DATA: atype = HAL_PKT_TYPE_NORMAL; /* default */ /* - * Data frames; consult the rate control module. + * Data frames: multicast frames go out at a fixed rate, + * otherwise consult the rate control module for the + * rate to use. */ - ath_rate_findrate(sc, an, shortPreamble, pktlen, - &rix, &try0, &txrate); - sc->sc_txrate = txrate; /* for LED blinking */ - sc->sc_lastdatarix = rix; /* for fast frames */ + if (ismcast) { + /* + * Check mcast rate setting in case it changed. + * XXX move out of fastpath + */ + if (ic->ic_mcast_rate != sc->sc_mcastrate) { + sc->sc_mcastrix = + ath_tx_findrix(rt, ic->ic_mcast_rate); + sc->sc_mcastrate = ic->ic_mcast_rate; + } + rix = sc->sc_mcastrix; + txrate = rt->info[rix].rateCode; + try0 = ATH_TXMAXTRY; + } else { + ath_rate_findrate(sc, an, shortPreamble, pktlen, + &rix, &try0, &txrate); + sc->sc_txrate = txrate; /* for LED blinking */ + sc->sc_lastdatarix = rix; /* for fast frames */ + } /* * Default all non-QoS traffic to the best-effort queue. */ @@ -5034,12 +5065,20 @@ /* * All protection frames are transmited at 2Mb/s for * 11g, otherwise at 1Mb/s. - * XXX select protection rate index from rate table. */ - sc->sc_protrix = (mode == IEEE80211_MODE_11G ? 1 : 0); - /* NB: caller is responsible for reseting rate control state */ + if (mode == IEEE80211_MODE_11G) + sc->sc_protrix = ath_tx_findrix(rt, 2*2); + else + sc->sc_protrix = ath_tx_findrix(rt, 2*1); /* rate index used to send management frames */ sc->sc_minrateix = 0; + /* + * Setup multicast rate state. + */ + /* XXX layering violation */ + sc->sc_mcastrix = ath_tx_findrix(rt, sc->sc_ic.ic_mcast_rate); + sc->sc_mcastrate = sc->sc_ic.ic_mcast_rate; + /* NB: caller is responsible for reseting rate control state */ #undef N } ==== //depot/projects/wifi/sys/dev/ath/if_athvar.h#38 (text+ko) ==== @@ -248,8 +248,10 @@ u_int16_t ledoff; /* softled off time */ } sc_hwmap[32]; /* h/w rate ix mappings */ u_int8_t sc_minrateix; /* min h/w rate index */ + u_int8_t sc_mcastrix; /* mcast h/w rate index */ u_int8_t sc_protrix; /* protection rate index */ u_int8_t sc_lastdatarix; /* last data frame rate index */ + u_int sc_mcastrate; /* ieee rate for mcastrateix */ u_int sc_fftxqmin; /* min frames before staging */ u_int sc_fftxqmax; /* max frames before drop */ u_int sc_txantenna; /* tx antenna (fixed or auto) */ ==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.c#41 (text+ko) ==== @@ -797,6 +797,9 @@ case IEEE80211_IOC_ROAM_RATE_11G: ireq->i_val = ic->ic_roam.rate11b; break; + case IEEE80211_IOC_MCAST_RATE: + ireq->i_val = ic->ic_mcast_rate; + break; default: error = EINVAL; break; @@ -1850,13 +1853,16 @@ ic->ic_roam.rssi11b = ireq->i_val; break; case IEEE80211_IOC_ROAM_RATE_11A: - ic->ic_roam.rate11a = ireq->i_val; + ic->ic_roam.rate11a = ireq->i_val & IEEE80211_RATE_VAL; break; case IEEE80211_IOC_ROAM_RATE_11B: - ic->ic_roam.rate11bOnly = ireq->i_val; + ic->ic_roam.rate11bOnly = ireq->i_val & IEEE80211_RATE_VAL; break; case IEEE80211_IOC_ROAM_RATE_11G: - ic->ic_roam.rate11b = ireq->i_val; + ic->ic_roam.rate11b = ireq->i_val & IEEE80211_RATE_VAL; + break; + case IEEE80211_IOC_MCAST_RATE: + ic->ic_mcast_rate = ireq->i_val & IEEE80211_RATE_VAL; break; default: error = EINVAL; ==== //depot/projects/wifi/sys/net80211/ieee80211_ioctl.h#26 (text+ko) ==== @@ -445,6 +445,7 @@ #define IEEE80211_IOC_ROAM_RATE_11A 69 /* tx rate threshold in 11a */ #define IEEE80211_IOC_ROAM_RATE_11B 70 /* tx rate threshold in 11b */ #define IEEE80211_IOC_ROAM_RATE_11G 71 /* tx rate threshold in 11g */ +#define IEEE80211_IOC_MCAST_RATE 72 /* tx rate for mcast frames */ /* * Scan result data returned for IEEE80211_IOC_SCAN_RESULTS. ==== //depot/projects/wifi/sys/net80211/ieee80211_proto.c#29 (text+ko) ==== @@ -101,6 +101,7 @@ #endif ic->ic_fragthreshold = 2346; /* XXX not used yet */ ic->ic_fixed_rate = IEEE80211_FIXED_RATE_NONE; + ic->ic_mcast_rate = IEEE80211_MCAST_RATE_DEFAULT; ic->ic_protmode = IEEE80211_PROT_CTSONLY; ic->ic_roaming = IEEE80211_ROAMING_AUTO; ==== //depot/projects/wifi/sys/net80211/ieee80211_var.h#29 (text+ko) ==== @@ -81,6 +81,7 @@ #define IEEE80211_PS_MAX_QUEUE 50 /* maximum saved packets */ #define IEEE80211_FIXED_RATE_NONE -1 +#define IEEE80211_MCAST_RATE_DEFAULT (2*1) /* default mcast rate (1M) */ #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) #define IEEE80211_TU_TO_MS(x) (((x) * 1024) / 1000)