[NETWORK] [LINUX] madwifi device: IPv6 dad failure
パケットダンプ
1 0.000000 :: -> ff02::1:XXXX:YYYY ICMPv6 Multicast listener report
2 0.000010 :: -> ff02::1:XXXX:YYYY ICMPv6 Multicast listener report
3 0.000013 :: -> ff02::1:XXXX:YYYY ICMPv6 Neighbor solicitation
4 0.000016 fe80::205:4eff:XXZX:YYYY -> ff02::2 ICMPv6 Router solicitation
5 0.020127 :: -> ff02::1:XXXX:YYYY ICMPv6 Multicast listener report
6 0.020997 :: -> ff02::1:XXXX:YYYY ICMPv6 Multicast listener report
7 0.021942 :: -> ff02::1:XXXX:YYYY ICMPv6 Neighbor solicitation
8 0.021956 fe80::205:4eff:XXZX:YYYY -> ff02::1 ICMPv6 Neighbor advertisement
9 0.024285 fe80::205:4eff:XXZX:YYYY -> ff02::1 ICMPv6 Neighbor advertisement
10 0.271149 fe80::203:47ff:BBBB:AAAA -> ff02::1 ICMPv6 Router advertisement
11 0.782556 :: -> ff02::1:XXXX:YYYY ICMPv6 Neighbor solicitation
12 0.839789 :: -> ff02::1:XXXX:YYYY ICMPv6 Neighbor solicitation
ログを見ると
...
Aug 30 00:10:30 dom kernel: ath0: someone advertises our address!
Aug 30 00:10:30 dom kernel: ath0: duplicate address detected!
...
上記とは別の時にdebug onにしてとったログ
...
Aug 29 01:11:18 dom kernel: ath_mode_init: RX filter 0x17, MC filter 00000000:00000000
...
Aug 29 01:11:18 dom kernel: ath_mode_init: RX filter 0x17, MC filter 00000000:00000000
Aug 29 01:11:18 dom kernel: ath_mode_init: RX filter 0x17, MC filter 00000000:00001000
...
というわけ、でどうやら自分が投げたNSを受けとりNAを返しそれを受信してしまいDADが失敗したと判断しているよう。MCフィルタが怪しい。
追記(2003/09/16)
ちょっと記録が遅くなりましたが、これは一応解決しました。diffは以下。
Index: wlan/if_ieee80211subr.c
===================================================================
RCS file: /cvsroot/madwifi/madwifi/wlan/if_ieee80211subr.c,v
retrieving revision 1.48
diff -u -u -r1.48 if_ieee80211subr.c
--- wlan/if_ieee80211subr.c 3 Sep 2003 21:54:56 -0000 1.48
+++ wlan/if_ieee80211subr.c 15 Sep 2003 15:56:37 -0000
@@ -859,6 +859,15 @@
dev->name));
goto out;
}
+#else
+ if ((dev->flags & IFF_MULTICAST) &&
+ IEEE80211_IS_MULTICAST(wh->i_addr1) &&
+ IEEE80211_ADDR_EQ(wh->i_addr3, dev->dev_addr)) {
+ /* discard mulicast echo back */
+ /* can we always assume that the received packets
+ * which have my mac addr were sent by me? */
+ goto out;
+ }
#endif
break;
case IEEE80211_M_MONITOR:
もともとこのAtherosの(802.11a/b/g)ドライバは(Free?)BSDから移植されたものなのでIFF_SIMPLEXがついている場合のみ自分の投げたマルチキャストパケットを自分にechoしないようにしていたのが原因でした。Linuxの場合IFF_SIMPLEXというフラグや(おそらく)それに準じたフラグはないのでもともとそういうものだとしてフィルタしても良い気もしますがよくわかりません。
さらに追記(2003/10/09)
CVSツリーにとりこまれたようです。