Here are three small net80211 fixes. I'm sending them in a batch, but feel free to ok or reject them individually.
The first one is an old bug fix from FreeBSD for AP-bridging encrypted multicast frames. http://marc.info/?l=freebsd-current&m=114168135819304&w=2 http://svn.freebsd.org/viewvc/base?view=revision&revision=156367 Index: ieee80211_input.c =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211_input.c,v retrieving revision 1.116 diff -u -p -r1.116 ieee80211_input.c --- ieee80211_input.c 7 Jun 2010 16:51:22 -0000 1.116 +++ ieee80211_input.c 20 Feb 2011 19:51:24 -0000 @@ -789,7 +789,7 @@ ieee80211_deliver_data(struct ieee80211c int error, len; if (ETHER_IS_MULTICAST(eh->ether_dhost)) { - m1 = m_copym(m, 0, M_COPYALL, M_DONTWAIT); + m1 = m_copym2(m, 0, M_COPYALL, M_DONTWAIT); if (m1 == NULL) ifp->if_oerrors++; else This one I'm not entirely sure about. But the code that receives the 3/4 message seems to expect an RSC for both the RSN and WPA cases. Also, this makes the code match up with how it's done in ieee80211_send_group_msg1(). <sidebar> I spotted this one trying to hunt down a phantom bug with replay counter handling (which in fact seems to be fine). On the client side, netstat -W shows TKIP replays for every broadcast packet sent from the hostap to the station (both running -current). Is anyone else seeing this? There might be some driver/hardware problem with ath(4) that causes the AP to send duplicate frames. Or signal reflection issues? I tried with both wpi(4) and ral(4) cards on the client side. I've given up on trying to fix this, but the diff below felt worth keeping. </sidebar> Index: ieee80211_pae_output.c =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211_pae_output.c,v retrieving revision 1.16 diff -u -p -r1.16 ieee80211_pae_output.c --- ieee80211_pae_output.c 5 Jun 2010 15:54:35 -0000 1.16 +++ ieee80211_pae_output.c 20 Feb 2011 17:55:51 -0000 @@ -417,7 +417,6 @@ ieee80211_send_4way_msg3(struct ieee8021 frm = ieee80211_add_rsn(frm, ic, ic->ic_bss); /* encapsulate the GTK */ frm = ieee80211_add_gtk_kde(frm, ni, k); - LE_WRITE_6(key->rsc, k->k_tsc); /* encapsulate the IGTK if MFP was negotiated */ if (ni->ni_flags & IEEE80211_NODE_MFP) { frm = ieee80211_add_igtk_kde(frm, @@ -427,6 +426,9 @@ ieee80211_send_4way_msg3(struct ieee8021 info |= EAPOL_KEY_ENCRYPTED | EAPOL_KEY_SECURE; } else /* WPA */ frm = ieee80211_add_wpa(frm, ic, ic->ic_bss); + + /* RSC = last transmit sequence number for the GTK */ + LE_WRITE_6(key->rsc, k->k_tsc); /* write the key info field */ BE_WRITE_2(key->info, info); This last one is pretty obvious. ieee80211_alloc_node() does the same increment already, so the stats about node allocation failures are wrong. Index: ieee80211_proto.c =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211_proto.c,v retrieving revision 1.44 diff -u -p -r1.44 ieee80211_proto.c --- ieee80211_proto.c 7 Aug 2010 03:50:02 -0000 1.44 +++ ieee80211_proto.c 6 Feb 2011 15:14:42 -0000 @@ -704,7 +704,6 @@ ieee80211_auth_open(struct ieee80211com if (ni == ic->ic_bss) { ni = ieee80211_alloc_node(ic, wh->i_addr2); if (ni == NULL) { - ic->ic_stats.is_rx_nodealloc++; return; } IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_bss->ni_bssid);