Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/net80211 Simplify the duration calculations somewhat.
details: https://anonhg.NetBSD.org/src/rev/8edc6a1f7e18
branches: trunk
changeset: 572240:8edc6a1f7e18
user: mycroft <mycroft%NetBSD.org@localhost>
date: Mon Dec 27 05:35:33 2004 +0000
description:
Simplify the duration calculations somewhat.
* Add an intermediate variable, ctsrate, which is currently derived directly
from rate, but may be handled differently later (especially for 11g).
* Assume ACKs are sent at the same rate as the original data packet, as ath
does, shortening the ACK reservation time substantially.
* Add a note that we need to deal with not adding the ACK time for some
packets, though this is not implemented yet.
Questions:
* How do we affect the control rate used to send RTS/CTS packets?
* Is the PLCP header length actually controlled by the preamble length
selection, or should this be based on the transmit rate?
Of course short preamble is not actually implemented/working yet.
diffstat:
sys/net80211/ieee80211_output.c | 55 ++++++++++++++++++----------------------
1 files changed, 25 insertions(+), 30 deletions(-)
diffs (108 lines):
diff -r 8e71813c18b2 -r 8edc6a1f7e18 sys/net80211/ieee80211_output.c
--- a/sys/net80211/ieee80211_output.c Mon Dec 27 02:46:22 2004 +0000
+++ b/sys/net80211/ieee80211_output.c Mon Dec 27 05:35:33 2004 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ieee80211_output.c,v 1.21 2004/12/27 01:57:58 mycroft Exp $ */
+/* $NetBSD: ieee80211_output.c,v 1.22 2004/12/27 05:35:33 mycroft Exp $ */
/*-
* Copyright (c) 2001 Atsushi Onoe
* Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
@@ -35,7 +35,7 @@
#ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_output.c,v 1.10 2004/04/02 23:25:39 sam Exp $");
#else
-__KERNEL_RCSID(0, "$NetBSD: ieee80211_output.c,v 1.21 2004/12/27 01:57:58 mycroft Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ieee80211_output.c,v 1.22 2004/12/27 05:35:33 mycroft Exp $");
#endif
#include "opt_inet.h"
@@ -296,40 +296,46 @@
ieee80211_compute_duration1(int len, uint32_t flags, int rate,
struct ieee80211_duration *d)
{
- int ack, bitlen, cts, data_dur, remainder;
+ int pre, ctsrate;
+ int bitlen, data_dur, remainder;
/* RTS reserves medium for SIFS | CTS | SIFS | (DATA) | SIFS | ACK
* DATA reserves medium for SIFS | ACK
+ *
+ * XXXMYC: no ACK on multicast/broadcast or control packets
*/
bitlen = len * 8;
+ pre = IEEE80211_DUR_DS_SIFS;
+ if ((flags & IEEE80211_F_SHPREAMBLE) != 0)
+ pre += IEEE80211_DUR_DS_SHORT_PREAMBLE + IEEE80211_DUR_DS_FAST_PLCPHDR;
+ else
+ pre += IEEE80211_DUR_DS_LONG_PREAMBLE + IEEE80211_DUR_DS_SLOW_PLCPHDR;
+
#if 0
/* RTS is always sent at 1 Mb/s. (XXX Really?) */
d->d_rts_plcp_len = sizeof(struct ieee80211_frame_rts) * 8;
#endif
d->d_residue = 0;
data_dur = (bitlen * 2) / rate;
+ remainder = (bitlen * 2) % rate;
+ if (remainder != 0) {
+ d->d_residue = (rate - remainder) / 16;
+ data_dur++;
+ }
switch (rate) {
case 2: /* 1 Mb/s */
case 4: /* 2 Mb/s */
/* 1 - 2 Mb/s WLAN: send ACK/CTS at 1 Mb/s */
- cts = IEEE80211_DUR_DS_SLOW_CTS;
- ack = IEEE80211_DUR_DS_SLOW_ACK;
+ ctsrate = 2;
break;
case 11: /* 5.5 Mb/s */
case 22: /* 11 Mb/s */
case 44: /* 22 Mb/s */
- remainder = (bitlen * 2) % rate;
- if (remainder != 0) {
- data_dur++;
- d->d_residue = (rate - remainder) / 16;
- }
-
/* 5.5 - 11 Mb/s WLAN: send ACK/CTS at 2 Mb/s */
- cts = IEEE80211_DUR_DS_FAST_CTS;
- ack = IEEE80211_DUR_DS_FAST_ACK;
+ ctsrate = 4;
break;
default:
/* TBD */
@@ -338,25 +344,14 @@
d->d_plcp_len = data_dur;
- d->d_rts_dur = data_dur + 3 * (IEEE80211_DUR_DS_SIFS +
- IEEE80211_DUR_DS_SHORT_PREAMBLE +
- IEEE80211_DUR_DS_FAST_PLCPHDR) + cts + ack;
+ d->d_rts_dur =
+ pre + (IEEE80211_DUR_DS_SLOW_CTS * 2) / ctsrate +
+ pre + data_dur +
+ pre + (IEEE80211_DUR_DS_SLOW_ACK * 2) / ctsrate;
- /* Note that this is the amount of time reserved *after*
- * the packet is transmitted: just long enough for a SIFS
- * and an ACK.
- */
- d->d_data_dur = IEEE80211_DUR_DS_SIFS +
- IEEE80211_DUR_DS_SHORT_PREAMBLE + IEEE80211_DUR_DS_FAST_PLCPHDR +
- ack;
+ d->d_data_dur =
+ pre + (IEEE80211_DUR_DS_SLOW_ACK * 2) / rate;
- if ((flags & IEEE80211_F_SHPREAMBLE) != 0)
- return 0;
-
- d->d_rts_dur += 3 * IEEE80211_DUR_DS_PREAMBLE_DIFFERENCE +
- 3 * IEEE80211_DUR_DS_PLCPHDR_DIFFERENCE;
- d->d_data_dur += IEEE80211_DUR_DS_PREAMBLE_DIFFERENCE +
- IEEE80211_DUR_DS_PLCPHDR_DIFFERENCE;
return 0;
}
Home |
Main Index |
Thread Index |
Old Index