[OpenWrt-Devel] [PATCH] hostapd: add switch_chan and set_vendor_elements ubus methods

John Crispin blogic at openwrt.org
Fri Mar 6 03:25:05 EST 2015


Hi Zefir,

if we switch the channel via ubus, then the channel specified inside uci
and the one actually used are not consistent. could you tell us what
your use case for this is ?

	John


On 10/02/2015 10:30, Zefir Kurtisi wrote:
> Signed-off-by: Zefir Kurtisi <zefir.kurtisi at neratec.com>
> ---
>  src/ap/ubus.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 82 insertions(+)
> 
> diff --git a/src/ap/ubus.c b/src/ap/ubus.c
> index 1030d58..a8853a0 100644
> --- a/src/ap/ubus.c
> +++ b/src/ap/ubus.c
> @@ -17,6 +17,12 @@
>  
>  static struct blob_buf b;
>  
> +static inline struct hostapd_data *get_hapd_from_object(struct ubus_object *obj)
> +{
> +	return container_of(obj, struct hostapd_data, ubus.obj);
> +}
> +
> +
>  struct ubus_banned_client {
>  	struct avl_node avl;
>  	u8 addr[ETH_ALEN];
> @@ -234,12 +240,88 @@ hostapd_bss_wps_cancel(struct ubus_context *ctx, struct ubus_object *obj,
>  	return 0;
>  }
>  
> +enum {
> +	CSA_FREQ,
> +	CSA_BCN_COUNT,
> +	__CSA_MAX
> +};
> +
> +static const struct blobmsg_policy csa_policy[__CSA_MAX] = {
> +	/*
> +	 * for now, frequency and beacon count are enough, add more
> +	 * parameters on demand
> +	 */
> +	[CSA_FREQ] = { "freq", BLOBMSG_TYPE_INT32 },
> +	[CSA_BCN_COUNT] = { "bcn_count", BLOBMSG_TYPE_INT32 },
> +};
> +
> +static int
> +hostapd_switch_chan(struct ubus_context *ctx, struct ubus_object *obj,
> +		    struct ubus_request_data *req, const char *method,
> +		    struct blob_attr *msg)
> +{
> +	struct blob_attr *tb[__CSA_MAX];
> +	struct hostapd_data *hapd = get_hapd_from_object(obj);
> +	struct csa_settings css;
> +
> +	blobmsg_parse(csa_policy, __CSA_MAX, tb, blob_data(msg), blob_len(msg));
> +
> +	if (!tb[CSA_FREQ])
> +		return UBUS_STATUS_INVALID_ARGUMENT;
> +
> +	memset(&css, 0, sizeof(css));
> +	css.freq_params.freq = blobmsg_get_u32(tb[CSA_FREQ]);
> +	if (tb[CSA_BCN_COUNT])
> +		css.cs_count = blobmsg_get_u32(tb[CSA_BCN_COUNT]);
> +
> +	if (hostapd_switch_channel(hapd, &css) != 0)
> +		return UBUS_STATUS_NOT_SUPPORTED;
> +	return UBUS_STATUS_OK;
> +}
> +
> +enum {
> +	VENDOR_ELEMENTS,
> +	__VENDOR_ELEMENTS_MAX
> +};
> +
> +static const struct blobmsg_policy ve_policy[__VENDOR_ELEMENTS_MAX] = {
> +	/* vendor elements are provided as hex-string */
> +	[VENDOR_ELEMENTS] = { "vendor_elements", BLOBMSG_TYPE_STRING },
> +};
> +
> +static int
> +hostapd_vendor_elements(struct ubus_context *ctx, struct ubus_object *obj,
> +			struct ubus_request_data *req, const char *method,
> +			struct blob_attr *msg)
> +{
> +	struct blob_attr *tb[__VENDOR_ELEMENTS_MAX];
> +	struct hostapd_data *hapd = get_hapd_from_object(obj);
> +
> +	blobmsg_parse(ve_policy, __VENDOR_ELEMENTS_MAX, tb,
> +		      blob_data(msg), blob_len(msg));
> +
> +	if (!tb[VENDOR_ELEMENTS])
> +		return UBUS_STATUS_INVALID_ARGUMENT;
> +
> +	const char *vendor_elements = blobmsg_data(tb[VENDOR_ELEMENTS]);
> +	if (hostapd_set_iface(hapd->iconf, hapd->conf, "vendor_elements",
> +			      vendor_elements) != 0)
> +		return UBUS_STATUS_NOT_SUPPORTED;
> +
> +	/* update beacons if vendor elements were set successfully */
> +	if (ieee802_11_update_beacons(hapd->iface) != 0)
> +		return UBUS_STATUS_NOT_SUPPORTED;
> +	return UBUS_STATUS_OK;
> +}
> +
>  static const struct ubus_method bss_methods[] = {
>  	UBUS_METHOD_NOARG("get_clients", hostapd_bss_get_clients),
>  	UBUS_METHOD("del_client", hostapd_bss_del_client, del_policy),
>  	UBUS_METHOD_NOARG("list_bans", hostapd_bss_list_bans),
>  	UBUS_METHOD_NOARG("wps_start", hostapd_bss_wps_start),
>  	UBUS_METHOD_NOARG("wps_cancel", hostapd_bss_wps_cancel),
> +	UBUS_METHOD("switch_chan", hostapd_switch_chan, csa_policy),
> +	UBUS_METHOD("set_vendor_elements", hostapd_vendor_elements, ve_policy),
>  };
>  
>  static struct ubus_object_type bss_object_type =
> 
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list