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 <[email protected]>
> ---
> 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
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel