[PATCH] Send probe as unicast in joining state

Eugene Krasnikov k.eugene.e at gmail.com
Tue May 28 10:44:26 EDT 2013


and pull request https://github.com/KrasnikovEugene/wcn36xx/pull/39

2013/5/28 Eugene Krasnikov <k.eugene.e at gmail.com>:
> While joining mac will try to send direct probe in case mac
> never received any probes from AP. But mac instead of sending
> unicast probe will send broadcast probe because some APs do
> not answer to direct packet in unassociated state. And HW
> cannot send broadcast packets in joining state so trick it
> like we are sending unicast probe instead of broadcast.
>
> Signed-off-by: Eugene Krasnikov <k.eugene.e at gmail.com>
> ---
>  main.c    | 12 ++++++++++++
>  wcn36xx.h |  1 +
>  2 files changed, 13 insertions(+)
>
> diff --git a/main.c b/main.c
> index 6804482..a1fa705 100644
> --- a/main.c
> +++ b/main.c
> @@ -179,6 +179,7 @@ static void wcn36xx_tx(struct ieee80211_hw *hw,
>         struct ieee80211_mgmt *mgmt;
>         bool high, bcast;
>         u32 header_len = 0;
> +       struct wcn36xx *wcn = hw->priv;
>
>         mgmt = (struct ieee80211_mgmt *)skb->data;
>
> @@ -188,6 +189,13 @@ static void wcn36xx_tx(struct ieee80211_hw *hw,
>         bcast = is_broadcast_ether_addr(mgmt->da) ||
>                 is_multicast_ether_addr(mgmt->da);
>
> +       /*
> +        * In joining state trick hardware that probe is sent as unicast even
> +        * if address is broadcast.
> +        */
> +       if (wcn->is_joining && ieee80211_is_probe_req(mgmt->frame_control)) {
> +               bcast = false;
> +       }
>         wcn36xx_dbg(WCN36XX_DBG_TX,
>                     "tx skb %p len %d fc %04x sn %d %s %s",
>                     skb, skb->len, __le16_to_cpu(mgmt->frame_control),
> @@ -199,6 +207,7 @@ static void wcn36xx_tx(struct ieee80211_hw *hw,
>         header_len = ieee80211_is_data_qos(mgmt->frame_control) ?
>                 sizeof(struct ieee80211_qos_hdr) :
>                 sizeof(struct ieee80211_hdr_3addr);
> +               wcn->is_joining = false;
>         wcn36xx_dxe_tx(hw->priv, skb, bcast, high, header_len);
>  }
>
> @@ -299,6 +308,7 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
>
>                 if (vif->type == NL80211_IFTYPE_STATION &&
>                     !is_zero_ether_addr(bss_conf->bssid)) {
> +                       wcn->is_joining = true;
>                         wcn36xx_smd_join(wcn, bss_conf->bssid, vif->addr, wcn->ch);
>                         wcn36xx_smd_config_bss(wcn, NL80211_IFTYPE_STATION,
>                                                bss_conf->bssid, false);
> @@ -316,6 +326,7 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
>         }
>
>         if (changed & BSS_CHANGED_ASSOC) {
> +               wcn->is_joining = false;
>                 if(bss_conf->assoc) {
>                         wcn36xx_dbg(WCN36XX_DBG_MAC,
>                                     "mac assoc bss %pM vif %pM AID=%d",
> @@ -777,6 +788,7 @@ static int __init wcn36xx_init(void)
>
>         wcn->aid = 0;
>         wcn->current_vif = NULL;
> +       wcn->is_joining = false;
>         wcn->hw->wiphy->n_addresses = ARRAY_SIZE(wcn->addresses);
>         wcn->hw->wiphy->addresses = wcn->addresses;
>
> diff --git a/wcn36xx.h b/wcn36xx.h
> index f9788e5..efebd85 100644
> --- a/wcn36xx.h
> +++ b/wcn36xx.h
> @@ -137,6 +137,7 @@ struct wcn36xx {
>
>         //Scanning
>         int                     is_scanning;
> +       bool                    is_joining;
>
>         // DXE chanels
>         struct wcn36xx_dxe_ch   dxe_tx_l_ch;    // TX low channel
> --
> 1.7.11.3
>



-- 
Best regards,
Eugene



More information about the wcn36xx mailing list