|
@@ -2775,6 +2775,58 @@ static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s,
|
|
|
}
|
|
|
|
|
|
|
|
|
+static void wpa_supplicant_notify_avoid_freq(struct wpa_supplicant *wpa_s,
|
|
|
+ union wpa_event_data *event)
|
|
|
+{
|
|
|
+#ifdef CONFIG_P2P
|
|
|
+ struct wpa_supplicant *ifs;
|
|
|
+#endif /* CONFIG_P2P */
|
|
|
+ struct wpa_freq_range_list *list;
|
|
|
+ char *str = NULL;
|
|
|
+
|
|
|
+ list = &event->freq_range;
|
|
|
+
|
|
|
+ if (list->num)
|
|
|
+ str = freq_range_list_str(list);
|
|
|
+ wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_AVOID_FREQ "ranges=%s",
|
|
|
+ str ? str : "");
|
|
|
+
|
|
|
+#ifdef CONFIG_P2P
|
|
|
+ if (freq_range_list_parse(&wpa_s->global->p2p_go_avoid_freq, str)) {
|
|
|
+ wpa_dbg(wpa_s, MSG_ERROR, "%s: Failed to parse freq range",
|
|
|
+ __func__);
|
|
|
+ } else {
|
|
|
+ wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Update channel list based on frequency avoid event");
|
|
|
+ wpas_p2p_update_channel_list(wpa_s);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
|
|
|
+ int freq;
|
|
|
+ if (!ifs->current_ssid ||
|
|
|
+ !ifs->current_ssid->p2p_group ||
|
|
|
+ (ifs->current_ssid->mode != WPAS_MODE_P2P_GO &&
|
|
|
+ ifs->current_ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ freq = ifs->current_ssid->frequency;
|
|
|
+ if (!freq_range_list_includes(list, freq)) {
|
|
|
+ wpa_dbg(ifs, MSG_DEBUG, "P2P GO operating frequency %d MHz in safe range",
|
|
|
+ freq);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ wpa_dbg(ifs, MSG_DEBUG, "P2P GO operating in unsafe frequency %d MHz",
|
|
|
+ freq);
|
|
|
+ /* TODO: Consider using CSA or removing the group within
|
|
|
+ * wpa_supplicant */
|
|
|
+ wpa_msg(ifs, MSG_INFO, P2P_EVENT_REMOVE_AND_REFORM_GROUP);
|
|
|
+ }
|
|
|
+#endif /* CONFIG_P2P */
|
|
|
+
|
|
|
+ os_free(str);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
|
|
|
union wpa_event_data *data)
|
|
|
{
|
|
@@ -3266,6 +3318,9 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
|
|
|
wpas_wps_start_pbc(wpa_s, NULL, 0);
|
|
|
#endif /* CONFIG_WPS */
|
|
|
break;
|
|
|
+ case EVENT_AVOID_FREQUENCIES:
|
|
|
+ wpa_supplicant_notify_avoid_freq(wpa_s, data);
|
|
|
+ break;
|
|
|
case EVENT_CONNECT_FAILED_REASON:
|
|
|
#ifdef CONFIG_AP
|
|
|
if (!wpa_s->ap_iface || !data)
|