diff options
author | Janusz Dziedzic <janusz.dziedzic@tieto.com> | 2011-09-28 12:12:39 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2011-12-06 11:00:33 +0100 |
commit | 642b1a5cc10ed5f54624e3a336a15a4f6fab9aad (patch) | |
tree | e870968c79e35939aa18ac980c5b8c6cca38bc7b | |
parent | 815a1fc0a2fd54e41bdecfb7e250b4884a582faf (diff) |
cw1200: improve ap mode startup
We have to set SSID in wsm_start request
correctly.
Change-Id: I75c243eb21964d83af9027266335d288941b7a16
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32314
Reviewed-by: Dmitry TARNYAGIN <dmitry.tarnyagin@stericsson.com>
Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Tested-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33532
Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
Tested-by: Dmitry TARNYAGIN <dmitry.tarnyagin@stericsson.com>
-rwxr-xr-x | drivers/staging/cw1200/ap.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/drivers/staging/cw1200/ap.c b/drivers/staging/cw1200/ap.c index f35eef5fae6..c4b68a42ccd 100755 --- a/drivers/staging/cw1200/ap.c +++ b/drivers/staging/cw1200/ap.c @@ -674,8 +674,6 @@ void cw1200_suspend_resume(struct cw1200_common *priv, static int cw1200_upload_beacon(struct cw1200_common *priv) { int ret = 0; - const u8 *ssidie; - const struct ieee80211_mgmt *mgmt; struct wsm_template_frame frame = { .frame_type = WSM_FRAME_TYPE_BEACON, }; @@ -685,20 +683,6 @@ static int cw1200_upload_beacon(struct cw1200_common *priv) if (WARN_ON(!frame.skb)) return -ENOMEM; - mgmt = (struct ieee80211_mgmt *)frame.skb->data; - ssidie = cfg80211_find_ie(WLAN_EID_SSID, - mgmt->u.beacon.variable, - frame.skb->len - (mgmt->u.beacon.variable - frame.skb->data)); - memset(priv->ssid, 0, sizeof(priv->ssid)); - if (ssidie) { - priv->ssid_length = ssidie[1]; - if (WARN_ON(priv->ssid_length > sizeof(priv->ssid))) - priv->ssid_length = sizeof(priv->ssid); - memcpy(priv->ssid, &ssidie[2], priv->ssid_length); - } else { - priv->ssid_length = 0; - } - ret = wsm_set_template_frame(priv, &frame); if (!ret) { /* TODO: Distille probe resp; remove TIM @@ -767,6 +751,9 @@ static int cw1200_enable_beaconing(struct cw1200_common *priv, static int cw1200_start_ap(struct cw1200_common *priv) { int ret; + const u8 *ssidie; + struct sk_buff *skb; + int offset; struct ieee80211_bss_conf *conf = &priv->vif->bss_conf; struct wsm_start start = { .mode = priv->vif->p2p ? @@ -782,11 +769,32 @@ static int cw1200_start_ap(struct cw1200_common *priv) .probeDelay = 100, .basicRateSet = cw1200_rate_mask_to_wsm(priv, conf->basic_rates), - .ssidLength = priv->ssid_length, }; + + /* Get SSID */ + skb = ieee80211_beacon_get(priv->hw, priv->vif); + if (WARN_ON(!skb)) + return -ENOMEM; + + offset = offsetof(struct ieee80211_mgmt, u.beacon.variable); + ssidie = cfg80211_find_ie(WLAN_EID_SSID, skb->data + offset, + skb->len - offset); + + memset(priv->ssid, 0, sizeof(priv->ssid)); + if (ssidie) { + priv->ssid_length = ssidie[1]; + if (WARN_ON(priv->ssid_length > sizeof(priv->ssid))) + priv->ssid_length = sizeof(priv->ssid); + memcpy(priv->ssid, &ssidie[2], priv->ssid_length); + } else { + priv->ssid_length = 0; + } + dev_kfree_skb(skb); + priv->beacon_int = conf->beacon_int; priv->join_dtim_period = conf->dtim_period; + start.ssidLength = priv->ssid_length; memcpy(&start.ssid[0], priv->ssid, start.ssidLength); memset(&priv->link_id_db, 0, sizeof(priv->link_id_db)); |