diff --git a/src/cntlr_cmdu.c b/src/cntlr_cmdu.c index 087cc5b6ac6ef5fcf8ead78335dadba4f8e959cb..bfb4bf03723e20719299e676ca11bdb667bcb14d 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 88d0d4ccce21fde6c1ae31cedaf9cac550d06e80..832376a5d80719ce4c182ac19462e3de56aee3f3 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 edc773196ba70f8c4a9ee856d208f712e42445be..6f2122acee5cd3f304c3b5b18977106c175c43b7 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 672ce35c6ea2dcc293856b70550c98265906918b..a04286ef27564f7cae0ee11ca8b77f4a85def0e1 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,