On Mon, 2017-05-01 at 09:35 +0530, Nishant Chaprana wrote: > Description: This patch adds "TDLSChannelSwitch" dbus method on > "fi.w1.wpa_supplicant1.Interface" interface to enable > channel switching with TDLS peer. > > > Do we expect more TDLS-related methods? If we expect more than say > > 3 > > or so, then it might make sense to make TDLS another D-Bus > > interface > > that the wpa_supplicant "Interface" object implements. > > Only below two new methods are required for TDLS. > 1. TDLSChannelSwitch > 2. TDLSCancelChannelSwitch > Below is the patch resolving your comments. Thanks for the update, LGTM. Dan > Signed-off-by: Nishant Chaprana <n.chaprana@xxxxxxxxxxx> > --- > wpa_supplicant/dbus/dbus_new.c | 7 ++ > wpa_supplicant/dbus/dbus_new_handlers.c | 123 > ++++++++++++++++++++++++++++++++ > wpa_supplicant/dbus/dbus_new_handlers.h | 2 + > 3 files changed, 132 insertions(+) > > diff --git a/wpa_supplicant/dbus/dbus_new.c > b/wpa_supplicant/dbus/dbus_new.c > index 0c355f7..0dce09e 100644 > --- a/wpa_supplicant/dbus/dbus_new.c > +++ b/wpa_supplicant/dbus/dbus_new.c > @@ -3086,6 +3086,13 @@ static const struct wpa_dbus_method_desc > wpas_dbus_interface_methods[] = { > END_ARGS > } > }, > + { "TDLSChannelSwitch", WPAS_DBUS_NEW_IFACE_INTERFACE, > + (WPADBusMethodHandler) > wpas_dbus_handler_tdls_channel_switch, > + { > + { "args", "a{sv}", ARG_IN }, > + END_ARGS > + } > + }, > #endif /* CONFIG_TDLS */ > { "VendorElemAdd", WPAS_DBUS_NEW_IFACE_INTERFACE, > (WPADBusMethodHandler) wpas_dbus_handler_vendor_elem_add, > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c > b/wpa_supplicant/dbus/dbus_new_handlers.c > index 56e6aab..7063e5a 100644 > --- a/wpa_supplicant/dbus/dbus_new_handlers.c > +++ b/wpa_supplicant/dbus/dbus_new_handlers.c > @@ -2292,6 +2292,129 @@ DBusMessage * > wpas_dbus_handler_tdls_teardown(DBusMessage *message, > return NULL; > } > > +/* > + * wpas_dbus_handler_tdls_channel_switch - Enable channel switching > with TDLS peer > + * @message: Pointer to incoming dbus message > + * @wpa_s: wpa_supplicant structure for a network interface > + * Returns: NULL indicating success or DBus error message on failure > + * > + * Handler function for "TDLSChannelSwitch" method call of network > interface. > + */ > +DBusMessage * wpas_dbus_handler_tdls_channel_switch(DBusMessage > *message, > + struct > wpa_supplicant *wpa_s) > +{ > + DBusMessageIter iter, iter_dict; > + struct wpa_dbus_dict_entry entry; > + u8 peer[ETH_ALEN]; > + struct hostapd_freq_params freq_params; > + u8 oper_class = 0; > + int ret; > + int is_peer_present = 0; > + > + if (!wpa_tdls_is_external_setup(wpa_s->wpa)) { > + wpa_printf(MSG_INFO, > + "tdls_chanswitch: Only supported with > external setup"); > + return wpas_dbus_error_unknown_error(message, "tdls > is not external setup"); > + } > + > + os_memset(&freq_params, 0, sizeof(freq_params)); > + > + dbus_message_iter_init(message, &iter); > + > + if (!wpa_dbus_dict_open_read(&iter, &iter_dict, NULL)) > + return wpas_dbus_error_invalid_args(message, NULL); > + > + while (wpa_dbus_dict_has_dict_entry(&iter_dict)) { > + if (!wpa_dbus_dict_get_entry(&iter_dict, &entry)) > + return wpas_dbus_error_invalid_args(message, > NULL); > + > + if (os_strcmp(entry.key, "PeerAddress") == 0 && > + entry.type == DBUS_TYPE_STRING) { > + if (hwaddr_aton(entry.str_value, peer)) { > + wpa_printf(MSG_DEBUG, > + "tdls_chanswitch: Invalid > address '%s'", > + entry.str_value); > + wpa_dbus_dict_entry_clear(&entry); > + return > wpas_dbus_error_invalid_args(message, > + > NULL); > + } > + > + is_peer_present = 1; > + > + } else if (os_strcmp(entry.key, "OperClass") == 0 && > + entry.type == DBUS_TYPE_BYTE) { > + oper_class = entry.byte_value; > + > + } else if (os_strcmp(entry.key, "Frequency") == 0 && > + entry.type == DBUS_TYPE_UINT32) { > + freq_params.freq = entry.uint32_value; > + > + } else if (os_strcmp(entry.key, "SecChannelOffset") > == 0 && > + entry.type == DBUS_TYPE_UINT32) { > + freq_params.sec_channel_offset = > entry.uint32_value; > + > + } else if (os_strcmp(entry.key, "CenterFrequency1") > == 0 && > + entry.type == DBUS_TYPE_UINT32) { > + freq_params.center_freq1 = > entry.uint32_value; > + > + } else if (os_strcmp(entry.key, "CenterFrequency2") > == 0 && > + entry.type == DBUS_TYPE_UINT32) { > + freq_params.center_freq2 = > entry.uint32_value; > + > + } else if (os_strcmp(entry.key, "Bandwidth") == 0 && > + entry.type == DBUS_TYPE_UINT32) { > + freq_params.bandwidth = entry.uint32_value; > + > + } else if (os_strcmp(entry.key, "HT") == 0 && > + entry.type == DBUS_TYPE_BOOLEAN) { > + freq_params.ht_enabled = entry.bool_value; > + > + } else if (os_strcmp(entry.key, "VHT") == 0 && > + entry.type == DBUS_TYPE_BOOLEAN) { > + freq_params.vht_enabled = entry.bool_value; > + > + } else { > + wpa_dbus_dict_entry_clear(&entry); > + return wpas_dbus_error_invalid_args(message, > NULL); > + } > + > + wpa_dbus_dict_entry_clear(&entry); > + } > + > + if (oper_class == 0) { > + wpa_printf(MSG_INFO, > + "tdls_chanswitch: Invalid op class > provided"); > + return wpas_dbus_error_invalid_args(message, > "Invalid op class provided"); > + } > + > + if (freq_params.freq == 0) { > + wpa_printf(MSG_INFO, > + "tdls_chanswitch: Invalid freq > provided"); > + return wpas_dbus_error_invalid_args(message, > "Invalid freq provided"); > + } > + > + if (is_peer_present == 0) { > + wpa_printf(MSG_DEBUG, > + "tdls_chanswitch: peer address not > provided"); > + return wpas_dbus_error_invalid_args(message, "peer > address not provided"); > + } > + > + wpa_printf(MSG_DEBUG, "DBUS TDLS_CHAN_SWITCH " MACSTR > + " OP CLASS %d FREQ %d CENTER1 %d CENTER2 %d BW %d > SEC_OFFSET %d%s%s", > + MAC2STR(peer), oper_class, freq_params.freq, > + freq_params.center_freq1, > freq_params.center_freq2, > + freq_params.bandwidth, > freq_params.sec_channel_offset, > + freq_params.ht_enabled ? " HT" : "", > + freq_params.vht_enabled ? " VHT" : ""); > + > + ret = wpa_tdls_enable_chan_switch(wpa_s->wpa, peer, > oper_class, > + &freq_params); > + if (ret) > + return wpas_dbus_error_unknown_error(message, "error > processing TDLS channel switch"); > + > + return NULL; > +} > + > #endif /* CONFIG_TDLS */ > > > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h > b/wpa_supplicant/dbus/dbus_new_handlers.h > index 3b8f096..3987c07 100644 > --- a/wpa_supplicant/dbus/dbus_new_handlers.h > +++ b/wpa_supplicant/dbus/dbus_new_handlers.h > @@ -213,6 +213,8 @@ DBusMessage * > wpas_dbus_handler_tdls_status(DBusMessage *message, > struct wpa_supplicant > *wpa_s); > DBusMessage * wpas_dbus_handler_tdls_teardown(DBusMessage *message, > struct wpa_supplicant > *wpa_s); > +DBusMessage * wpas_dbus_handler_tdls_channel_switch(DBusMessage > *message, > + struct > wpa_supplicant *wpa_s); > > DBusMessage * wpas_dbus_handler_vendor_elem_add(DBusMessage > *message, > struct > wpa_supplicant *wpa_s); _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap