diff --git a/src/core/agent.c b/src/core/agent.c
index 13fd0c72f46b91d4569484f70d3bc78392a5b1c5..3112e5cbf40d769afb5a24248913f3607d9710e0 100644
--- a/src/core/agent.c
+++ b/src/core/agent.c
@@ -73,10 +73,12 @@ static void bsta_steer_cb(struct uloop_timeout *t)
struct netif_bk *bk = container_of(t, struct netif_bk, connect_timer);
uint8_t *bssid = NULL;
- if (hwaddr_is_zero(bk->bsta_steer.prev_bssid))
- bssid = bk->bsta_steer.prev_bssid;
+ dbg("|%s:%d| steer timer expired, restoring old bssid (" MACFMT ") for"\
+ "bsta %s\n",
+ __func__, __LINE__, MAC2STR(bk->bsta_steer.prev_bssid),
+ bk->name);
- wifi_set_iface_bssid(bk->name, bssid);
+ wifi_set_iface_bssid(bk, bk->bsta_steer.prev_bssid);
}
static void agent_terminate(void)
@@ -3500,7 +3502,7 @@ static void parse_bk(struct ubus_request *req, int type,
char bssid[18] = { 0 };
struct blob_attr *tb[1];
static const struct blobmsg_policy ap_attr[1] = {
- [0] = { .name = "bssid", .type = BLOBMSG_TYPE_STRING }
+ [0] = { .name = "macaddr", .type = BLOBMSG_TYPE_STRING }
};
blobmsg_parse(ap_attr, 1, tb, blob_data(msg), blob_len(msg));
@@ -4255,6 +4257,7 @@ static void mapclient_subscribe_for_cmdus(struct agent *a)
CMDU_TYPE_AP_AUTOCONFIGURATION_SEARCH,
CMDU_TYPE_AP_AUTOCONFIGURATION_RESPONSE,
CMDU_TYPE_AP_AUTOCONFIGURATION_WSC,
+ CMDU_BACKHAUL_STEER_REQUEST,
-1);
trace("<----------------------------------- %s\n", __func__);
diff --git a/src/core/agent_cmdu_generator.c b/src/core/agent_cmdu_generator.c
index 33c1b74e9913c328d4cf1cefab507b19cd9a0d69..cb2d25bfad58e9cd39cbb18dec736f35501d80ee 100644
--- a/src/core/agent_cmdu_generator.c
+++ b/src/core/agent_cmdu_generator.c
@@ -1110,7 +1110,7 @@ int agent_gen_cmdu_backhaul_steer_resp(struct agent *a, uint8_t *target_bssid, u
if (ret)
goto out;
- trace("build ap autoconfig wsc!\n");
+
cmdu_put_eom(frm);
cmdu_set_mid(frm, mid);
return frm;
diff --git a/src/core/agent_map.c b/src/core/agent_map.c
index ee12475328c71efd21175b47b0e16a61ccd4b37d..4601500699f3cd27154e614d3c5d73bf38c95dd8 100644
--- a/src/core/agent_map.c
+++ b/src/core/agent_map.c
@@ -3168,7 +3168,7 @@ int handle_backhaul_sta_steer_request(void *agent,
if (!tv[0][0])
return -1;
- req = (struct tlv_backhaul_steer_request *) tv[1][0]->data;
+ req = (struct tlv_backhaul_steer_request *) tv[0][0]->data;
if (!req)
return -1;
@@ -3184,65 +3184,13 @@ int handle_backhaul_sta_steer_request(void *agent,
cmdu_free(bk->bsta_steer.cmdu);
bk->bsta_steer.cmdu = cmdu;
- wifi_set_iface_bssid(bk->name, req->target_bssid);
- uloop_timeout_set(&bk->connect_timer, BSTA_STEER_TIMEOUT);
+ wifi_get_iface_bssid(bk->name, bk->bsta_steer.prev_bssid);
+
+ wifi_set_iface_bssid(bk, req->target_bssid);
+ uloop_timeout_set(&bk->connect_timer, 20 * 1000); /* TODO: why the long timeout */
memcpy(cmdu->origin, rx_cmdu->origin, 6);
return 0;
-// struct agent *a = (struct agent *) agent;
-// struct tlv_backhaul_steer_resp *p;
-// struct tlv_backhaul_steer_req *req;
-// struct cmdu_cstruct *cmdu;
-// struct netif_bk *bk;
-//
-// req = (struct tlv_backhaul_steer_req *) extract_tlv_by_type(rx_cmdu,
-// MAP_TLV_BACKHAUL_STEERING_REQUEST);
-// if (!req)
-// return -1;
-//
-// bk = find_bkhaul_by_bssid(a, req->addr);
-// if (!bk)
-// return -1;
-//
-// cmdu = (struct cmdu_cstruct *)calloc(1,
-// sizeof(struct cmdu_cstruct));
-// if (!cmdu) {
-// fprintf(stderr, "Out of memory!\n");
-// return -1;
-// }
-//
-// cmdu->message_type = CMDU_BACKHAUL_STEER_RESPONSE;
-// memcpy(cmdu->origin, rx_cmdu->origin, 6);
-// cmdu->message_id = rx_cmdu->message_id;
-// strncpy(cmdu->intf_name, rx_cmdu->intf_name, sizeof(cmdu->intf_name));
-//
-// p = calloc(1, sizeof(struct tlv_backhaul_steer_resp));
-// if (!p)
-// goto out_cmdu;
-//
-// p->tlv_type = MAP_TLV_BACKHAUL_STEERING_RESPONSE;
-// memcpy(p->bssid, req->bssid, 6);
-// memcpy(p->addr, req->addr, 6);
-//
-// cmdu->num_tlvs++;
-// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *));
-// if (!cmdu->tlvs)
-// goto out_p;
-//
-// cmdu->tlvs[0] = (uint8_t *) p;
-//
-// if (bk->bsta_steer.cmdu)
-// map_free_cmdu(bk->bsta_steer.cmdu);
-// bk->bsta_steer.cmdu = cmdu;
-//
-// wifi_set_iface_bssid(bk->name, req->bssid);
-// uloop_timeout_set(&bk->connect_timer, BSTA_STEER_TIMEOUT);
-// return 0;
-//out_p:
-// free(p);
-//out_cmdu:
-// free(cmdu);
-// return -1;
}
void free_scanresults_neighbors(struct wifi_radio_element *re)
diff --git a/src/core/config.c b/src/core/config.c
index 656053bc0eed89d7877014297add80aecead948d..3207b929fa969d00ec98343a24f5af2a01545f31 100644
--- a/src/core/config.c
+++ b/src/core/config.c
@@ -212,9 +212,45 @@ char *uci_get_bridge(char *ifname, char *bridge)
return bridge;
}
+int wifi_get_iface_bssid(char *ifname, uint8_t *bssid)
+{
+ struct uci_context *ctx = NULL;
+ struct uci_package *pkg;
+ struct uci_section *section;
+ struct uci_ptr ptr = {0};
+ int ret = -1;
+
+ if (!bssid)
+ return ret;
+
+ pkg = uci_load_pkg(&ctx, "wireless");
+ if (!pkg)
+ return ret;
+
+ section = config_get_section(ctx, pkg, "wifi-iface", "ifname", ifname);
+ if (!section)
+ goto out_pkg;
+
+ ptr.p = pkg;
+ ptr.s = section;
+ ptr.option = "bssid";
+ ptr.target = UCI_TYPE_OPTION;
+
+ ret = uci_lookup_ptr(ctx, &ptr, NULL, false);
+ if (!ret && ptr.o)
+ hwaddr_aton(ptr.o->v.string, bssid);
+ else
+ memset(bssid, 0, 6);
+
+out_pkg:
+ uci_unload(ctx, pkg);
+ uci_free_context(ctx);
+ return ret;
+}
+
/* TODO: can it be generalized? */
-int wifi_set_iface_bssid(const char *ifname, uint8_t *bssid)
+int wifi_set_iface_bssid(struct netif_bk *bk, uint8_t *bssid)
{
struct uci_context *ctx = NULL;
struct uci_package *pkg;
@@ -226,12 +262,14 @@ int wifi_set_iface_bssid(const char *ifname, uint8_t *bssid)
if (!pkg)
return ret;
- section = config_get_section(ctx, pkg, "wifi-iface", "ifname", ifname);
+ section = config_get_section(ctx, pkg, "wifi-iface", "ifname", bk->name);
if (!section)
goto out_pkg;
- if (bssid && !hwaddr_ntoa(bssid, bssid_str))
- goto out_pkg;
+ if (bssid && !hwaddr_is_zero(bssid))
+ hwaddr_ntoa(bssid, bssid_str);
+
+ dbg("|%s:%d| setting bssid to %s\n", bssid_str);
ret = set_value(ctx, pkg, section, "bssid", bssid_str, UCI_TYPE_STRING);
diff --git a/src/core/config.h b/src/core/config.h
index fb67881b84e4b08ddeabe793375e0747c9a4c088..b2699039c37d28f473fcef5c62bb8e83e47b5bbb 100644
--- a/src/core/config.h
+++ b/src/core/config.h
@@ -195,6 +195,7 @@ union config {
#endif
struct agent;
+struct netif_bk;
enum m2_process_status {
M2_PROCESS_OK,
@@ -212,7 +213,8 @@ struct uci_section *config_get_iface_section(struct uci_context *ctx,
struct uci_package *pkg, const char *type, const char *ifname);
bool uci_reload_services(char *services);
struct uci_package *uci_load_pkg(struct uci_context **ctx, const char *config);
-int wifi_set_iface_bssid(const char *ifname, uint8_t *bssid);
+int wifi_get_iface_bssid(char *ifname, uint8_t *bssid);
+int wifi_set_iface_bssid(struct netif_bk *bk, uint8_t *bssid);
char *uci_get_bridge(char *ifname, char *bridge);
/* END TODO */