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 90b3902..9a0b7be 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 122c121..81a2a8e 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 502ad8d..af5f9b5 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 602f992..76ee93b 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 79b7691..f57e50c 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 363293a..73c6e1a 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 */