hostapd: ubus: add handler for wps_status and guard WPS calls
Expose WPS ubus API only if compiled with WPS support and add new handler for wps_status call. Also add '-v wps' option to check whether WPS support is present in hostapd. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
This commit is contained in:
parent
5666ca913a
commit
63e2e086be
|
@ -7,7 +7,7 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=hostapd
|
PKG_NAME:=hostapd
|
||||||
PKG_RELEASE:=11
|
PKG_RELEASE:=12
|
||||||
|
|
||||||
PKG_SOURCE_URL:=http://w1.fi/hostap.git
|
PKG_SOURCE_URL:=http://w1.fi/hostap.git
|
||||||
PKG_SOURCE_PROTO:=git
|
PKG_SOURCE_PROTO:=git
|
||||||
|
|
|
@ -395,6 +395,7 @@ hostapd_bss_list_bans(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_WPS
|
||||||
static int
|
static int
|
||||||
hostapd_bss_wps_start(struct ubus_context *ctx, struct ubus_object *obj,
|
hostapd_bss_wps_start(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
struct ubus_request_data *req, const char *method,
|
struct ubus_request_data *req, const char *method,
|
||||||
|
@ -411,6 +412,53 @@ hostapd_bss_wps_start(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const char * pbc_status_enum_str(enum pbc_status status)
|
||||||
|
{
|
||||||
|
switch (status) {
|
||||||
|
case WPS_PBC_STATUS_DISABLE:
|
||||||
|
return "Disabled";
|
||||||
|
case WPS_PBC_STATUS_ACTIVE:
|
||||||
|
return "Active";
|
||||||
|
case WPS_PBC_STATUS_TIMEOUT:
|
||||||
|
return "Timed-out";
|
||||||
|
case WPS_PBC_STATUS_OVERLAP:
|
||||||
|
return "Overlap";
|
||||||
|
default:
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
hostapd_bss_wps_status(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
struct ubus_request_data *req, const char *method,
|
||||||
|
struct blob_attr *msg)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj);
|
||||||
|
|
||||||
|
blob_buf_init(&b, 0);
|
||||||
|
|
||||||
|
blobmsg_add_string(&b, "pbc_status", pbc_status_enum_str(hapd->wps_stats.pbc_status));
|
||||||
|
blobmsg_add_string(&b, "last_wps_result",
|
||||||
|
(hapd->wps_stats.status == WPS_STATUS_SUCCESS ?
|
||||||
|
"Success":
|
||||||
|
(hapd->wps_stats.status == WPS_STATUS_FAILURE ?
|
||||||
|
"Failed" : "None")));
|
||||||
|
|
||||||
|
/* If status == Failure - Add possible Reasons */
|
||||||
|
if(hapd->wps_stats.status == WPS_STATUS_FAILURE &&
|
||||||
|
hapd->wps_stats.failure_reason > 0)
|
||||||
|
blobmsg_add_string(&b, "reason", wps_ei_str(hapd->wps_stats.failure_reason));
|
||||||
|
|
||||||
|
if (hapd->wps_stats.status)
|
||||||
|
blobmsg_printf(&b, "peer_address", MACSTR, MAC2STR(hapd->wps_stats.peer_addr));
|
||||||
|
|
||||||
|
ubus_send_reply(ctx, req, b.head);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
hostapd_bss_wps_cancel(struct ubus_context *ctx, struct ubus_object *obj,
|
hostapd_bss_wps_cancel(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
struct ubus_request_data *req, const char *method,
|
struct ubus_request_data *req, const char *method,
|
||||||
|
@ -426,6 +474,7 @@ hostapd_bss_wps_cancel(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_WPS */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
hostapd_bss_update_beacon(struct ubus_context *ctx, struct ubus_object *obj,
|
hostapd_bss_update_beacon(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
@ -1100,8 +1149,11 @@ static const struct ubus_method bss_methods[] = {
|
||||||
UBUS_METHOD_NOARG("get_clients", hostapd_bss_get_clients),
|
UBUS_METHOD_NOARG("get_clients", hostapd_bss_get_clients),
|
||||||
UBUS_METHOD("del_client", hostapd_bss_del_client, del_policy),
|
UBUS_METHOD("del_client", hostapd_bss_del_client, del_policy),
|
||||||
UBUS_METHOD_NOARG("list_bans", hostapd_bss_list_bans),
|
UBUS_METHOD_NOARG("list_bans", hostapd_bss_list_bans),
|
||||||
|
#ifdef CONFIG_WPS
|
||||||
UBUS_METHOD_NOARG("wps_start", hostapd_bss_wps_start),
|
UBUS_METHOD_NOARG("wps_start", hostapd_bss_wps_start),
|
||||||
|
UBUS_METHOD_NOARG("wps_status", hostapd_bss_wps_status),
|
||||||
UBUS_METHOD_NOARG("wps_cancel", hostapd_bss_wps_cancel),
|
UBUS_METHOD_NOARG("wps_cancel", hostapd_bss_wps_cancel),
|
||||||
|
#endif
|
||||||
UBUS_METHOD_NOARG("update_beacon", hostapd_bss_update_beacon),
|
UBUS_METHOD_NOARG("update_beacon", hostapd_bss_update_beacon),
|
||||||
UBUS_METHOD_NOARG("get_features", hostapd_bss_get_features),
|
UBUS_METHOD_NOARG("get_features", hostapd_bss_get_features),
|
||||||
#ifdef NEED_AP_MLME
|
#ifdef NEED_AP_MLME
|
||||||
|
|
|
@ -50,6 +50,10 @@ static inline int has_feature(const char *feat)
|
||||||
#ifdef CONFIG_HS20
|
#ifdef CONFIG_HS20
|
||||||
if (!strcmp(feat, "hs20"))
|
if (!strcmp(feat, "hs20"))
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_WPS
|
||||||
|
if (!strcmp(feat, "wps"))
|
||||||
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue