atheros broadcast/multicast corruption with multiple hostap's

Sam Leffler sam at errno.com
Sun Jan 24 01:22:12 UTC 2010


Russell Yount wrote:
> On Sun, Jan 17, 2010 at 1:45 PM, Sam Leffler <sam at errno.com
> <mailto:sam at errno.com>> wrote:
> 
>     Russell Yount wrote:
> 
> 
> 
>         On Sat, Jan 16, 2010 at 3:21 PM, Sam Leffler <sam at errno.com
>         <mailto:sam at errno.com> <mailto:sam at errno.com
>         <mailto:sam at errno.com>>> wrote:
> 
>            Russell Yount wrote:
> 
>                It seems AP to client broadcasts/multicasts traffic is
>                broken when using WPA2/802.11i with multiple hostapds in 8.0.
> 
>                Only the SSID associated with the last hostapd to be
>         started has
>                AP to client broadcasts/multicasts being delivered correctly.
> 
>                The AP and client are 8.0 freebsd systems althought I see
>         same
>                problems with windows XP as a client.
> 
>                The AP has 4 hostapds configured to use TLS with client
>                certificates for
>                authentication. (hostapd recompiled with
>                HOSTAPD_CFLAGS=-DEAP_SERVER)
>                The AP and client radio are shown as ath0: AR5212 mac 5.9
>         RF5112
>                phy 4.3
>                in dmesg.
> 
>                Client authenticate using client certificates associate
>         correctly
>                to all 4 SSIDs. Unicast traffic flows correctly between
>         clients
>                and AP
>                for all for 4 SSIDs. Client to AP broadcast/multicast
>         traffic works
>                on of 4 SSIDs. AP to client broadcast/multicast traffic
>         only works
>                on 1 of the SSIDs. I have documented this using ARP
>         broadcasts,
>                but normal IP broadcasts also observed to corrupted.
> 
>                When an ARP request is send through the AP to an
>         associated client
>                it seems to be trashed on any of the SSID except the one
>         associated
>                with the last hostapd to be started. Here is the output of
>                client side
>                tcpdump showing the problems.
> 
>                In the first client side tcpdump with the hostapd associated
>                with the SSID
>                being associaed with the last hostapd started and the traffic
>                flowing
>                normally.
> 
>                In the second client side tcpdump with the hostapd associated
>                with the SSID
>                being not the last hostapd started the ARP request is resent
>                multiple times
>                and appears corrupted.
> 
>                I would really like to find a fix for this.
>                Any help would be greatly appreciated.
> 
> 
>            This sounds like the crypto encap of the frame is clobbering the
>            mbuf contents.  You can verify this by setting up multiple
>         vaps w/o
>            WPA.  If this is the problem look for the mbuf copy logic for
>         mcast
>            frames and make sure a deep copy is done.
> 
>                   Sam
> 
>            The four VAPs broadcast traffic works find without WPA if I
>         do not start hostapds on them
>          I have been trying to discovery why broadcast traffic only
>         works correctly on the VAP associated with the last hostapd to
>         be started. I have move with VAP has the working broadcast
>         traffic by restarting the hostapd
>         associated with it.
>          It would seem something in the WPA/802.1x layer initialization
>         remembers which hostapd was started last and that affected the
>         crypto encap.
>          I keep looking but do not see any place in the code that could
>         account for this.
>          It seems the corrupt crypto encap also happens on broadcast
>         between stations.
>         Please correct me if I am wrong:
>         but when using hostapd normally traffic is bridged withing the card.
>         So if a station sends to the VAP a broadcast it is actaully
>         sending a non- broadcast frame to the AP
>         and the AP sends the frame to all the other stations.
> 
> 
>     I told you waht the likely problem is.  Look in the net80211 layer
>     in the kernel for the problem.
> 
>            Sam
> 
>  
>  
>  
>  I tried to find problems in mbuf corruption
> in ieee80211_output.c by placing
>  
>   m = m_unshare(m,M_NOWAIT);
>   if (m == NULL) {
>       IEEE80211_DPRINTF(vap, IEEE80211_MSG_OUTPUT,
>       "%s: cannot get writable mbuf\n", __func__);
>       return NULL;
>   }
>  
> at begining ieee80211_mbuf_adjust() and at
> beginning of ieee80211_encap() with no change
> in the broadcast traffic behaviour.
> 
> I tried then to in ieee80211_crypto.c substituting
>  
>   flags |= IEEE80211_KEY_SWCRYPT;
>  
> for the encryption capabilities test code
>  
>   if ((ic->ic_cryptocaps & (1<<cipher)) == 0) {
>        IEEE80211_DPRINTF(vap, IEEE80211_MSG_CRYPTO,
>        "%s: no h/w support for cipher %s, falling back to s/w\n",
>            __func__, cip->ic_name);
>        flags |= IEEE80211_KEY_SWCRYPT;
>    }
>  
> to force all the encryption to be done in software.
>  
> This fixed the broadcast traffic problem but without
> hardware support its very slow and really loads machine.
> Enabling in the debug code to ath and net80211
> 
> and enabled ATH_DEBUG_KEYCACHE in if_ath.c and
> IEEE80211_MSG_CRYPTO in net80211 code.
>  
> It seems that all the VAPS sets the broadcast key for
> mac ff:ff:ff:ff:ff:ff in the ath device so I assume
> they conflict and the last one setting the key is the
> working one; that would explain why the last hostapd
> started is the only one with working broadcast code
> to clients.
>  
> In if_ath.c the code
>  
>  if ((k->wk_flags & IEEE80211_KEY_GROUP) && sc->sc_mcastkey) {
>    /*
>     * Group keys on hardware that supports multicast frame
>     * key search use a mac that is the sender's address with
>     * the high bit set instead of the app-specified address.
>     */
>      IEEE80211_ADDR_COPY(gmac, bss->ni_macaddr);
>      gmac[0] |= 0x80;
>      mac = gmac;
>  } else
>     mac = k->wk_macaddr;
>  
> seems to indicate that for multiple VAPs the ath chips
> needs to be able to distinguish between broadcast keys
> by using a permutation of VAPs bssid.
>  
> But in if_athvar.h the code does not seem complete
> and sc->sc_mcastkey is also set false.
>  
>  #ifdef notyet
>  #define ath_hal_hasmcastkeysearch(_ah) \
>         (ath_hal_getcapability(_ah, HAL_CAP_MCAST_KEYSRCH, 0, NULL) ==
> HAL_OK)
>  #define ath_hal_getmcastkeysearch(_ah) \
>         (ath_hal_getcapability(_ah, HAL_CAP_MCAST_KEYSRCH, 1, NULL) ==
> HAL_OK)
>  #else
>  #define ath_hal_getmcastkeysearch(_ah)  0
>  #endif
>  
> I am using cards with an AR5212 which does seem to have
> multiple bssid support working so I hope they should also
> support mcastkeysearch capability. Maybe only some
> firmware revisions have this?
>  
> Do you know what the status of the HAL code is for
> supporting this? Why it is commented out in if_athvar.h?

Good work analyzing things; been a long time since I looked at this.  I
vaguely recall disabling mcastkey searching because of problems with
WEP.  I'm surprised WPA is broken as that was a standard test case.

You can try enabling the notyet code and see if the right thing happens.
 I don't see any indication of the mac rev for your part but I expect it
supports this as it was only very early parts that had issues.

If enabling the mcastkey search mechanism doesn't fix this I might've
broken things with changes to explicitly mark group keys when hostapd
plumbs their contents.  I recall doing this for mwl which doesn't have
an indexed key table like ath (it uses the mac address of the local bss
and/or associated station to find the data structure where crypto keys
are stored).

I haven't looked at this stuff in a long time and can't setup a system
to test but if you keep pushing on this I'll try to help w/ advise.

	Sam


More information about the freebsd-stable mailing list