From 3672ebef6cb2f70329da8867dfde594bf37c5936 Mon Sep 17 00:00:00 2001
From: Jakob Olsson <jakob.olsson@iopsys.eu>
Date: Fri, 11 Aug 2023 13:57:58 +0000
Subject: [PATCH] support creation of supported service tlv as a list
---
src/cntlr_cmdu.c | 7 ++-----
src/cntlr_map.c | 7 +++++++
src/cntlr_tlv.c | 20 +++++++++++++++-----
src/cntlr_tlv.h | 3 +--
4 files changed, 25 insertions(+), 12 deletions(-)
diff --git a/src/cntlr_cmdu.c b/src/cntlr_cmdu.c
index 087cc5b6..bfb4bf03 100644
--- a/src/cntlr_cmdu.c
+++ b/src/cntlr_cmdu.c
@@ -468,7 +468,6 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_search(struct controller *c,
int ret = 0;
uint16_t mid = 0;
uint8_t origin[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x13};
- uint8_t role;
frm = cmdu_alloc_simple(CMDU_TYPE_AP_AUTOCONFIGURATION_SEARCH, &mid);
if (!frm) {
@@ -490,9 +489,7 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_search(struct controller *c,
if (ret)
goto out;
- role = (c->state == CNTLR_INIT ? SUPPORTED_SERVICE_MULTIAP_AGENT :
- SUPPORTED_SERVICE_MULTIAP_CONTROLLER);
- ret = cntlr_gen_supp_service(c, frm, role);
+ ret = cntlr_gen_supp_service(c, frm);
if (ret)
goto out;
@@ -543,7 +540,7 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_response(struct controller *c,
if (ret)
goto out;
- ret = cntlr_gen_supp_service(c, resp, SUPPORTED_SERVICE_MULTIAP_CONTROLLER);
+ ret = cntlr_gen_supp_service(c, resp);
if (ret)
goto out;
diff --git a/src/cntlr_map.c b/src/cntlr_map.c
index 88d0d4cc..832376a5 100644
--- a/src/cntlr_map.c
+++ b/src/cntlr_map.c
@@ -957,6 +957,13 @@ int handle_ap_autoconfig_search(void *cntlr, struct cmdu_buff *rx_cmdu,
int ret = 0;
char freq_band[8] = {0};
+ if (cmdu_get_mid(rx_cmdu) == c->mid_5g ||
+ cmdu_get_mid(rx_cmdu) == c->mid_2g) {
+ dbg("|%s:%d| Drop search from self!\n", __func__,
+ __LINE__);
+ return -1;
+ }
+
t = map_cmdu_get_tlv(rx_cmdu, TLV_TYPE_AL_MAC_ADDRESS_TYPE);
if (!t) {
dbg("|%s:%d| Malformed topology notification!\n", __func__,
diff --git a/src/cntlr_tlv.c b/src/cntlr_tlv.c
index edc77319..6f2122ac 100644
--- a/src/cntlr_tlv.c
+++ b/src/cntlr_tlv.c
@@ -358,20 +358,30 @@ int cntlr_gen_supp_role(struct controller *c, struct cmdu_buff *frm,
return 0;
}
-int cntlr_gen_supp_service(struct controller *c, struct cmdu_buff *frm,
- uint8_t service)
+int cntlr_gen_supp_service(struct controller *c, struct cmdu_buff *frm)
{
struct tlv *t;
int ret;
+ int num = 0;
+ struct tlv_supported_service *t_supp_serv;
t = cmdu_reserve_tlv(frm, 256);
if (!t)
return -1;
t->type = MAP_TLV_SUPPORTED_SERVICE;
- t->len = 2;
- t->data[0] = 0x1;
- t->data[1] = service;
+ t_supp_serv = (struct tlv_supported_service *) t->data;
+
+ if (c->state != CNTLR_INIT) {
+ t_supp_serv->services[num++] = SUPPORTED_SERVICE_MULTIAP_CONTROLLER;
+
+ if (cntlr_find_node(c, c->almac))
+ t_supp_serv->services[num++] = SUPPORTED_SERVICE_MULTIAP_AGENT;
+ } else
+ t_supp_serv->services[num++] = SUPPORTED_SERVICE_MULTIAP_AGENT;
+
+ t_supp_serv->num_services = num;
+ t->len = num + 1;
ret = cmdu_put_tlv(frm, t);
if (ret) {
diff --git a/src/cntlr_tlv.h b/src/cntlr_tlv.h
index 672ce35c..a04286ef 100644
--- a/src/cntlr_tlv.h
+++ b/src/cntlr_tlv.h
@@ -34,8 +34,7 @@ int cntlr_gen_ap_radio_identifier(struct controller *c, struct cmdu_buff *frm,
uint8_t *hwaddr);
int cntlr_gen_supp_role(struct controller *c, struct cmdu_buff *frm,
uint8_t role);
-int cntlr_gen_supp_service(struct controller *c, struct cmdu_buff *cmdu,
- uint8_t service);
+int cntlr_gen_supp_service(struct controller *c, struct cmdu_buff *cmdu);
int cntlr_gen_map_profile(struct controller *c, struct cmdu_buff *frm,
uint8_t profile);
int cntlr_gen_steering_policy(struct controller *c,
--
GitLab