hostapd: add pending patches
authorJohn Crispin <john@openwrt.org>
Tue, 24 Jul 2012 23:07:10 +0000 (23:07 +0000)
committerJohn Crispin <john@openwrt.org>
Tue, 24 Jul 2012 23:07:10 +0000 (23:07 +0000)
add patched needed to pass more parameters to the IBSS JOIN command

Signed-off-by: Antonio Quartulli <ordex@autistici.org>
SVN-Revision: 32828

package/hostapd/patches/601-wpa_supplicant-add-new-config-params-to-be-used-with.patch [new file with mode: 0644]
package/hostapd/patches/602-driver_nl80211-use-new-parameters-during-ibss-join.patch [new file with mode: 0644]

diff --git a/package/hostapd/patches/601-wpa_supplicant-add-new-config-params-to-be-used-with.patch b/package/hostapd/patches/601-wpa_supplicant-add-new-config-params-to-be-used-with.patch
new file mode 100644 (file)
index 0000000..a1fde05
--- /dev/null
@@ -0,0 +1,222 @@
+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(-)
+
+diff --git a/src/drivers/driver.h b/src/drivers/driver.h
+index 5ee92f7..d204148 100644
+--- a/src/drivers/driver.h
++++ b/src/drivers/driver.h
+@@ -19,6 +19,7 @@
+ #define WPA_SUPPLICANT_DRIVER_VERSION 4
++#include "drivers/nl80211_copy.h"
+ #include "common/defs.h"
+ #define HOSTAPD_CHAN_DISABLED 0x00000001
+@@ -332,6 +333,11 @@ struct wpa_driver_associate_params {
+        */
+       int freq;
++      int beacon_interval;
++      int fixed_freq;
++      unsigned char rates[NL80211_MAX_SUPP_RATES];
++      int mcast_rate;
++
+       /**
+        * bg_scan_period - Background scan period in seconds, 0 to disable
+        * background scan, or -1 to indicate no change to default driver
+diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c
+index c423bc3..be566ee 100644
+--- a/wpa_supplicant/config.c
++++ b/wpa_supplicant/config.c
+@@ -14,6 +14,7 @@
+ #include "rsn_supp/wpa.h"
+ #include "eap_peer/eap.h"
+ #include "p2p/p2p.h"
++#include "drivers/nl80211_copy.h"
+ #include "config.h"
+@@ -1431,6 +1432,97 @@ static char * wpa_config_write_p2p_client_list(const struct parse_data *data,
+ #endif /* CONFIG_P2P */
++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 < NL80211_MAX_SUPP_RATES) {
++              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 * NL80211_MAX_SUPP_RATES + 1);
++      if (value == NULL)
++              return NULL;
++      pos = value;
++      for (i = 0; i < NL80211_MAX_SUPP_RATES - 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[NL80211_MAX_SUPP_RATES - 1] / 2);
++      if (res < 0) {
++              os_free(value);
++              return NULL;
++      }
++
++      value[6 * NL80211_MAX_SUPP_RATES] = '\0';
++      return value;
++}
++#endif /* NO_CONFIG_WRITE */
++
+ /* Helper macros for network block parser */
+ #ifdef OFFSET
+@@ -1605,6 +1697,10 @@ static const struct parse_data ssid_fields[] = {
+       { STR(ht_mcs) },
+ #endif /* CONFIG_HT_OVERRIDES */
+       { INT(ap_max_inactivity) },
++      { INT_RANGE(fixed_freq, 0, 1) },
++      { INT_RANGE(beacon_interval, 0, 1000) },
++      { FUNC(rates) },
++      { FUNC(mcast_rate) },
+ };
+ #undef OFFSET
+diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
+index 80d4382..8d152a4 100644
+--- a/wpa_supplicant/config_ssid.h
++++ b/wpa_supplicant/config_ssid.h
+@@ -11,6 +11,7 @@
+ #include "common/defs.h"
+ #include "eap_peer/eap_config.h"
++#include "drivers/nl80211_copy.h"
+ #define MAX_SSID_LEN 32
+@@ -499,6 +500,11 @@ struct wpa_ssid {
+        * By default: 300 seconds.
+        */
+       int ap_max_inactivity;
++
++      int fixed_freq;
++      int beacon_interval;
++      unsigned char rates[NL80211_MAX_SUPP_RATES];
++      double mcast_rate;
+ };
+ #endif /* CONFIG_SSID_H */
+diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
+index cc85f1e..1473d91 100644
+--- a/wpa_supplicant/wpa_supplicant.c
++++ b/wpa_supplicant/wpa_supplicant.c
+@@ -1395,15 +1395,24 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
+               params.ssid_len = ssid->ssid_len;
+       }
+-      if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
+-          wpa_s->conf->ap_scan == 2) {
+-              params.bssid = ssid->bssid;
+-              params.fixed_bssid = 1;
++      if (ssid->mode == WPAS_MODE_IBSS) {
++              if (ssid->bssid_set && wpa_s->conf->ap_scan == 2) {
++                      params.bssid = ssid->bssid;
++                      params.fixed_bssid = 1;
++              }
++              if (ssid->frequency > 0 && params.freq == 0)
++                      /* Initial channel for IBSS */
++                      params.freq = ssid->frequency;
++              params.fixed_freq = ssid->fixed_freq;
++              params.beacon_interval = ssid->beacon_interval;
++              i = 0;
++              while (i < NL80211_MAX_SUPP_RATES) {
++                      params.rates[i] = ssid->rates[i];
++                      i++;
++              }
++              params.mcast_rate = ssid->mcast_rate;
+       }
+-      if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
+-          params.freq == 0)
+-              params.freq = ssid->frequency; /* Initial channel for IBSS */
+       params.wpa_ie = wpa_ie;
+       params.wpa_ie_len = wpa_ie_len;
+       params.pairwise_suite = cipher_pairwise;
+-- 
+1.7.9.4
+
diff --git a/package/hostapd/patches/602-driver_nl80211-use-new-parameters-during-ibss-join.patch b/package/hostapd/patches/602-driver_nl80211-use-new-parameters-during-ibss-join.patch
new file mode 100644 (file)
index 0000000..5f4df23
--- /dev/null
@@ -0,0 +1,64 @@
+From ffc4445958a3ed4064f2e1bf73fa478a61c5cf7b Mon Sep 17 00:00:00 2001
+From: Antonio Quartulli <ordex@autistici.org>
+Date: Sun, 3 Jun 2012 18:42:25 +0200
+Subject: [PATCHv2 602/602] driver_nl80211: use new parameters during ibss join
+
+Signed-hostap: Antonio Quartulli <ordex@autistici.org>
+---
+ src/drivers/driver_nl80211.c |   33 ++++++++++++++++++++++++++++++++-
+ 1 file changed, 32 insertions(+), 1 deletion(-)
+
+diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
+index 22e7075..f510d18 100644
+--- a/src/drivers/driver_nl80211.c
++++ b/src/drivers/driver_nl80211.c
+@@ -6481,7 +6481,7 @@ static int wpa_driver_nl80211_ibss(struct wpa_driver_nl80211_data *drv,
+                                  struct wpa_driver_associate_params *params)
+ {
+       struct nl_msg *msg;
+-      int ret = -1;
++      int ret = -1, i;
+       int count = 0;
+       wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
+@@ -6514,6 +6514,37 @@ retry:
+       wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
+       NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
++      if (params->fixed_freq) {
++              wpa_printf(MSG_DEBUG, "  * fixed_freq");
++              NLA_PUT_FLAG(msg, NL80211_ATTR_FREQ_FIXED);
++      }
++
++      if (params->beacon_interval > 0) {
++              wpa_printf(MSG_DEBUG, "  * beacon_interval=%d",
++                         params->beacon_interval);
++              NLA_PUT_U32(msg, NL80211_ATTR_BEACON_INTERVAL,
++                          params->beacon_interval);
++      }
++
++      if (params->rates[0] > 0) {
++              wpa_printf(MSG_DEBUG, "  * basic_rates:");
++              i = 0;
++              while (i < NL80211_MAX_SUPP_RATES &&
++                     params->rates[i] > 0) {
++                      wpa_printf(MSG_DEBUG, "    %.1f",
++                                 (double)params->rates[i] / 2);
++                      i++;
++              }
++              NLA_PUT(msg, NL80211_ATTR_BSS_BASIC_RATES, i,
++                      params->rates);
++      }
++
++      if (params->mcast_rate > 0) {
++              wpa_printf(MSG_DEBUG, "  * mcast_rates=%.1f",
++                         (double)params->mcast_rate / 10);
++              NLA_PUT_U32(msg, NL80211_ATTR_MCAST_RATE, params->mcast_rate);
++      }
++
+       ret = nl80211_set_conn_keys(params, msg);
+       if (ret)
+               goto nla_put_failure;
+-- 
+1.7.9.4
+