[PATCH] supplicant: add dbus getter method for nl80211 iftype

Avinash Patil avinashapatil at gmail.com
Thu Nov 6 02:41:04 EST 2014


Hi Dan,

Thanks for the review.
I have sent v2 with notification support and also renamed
CurrentIfType to IfType.

Thanks,
Avinash

On Tue, Nov 4, 2014 at 9:29 PM, Dan Williams <dcbw at redhat.com> wrote:
> On Tue, 2014-11-04 at 14:21 +0530, Avinash Patil wrote:
>> This patch adds dbus getter method for nl80211 iftype.
>> This is required by certain applications which intend to start
>> AP operations only if current interface type is AP.
>> Getter method for capabilities cannot be used for this purpose as
>> this enumerates all the supported interface types.
>>
>> Signed-off-by: Avinash Patil <avinashapatil at gmail.com>
>> ---
>>  src/common/defs.h                       | 18 ++++++++++++++++
>>  src/drivers/driver.h                    | 12 +++++++++++
>>  src/drivers/driver_nl80211.c            | 11 ++++++++++
>>  wpa_supplicant/dbus/dbus_new.c          |  4 ++++
>>  wpa_supplicant/dbus/dbus_new_handlers.c | 38 +++++++++++++++++++++++++++++++++
>>  wpa_supplicant/dbus/dbus_new_handlers.h |  4 ++++
>>  wpa_supplicant/driver_i.h               |  8 +++++++
>>  wpa_supplicant/wpa_supplicant.c         | 33 ++++++++++++++++++++++++++++
>>  wpa_supplicant/wpa_supplicant_i.h       |  1 +
>>  9 files changed, 129 insertions(+)
>>
>> diff --git a/src/common/defs.h b/src/common/defs.h
>> index d4091e3..b5e5a77 100644
>> --- a/src/common/defs.h
>> +++ b/src/common/defs.h
>> @@ -297,6 +297,24 @@ enum wpa_ctrl_req_type {
>>         NUM_WPA_CTRL_REQS
>>  };
>>
>> +enum wpa_nl80211_iftype {
>> +       WPA_IFTYPE_UNSPECIFIED,
>> +       WPA_IFTYPE_ADHOC,
>> +       WPA_IFTYPE_STATION,
>> +       WPA_IFTYPE_AP,
>> +       WPA_IFTYPE_AP_VLAN,
>> +       WPA_IFTYPE_WDS,
>> +       WPA_IFTYPE_MONITOR,
>> +       WPA_IFTYPE_MESH_POINT,
>> +       WPA_IFTYPE_P2P_CLIENT,
>> +       WPA_IFTYPE_P2P_GO,
>> +       WPA_IFTYPE_P2P_DEVICE,
>> +
>> +       /* keep last */
>> +       WPA_NL80211_IFTYPES,
>> +       WPA_IFTYPE_MAX = WPA_NL80211_IFTYPES - 1
>> +};
>> +
>>  /* Maximum number of EAP methods to store for EAP server user information */
>>  #define EAP_MAX_METHODS 8
>>
>> diff --git a/src/drivers/driver.h b/src/drivers/driver.h
>> index 6e47b86..6833d32 100644
>> --- a/src/drivers/driver.h
>> +++ b/src/drivers/driver.h
>> @@ -1358,6 +1358,18 @@ struct wpa_driver_ops {
>>         int (*get_ssid)(void *priv, u8 *ssid);
>>
>>         /**
>> +        * get_iftype - Get the current NL80211 iftype
>> +        * @priv: private driver interface data
>> +        * @iftype: buffer for storing iftype
>> +        *
>> +        * Returns: 0 on success, -1 on failure
>> +        *
>> +        * Query kernel driver for the current NL80211 mode and copy it to
>> +        * iftype.
>> +        */
>> +       int (*get_iftype)(void *priv, u8 *iftype);
>> +
>> +       /**
>>          * set_key - Configure encryption key
>>          * @ifname: Interface name (for multi-SSID/VLAN support)
>>          * @priv: private driver interface data
>> diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
>> index 5d31018..15fa461 100644
>> --- a/src/drivers/driver_nl80211.c
>> +++ b/src/drivers/driver_nl80211.c
>> @@ -1063,6 +1063,16 @@ static int wpa_driver_nl80211_get_bssid(void
>> *priv, u8 *bssid)
>>         return 0;
>>  }
>>
>> +static int wpa_driver_nl80211_get_nl80211_iftype(void *priv, u8 *iftype)
>> +{
>> +       struct i802_bss *bss = priv;
>> +       if (!bss)
>> +               return -1;
>> +
>> +       *iftype = (u8)nl80211_get_ifmode(bss);
>> +
>> +       return 0;
>> +}
>>
>>  static int wpa_driver_nl80211_get_ssid(void *priv, u8 *ssid)
>>  {
>> @@ -12293,6 +12303,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
>>         .desc = "Linux nl80211/cfg80211",
>>         .get_bssid = wpa_driver_nl80211_get_bssid,
>>         .get_ssid = wpa_driver_nl80211_get_ssid,
>> +       .get_iftype = wpa_driver_nl80211_get_nl80211_iftype,
>>         .set_key = driver_nl80211_set_key,
>>         .scan2 = driver_nl80211_scan2,
>>         .sched_scan = wpa_driver_nl80211_sched_scan,
>> diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
>> index 6bd2a40..67238e7 100644
>> --- a/wpa_supplicant/dbus/dbus_new.c
>> +++ b/wpa_supplicant/dbus/dbus_new.c
>> @@ -2809,6 +2809,10 @@ static const struct wpa_dbus_property_desc
>> wpas_dbus_interface_properties[] = {
>>           wpas_dbus_getter_driver,
>>           NULL
>>         },
>> +       { "CurrentIfType", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
>> +         wpas_dbus_getter_current_iftype,
>> +         NULL
>> +       },
>
> I would just call this "IfType".  "Current" is redundant, because the
> property only ever reports the current Iftype.
>
> Second, I don't see any notification handling code.  When the iftype is
> changed, something needs to emit property notifications for the IfType
> property so that listeners know that the interface type is now
> different.
>
> Dan
>
>>         { "BridgeIfname", WPAS_DBUS_NEW_IFACE_INTERFACE, "s",
>>           wpas_dbus_getter_bridge_ifname,
>>           NULL
>> diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c
>> b/wpa_supplicant/dbus/dbus_new_handlers.c
>> index f5efd8b..755f902 100644
>> --- a/wpa_supplicant/dbus/dbus_new_handlers.c
>> +++ b/wpa_supplicant/dbus/dbus_new_handlers.c
>> @@ -3083,6 +3083,44 @@ dbus_bool_t
>> wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error,
>>                                                 &driver, error);
>>  }
>>
>> +/**
>> + * wpas_dbus_getter_current_mode -
>> + * Get current NL mode
>> + * @iter: Pointer to incoming dbus message iter
>> + * @error: Location to store error on failure
>> + * @user_data: Function specific data
>> + * Returns: TRUE on success, FALSE on failure
>> + *
>> + * Getter for "Current IF type" property.
>> + */
>> +dbus_bool_t wpas_dbus_getter_current_iftype(DBusMessageIter *iter,
>> +                                         DBusError *error, void *user_data)
>> +{
>> +       struct wpa_supplicant *wpa_s = user_data;
>> +       u8 iftype;
>> +       const char *char_iftype;
>> +
>> +       if (wpa_s->driver == NULL) {
>> +               wpa_printf(MSG_DEBUG, "wpas_dbus_getter_current_iftype[dbus]: "
>> +                          "wpa_s has no driver set");
>> +               dbus_set_error(error, DBUS_ERROR_FAILED, "%s: no driver set",
>> +                              __func__);
>> +               return FALSE;
>> +       }
>> +
>> +       if(wpa_drv_get_iftype(wpa_s, &iftype)) {
>> +               wpa_printf(MSG_DEBUG, "wpas_dbus_getter_current_iftype[dbus]: "
>> +                          "failed");
>> +               dbus_set_error(error, DBUS_ERROR_FAILED, "%s: failed",
>> +                              __func__);
>> +               return FALSE;
>> +       }
>> +       char_iftype =  wpa_supplicant_iftype_txt(iftype);
>> +
>> +       wpa_printf(MSG_DEBUG, "dbus: Get interface type: %s", char_iftype);
>> +       return wpas_dbus_simple_property_getter(iter, DBUS_TYPE_STRING,
>> +                                               &char_iftype, error);
>> +}
>>
>>  /**
>>   * wpas_dbus_getter_current_bss - Get current bss object path
>> diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h
>> b/wpa_supplicant/dbus/dbus_new_handlers.h
>> index 461970d..51f0332 100644
>> --- a/wpa_supplicant/dbus/dbus_new_handlers.h
>> +++ b/wpa_supplicant/dbus/dbus_new_handlers.h
>> @@ -202,6 +202,10 @@ dbus_bool_t
>> wpas_dbus_getter_ifname(DBusMessageIter *iter, DBusError *error,
>>  dbus_bool_t wpas_dbus_getter_driver(DBusMessageIter *iter, DBusError *error,
>>                                     void *user_data);
>>
>> +dbus_bool_t wpas_dbus_getter_current_iftype(DBusMessageIter *iter,
>> +                                           DBusError *error,
>> +                                           void *user_data);
>> +
>>  dbus_bool_t wpas_dbus_getter_bridge_ifname(DBusMessageIter *iter,
>>                                            DBusError *error,
>>                                            void *user_data);
>> diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h
>> index 00703d9..c10ae25 100644
>> --- a/wpa_supplicant/driver_i.h
>> +++ b/wpa_supplicant/driver_i.h
>> @@ -114,6 +114,14 @@ static inline int wpa_drv_get_ssid(struct
>> wpa_supplicant *wpa_s, u8 *ssid)
>>         return -1;
>>  }
>>
>> +static inline int wpa_drv_get_iftype(struct wpa_supplicant *wpa_s, u8 *iftype)
>> +{
>> +       if (wpa_s->driver->get_iftype) {
>> +               return wpa_s->driver->get_iftype(wpa_s->drv_priv, iftype);
>> +       }
>> +       return -1;
>> +}
>> +
>>  static inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s,
>>                                   enum wpa_alg alg, const u8 *addr,
>>                                   int key_idx, int set_tx,
>> diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
>> index 28d763c..16519d9 100644
>> --- a/wpa_supplicant/wpa_supplicant.c
>> +++ b/wpa_supplicant/wpa_supplicant.c
>> @@ -573,6 +573,39 @@ const char * wpa_supplicant_state_txt(enum
>> wpa_states state)
>>         }
>>  }
>>
>> +/**
>> + * wpa_supplicant_iftype_txt - Get the NL80211 iftype as a text string
>> + * Returns: The iftype name as a printable text string
>> + */
>> +const char * wpa_supplicant_iftype_txt(u8 iftype)
>> +{
>> +       switch (iftype) {
>> +       case WPA_IFTYPE_UNSPECIFIED:
>> +               return "UNSPECIFIED";
>> +       case WPA_IFTYPE_ADHOC:
>> +               return "ADHOC";
>> +       case WPA_IFTYPE_STATION:
>> +               return "STATION";
>> +       case WPA_IFTYPE_AP:
>> +               return "AP";
>> +       case WPA_IFTYPE_AP_VLAN:
>> +               return "AP_VLAN";
>> +       case WPA_IFTYPE_WDS:
>> +               return "WDS";
>> +       case WPA_IFTYPE_MONITOR:
>> +               return "MONITOR";
>> +       case WPA_IFTYPE_MESH_POINT:
>> +               return "MESH_POINT";
>> +       case WPA_IFTYPE_P2P_CLIENT:
>> +               return "P2P_CLIENT";
>> +       case WPA_IFTYPE_P2P_GO:
>> +               return "P2P_GO";
>> +       case WPA_IFTYPE_P2P_DEVICE:
>> +               return "P2P_DEVICE";
>> +       default:
>> +               return "UNKNOWN";
>> +       }
>> +}
>>
>>  #ifdef CONFIG_BGSCAN
>>
>> diff --git a/wpa_supplicant/wpa_supplicant_i.h
>> b/wpa_supplicant/wpa_supplicant_i.h
>> index c51a703..9138630 100644
>> --- a/wpa_supplicant/wpa_supplicant_i.h
>> +++ b/wpa_supplicant/wpa_supplicant_i.h
>> @@ -874,6 +874,7 @@ int wpa_supplicant_set_wpa_none_key(struct
>> wpa_supplicant *wpa_s,
>>  int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s);
>>
>>  const char * wpa_supplicant_state_txt(enum wpa_states state);
>> +const char * wpa_supplicant_iftype_txt(u8 iftype);
>>  int wpa_supplicant_update_mac_addr(struct wpa_supplicant *wpa_s);
>>  int wpa_supplicant_driver_init(struct wpa_supplicant *wpa_s);
>>  int wpa_supplicant_set_suites(struct wpa_supplicant *wpa_s,
>> --
>> 1.8.1.4
>> _______________________________________________
>> HostAP mailing list
>> HostAP at lists.shmoo.com
>> http://lists.shmoo.com/mailman/listinfo/hostap
>
>


More information about the HostAP mailing list