brcmfmac: use mfp if required from user-space
authorDaniel Kim <dekim@broadcom.com>
Tue, 25 Mar 2014 20:45:09 +0000 (21:45 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 27 Mar 2014 18:20:06 +0000 (14:20 -0400)
The struct cfg80211_connect_params indicate whether the connection
should use management frame protection (mfp). If required set the
MFP_CAPABLE flag in the firmware command. This is supported from
user-space by wpa_supplicant since v2.1.

Reviewed-by: Daniel (Deognyoun) Kim <dekim@broadcom.com>
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: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
drivers/net/wireless/brcm80211/include/brcmu_wifi.h

index e0e649aab8dbc5bffca9de3f58ddbb97bd898732..afb3d15e38ff0379a99c5e2c534be23c57b94e38 100644 (file)
@@ -1354,13 +1354,14 @@ static s32 brcmf_set_auth_type(struct net_device *ndev,
 }
 
 static s32
-brcmf_set_set_cipher(struct net_device *ndev,
-                    struct cfg80211_connect_params *sme)
+brcmf_set_wsec_mode(struct net_device *ndev,
+                    struct cfg80211_connect_params *sme, bool mfp)
 {
        struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
        struct brcmf_cfg80211_security *sec;
        s32 pval = 0;
        s32 gval = 0;
+       s32 wsec;
        s32 err = 0;
 
        if (sme->crypto.n_ciphers_pairwise) {
@@ -1412,7 +1413,12 @@ brcmf_set_set_cipher(struct net_device *ndev,
        if (brcmf_find_wpsie(sme->ie, sme->ie_len) && !pval && !gval &&
            sme->privacy)
                pval = AES_ENABLED;
-       err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wsec", pval | gval);
+
+       if (mfp)
+               wsec = pval | gval | MFP_CAPABLE;
+       else
+               wsec = pval | gval;
+       err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wsec", wsec);
        if (err) {
                brcmf_err("error (%d)\n", err);
                return err;
@@ -1582,7 +1588,6 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
        u32 ie_len;
        struct brcmf_ext_join_params_le *ext_join_params;
        u16 chanspec;
-
        s32 err = 0;
 
        brcmf_dbg(TRACE, "Enter\n");
@@ -1651,7 +1656,7 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
                goto done;
        }
 
-       err = brcmf_set_set_cipher(ndev, sme);
+       err = brcmf_set_wsec_mode(ndev, sme, sme->mfp == NL80211_MFP_REQUIRED);
        if (err) {
                brcmf_err("wl_set_set_cipher failed (%d)\n", err);
                goto done;
index 7ca2aa1035b2101d1d8129c1ca480724863dd507..74419d4bd123772f94e222326c61ee4e93f0f9d3 100644 (file)
@@ -217,6 +217,9 @@ static inline bool ac_bitmap_tst(u8 bitmap, int prec)
 #define WSEC_SWFLAG            0x0008
 /* to go into transition mode without setting wep */
 #define SES_OW_ENABLED         0x0040
+/* MFP */
+#define MFP_CAPABLE            0x0200
+#define MFP_REQUIRED           0x0400
 
 /* WPA authentication mode bitvec */
 #define WPA_AUTH_DISABLED      0x0000  /* Legacy (i.e., non-WPA) */