brcmfmac: store IEs per virtual interface
authorArend van Spriel <arend@broadcom.com>
Mon, 22 Oct 2012 20:55:41 +0000 (13:55 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 29 Oct 2012 19:28:58 +0000 (15:28 -0400)
For AP feature the IEs are stored in global structure. For future
functionality like P2P-GO it needs to be stored per virtual interface
so better store it in the virtual interface structure.

Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h

index 62b155e1e018a79974a1c1e7090c511b1a169f23..cbad77261ee4d207eacaf02bdc2983e1b9cfc40c 100644 (file)
@@ -3774,6 +3774,7 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg,
                        u8 *vndr_ie_buf, u32 vndr_ie_len)
 {
        struct brcmf_if *ifp = netdev_priv(ndev);
+       struct vif_saved_ie *saved_ie = &ifp->vif->saved_ie;
        s32 err = 0;
        u8  *iovar_ie_buf;
        u8  *curr_ie_buf;
@@ -3796,18 +3797,17 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg,
        if (!iovar_ie_buf)
                return -ENOMEM;
        curr_ie_buf = iovar_ie_buf;
-       if (test_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state) ||
-           test_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state)) {
+       if (ifp->vif->mode == WL_MODE_AP) {
                switch (pktflag) {
                case VNDR_IE_PRBRSP_FLAG:
-                       mgmt_ie_buf = cfg->ap_info->probe_res_ie;
-                       mgmt_ie_len = &cfg->ap_info->probe_res_ie_len;
-                       mgmt_ie_buf_len = sizeof(cfg->ap_info->probe_res_ie);
+                       mgmt_ie_buf = saved_ie->probe_res_ie;
+                       mgmt_ie_len = &saved_ie->probe_res_ie_len;
+                       mgmt_ie_buf_len = sizeof(saved_ie->probe_res_ie);
                        break;
                case VNDR_IE_BEACON_FLAG:
-                       mgmt_ie_buf = cfg->ap_info->beacon_ie;
-                       mgmt_ie_len = &cfg->ap_info->beacon_ie_len;
-                       mgmt_ie_buf_len = sizeof(cfg->ap_info->beacon_ie);
+                       mgmt_ie_buf = saved_ie->beacon_ie;
+                       mgmt_ie_len = &saved_ie->beacon_ie_len;
+                       mgmt_ie_buf_len = sizeof(saved_ie->beacon_ie);
                        break;
                default:
                        err = -EPERM;
index 85f3adf8ff69eb476a0dbb1662c82423d68998df..1dd96f148ef7e8eb9a2978c1d2e0f7be09c16cb9 100644 (file)
@@ -231,6 +231,21 @@ enum brcmf_vif_status {
        BRCMF_VIF_STATUS_AP_CREATED
 };
 
+/**
+ * struct vif_saved_ie - holds saved IEs for a virtual interface.
+ *
+ * @probe_res_ie: IE info for probe response.
+ * @beacon_ie: IE info for beacon frame.
+ * @probe_res_ie_len: IE info length for probe response.
+ * @beacon_ie_len: IE info length for beacon frame.
+ */
+struct vif_saved_ie {
+       u8  probe_res_ie[IE_MAX_LEN];
+       u8  beacon_ie[IE_MAX_LEN];
+       u32 probe_res_ie_len;
+       u32 beacon_ie_len;
+};
+
 /**
  * struct brcmf_cfg80211_vif - virtual interface specific information.
  *
@@ -251,6 +266,7 @@ struct brcmf_cfg80211_vif {
        s32 roam_off;
        unsigned long sme_state;
        bool pm_block;
+       struct vif_saved_ie saved_ie;
        struct list_head list;
 };