OpenWrt – Rev 1

Subversion Repositories:
Rev:
From 4bb69d15477e0f2b00e166845341dc933de47c58 Mon Sep 17 00:00:00 2001
From: Antonio Quartulli <ordex@autistici.org>
Date: Sun, 3 Jun 2012 18:22:56 +0200
Subject: [PATCHv2 601/602] wpa_supplicant: add new config params to be used
 with the ibss join command

Signed-hostap: Antonio Quartulli <ordex@autistici.org>
---
 src/drivers/driver.h            |    6 +++
 wpa_supplicant/config.c         |   96 +++++++++++++++++++++++++++++++++++++++
 wpa_supplicant/config_ssid.h    |    6 +++
 wpa_supplicant/wpa_supplicant.c |   23 +++++++---
 4 files changed, 124 insertions(+), 7 deletions(-)

--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -19,6 +19,7 @@
 
 #define WPA_SUPPLICANT_DRIVER_VERSION 4
 
+#include "ap/sta_info.h"
 #include "common/defs.h"
 #include "common/ieee802_11_defs.h"
 #include "common/wpa_common.h"
@@ -774,6 +775,9 @@ struct wpa_driver_associate_params {
         * responsible for selecting with which BSS to associate. */
        const u8 *bssid;
 
+       unsigned char rates[WLAN_SUPP_RATES_MAX];
+       int mcast_rate;
+
        /**
         * bssid_hint - BSSID of a proposed AP
         *
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
@@ -17,6 +17,7 @@
 #include "eap_peer/eap.h"
 #include "p2p/p2p.h"
 #include "fst/fst.h"
+#include "ap/sta_info.h"
 #include "config.h"
 
 
@@ -2053,6 +2054,97 @@ static char * wpa_config_write_peerkey(c
 #endif /* NO_CONFIG_WRITE */
 
 
+static int wpa_config_parse_mcast_rate(const struct parse_data *data,
+                                      struct wpa_ssid *ssid, int line,
+                                      const char *value)
+{
+       ssid->mcast_rate = (int)(strtod(value, NULL) * 10);
+
+       return 0;
+}
+
+#ifndef NO_CONFIG_WRITE
+static char * wpa_config_write_mcast_rate(const struct parse_data *data,
+                                         struct wpa_ssid *ssid)
+{
+       char *value;
+       int res;
+
+       if (!ssid->mcast_rate == 0)
+               return NULL;
+
+       value = os_malloc(6); /* longest: 300.0 */
+       if (value == NULL)
+               return NULL;
+       res = os_snprintf(value, 5, "%.1f", (double)ssid->mcast_rate / 10);
+       if (res < 0) {
+               os_free(value);
+               return NULL;
+       }
+       return value;
+}
+#endif /* NO_CONFIG_WRITE */
+
+static int wpa_config_parse_rates(const struct parse_data *data,
+                                 struct wpa_ssid *ssid, int line,
+                                 const char *value)
+{
+       int i;
+       char *pos, *r, *sptr, *end;
+       double rate;
+
+       pos = (char *)value;
+       r = strtok_r(pos, ",", &sptr);
+       i = 0;
+       while (pos && i < WLAN_SUPP_RATES_MAX) {
+               rate = 0.0;
+               if (r)
+                       rate = strtod(r, &end);
+               ssid->rates[i] = rate * 2;
+               if (*end != '\0' || rate * 2 != ssid->rates[i])
+                       return 1;
+
+               i++;
+               r = strtok_r(NULL, ",", &sptr);
+       }
+
+       return 0;
+}
+
+#ifndef NO_CONFIG_WRITE
+static char * wpa_config_write_rates(const struct parse_data *data,
+                                    struct wpa_ssid *ssid)
+{
+       char *value, *pos;
+       int res, i;
+
+       if (ssid->rates[0] <= 0)
+               return NULL;
+
+       value = os_malloc(6 * WLAN_SUPP_RATES_MAX + 1);
+       if (value == NULL)
+               return NULL;
+       pos = value;
+       for (i = 0; i < WLAN_SUPP_RATES_MAX - 1; i++) {
+               res = os_snprintf(pos, 6, "%.1f,", (double)ssid->rates[i] / 2);
+               if (res < 0) {
+                       os_free(value);
+                       return NULL;
+               }
+               pos += res;
+       }
+       res = os_snprintf(pos, 6, "%.1f",
+                         (double)ssid->rates[WLAN_SUPP_RATES_MAX - 1] / 2);
+       if (res < 0) {
+               os_free(value);
+               return NULL;
+       }
+
+       value[6 * WLAN_SUPP_RATES_MAX] = '\0';
+       return value;
+}
+#endif /* NO_CONFIG_WRITE */
+
 /* Helper macros for network block parser */
 
 #ifdef OFFSET
@@ -2298,6 +2390,8 @@ static const struct parse_data ssid_fiel
        { INT(ap_max_inactivity) },
        { INT(dtim_period) },
        { INT(beacon_int) },
+       { FUNC(rates) },
+       { FUNC(mcast_rate) },
 #ifdef CONFIG_MACSEC
        { INT_RANGE(macsec_policy, 0, 1) },
        { INT_RANGE(macsec_integ_only, 0, 1) },
--- a/wpa_supplicant/config_ssid.h
+++ b/wpa_supplicant/config_ssid.h
@@ -10,8 +10,10 @@
 #define CONFIG_SSID_H
 
 #include "common/defs.h"
+#include "ap/sta_info.h"
 #include "utils/list.h"
 #include "eap_peer/eap_config.h"
+#include "drivers/nl80211_copy.h"
 
 
 #define DEFAULT_EAP_WORKAROUND ((unsigned int) -1)
@@ -757,6 +759,9 @@ struct wpa_ssid {
         */
        void *parent_cred;
 
+       unsigned char rates[WLAN_SUPP_RATES_MAX];
+       double mcast_rate;
+
 #ifdef CONFIG_MACSEC
        /**
         * macsec_policy - Determines the policy for MACsec secure session
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -3117,6 +3117,12 @@ static void wpas_start_assoc_cb(struct w
                        params.beacon_int = ssid->beacon_int;
                else
                        params.beacon_int = wpa_s->conf->beacon_int;
+               i = 0;
+               while (i < WLAN_SUPP_RATES_MAX) {
+                       params.rates[i] = ssid->rates[i];
+                       i++;
+               }
+               params.mcast_rate = ssid->mcast_rate;
        }
 
        params.pairwise_suite = cipher_pairwise;