]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P: Add mechanism for updating P2P channel list based on driver events
authorJouni Malinen <jouni.malinen@atheros.com>
Fri, 15 Oct 2010 15:55:22 +0000 (18:55 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 15 Oct 2010 15:55:22 +0000 (18:55 +0300)
This allows P2P channel list to be updated whenever the driver changes
its list of allowed channels, e.g., based on country code from scan
results.

src/drivers/driver.h
src/p2p/p2p.c
src/p2p/p2p.h
wpa_supplicant/events.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/p2p_supplicant.h

index 90b3902b46c8e6b307079dfe39002f28f90792d6..9a0b7be030c808c61e3823d5b3b154751350fa57 100644 (file)
@@ -2203,7 +2203,16 @@ enum wpa_event_type {
         * This event is used to indicate that the interface was disabled,
         * e.g., due to rfkill.
         */
-       EVENT_INTERFACE_DISABLED
+       EVENT_INTERFACE_DISABLED,
+
+       /**
+        * EVENT_CHANNEL_LIST_CHANGED - Channel list changed
+        *
+        * This event is used to indicate that the channel list has changed,
+        * e.g., because of a regulatory domain change triggered by scan
+        * results including an AP advertising a country code.
+        */
+       EVENT_CHANNEL_LIST_CHANGED
 };
 
 
index 122c121776039ed21e58088fbb8295d99c70bf9c..81a2a8e1d92979ee5cabc6c8601bdc84035fa1a3 100644 (file)
@@ -3036,3 +3036,10 @@ void p2p_set_intra_bss_dist(struct p2p_data *p2p, int enabled)
                enabled ? "enabled" : "disabled");
        p2p->cfg->p2p_intra_bss = enabled;
 }
+
+
+void p2p_update_channel_list(struct p2p_data *p2p, struct p2p_channels *chan)
+{
+       wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Update channel list");
+       os_memcpy(&p2p->cfg->channels, chan, sizeof(struct p2p_channels));
+}
index 502ad8de799c5c1728d4f6d3cc2353dc2756522e..af5f9b580a8e74b65e43ffade64f430a694d1bb4 100644 (file)
@@ -1263,4 +1263,6 @@ void p2p_set_intra_bss_dist(struct p2p_data *p2p, int enabled);
  */
 int p2p_supported_freq(struct p2p_data *p2p, unsigned int freq);
 
+void p2p_update_channel_list(struct p2p_data *p2p, struct p2p_channels *chan);
+
 #endif /* P2P_H */
index 602f992c21adf8453b918feed5c01d86444dc42f..76ee93b225d29a65c4eb5b7cd90dbe26eea32e05 100644 (file)
@@ -1829,6 +1829,11 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                wpa_supplicant_mark_disassoc(wpa_s);
                wpa_supplicant_set_state(wpa_s, WPA_INTERFACE_DISABLED);
                break;
+       case EVENT_CHANNEL_LIST_CHANGED:
+#ifdef CONFIG_P2P
+               wpas_p2p_update_channel_list(wpa_s);
+#endif /* CONFIG_P2P */
+               break;
        default:
                wpa_printf(MSG_INFO, "Unknown event %d", event);
                break;
index 79b769149367607e7e26963f0b3badb4dfe4abff..f57e50c94089bd0d5d4b4c868ca8d23663581452 100644 (file)
@@ -3599,3 +3599,21 @@ int wpas_p2p_notif_pbc_overlap(struct wpa_supplicant *wpa_s)
        wpas_group_formation_completed(wpa_s, 0);
        return 1;
 }
+
+
+void wpas_p2p_update_channel_list(struct wpa_supplicant *wpa_s)
+{
+       struct p2p_channels chan;
+
+       if (wpa_s->global == NULL || wpa_s->global->p2p == NULL)
+               return;
+
+       os_memset(&chan, 0, sizeof(chan));
+       if (wpas_p2p_setup_channels(wpa_s, &chan)) {
+               wpa_printf(MSG_ERROR, "P2P: Failed to update supported "
+                          "channel list");
+               return;
+       }
+
+       p2p_update_channel_list(wpa_s->global->p2p, &chan);
+}
index 363293af7461661efb4b87cb798b142131c81c94..73c6e1a5752523faa5216e362b8b930c0c17b041 100644 (file)
@@ -113,5 +113,6 @@ int wpas_p2p_set_cross_connect(struct wpa_supplicant *wpa_s, int enabled);
 void wpas_p2p_notif_connected(struct wpa_supplicant *wpa_s);
 void wpas_p2p_notif_disconnected(struct wpa_supplicant *wpa_s);
 int wpas_p2p_notif_pbc_overlap(struct wpa_supplicant *wpa_s);
+void wpas_p2p_update_channel_list(struct wpa_supplicant *wpa_s);
 
 #endif /* P2P_SUPPLICANT_H */