All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] d80211: Add software RTS support
@ 2007-01-31 19:16 Ivo van Doorn
  2007-02-05 17:28 ` Jiri Benc
  0 siblings, 1 reply; 11+ messages in thread
From: Ivo van Doorn @ 2007-01-31 19:16 UTC (permalink / raw)
  To: Jiri Benc, John Linville; +Cc: netdev

Not all hardware are capable of generating their own RTS frames.
This patch will add support for creating the RTS frame in software,
when the driver requests this through the flag
IEEE80211_HW_SOFTWARE_RTS

Signed-off-by Ivo van Doorn <IvDoorn@gmail.com>

---

diff --git a/include/net/d80211.h b/include/net/d80211.h
index 65a5d36..17e0530 100644
--- a/include/net/d80211.h
+++ b/include/net/d80211.h
@@ -531,6 +531,9 @@ struct ieee80211_hw {
 	 * per-packet RC4 key with each TX frame when doing hwcrypto */
 #define IEEE80211_HW_TKIP_REQ_PHASE2_KEY (1<<14)
 
+	/* Does the device need the stack to create a RTS frame */
+#define IEEE80211_HW_SOFTWARE_RTS (1<<15)
+
 	u32 flags;			/* hardware flags defined above */
 
 	/* Set to the size of a needed device specific skb headroom for TX skbs. */
diff --git a/net/d80211/ieee80211.c b/net/d80211/ieee80211.c
index 7353ed3..43d91bf 100644
--- a/net/d80211/ieee80211.c
+++ b/net/d80211/ieee80211.c
@@ -760,8 +760,7 @@ ieee80211_tx_h_misc(struct ieee80211_txrx_data *tx)
 	struct ieee80211_tx_control *control = tx->u.tx.control;
 
 	if (!is_multicast_ether_addr(hdr->addr1)) {
-		if (tx->skb->len + FCS_LEN > tx->local->rts_threshold &&
-		    tx->local->rts_threshold < IEEE80211_MAX_RTS_THRESHOLD) {
+		if (tx->u.tx.rts_required) {
 			control->flags |= IEEE80211_TXCTL_USE_RTS_CTS;
 			control->retry_limit =
 				tx->local->long_retry_limit;
@@ -843,6 +842,35 @@ ieee80211_tx_h_misc(struct ieee80211_txrx_data *tx)
 	return TXRX_CONTINUE;
 }
 
+static ieee80211_txrx_result
+ieee80211_tx_h_rts(struct ieee80211_txrx_data *tx)
+{
+	struct ieee80211_tx_control *control = tx->u.tx.control;
+	struct ieee80211_hdr *old_hdr = (struct ieee80211_hdr *) tx->skb->data;
+	struct ieee80211_hdr *new_hdr;
+	int hdr_len;
+
+	if (!tx->u.tx.rts_required ||
+	    !(tx->local->hw.flags & IEEE80211_HW_SOFTWARE_RTS))
+		return TXRX_CONTINUE;
+
+	hdr_len = ieee80211_get_hdrlen(old_hdr->frame_control);
+
+	tx->u.tx.rts_frame = dev_alloc_skb(hdr_len);
+	if (!tx->u.tx.rts_frame)
+		return TXRX_DROP;
+
+	new_hdr = (struct ieee80211_hdr*)skb_put(tx->u.tx.rts_frame, hdr_len);
+
+	memcpy(new_hdr, old_hdr, hdr_len);
+
+	new_hdr->frame_control = cpu_to_le16(
+		IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
+	new_hdr->duration_id = cpu_to_le16(control->rts_cts_duration);
+	new_hdr->seq_ctrl = 0;
+
+	return TXRX_CONTINUE;
+}
 
 static ieee80211_txrx_result
 ieee80211_tx_h_check_assoc(struct ieee80211_txrx_data *tx)
@@ -1072,8 +1100,12 @@ __ieee80211_tx_prepare(struct ieee80211_txrx_data *tx,
         tx->u.tx.unicast = !is_multicast_ether_addr(hdr->addr1);
 	if (is_multicast_ether_addr(hdr->addr1))
 		control->flags |= IEEE80211_TXCTL_NO_ACK;
-	else
+	else {
 		control->flags &= ~IEEE80211_TXCTL_NO_ACK;
+		if (tx->skb->len + FCS_LEN > tx->local->rts_threshold &&
+		    tx->local->rts_threshold < IEEE80211_MAX_RTS_THRESHOLD)
+			tx->u.tx.rts_required = 1;
+	}
 	tx->fragmented = local->fragmentation_threshold <
 		IEEE80211_MAX_FRAG_THRESHOLD && tx->u.tx.unicast &&
 		skb->len + FCS_LEN > local->fragmentation_threshold &&
@@ -1149,7 +1181,21 @@ static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb,
 	struct ieee80211_tx_control *control = tx->u.tx.control;
 	int ret, i;
 
+	if (tx->u.tx.rts_frame) {
+		ieee80211_dump_frame(local->mdev->name,
+				     "RTS to low-level driver",
+				     tx->u.tx.rts_frame);
+		ret = local->ops->tx(local_to_hw(local), tx->u.tx.rts_frame, control);
+		if (ret)
+			return IEEE80211_TX_AGAIN;
+		ieee80211_led_tx(local, 1);
+
+		control->flags &= ~IEEE80211_TXCTL_USE_RTS_CTS;
+		tx->u.tx.rts_frame = NULL;
+	}
 	if (skb) {
+		if (__ieee80211_queue_stopped(local, control->queue))
+			return IEEE80211_TX_FRAG_AGAIN;
 		ieee80211_dump_frame(local->mdev->name, "TX to low-level driver", skb);
 		ret = local->ops->tx(local_to_hw(local), skb, control);
 		if (ret)
@@ -1287,6 +1333,7 @@ retry:
 		store->last_frag_hwrate = tx.u.tx.last_frag_hwrate;
 		store->last_frag_rateidx = tx.u.tx.last_frag_rateidx;
 		store->last_frag_rate_ctrl_probe = tx.u.tx.probe_last_frag;
+		store->rts_frame = tx.u.tx.rts_frame;
 	}
 	return 0;
 
@@ -1296,7 +1343,9 @@ retry:
 	for (i = 0; i < tx.u.tx.num_extra_frag; i++)
 		if (tx.u.tx.extra_frag[i])
 			dev_kfree_skb(tx.u.tx.extra_frag[i]);
-        kfree(tx.u.tx.extra_frag);
+	if (tx.u.tx.rts_frame)
+		dev_kfree_skb(tx.u.tx.rts_frame);
+	kfree(tx.u.tx.extra_frag);
 	return 0;
 }
 
@@ -1323,6 +1372,7 @@ static void ieee80211_tx_pending(unsigned long data)
 		tx.u.tx.last_frag_hwrate = store->last_frag_hwrate;
 		tx.u.tx.last_frag_rateidx = store->last_frag_rateidx;
 		tx.u.tx.probe_last_frag = store->last_frag_rate_ctrl_probe;
+		tx.u.tx.rts_frame = store->rts_frame;
 		ret = __ieee80211_tx(local, store->skb, &tx);
 		if (ret) {
 			if (ret == IEEE80211_TX_FRAG_AGAIN)
@@ -1350,6 +1400,8 @@ static void ieee80211_clear_tx_pending(struct ieee80211_local *local)
 		kfree_skb(store->skb);
 		for (j = 0; j < store->num_extra_frag; j++)
 			kfree_skb(store->extra_frag[j]);
+		if (store->rts_frame)
+			dev_kfree_skb(store->rts_frame);
 		kfree(store->extra_frag);
 		clear_bit(IEEE80211_LINK_STATE_PENDING, &local->state[i]);
 	}
@@ -4280,6 +4332,7 @@ static ieee80211_tx_handler ieee80211_tx_handlers[] =
 	ieee80211_tx_h_wep_encrypt,
 	ieee80211_tx_h_rate_ctrl,
 	ieee80211_tx_h_misc,
+	ieee80211_tx_h_rts,
 	ieee80211_tx_h_load_stats,
 	NULL
 };
diff --git a/net/d80211/ieee80211_i.h b/net/d80211/ieee80211_i.h
index aa4aa81..3ab910c 100644
--- a/net/d80211/ieee80211_i.h
+++ b/net/d80211/ieee80211_i.h
@@ -119,6 +119,7 @@ struct ieee80211_txrx_data {
 			unsigned int ps_buffered:1;
 			unsigned int short_preamble:1;
 			unsigned int probe_last_frag:1;
+			unsigned int rts_required:1;
 			struct ieee80211_rate *rate;
 			/* use this rate (if set) for last fragment; rate can
 			 * be set to lower rate for the first fragments, e.g.,
@@ -132,6 +133,10 @@ struct ieee80211_txrx_data {
 			 * in skb) */
 			int num_extra_frag;
 			struct sk_buff **extra_frag;
+
+			/* Extra RTS frame, this should be send out
+			 * before any of the other fragments. */
+			struct sk_buff *rts_frame;
 		} tx;
 		struct {
 			struct ieee80211_rx_status *status;
@@ -168,6 +173,7 @@ struct ieee80211_tx_stored_packet {
 	int last_frag_rateidx;
 	int last_frag_hwrate;
 	unsigned int last_frag_rate_ctrl_probe:1;
+	struct sk_buff *rts_frame;
 };
 
 struct ieee80211_passive_scan {

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-01-31 19:16 [PATCH 1/2] d80211: Add software RTS support Ivo van Doorn
@ 2007-02-05 17:28 ` Jiri Benc
  2007-02-05 17:43   ` Michael Buesch
  2007-02-05 17:43   ` Ivo van Doorn
  0 siblings, 2 replies; 11+ messages in thread
From: Jiri Benc @ 2007-02-05 17:28 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: John Linville, netdev, Michael Buesch, Johannes Berg

On Wed, 31 Jan 2007 20:16:50 +0100, Ivo van Doorn wrote:
> Not all hardware are capable of generating their own RTS frames.
> This patch will add support for creating the RTS frame in software,
> when the driver requests this through the flag
> IEEE80211_HW_SOFTWARE_RTS

It seems this is not the ideal solution. Most of drivers needing
software RTS would need to remember the RTS frame somewhere (as they
need to pass it together with the actual frame).

A better solution would be either to pass a pointer to RTS frame data
in tx_control or to create a function returning RTS frame.

 Jiri

-- 
Jiri Benc
SUSE Labs

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 17:28 ` Jiri Benc
@ 2007-02-05 17:43   ` Michael Buesch
  2007-02-05 18:08     ` Jiri Benc
  2007-02-05 17:43   ` Ivo van Doorn
  1 sibling, 1 reply; 11+ messages in thread
From: Michael Buesch @ 2007-02-05 17:43 UTC (permalink / raw)
  To: Jiri Benc
  Cc: Ivo van Doorn, John Linville, netdev, Michael Buesch, Johannes Berg

On Monday 05 February 2007 18:28, Jiri Benc wrote:
> On Wed, 31 Jan 2007 20:16:50 +0100, Ivo van Doorn wrote:
> > Not all hardware are capable of generating their own RTS frames.
> > This patch will add support for creating the RTS frame in software,
> > when the driver requests this through the flag
> > IEEE80211_HW_SOFTWARE_RTS
> 
> It seems this is not the ideal solution. Most of drivers needing
> software RTS would need to remember the RTS frame somewhere (as they
> need to pass it together with the actual frame).
> 
> A better solution would be either to pass a pointer to RTS frame data
> in tx_control or to create a function returning RTS frame.

I sent a patchset that works with most (all?) hardware implementations,
as it uses library calls.

I also think that sending RTS in software is not going to work,
as the timing can not be guaranteed. And timing is why we do it in
the first place. If the HW is not capable of sending RTS frames, we
should not try to emulate them in SW, as it might make the situation
even worse by messing up the NAVs by wrong timing.

-- 
Greetings Michael.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 17:28 ` Jiri Benc
  2007-02-05 17:43   ` Michael Buesch
@ 2007-02-05 17:43   ` Ivo van Doorn
  2007-02-05 17:47     ` Michael Buesch
  1 sibling, 1 reply; 11+ messages in thread
From: Ivo van Doorn @ 2007-02-05 17:43 UTC (permalink / raw)
  To: Jiri Benc; +Cc: John Linville, netdev, Michael Buesch, Johannes Berg

On Monday 05 February 2007 18:28, Jiri Benc wrote:
> On Wed, 31 Jan 2007 20:16:50 +0100, Ivo van Doorn wrote:
> > Not all hardware are capable of generating their own RTS frames.
> > This patch will add support for creating the RTS frame in software,
> > when the driver requests this through the flag
> > IEEE80211_HW_SOFTWARE_RTS
> 
> It seems this is not the ideal solution. Most of drivers needing
> software RTS would need to remember the RTS frame somewhere (as they
> need to pass it together with the actual frame).

Well in case of rt2x00 (I am not sure which other drivers also need software RTS)
the rts packet is just inserted inside the packet ring and is treated as a regular
packet/fragment that has just been inserted by the driver.

This patch just adds this additional packet just before the real packet, and in case
the real packet could not be send the rts packet is stored in the
ieee80211_tx_stored_packet structure to be send later.

> A better solution would be either to pass a pointer to RTS frame data
> in tx_control or to create a function returning RTS frame.

In case of rt2x00 this would deliver more problems, especially since it will use
a ring entry to send the rts frame and in case of rt2500usb and rt73usb it will
need a sk_buff structure since it needs to pass it to the device (where the sk_buff
will have some free tx_header_room for the descriptor.)

Ivo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 17:43   ` Ivo van Doorn
@ 2007-02-05 17:47     ` Michael Buesch
  2007-02-05 18:07       ` Ivo van Doorn
  0 siblings, 1 reply; 11+ messages in thread
From: Michael Buesch @ 2007-02-05 17:47 UTC (permalink / raw)
  To: Ivo van Doorn
  Cc: Jiri Benc, John Linville, netdev, Michael Buesch, Johannes Berg

On Monday 05 February 2007 18:43, Ivo van Doorn wrote:
> On Monday 05 February 2007 18:28, Jiri Benc wrote:
> > On Wed, 31 Jan 2007 20:16:50 +0100, Ivo van Doorn wrote:
> > > Not all hardware are capable of generating their own RTS frames.
> > > This patch will add support for creating the RTS frame in software,
> > > when the driver requests this through the flag
> > > IEEE80211_HW_SOFTWARE_RTS
> > 
> > It seems this is not the ideal solution. Most of drivers needing
> > software RTS would need to remember the RTS frame somewhere (as they
> > need to pass it together with the actual frame).
> 
> Well in case of rt2x00 (I am not sure which other drivers also need software RTS)
> the rts packet is just inserted inside the packet ring and is treated as a regular
> packet/fragment that has just been inserted by the driver.
> 
> This patch just adds this additional packet just before the real packet, and in case
> the real packet could not be send the rts packet is stored in the
> ieee80211_tx_stored_packet structure to be send later.

Ok, I see. But this is not going to work with bcm43xx.

I also sent a fix for rt2x00 to work with my patchset.

> > A better solution would be either to pass a pointer to RTS frame data
> > in tx_control or to create a function returning RTS frame.
> 
> In case of rt2x00 this would deliver more problems, especially since it will use
> a ring entry to send the rts frame and in case of rt2500usb and rt73usb it will
> need a sk_buff structure since it needs to pass it to the device (where the sk_buff
> will have some free tx_header_room for the descriptor.)

I don't understand this.
You need to put in into the ring either way.

See my patch.

-- 
Greetings Michael.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 17:47     ` Michael Buesch
@ 2007-02-05 18:07       ` Ivo van Doorn
  2007-02-05 18:22         ` Michael Buesch
  0 siblings, 1 reply; 11+ messages in thread
From: Ivo van Doorn @ 2007-02-05 18:07 UTC (permalink / raw)
  To: Michael Buesch
  Cc: Jiri Benc, John Linville, netdev, Michael Buesch, Johannes Berg

Hi,

> > > > Not all hardware are capable of generating their own RTS frames.
> > > > This patch will add support for creating the RTS frame in software,
> > > > when the driver requests this through the flag
> > > > IEEE80211_HW_SOFTWARE_RTS
> > > 
> > > It seems this is not the ideal solution. Most of drivers needing
> > > software RTS would need to remember the RTS frame somewhere (as they
> > > need to pass it together with the actual frame).
> > 
> > Well in case of rt2x00 (I am not sure which other drivers also need software RTS)
> > the rts packet is just inserted inside the packet ring and is treated as a regular
> > packet/fragment that has just been inserted by the driver.
> > 
> > This patch just adds this additional packet just before the real packet, and in case
> > the real packet could not be send the rts packet is stored in the
> > ieee80211_tx_stored_packet structure to be send later.
> 
> Ok, I see. But this is not going to work with bcm43xx.
> 
> I also sent a fix for rt2x00 to work with my patchset.

Did you already send that patchset to the netdev list?
Because I haven't seen a patch series about rts for d80211 yet.

> > > A better solution would be either to pass a pointer to RTS frame data
> > > in tx_control or to create a function returning RTS frame.
> > 
> > In case of rt2x00 this would deliver more problems, especially since it will use
> > a ring entry to send the rts frame and in case of rt2500usb and rt73usb it will
> > need a sk_buff structure since it needs to pass it to the device (where the sk_buff
> > will have some free tx_header_room for the descriptor.)
> 
> I don't understand this.
> You need to put in into the ring either way.

The new rt2500usb and rt73usb packet ring handling no longer use a DMA buffer
but instead send the sk_buffer->data pointer to the USB layer.
The solution as suggested by Jiri could be handled by making sure the rts allocated
buffer will also have a tx header room as set in the tx_header_room field. But I am not
sure if that would be a better solution than putting the rts packet in a sk_buffer that is being
send out just before the real packet...

For the timing problem you mentioned, another solution could be implemented,
like already mentioned on the d80211 TODO list, the dscape stack should be able
to send a signal to the driver that the last fragment was handed over, this signal can
be used by the driver to start sending out the queued packets. This would at least work
for rt2x00 where especially for PCI devices _no_ packets are being send until the TX ring
has been kicked.

Ivo


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 17:43   ` Michael Buesch
@ 2007-02-05 18:08     ` Jiri Benc
  2007-02-05 18:15       ` Ivo van Doorn
  2007-02-05 18:23       ` Michael Buesch
  0 siblings, 2 replies; 11+ messages in thread
From: Jiri Benc @ 2007-02-05 18:08 UTC (permalink / raw)
  To: Michael Buesch
  Cc: Ivo van Doorn, John Linville, netdev, Michael Buesch, Johannes Berg

On Mon, 5 Feb 2007 18:43:06 +0100, Michael Buesch wrote:
> I also think that sending RTS in software is not going to work,
> as the timing can not be guaranteed. And timing is why we do it in
> the first place. If the HW is not capable of sending RTS frames, we
> should not try to emulate them in SW, as it might make the situation
> even worse by messing up the NAVs by wrong timing.

That's not emulation in the software, it's just similar approach as
with sending fragmented frames - you need (more or less) precise timing
there as well and many cards still want them enqueued one-by-one. The
firmware takes care of the precise timing. The same could apply to RTS
frames (i. e. the firmware recognize them and doesn't send them before
it has the next frame ready).

 Jiri

-- 
Jiri Benc
SUSE Labs

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 18:08     ` Jiri Benc
@ 2007-02-05 18:15       ` Ivo van Doorn
  2007-02-05 18:23       ` Michael Buesch
  1 sibling, 0 replies; 11+ messages in thread
From: Ivo van Doorn @ 2007-02-05 18:15 UTC (permalink / raw)
  To: Jiri Benc
  Cc: Michael Buesch, John Linville, netdev, Michael Buesch, Johannes Berg

On Monday 05 February 2007 19:08, Jiri Benc wrote:
> On Mon, 5 Feb 2007 18:43:06 +0100, Michael Buesch wrote:
> > I also think that sending RTS in software is not going to work,
> > as the timing can not be guaranteed. And timing is why we do it in
> > the first place. If the HW is not capable of sending RTS frames, we
> > should not try to emulate them in SW, as it might make the situation
> > even worse by messing up the NAVs by wrong timing.
> 
> That's not emulation in the software, it's just similar approach as
> with sending fragmented frames - you need (more or less) precise timing
> there as well and many cards still want them enqueued one-by-one. The
> firmware takes care of the precise timing. The same could apply to RTS
> frames (i. e. the firmware recognize them and doesn't send them before
> it has the next frame ready).

And even for a "dumb" device like rt2x00 (no firmware for rt2400pci, rt2500pci or rt2500usb)
it still has rts capabilities. It is just not capable of creating the frame, but
the descriptor has a special field that should be set in case of a rts frame.
So that would suggest that the device will treat the frame a little bit
different than a regular frame.

Ivo

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 18:07       ` Ivo van Doorn
@ 2007-02-05 18:22         ` Michael Buesch
  2007-02-05 18:42           ` Ivo van Doorn
  0 siblings, 1 reply; 11+ messages in thread
From: Michael Buesch @ 2007-02-05 18:22 UTC (permalink / raw)
  To: Ivo van Doorn
  Cc: Jiri Benc, John Linville, netdev, Michael Buesch, Johannes Berg

On Monday 05 February 2007 19:07, Ivo van Doorn wrote:
> Hi,
> 
> > > > > Not all hardware are capable of generating their own RTS frames.
> > > > > This patch will add support for creating the RTS frame in software,
> > > > > when the driver requests this through the flag
> > > > > IEEE80211_HW_SOFTWARE_RTS
> > > > 
> > > > It seems this is not the ideal solution. Most of drivers needing
> > > > software RTS would need to remember the RTS frame somewhere (as they
> > > > need to pass it together with the actual frame).
> > > 
> > > Well in case of rt2x00 (I am not sure which other drivers also need software RTS)
> > > the rts packet is just inserted inside the packet ring and is treated as a regular
> > > packet/fragment that has just been inserted by the driver.
> > > 
> > > This patch just adds this additional packet just before the real packet, and in case
> > > the real packet could not be send the rts packet is stored in the
> > > ieee80211_tx_stored_packet structure to be send later.
> > 
> > Ok, I see. But this is not going to work with bcm43xx.
> > 
> > I also sent a fix for rt2x00 to work with my patchset.
> 
> Did you already send that patchset to the netdev list?
> Because I haven't seen a patch series about rts for d80211 yet.

No, linux-wireless@vger.kernel.org

> The new rt2500usb and rt73usb packet ring handling no longer use a DMA buffer
> but instead send the sk_buffer->data pointer to the USB layer.
> The solution as suggested by Jiri could be handled by making sure the rts allocated
> buffer will also have a tx header room as set in the tx_header_room field. But I am not
> sure if that would be a better solution than putting the rts packet in a sk_buffer that is being
> send out just before the real packet...

In my patchset you can put it into anything you like.
I put it into an skb.

-- 
Greetings Michael.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 18:08     ` Jiri Benc
  2007-02-05 18:15       ` Ivo van Doorn
@ 2007-02-05 18:23       ` Michael Buesch
  1 sibling, 0 replies; 11+ messages in thread
From: Michael Buesch @ 2007-02-05 18:23 UTC (permalink / raw)
  To: Jiri Benc
  Cc: Ivo van Doorn, John Linville, netdev, Michael Buesch, Johannes Berg

On Monday 05 February 2007 19:08, Jiri Benc wrote:
> On Mon, 5 Feb 2007 18:43:06 +0100, Michael Buesch wrote:
> > I also think that sending RTS in software is not going to work,
> > as the timing can not be guaranteed. And timing is why we do it in
> > the first place. If the HW is not capable of sending RTS frames, we
> > should not try to emulate them in SW, as it might make the situation
> > even worse by messing up the NAVs by wrong timing.
> 
> That's not emulation in the software, it's just similar approach as
> with sending fragmented frames - you need (more or less) precise timing
> there as well and many cards still want them enqueued one-by-one. The
> firmware takes care of the precise timing. The same could apply to RTS
> frames (i. e. the firmware recognize them and doesn't send them before
> it has the next frame ready).

Yeah, ok. I got the point.
But still, this does not work with bcm43xx. :)

-- 
Greetings Michael.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/2] d80211: Add software RTS support
  2007-02-05 18:22         ` Michael Buesch
@ 2007-02-05 18:42           ` Ivo van Doorn
  0 siblings, 0 replies; 11+ messages in thread
From: Ivo van Doorn @ 2007-02-05 18:42 UTC (permalink / raw)
  To: Michael Buesch
  Cc: Jiri Benc, John Linville, netdev, Michael Buesch, Johannes Berg

Hi,

> > Did you already send that patchset to the netdev list?
> > Because I haven't seen a patch series about rts for d80211 yet.
> 
> No, linux-wireless@vger.kernel.org

Hmm, wasn't subscribed to that list yet. :(
But now I am. :)

> > The new rt2500usb and rt73usb packet ring handling no longer use a DMA buffer
> > but instead send the sk_buffer->data pointer to the USB layer.
> > The solution as suggested by Jiri could be handled by making sure the rts allocated
> > buffer will also have a tx header room as set in the tx_header_room field. But I am not
> > sure if that would be a better solution than putting the rts packet in a sk_buffer that is being
> > send out just before the real packet...
> 
> In my patchset you can put it into anything you like.
> I put it into an skb.

Sounds good, I'll look that patchset up in the mailarchive.

Ivo

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2007-02-05 18:43 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-01-31 19:16 [PATCH 1/2] d80211: Add software RTS support Ivo van Doorn
2007-02-05 17:28 ` Jiri Benc
2007-02-05 17:43   ` Michael Buesch
2007-02-05 18:08     ` Jiri Benc
2007-02-05 18:15       ` Ivo van Doorn
2007-02-05 18:23       ` Michael Buesch
2007-02-05 17:43   ` Ivo van Doorn
2007-02-05 17:47     ` Michael Buesch
2007-02-05 18:07       ` Ivo van Doorn
2007-02-05 18:22         ` Michael Buesch
2007-02-05 18:42           ` Ivo van Doorn

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.