From f6347b49a90ffa5eae62c7eb6e43635c470af9cc Mon Sep 17 00:00:00 2001 From: Jakob Olsson <jakob.olsson@iopsys.eu> Date: Fri, 21 May 2021 17:44:38 +0200 Subject: [PATCH] [WIP]: map-controller: autoconfig renew --- src/core/cntlr_cmdu_generator.c | 80 +++++++++++++-------------------- src/core/cntlr_ubus.c | 79 +++++++++++++------------------- 2 files changed, 61 insertions(+), 98 deletions(-) diff --git a/src/core/cntlr_cmdu_generator.c b/src/core/cntlr_cmdu_generator.c index 0fbcaee7..fcbe352c 100644 --- a/src/core/cntlr_cmdu_generator.c +++ b/src/core/cntlr_cmdu_generator.c @@ -66,58 +66,38 @@ static void cmdu_defaults(struct controller *c, struct cmdu_buff *cmdu, } struct cmdu_buff *cntlr_gen_ap_autoconfig_renew(struct controller *c, - uint8_t *origin, char *intf_name, uint8_t *almac) + uint8_t *dst) { + struct cmdu_buff *resp; + struct tlv *t; + int ret; + uint16_t mid = 0; + + resp = cmdu_alloc_simple(CMDU_TYPE_AP_AUTOCONFIGURATION_RENEW, &mid); + if (!resp) { + trace("%s: -ENOMEM\n", __func__); + return -1; + } + + ret = cntlr_gen_supp_role(c, resp, IEEE80211_ROLE_REGISTRAR); + if (ret) + goto out; + + ret = cntlr_gen_al_mac(c, c->almac); + if (ret) + goto out; + + /* Hard-code dummy 5GHz, ignored by agent according to spec */ + ret = cntlr_gen_supported_freq_band(c, IEEE80211_FREQUENCY_BAND_5_GHZ); + if (ret) + goto out; + + cmdu_put_eom(resp); + memcpy(resp->origin, dst, 6); + return resp; +out: + cmdu_free(resp;) return NULL; -// struct cmdu_cstruct *cmdu; -// struct tlv_al_mac *p; -// struct tlv_supported_freq_band *p1; -// struct tlv_supported_role *p2; -// int tlv_index = 0; -// -// cmdu = (struct cmdu_cstruct *)calloc(1, sizeof(struct cmdu_cstruct)); -// if (!cmdu) { -// trace("failed to malloc cmdu\n"); -// return NULL; -// } -// -// cmdu_defaults(c, cmdu, origin, intf_name, -// CMDU_TYPE_AP_AUTOCONFIGURATION_RENEW); -// -// p = cntlr_gen_al_mac(c, almac); -// if (!p) -// goto fail_cmdu; -// cmdu->num_tlvs++; -// -// /* Hard-code dummy 5GHz, ignored by agent according to spec */ -// p1 = cntlr_gen_supported_freq_band(c, 0x01); -// if (!p1) -// goto fail_p; -// cmdu->num_tlvs++; -// -// /* Hard-code dummy registrar role, only valid value */ -// p2 = cntlr_gen_supported_role(c, 0x00); -// if (!p2) -// goto fail_p1; -// cmdu->num_tlvs++; -// -// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); -// if (!cmdu->tlvs) -// goto fail_p2; -// cmdu->tlvs[tlv_index++] = (uint8_t *)p; -// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; -// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; -// -// return cmdu; -//fail_p2: -// map_free_tlv_cstruct((uint8_t *) p2); -//fail_p1: -// map_free_tlv_cstruct((uint8_t *) p1); -//fail_p: -// map_free_tlv_cstruct((uint8_t *) p); -//fail_cmdu: -// map_free_cmdu(cmdu); -// return NULL; } struct cmdu_buff *cntlr_gen_ap_capability_query(struct controller *c, diff --git a/src/core/cntlr_ubus.c b/src/core/cntlr_ubus.c index c4cdf8d4..641d08ba 100644 --- a/src/core/cntlr_ubus.c +++ b/src/core/cntlr_ubus.c @@ -112,15 +112,11 @@ static const struct blobmsg_policy config_policy_params[__CFG_POLICY_MAX] = { enum { RECFG_POLICY_AGENT, - RECFG_POLICY_ALMAC, - RECFG_POLICY_EGRESS, __RECFG_POLICY_MAX, }; static const struct blobmsg_policy reconfig_policy_params[__RECFG_POLICY_MAX] = { - [RECFG_POLICY_AGENT] = { .name = "agent", .type = BLOBMSG_TYPE_STRING }, - [RECFG_POLICY_ALMAC] = { .name = "almac", .type = BLOBMSG_TYPE_STRING }, - [RECFG_POLICY_EGRESS] = { .name = "egress", .type = BLOBMSG_TYPE_STRING } + [RECFG_POLICY_AGENT] = { .name = "agent", .type = BLOBMSG_TYPE_STRING } }; enum { @@ -1000,49 +996,36 @@ static int cntlr_reconfig_ap(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { - return 0; -// struct controller *c = container_of(obj, struct controller, obj); -// struct blob_attr *tb[__RECFG_POLICY_MAX]; -// char almac[18] = {0}, egress[16] = {0}; -// uint8_t hwaddr[6] = {0}, alhwaddr[6] = {0}; -// struct cmdu_cstruct *cmdu; -// int i, tlv_index = 0; -// -// blobmsg_parse(reconfig_policy_params, __RECFG_POLICY_MAX, tb, -// blob_data(msg), blob_len(msg)); -// -// if (!tb[RECFG_POLICY_ALMAC]) { -// fprintf(stderr, "Provide ALMAC address in format 11:22:33...\n"); -// return UBUS_STATUS_INVALID_ARGUMENT; -// } -// -// if (tb[RECFG_POLICY_AGENT]) { -// char agent[18] = {0}; -// -// strncpy(agent, blobmsg_data(tb[RECFG_POLICY_AGENT]), -// sizeof(agent) - 1); -// if (!hwaddr_aton(agent, hwaddr)) -// return UBUS_STATUS_UNKNOWN_ERROR; -// } -// -// if (tb[RECFG_POLICY_EGRESS]) -// strncpy(egress, blobmsg_data(tb[RECFG_POLICY_EGRESS]), -// sizeof(egress) - 1); -// else -// strncpy(egress, c->cfg.al_bridge, sizeof(egress) - 1); -// -// strncpy(almac, blobmsg_data(tb[RECFG_POLICY_ALMAC]), -// sizeof(almac) - 1); -// if (!hwaddr_aton(almac, alhwaddr)) -// return UBUS_STATUS_UNKNOWN_ERROR; -// -// cmdu = cntlr_gen_ap_autoconfig_renew(c, alhwaddr, egress, alhwaddr); -// if (!cmdu) -// return UBUS_STATUS_UNKNOWN_ERROR; -// -// send_cmdu(c, cmdu); -// map_free_cmdu(cmdu); -// return UBUS_STATUS_OK; + struct controller *c = container_of(obj, struct controller, obj); + struct blob_attr *tb[__RECFG_POLICY_MAX]; + char almac[18] = {0}; + char agent[18] = {0}; + uint8_t hwaddr[6] = {0}, alhwaddr[6] = {0}; + struct cmdu_cstruct *cmdu; + int i, tlv_index = 0; + + blobmsg_parse(reconfig_policy_params, __RECFG_POLICY_MAX, tb, + blob_data(msg), blob_len(msg)); + + if (!tb[RECFG_POLICY_AGENT]) { + fprintf(stderr, "Provide ALMAC address in format 11:22:33...\n"); + return UBUS_STATUS_INVALID_ARGUMENT; + } + + + strncpy(agent, blobmsg_data(tb[RECFG_POLICY_AGENT]), + sizeof(agent) - 1); + if (!hwaddr_aton(agent, hwaddr)) + return UBUS_STATUS_UNKNOWN_ERROR; + + + cmdu = cntlr_gen_ap_autoconfig_renew(c, hwaddr); + if (!cmdu) + return UBUS_STATUS_UNKNOWN_ERROR; + + send_cmdu(c, cmdu); + map_free_cmdu(cmdu); + return UBUS_STATUS_OK; } static struct netif_radio *cntlr_radio_to_bssid(struct controller *c, const char *radio) -- GitLab