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