diff --git a/src/cntlr.c b/src/cntlr.c index 478162c838d5671fd224e101ba1db644807aefdb..59a1007fb943fbf222c9d82321a0ed0d27b6b0a0 100644 --- a/src/cntlr.c +++ b/src/cntlr.c @@ -416,7 +416,7 @@ static int cntlr_steer_sta(struct controller *c, struct sta *s, struct steer_target *to, uint32_t mode, uint32_t reason) { - struct cmdu_buff *cmdu; + int ret = 0; trace("%s:--->\n", __func__); @@ -443,22 +443,20 @@ static int cntlr_steer_sta(struct controller *c, struct sta *s, break; case STEER_MODE_BTM_REQ: case STEER_MODE_OPPORTUNITY: - cmdu = cntlr_gen_client_steer_request(c, s->fh->agent->alid, + ret = cntlr_send_client_steer_request(c, s->fh->agent->alid, s->bssid, 0, 1, (uint8_t (*)[6])s->macaddr, 1, (uint8_t (*)[6])to->bssid, mode); - if (!cmdu) { - warn("%s: Failed to generate cmdu for steering sta!\n", __func__); - return -1; + if (ret) { + warn("%s: Failed to send cmdu for steering sta!\n", __func__); + return ret; } cntlr_notify_client_steer_req_evt(c, s->bssid, 1, (uint8_t (*)[6])s->macaddr, 1, (uint8_t (*)[6])to->bssid); - send_cmdu(c, cmdu); - cmdu_free(cmdu); break; case STEER_MODE_UNDEFINED: default: diff --git a/src/cntlr_cmdu.c b/src/cntlr_cmdu.c index 37df7bcef90ed9ce18776c9169a1d1ad1488704d..da0c328a950495ef563370d8f088678a56f0a075 100644 --- a/src/cntlr_cmdu.c +++ b/src/cntlr_cmdu.c @@ -884,13 +884,14 @@ struct cmdu_buff *cntlr_gen_client_steer_request(struct controller *c, frm = cmdu_alloc_simple(CMDU_CLIENT_STEERING_REQUEST, &mid); if (!frm) { + warn("%s: Failed to generate cmdu for steering sta!\n", __func__); dbg("%s: -ENOMEM\n", __func__); return NULL; } dbg("%s %d sta_id " MACFMT "\n", __func__, __LINE__, MAC2STR(stas[0])); - ret = cntlr_gen_steer_request(c, frm, + ret = cntlr_gen_tlv_steer_request(c, frm, MAP_TLV_STEERING_REQUEST, bssid, steer_timeout, sta_nr, stas, bssid_nr, target_bssid, request_mode); @@ -906,6 +907,27 @@ error: return NULL; } +int cntlr_send_client_steer_request(struct controller *c, + uint8_t *agent_mac, uint8_t *bssid, + uint32_t steer_timeout, uint32_t sta_nr, uint8_t stas[][6], + uint32_t bssid_nr, uint8_t target_bssid[][6], uint32_t request_mode) +{ + struct cmdu_buff *cmdu_data = NULL; + + trace("%s:--->\n", __func__); + + cmdu_data = cntlr_gen_client_steer_request(c, agent_mac, bssid, steer_timeout, + sta_nr, stas, bssid_nr, target_bssid, request_mode); + + if (!cmdu_data) + return -1; + + send_cmdu(c, cmdu_data); + cmdu_free(cmdu_data); + + return 0; +} + struct cmdu_buff *cntlr_gen_comb_infra_metrics_query(struct controller *c, uint8_t *origin, uint8_t *bssid) { struct cmdu_buff *frm; diff --git a/src/cntlr_cmdu.h b/src/cntlr_cmdu.h index 2888a146df6ebd544c35205c3e2491313dc8656c..b6e6c6d7771404da6716fa70c0034352ce58fab0 100644 --- a/src/cntlr_cmdu.h +++ b/src/cntlr_cmdu.h @@ -78,4 +78,8 @@ int cntlr_send_cac_req(struct controller *c, uint8_t *agent, int num_data, struct cac_data *data); int cntlr_send_cac_term(struct controller *c, uint8_t *agent, int num_data, struct cac_data *data); +int cntlr_send_client_steer_request(struct controller *c, + uint8_t *agent_mac, uint8_t *bssid, + uint32_t steer_timeout, uint32_t sta_nr, uint8_t stas[][6], + uint32_t bssid_nr, uint8_t target_bssid[][6], uint32_t request_mode); #endif diff --git a/src/cntlr_map.c b/src/cntlr_map.c index a7c678d08ff3219ba34314afffbbb01bf89394ab..d211967478259d42cca577fdb1449cd96401f7e1 100644 --- a/src/cntlr_map.c +++ b/src/cntlr_map.c @@ -1634,6 +1634,7 @@ void cntlr_check_usta_steer(struct controller *c, struct sta *s) && memcmp(best_fh->bssid, s->bssid, 6)) { struct cmdu_buff *cmdu; + int ret = 0; if ((s->type == IEEE1905 && !c->cfg.enable_bsta_steer) || (s->type == NON_IEEE1905 && !c->cfg.enable_sta_steer)) { @@ -1648,19 +1649,22 @@ void cntlr_check_usta_steer(struct controller *c, struct sta *s) __func__, __LINE__, MAC2STR(s->macaddr), MAC2STR(s->bssid), MAC2STR(best_fh->bssid)); - if (s->type == IEEE1905) + if (s->type == IEEE1905) { cmdu = cntlr_gen_backhaul_steer_request(c, s->agent->alid, s->macaddr, best_fh->bssid, 0, 0); - else - cmdu = cntlr_gen_client_steer_request(c, s->fh->agent->alid, + if (cmdu) { + send_cmdu(c, cmdu); + cmdu_free(cmdu); + } + } + else { + ret = cntlr_send_client_steer_request(c, s->fh->agent->alid, s->bssid, 0, 1, (uint8_t (*)[6])s->macaddr, 1, (uint8_t (*)[6])best_fh->bssid, STEER_MODE_BTM_REQ); /* mandate */ - - if (cmdu) { - send_cmdu(c, cmdu); - cmdu_free(cmdu); + if (ret) + warn("%s: Failed to send cmdu for steering sta!\n", __func__); } } } diff --git a/src/cntlr_tlv.c b/src/cntlr_tlv.c index 33abebc9abe35b0c1b5f581d4d1d2a913dca4876..c07393e995d65c5108d71906aaae475e05f1d2c6 100644 --- a/src/cntlr_tlv.c +++ b/src/cntlr_tlv.c @@ -707,7 +707,7 @@ int cntlr_gen_backhaul_steer_req(struct controller *c, struct cmdu_buff *frm, return 0; } -int cntlr_gen_steer_request(struct controller *c, +int cntlr_gen_tlv_steer_request(struct controller *c, struct cmdu_buff *frm, uint8_t tlv_type, uint8_t *bssid, uint32_t steer_timeout, uint32_t sta_nr, uint8_t sta_id[][6], diff --git a/src/cntlr_tlv.h b/src/cntlr_tlv.h index bb67923e571e84938e729b1af54e0f17771d4b5c..af0ca5969bf1637c46ef99963de8c0e1557a683c 100644 --- a/src/cntlr_tlv.h +++ b/src/cntlr_tlv.h @@ -64,7 +64,7 @@ int cntlr_gen_backhaul_steer_req(struct controller *c, struct cmdu_buff *frm, int cntlr_gen_channel_scan_req(struct controller *c, struct cmdu_buff *frm, uint8_t num_radios, const uint8_t *num_ch_to_scan, uint8_t **channel, char (*radio)[18]); -int cntlr_gen_steer_request(struct controller *c, +int cntlr_gen_tlv_steer_request(struct controller *c, struct cmdu_buff *frm, uint8_t tlv_type, uint8_t *bss_id, uint32_t steer_timeout, uint32_t sta_nr, uint8_t sta_id[][6], uint32_t bssid_nr, diff --git a/src/cntlr_ubus.c b/src/cntlr_ubus.c index e43420404bf4a02ae0f7d6578d2ebdac9da49be6..efebf7bd6b017dcbe2afbe2d3e063f633b18717b 100644 --- a/src/cntlr_ubus.c +++ b/src/cntlr_ubus.c @@ -1299,7 +1299,7 @@ static int cntlr_client_steering(struct ubus_context *ctx, struct ubus_object *o bssid_nr); /* Client Steering Request TLV */ - ret = cntlr_gen_steer_request(c, cmdu, + ret = cntlr_gen_tlv_steer_request(c, cmdu, MAP_TLV_STEERING_REQUEST, bss_id, steer_timeout, sta_nr, sta_id, bssid_nr, target_bbsid, request_mode); @@ -1315,7 +1315,7 @@ static int cntlr_client_steering(struct ubus_context *ctx, struct ubus_object *o sta_multi_present != -1)) { /* Client Steering Request TLV 17.2.57 */ - ret = cntlr_gen_steer_request(c, cmdu, + ret = cntlr_gen_tlv_steer_request(c, cmdu, MAP_TLV_PROFILE2_STEERING_REQ, bss_id, steer_timeout, sta_multi_nr, sta_multi_id, bssid_multi_nr, target_bbsid_multi, request_mode);