hostapd: add support for authenticating with multiple PSKs via ubus helper
[openwrt/staging/nbd.git] / package / network / services / hostapd / patches / 601-ucode_support.patch
index b826363248a640f57e8af48bc49767814393ff40..e31cc3d4112c37948c96b58f5b31305847adcc51 100644 (file)
@@ -678,3 +678,72 @@ as adding/removing interfaces.
  #ifdef CONFIG_MATCH_IFACE
        int matched;
  #endif /* CONFIG_MATCH_IFACE */
+--- a/src/ap/ieee802_11.c
++++ b/src/ap/ieee802_11.c
+@@ -3123,6 +3123,12 @@ static void handle_auth(struct hostapd_d
+               goto fail;
+       }
++      res = hostapd_ucode_sta_auth(hapd, sta);
++      if (res) {
++              resp = res;
++              goto fail;
++      }
++
+       sta->flags &= ~WLAN_STA_PREAUTH;
+       ieee802_1x_notify_pre_auth(sta->eapol_sm, 0);
+--- a/src/ap/sta_info.c
++++ b/src/ap/sta_info.c
+@@ -1434,6 +1434,8 @@ void ap_sta_set_authorized_event(struct
+ #endif /* CONFIG_P2P */
+       const u8 *ip_ptr = NULL;
++      if (authorized)
++              hostapd_ucode_sta_connected(hapd, sta);
+ #ifdef CONFIG_P2P
+       if (hapd->p2p_group == NULL) {
+               if (sta->p2p_ie != NULL &&
+--- a/src/ap/sta_info.h
++++ b/src/ap/sta_info.h
+@@ -195,6 +195,7 @@ struct sta_info {
+       int vlan_id_bound; /* updated by ap_sta_bind_vlan() */
+        /* PSKs from RADIUS authentication server */
+       struct hostapd_sta_wpa_psk_short *psk;
++      int psk_idx;
+       char *identity; /* User-Name from RADIUS */
+       char *radius_cui; /* Chargeable-User-Identity from RADIUS */
+--- a/src/ap/wpa_auth_glue.c
++++ b/src/ap/wpa_auth_glue.c
+@@ -347,6 +347,7 @@ static const u8 * hostapd_wpa_auth_get_p
+       struct sta_info *sta = ap_get_sta(hapd, addr);
+       const u8 *psk;
++      sta->psk_idx = 0;
+       if (vlan_id)
+               *vlan_id = 0;
+       if (psk_len)
+@@ -395,11 +396,12 @@ static const u8 * hostapd_wpa_auth_get_p
+        */
+       if (sta && sta->psk && !psk) {
+               struct hostapd_sta_wpa_psk_short *pos;
++              int psk_idx = 1;
+               if (vlan_id)
+                       *vlan_id = 0;
+               psk = sta->psk->psk;
+-              for (pos = sta->psk; pos; pos = pos->next) {
++              for (pos = sta->psk; pos; pos = pos->next, psk_idx++) {
+                       if (pos->is_passphrase) {
+                               if (pbkdf2_sha1(pos->passphrase,
+                                               hapd->conf->ssid.ssid,
+@@ -416,6 +418,8 @@ static const u8 * hostapd_wpa_auth_get_p
+                               break;
+                       }
+               }
++              if (psk)
++                      sta->psk_idx = psk_idx;
+       }
+       return psk;
+ }