summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>2011-09-28 12:12:39 +0200
committerPhilippe LANGLAIS <philippe.langlais@stericsson.com>2011-10-13 10:19:46 +0200
commit0748876a91f2f9b35e5625133d919a0a75e29237 (patch)
tree3d3bbe7ab177c290162b39044d5f10ae92c365f9
parent3d07e57f283ea27757d04c1eaf3b5da6ea88807f (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-xdrivers/staging/cw1200/ap.c42
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));