On Thu, Aug 02, 2007 at 11:46:18PM +0100, David Woodhouse wrote:
> On Thu, 2007-08-02 at 18:30 -0400, Daniel Drake wrote:
> > This may be a stack-level issue. This is one of the issues holding back 
> > zd1211rw-mac80211 going into mainline: we have a report that 
> > zd1211rw-softmac works fine with IPv6 but mac80211 only works 
> > occasionally with the same device on the same system.
> > 
> > Does anyone have any ideas?
> 
> It receives its own neighbour solicitation (multicast) packets when the
> AP sends them back out again. These packets...
> 
> 23:41:56.046939 00:0a:95:f3:99:92 > 33:33:ff:f3:99:92, ethertype IPv6
> (0x86dd), length 78: :: > ff02::1:fff3:9992: ICMP6, neighbor
> solicitation, who has fe80::20a:95ff:fef3:9992, length 24
> 
> You should be able to see this without _any_ IPv6 infrastructure -- and
> you'll see the link-local IPv6 address remains 'tentative'.
> 
> Once you've fixed that, setting up a local route advertisement dæmon
> (radvd) to give you site-local addresses is fairly trivial too -- and
> then you can also check that Ethernet multicast is working properly.

I hacked-up the (untested) patch below -- thoughts?

---

From: John W. Linville <[EMAIL PROTECTED]>

[PATCH] mac80211: filter locally-originated multicast frames

In STA mode, the AP will echo our traffic.  This includes multicast
traffice.

Receiving these frames confuses some protocols and applications,
notably IPv6 Duplicate Address Detection.

Signed-off-by: John W. Linville <[EMAIL PROTECTED]>
---

 net/mac80211/ieee80211.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c
index a42e70e..6dc6451 100644
--- a/net/mac80211/ieee80211.c
+++ b/net/mac80211/ieee80211.c
@@ -4263,11 +4263,14 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct 
sk_buff *skb,
                                        rx.u.rx.ra_match = 0;
                                } else if (!multicast &&
                                           
compare_ether_addr(sdata->dev->dev_addr,
-                                                             hdr->addr1) != 0) 
{
+                                                             hdr->addr1)) {
                                        if (!sdata->promisc)
                                                continue;
                                        rx.u.rx.ra_match = 0;
-                               }
+                               } else if (multicast &&
+                                          
!compare_ether_addr(sdata->dev->dev_addr,
+                                                              hdr->addr3))
+                                       rx.u.rx.ra_match = 0;
                                break;
                        case IEEE80211_IF_TYPE_IBSS:
                                if (!bssid)
-- 
John W. Linville
[EMAIL PROTECTED]
_______________________________________________
Bcm43xx-dev mailing list
Bcm43xx-dev@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to