ar71xx: ag71xx: make switch register access atomic
[openwrt.git] / package / hostapd / patches / 350-hostap_multicall_fix.patch
index 016ed0c..20c5060 100644 (file)
@@ -40,7 +40,7 @@
  static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param,
                         int len);
  static int hostap_set_iface_flags(void *priv, int dev_up);
  static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param,
                         int len);
  static int hostap_set_iface_flags(void *priv, int dev_up);
-@@ -399,65 +404,6 @@ static int hostapd_ioctl(void *priv, str
+@@ -400,65 +405,6 @@ static int hostapd_ioctl(void *priv, str
  }
  
  
  }
  
  
  static int hostap_get_seqnum(const char *ifname, void *priv, const u8 *addr,
                             int idx, u8 *seq)
  {
  static int hostap_get_seqnum(const char *ifname, void *priv, const u8 *addr,
                             int idx, u8 *seq)
  {
-@@ -1125,21 +1071,14 @@ static struct hostapd_hw_modes * hostap_
+@@ -1126,21 +1072,9 @@ static struct hostapd_hw_modes * hostap_
        return mode;
  }
  
        return mode;
  }
  
 -      int sock;
 -      int current_mode; /* infra/adhoc */
 -};
 -      int sock;
 -      int current_mode; /* infra/adhoc */
 -};
+-
+-
+-static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg);
+-
 +#endif /* HOSTAPD */
  
 +#endif /* HOSTAPD */
  
-+#if !defined(NO_SUPPLICANT)
- static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg);
 -static int hostapd_ioctl(struct wpa_driver_hostap_data *drv,
 +static int wpa_hostapd_ioctl(struct hostap_driver_data *drv,
                         struct prism2_hostapd_param *param,
                         int len, int show_err)
  {
 -static int hostapd_ioctl(struct wpa_driver_hostap_data *drv,
 +static int wpa_hostapd_ioctl(struct hostap_driver_data *drv,
                         struct prism2_hostapd_param *param,
                         int len, int show_err)
  {
-@@ -1161,7 +1100,7 @@ static int hostapd_ioctl(struct wpa_driv
+@@ -1162,7 +1096,12 @@ static int hostapd_ioctl(struct wpa_driv
  }
  
  
 -static int wpa_driver_hostap_set_wpa_ie(struct wpa_driver_hostap_data *drv,
  }
  
  
 -static int wpa_driver_hostap_set_wpa_ie(struct wpa_driver_hostap_data *drv,
++#if !defined(NO_SUPPLICANT)
++
++static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg);
++
++
 +static int wpa_driver_hostap_set_wpa_ie(struct hostap_driver_data *drv,
                                        const u8 *wpa_ie, size_t wpa_ie_len)
  {
        struct prism2_hostapd_param *param;
 +static int wpa_driver_hostap_set_wpa_ie(struct hostap_driver_data *drv,
                                        const u8 *wpa_ie, size_t wpa_ie_len)
  {
        struct prism2_hostapd_param *param;
-@@ -1177,7 +1116,7 @@ static int wpa_driver_hostap_set_wpa_ie(
+@@ -1178,7 +1117,7 @@ static int wpa_driver_hostap_set_wpa_ie(
        param->cmd = PRISM2_HOSTAPD_SET_GENERIC_ELEMENT;
        param->u.generic_elem.len = wpa_ie_len;
        os_memcpy(param->u.generic_elem.data, wpa_ie, wpa_ie_len);
        param->cmd = PRISM2_HOSTAPD_SET_GENERIC_ELEMENT;
        param->u.generic_elem.len = wpa_ie_len;
        os_memcpy(param->u.generic_elem.data, wpa_ie, wpa_ie_len);
  
        os_free(param);
  
  
        os_free(param);
  
-@@ -1185,7 +1124,7 @@ static int wpa_driver_hostap_set_wpa_ie(
+@@ -1186,7 +1125,7 @@ static int wpa_driver_hostap_set_wpa_ie(
  }
  
  
  }
  
  
                       int value)
  {
        struct iwreq iwr;
                       int value)
  {
        struct iwreq iwr;
-@@ -1207,7 +1146,7 @@ static int prism2param(struct wpa_driver
+@@ -1208,7 +1147,7 @@ static int prism2param(struct wpa_driver
  
  static int wpa_driver_hostap_set_wpa(void *priv, int enabled)
  {
  
  static int wpa_driver_hostap_set_wpa(void *priv, int enabled)
  {
        int ret = 0;
  
        wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
        int ret = 0;
  
        wpa_printf(MSG_DEBUG, "%s: enabled=%d", __FUNCTION__, enabled);
-@@ -1260,7 +1199,7 @@ static int wpa_driver_hostap_set_key(con
-                                    const u8 *seq, size_t seq_len,
-                                    const u8 *key, size_t key_len)
- {
+@@ -1224,125 +1163,15 @@ static int wpa_driver_hostap_set_wpa(voi
+ }
+-static void show_set_key_error(struct prism2_hostapd_param *param)
+-{
+-      switch (param->u.crypt.err) {
+-      case HOSTAP_CRYPT_ERR_UNKNOWN_ALG:
+-              wpa_printf(MSG_INFO, "Unknown algorithm '%s'.",
+-                         param->u.crypt.alg);
+-              wpa_printf(MSG_INFO, "You may need to load kernel module to "
+-                         "register that algorithm.");
+-              wpa_printf(MSG_INFO, "E.g., 'modprobe hostap_crypt_wep' for "
+-                         "WEP.");
+-              break;
+-      case HOSTAP_CRYPT_ERR_UNKNOWN_ADDR:
+-              wpa_printf(MSG_INFO, "Unknown address " MACSTR ".",
+-                         MAC2STR(param->sta_addr));
+-              break;
+-      case HOSTAP_CRYPT_ERR_CRYPT_INIT_FAILED:
+-              wpa_printf(MSG_INFO, "Crypt algorithm initialization failed.");
+-              break;
+-      case HOSTAP_CRYPT_ERR_KEY_SET_FAILED:
+-              wpa_printf(MSG_INFO, "Key setting failed.");
+-              break;
+-      case HOSTAP_CRYPT_ERR_TX_KEY_SET_FAILED:
+-              wpa_printf(MSG_INFO, "TX key index setting failed.");
+-              break;
+-      case HOSTAP_CRYPT_ERR_CARD_CONF_FAILED:
+-              wpa_printf(MSG_INFO, "Card configuration failed.");
+-              break;
+-      }
+-}
+-
+-
+-static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
+-                                   enum wpa_alg alg, const u8 *addr,
+-                                   int key_idx, int set_tx,
+-                                   const u8 *seq, size_t seq_len,
+-                                   const u8 *key, size_t key_len)
+-{
 -      struct wpa_driver_hostap_data *drv = priv;
 -      struct wpa_driver_hostap_data *drv = priv;
-+      struct hostap_driver_data *drv = priv;
-       struct prism2_hostapd_param *param;
-       u8 *buf;
-       size_t blen;
-@@ -1305,14 +1244,10 @@ static int wpa_driver_hostap_set_key(con
-        * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported).
-        * This should be fine for more or less all cases, but for completeness
-        * sake, the driver could be enhanced to support the missing key. */
+-      struct prism2_hostapd_param *param;
+-      u8 *buf;
+-      size_t blen;
+-      int ret = 0;
+-      char *alg_name;
+-
+-      switch (alg) {
+-      case WPA_ALG_NONE:
+-              alg_name = "none";
+-              break;
+-      case WPA_ALG_WEP:
+-              alg_name = "WEP";
+-              break;
+-      case WPA_ALG_TKIP:
+-              alg_name = "TKIP";
+-              break;
+-      case WPA_ALG_CCMP:
+-              alg_name = "CCMP";
+-              break;
+-      default:
+-              return -1;
+-      }
+-
+-      wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu "
+-                 "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx,
+-                 (unsigned long) seq_len, (unsigned long) key_len);
+-
+-      if (seq_len > 8)
+-              return -2;
+-
+-      blen = sizeof(*param) + key_len;
+-      buf = os_zalloc(blen);
+-      if (buf == NULL)
+-              return -1;
+-
+-      param = (struct prism2_hostapd_param *) buf;
+-      param->cmd = PRISM2_SET_ENCRYPTION;
+-      /* TODO: In theory, STA in client mode can use five keys; four default
+-       * keys for receiving (with keyidx 0..3) and one individual key for
+-       * both transmitting and receiving (keyidx 0) _unicast_ packets. Now,
+-       * keyidx 0 is reserved for this unicast use and default keys can only
+-       * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported).
+-       * This should be fine for more or less all cases, but for completeness
+-       * sake, the driver could be enhanced to support the missing key. */
 -#if 0
 -#if 0
-       if (addr == NULL)
-               os_memset(param->sta_addr, 0xff, ETH_ALEN);
-       else
-               os_memcpy(param->sta_addr, addr, ETH_ALEN);
+-      if (addr == NULL)
+-              os_memset(param->sta_addr, 0xff, ETH_ALEN);
+-      else
+-              os_memcpy(param->sta_addr, addr, ETH_ALEN);
 -#else
 -      os_memset(param->sta_addr, 0xff, ETH_ALEN);
 -#endif
 -#else
 -      os_memset(param->sta_addr, 0xff, ETH_ALEN);
 -#endif
-       os_strlcpy((char *) param->u.crypt.alg, alg_name,
-                  HOSTAP_CRYPT_ALG_NAME_LEN);
-       param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0;
-@@ -1322,7 +1257,7 @@ static int wpa_driver_hostap_set_key(con
-       param->u.crypt.key_len = key_len;
-       os_memcpy((u8 *) (param + 1), key, key_len);
+-      os_strlcpy((char *) param->u.crypt.alg, alg_name,
+-                 HOSTAP_CRYPT_ALG_NAME_LEN);
+-      param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0;
+-      param->u.crypt.idx = key_idx;
+-      if (seq)
+-              os_memcpy(param->u.crypt.seq, seq, seq_len);
+-      param->u.crypt.key_len = key_len;
+-      os_memcpy((u8 *) (param + 1), key, key_len);
+-
 -      if (hostapd_ioctl(drv, param, blen, 1)) {
 -      if (hostapd_ioctl(drv, param, blen, 1)) {
-+      if (wpa_hostapd_ioctl(drv, param, blen, 1)) {
-               wpa_printf(MSG_WARNING, "Failed to set encryption.");
-               show_set_key_error(param);
-               ret = -1;
-@@ -1335,13 +1270,13 @@ static int wpa_driver_hostap_set_key(con
+-              wpa_printf(MSG_WARNING, "Failed to set encryption.");
+-              show_set_key_error(param);
+-              ret = -1;
+-      }
+-      os_free(buf);
+-
+-      return ret;
+-}
+-
+-
  static int wpa_driver_hostap_set_countermeasures(void *priv, int enabled)
  {
 -      struct wpa_driver_hostap_data *drv = priv;
  static int wpa_driver_hostap_set_countermeasures(void *priv, int enabled)
  {
 -      struct wpa_driver_hostap_data *drv = priv;
                                   int type)
  {
        struct iwreq iwr;
                                   int type)
  {
        struct iwreq iwr;
-@@ -1362,7 +1297,7 @@ static int wpa_driver_hostap_reset(struc
+@@ -1363,7 +1192,7 @@ static int wpa_driver_hostap_reset(struc
  }
  
  
  }
  
  
                                  const u8 *addr, int cmd, int reason_code)
  {
        struct prism2_hostapd_param param;
                                  const u8 *addr, int cmd, int reason_code)
  {
        struct prism2_hostapd_param param;
-@@ -1377,7 +1312,7 @@ static int wpa_driver_hostap_mlme(struct
+@@ -1378,7 +1207,7 @@ static int wpa_driver_hostap_mlme(struct
        os_memcpy(param.sta_addr, addr, ETH_ALEN);
        param.u.mlme.cmd = cmd;
        param.u.mlme.reason_code = reason_code;
        os_memcpy(param.sta_addr, addr, ETH_ALEN);
        param.u.mlme.cmd = cmd;
        param.u.mlme.reason_code = reason_code;
        if (ret == 0) {
                os_sleep(0, 100000);
                ret = wpa_driver_hostap_reset(drv, 2);
        if (ret == 0) {
                os_sleep(0, 100000);
                ret = wpa_driver_hostap_reset(drv, 2);
-@@ -1389,7 +1324,7 @@ static int wpa_driver_hostap_mlme(struct
+@@ -1390,7 +1219,7 @@ static int wpa_driver_hostap_mlme(struct
  static int wpa_driver_hostap_deauthenticate(void *priv, const u8 *addr,
                                            int reason_code)
  {
  static int wpa_driver_hostap_deauthenticate(void *priv, const u8 *addr,
                                            int reason_code)
  {
        wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
        return wpa_driver_hostap_mlme(drv, addr, MLME_STA_DEAUTH,
                                      reason_code);
        wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
        return wpa_driver_hostap_mlme(drv, addr, MLME_STA_DEAUTH,
                                      reason_code);
-@@ -1399,7 +1334,7 @@ static int wpa_driver_hostap_deauthentic
+@@ -1400,7 +1229,7 @@ static int wpa_driver_hostap_deauthentic
  static int wpa_driver_hostap_disassociate(void *priv, const u8 *addr,
                                          int reason_code)
  {
  static int wpa_driver_hostap_disassociate(void *priv, const u8 *addr,
                                          int reason_code)
  {
        wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
        return wpa_driver_hostap_mlme(drv, addr, MLME_STA_DISASSOC,
                                      reason_code);
        wpa_printf(MSG_DEBUG, "%s", __FUNCTION__);
        return wpa_driver_hostap_mlme(drv, addr, MLME_STA_DISASSOC,
                                      reason_code);
-@@ -1410,7 +1345,7 @@ static int
+@@ -1411,7 +1240,7 @@ static int
  wpa_driver_hostap_associate(void *priv,
                            struct wpa_driver_associate_params *params)
  {
  wpa_driver_hostap_associate(void *priv,
                            struct wpa_driver_associate_params *params)
  {
        int ret = 0;
        int allow_unencrypted_eapol;
  
        int ret = 0;
        int allow_unencrypted_eapol;
  
-@@ -1474,7 +1409,7 @@ wpa_driver_hostap_associate(void *priv,
+@@ -1475,7 +1304,7 @@ wpa_driver_hostap_associate(void *priv,
  static int wpa_driver_hostap_scan(void *priv,
                                  struct wpa_driver_scan_params *params)
  {
  static int wpa_driver_hostap_scan(void *priv,
                                  struct wpa_driver_scan_params *params)
  {
        struct prism2_hostapd_param param;
        int ret;
        const u8 *ssid = params->ssids[0].ssid;
        struct prism2_hostapd_param param;
        int ret;
        const u8 *ssid = params->ssids[0].ssid;
-@@ -1495,7 +1430,7 @@ static int wpa_driver_hostap_scan(void *
+@@ -1496,7 +1325,7 @@ static int wpa_driver_hostap_scan(void *
        param.cmd = PRISM2_HOSTAPD_SCAN_REQ;
        param.u.scan_req.ssid_len = ssid_len;
        os_memcpy(param.u.scan_req.ssid, ssid, ssid_len);
        param.cmd = PRISM2_HOSTAPD_SCAN_REQ;
        param.u.scan_req.ssid_len = ssid_len;
        os_memcpy(param.u.scan_req.ssid, ssid, ssid_len);
  
        /* Not all drivers generate "scan completed" wireless event, so try to
         * read results after a timeout. */
  
        /* Not all drivers generate "scan completed" wireless event, so try to
         * read results after a timeout. */
-@@ -1510,7 +1445,7 @@ static int wpa_driver_hostap_scan(void *
+@@ -1511,7 +1340,7 @@ static int wpa_driver_hostap_scan(void *
  
  static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg)
  {
  
  static int wpa_driver_hostap_set_auth_alg(void *priv, int auth_alg)
  {
        int algs = 0;
  
        if (auth_alg & WPA_AUTH_ALG_OPEN)
        int algs = 0;
  
        if (auth_alg & WPA_AUTH_ALG_OPEN)
-@@ -1528,35 +1463,35 @@ static int wpa_driver_hostap_set_auth_al
+@@ -1529,35 +1358,35 @@ static int wpa_driver_hostap_set_auth_al
  
  static int wpa_driver_hostap_get_bssid(void *priv, u8 *bssid)
  {
  
  static int wpa_driver_hostap_get_bssid(void *priv, u8 *bssid)
  {
  
        drv = os_zalloc(sizeof(*drv));
        if (drv == NULL)
  
        drv = os_zalloc(sizeof(*drv));
        if (drv == NULL)
-@@ -1596,14 +1531,14 @@ static void * wpa_driver_hostap_init(voi
+@@ -1597,14 +1426,120 @@ static void * wpa_driver_hostap_init(voi
  
  static void wpa_driver_hostap_deinit(void *priv)
  {
  
  static void wpa_driver_hostap_deinit(void *priv)
  {
  
 -#endif /* HOSTAPD */
 +#endif
  
 -#endif /* HOSTAPD */
 +#endif
++
++
++static void show_set_key_error(struct prism2_hostapd_param *param)
++{
++      switch (param->u.crypt.err) {
++      case HOSTAP_CRYPT_ERR_UNKNOWN_ALG:
++              wpa_printf(MSG_INFO, "Unknown algorithm '%s'.",
++                         param->u.crypt.alg);
++              wpa_printf(MSG_INFO, "You may need to load kernel module to "
++                         "register that algorithm.");
++              wpa_printf(MSG_INFO, "E.g., 'modprobe hostap_crypt_wep' for "
++                         "WEP.");
++              break;
++      case HOSTAP_CRYPT_ERR_UNKNOWN_ADDR:
++              wpa_printf(MSG_INFO, "Unknown address " MACSTR ".",
++                         MAC2STR(param->sta_addr));
++              break;
++      case HOSTAP_CRYPT_ERR_CRYPT_INIT_FAILED:
++              wpa_printf(MSG_INFO, "Crypt algorithm initialization failed.");
++              break;
++      case HOSTAP_CRYPT_ERR_KEY_SET_FAILED:
++              wpa_printf(MSG_INFO, "Key setting failed.");
++              break;
++      case HOSTAP_CRYPT_ERR_TX_KEY_SET_FAILED:
++              wpa_printf(MSG_INFO, "TX key index setting failed.");
++              break;
++      case HOSTAP_CRYPT_ERR_CARD_CONF_FAILED:
++              wpa_printf(MSG_INFO, "Card configuration failed.");
++              break;
++      }
++}
++
++
++static int wpa_driver_hostap_set_key(const char *ifname, void *priv,
++                                   enum wpa_alg alg, const u8 *addr,
++                                   int key_idx, int set_tx,
++                                   const u8 *seq, size_t seq_len,
++                                   const u8 *key, size_t key_len)
++{
++      struct hostap_driver_data *drv = priv;
++      struct prism2_hostapd_param *param;
++      u8 *buf;
++      size_t blen;
++      int ret = 0;
++      char *alg_name;
++
++      switch (alg) {
++      case WPA_ALG_NONE:
++              alg_name = "none";
++              break;
++      case WPA_ALG_WEP:
++              alg_name = "WEP";
++              break;
++      case WPA_ALG_TKIP:
++              alg_name = "TKIP";
++              break;
++      case WPA_ALG_CCMP:
++              alg_name = "CCMP";
++              break;
++      default:
++              return -1;
++      }
++
++      wpa_printf(MSG_DEBUG, "%s: alg=%s key_idx=%d set_tx=%d seq_len=%lu "
++                 "key_len=%lu", __FUNCTION__, alg_name, key_idx, set_tx,
++                 (unsigned long) seq_len, (unsigned long) key_len);
++
++      if (seq_len > 8)
++              return -2;
++
++      blen = sizeof(*param) + key_len;
++      buf = os_zalloc(blen);
++      if (buf == NULL)
++              return -1;
++
++      param = (struct prism2_hostapd_param *) buf;
++      param->cmd = PRISM2_SET_ENCRYPTION;
++      /* TODO: In theory, STA in client mode can use five keys; four default
++       * keys for receiving (with keyidx 0..3) and one individual key for
++       * both transmitting and receiving (keyidx 0) _unicast_ packets. Now,
++       * keyidx 0 is reserved for this unicast use and default keys can only
++       * use keyidx 1..3 (i.e., default key with keyidx 0 is not supported).
++       * This should be fine for more or less all cases, but for completeness
++       * sake, the driver could be enhanced to support the missing key. */
++      if (addr == NULL)
++              os_memset(param->sta_addr, 0xff, ETH_ALEN);
++      else
++              os_memcpy(param->sta_addr, addr, ETH_ALEN);
++      os_strlcpy((char *) param->u.crypt.alg, alg_name,
++                 HOSTAP_CRYPT_ALG_NAME_LEN);
++      param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0;
++      param->u.crypt.idx = key_idx;
++      if (seq)
++              os_memcpy(param->u.crypt.seq, seq, seq_len);
++      param->u.crypt.key_len = key_len;
++      os_memcpy((u8 *) (param + 1), key, key_len);
++
++      if (wpa_hostapd_ioctl(drv, param, blen, 1)) {
++              wpa_printf(MSG_WARNING, "Failed to set encryption.");
++              show_set_key_error(param);
++              ret = -1;
++      }
++      os_free(buf);
++
++      return ret;
++}
  
  
  const struct wpa_driver_ops wpa_driver_hostap_ops = {
  
  
  const struct wpa_driver_ops wpa_driver_hostap_ops = {
-@@ -1631,7 +1566,8 @@ const struct wpa_driver_ops wpa_driver_h
+@@ -1632,7 +1567,8 @@ const struct wpa_driver_ops wpa_driver_h
        .sta_clear_stats = hostap_sta_clear_stats,
        .get_hw_feature_data = hostap_get_hw_feature_data,
        .set_ap_wps_ie = hostap_set_ap_wps_ie,
        .sta_clear_stats = hostap_sta_clear_stats,
        .get_hw_feature_data = hostap_get_hw_feature_data,
        .set_ap_wps_ie = hostap_set_ap_wps_ie,
        .get_bssid = wpa_driver_hostap_get_bssid,
        .get_ssid = wpa_driver_hostap_get_ssid,
        .set_countermeasures = wpa_driver_hostap_set_countermeasures,
        .get_bssid = wpa_driver_hostap_get_bssid,
        .get_ssid = wpa_driver_hostap_get_ssid,
        .set_countermeasures = wpa_driver_hostap_set_countermeasures,
-@@ -1643,5 +1579,5 @@ const struct wpa_driver_ops wpa_driver_h
+@@ -1644,5 +1580,5 @@ const struct wpa_driver_ops wpa_driver_h
        .init = wpa_driver_hostap_init,
        .deinit = wpa_driver_hostap_deinit,
        .set_operstate = wpa_driver_hostap_set_operstate,
        .init = wpa_driver_hostap_init,
        .deinit = wpa_driver_hostap_deinit,
        .set_operstate = wpa_driver_hostap_set_operstate,
This page took 0.032189 seconds and 4 git commands to generate.