]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
HS 2.0: Request and process OSU Providers NAI List ANQP-element
authorJouni Malinen <jouni@codeaurora.org>
Fri, 5 Oct 2018 17:51:51 +0000 (20:51 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 5 Oct 2018 17:51:51 +0000 (20:51 +0300)
Extend wpa_supplicant to use a separate OSU_NAI information from OSU
Providers NAI List ANQP-element instead of the OSU_NAI information from
OSU Providers list ANQP-element when connecting to the shared BSS
(Single SSID) for OSU.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
wpa_supplicant/bss.c
wpa_supplicant/bss.h
wpa_supplicant/ctrl_iface.c
wpa_supplicant/hs20_supplicant.c
wpa_supplicant/interworking.c

index 5aa07eac445874445e3f355dc28549c173a02f2c..3a41db98e5ba4647a3fd7f7fdb3caee4cf55231f 100644 (file)
@@ -103,6 +103,7 @@ static struct wpa_bss_anqp * wpa_bss_anqp_clone(struct wpa_bss_anqp *anqp)
        ANQP_DUP(hs20_operating_class);
        ANQP_DUP(hs20_osu_providers_list);
        ANQP_DUP(hs20_operator_icon_metadata);
+       ANQP_DUP(hs20_osu_providers_nai_list);
 #endif /* CONFIG_HS20 */
 #undef ANQP_DUP
 
@@ -187,6 +188,7 @@ static void wpa_bss_anqp_free(struct wpa_bss_anqp *anqp)
        wpabuf_free(anqp->hs20_operating_class);
        wpabuf_free(anqp->hs20_osu_providers_list);
        wpabuf_free(anqp->hs20_operator_icon_metadata);
+       wpabuf_free(anqp->hs20_osu_providers_nai_list);
 #endif /* CONFIG_HS20 */
 
        os_free(anqp);
index 9179385021dc06f5915b591d043edd7484ad0c0f..5251b2c354e31a467abc8c348a49b06dd2fb30f7 100644 (file)
@@ -51,6 +51,7 @@ struct wpa_bss_anqp {
        struct wpabuf *hs20_operating_class;
        struct wpabuf *hs20_osu_providers_list;
        struct wpabuf *hs20_operator_icon_metadata;
+       struct wpabuf *hs20_osu_providers_nai_list;
 #endif /* CONFIG_HS20 */
 };
 
index fe39c25b7a9618d622f68d675ed8159f6fafbe67..945ab9c4dd6b7071c376c8e274527e7ae6da6eb5 100644 (file)
@@ -4809,6 +4809,8 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
                                   anqp->hs20_osu_providers_list);
                pos = anqp_add_hex(pos, end, "hs20_operator_icon_metadata",
                                   anqp->hs20_operator_icon_metadata);
+               pos = anqp_add_hex(pos, end, "hs20_osu_providers_nai_list",
+                                  anqp->hs20_osu_providers_nai_list);
 #endif /* CONFIG_HS20 */
 
                dl_list_for_each(elem, &anqp->anqp_elems,
index e00c5afa3909062ca3851421337df025361d5fbb..f4187900ed42d418c257be6618233d064067e72c 100644 (file)
@@ -54,6 +54,7 @@ struct osu_provider {
        char server_uri[256];
        u32 osu_methods; /* bit 0 = OMA-DM, bit 1 = SOAP-XML SPP */
        char osu_nai[256];
+       char osu_nai2[256];
        struct osu_lang_string friendly_name[OSU_MAX_ITEMS];
        size_t friendly_name_count;
        struct osu_lang_string serv_desc[OSU_MAX_ITEMS];
@@ -673,6 +674,15 @@ void hs20_parse_rx_hs20_anqp_resp(struct wpa_supplicant *wpa_s,
                                wpabuf_alloc_copy(pos, slen);
                }
                break;
+       case HS20_STYPE_OSU_PROVIDERS_NAI_LIST:
+               wpa_msg(wpa_s, MSG_INFO, RX_HS20_ANQP MACSTR
+                       " OSU Providers NAI List", MAC2STR(sa));
+               if (anqp) {
+                       wpabuf_free(anqp->hs20_osu_providers_nai_list);
+                       anqp->hs20_osu_providers_nai_list =
+                               wpabuf_alloc_copy(pos, slen);
+               }
+               break;
        default:
                wpa_printf(MSG_DEBUG, "HS20: Unsupported subtype %u", subtype);
                break;
@@ -759,6 +769,8 @@ static void hs20_osu_fetch_done(struct wpa_supplicant *wpa_s)
                }
                if (osu->osu_nai[0])
                        fprintf(f, "osu_nai=%s\n", osu->osu_nai);
+               if (osu->osu_nai2[0])
+                       fprintf(f, "osu_nai2=%s\n", osu->osu_nai2);
                for (j = 0; j < osu->friendly_name_count; j++) {
                        fprintf(f, "friendly_name=%s:%s\n",
                                osu->friendly_name[j].lang,
@@ -1103,6 +1115,35 @@ void hs20_osu_icon_fetch(struct wpa_supplicant *wpa_s)
                                   "extra data after OSU Providers",
                                   (int) (end - pos));
                }
+
+               prov_anqp = bss->anqp->hs20_osu_providers_nai_list;
+               if (!prov_anqp)
+                       continue;
+               wpa_printf(MSG_DEBUG,
+                          "HS 2.0: Parsing OSU Providers NAI List from "
+                          MACSTR, MAC2STR(bss->bssid));
+               wpa_hexdump_buf(MSG_DEBUG, "HS 2.0: OSU Providers NAI List",
+                               prov_anqp);
+               pos = wpabuf_head(prov_anqp);
+               end = pos + wpabuf_len(prov_anqp);
+               num_providers = 0;
+               while (end - pos > 0) {
+                       len = *pos++;
+                       if (end - pos < len) {
+                               wpa_printf(MSG_DEBUG,
+                                          "HS 2.0: Not enough room for OSU_NAI");
+                               break;
+                       }
+                       if (num_providers >= wpa_s->osu_prov_count) {
+                               wpa_printf(MSG_DEBUG,
+                                          "HS 2.0: Ignore unexpected OSU Provider NAI List entries");
+                               break;
+                       }
+                       os_memcpy(wpa_s->osu_prov[num_providers].osu_nai2,
+                                 pos, len);
+                       pos += len;
+                       num_providers++;
+               }
        }
 
        wpa_s->fetch_osu_icon_in_progress = 1;
index f3f88d3916fb4cce5ab05c427a2092afc7003c7a..60c8be9a6c6a5121475a090834f66a6ca1f9a44f 100644 (file)
@@ -303,8 +303,10 @@ static int interworking_anqp_send_req(struct wpa_supplicant *wpa_s,
                        wpabuf_put_u8(extra, HS20_STYPE_CONNECTION_CAPABILITY);
                if (all)
                        wpabuf_put_u8(extra, HS20_STYPE_OPERATING_CLASS);
-               if (all)
+               if (all) {
                        wpabuf_put_u8(extra, HS20_STYPE_OSU_PROVIDERS_LIST);
+                       wpabuf_put_u8(extra, HS20_STYPE_OSU_PROVIDERS_NAI_LIST);
+               }
                gas_anqp_set_element_len(extra, len_pos);
        }
 #endif /* CONFIG_HS20 */