diff --git a/src/agent.c b/src/agent.c index 3d3dd075280bbe9568e502d94705cd221ffafb30..a6a887351eeda61f3678398b55d70f632299d36e 100644 --- a/src/agent.c +++ b/src/agent.c @@ -41,6 +41,7 @@ #include <unistd.h> #include <wifiutils.h> #include <timer.h> +#include <openssl/sha.h> #include "agent_cmdu.h" #include "agent_map.h" @@ -5763,16 +5764,45 @@ struct wifi_radio_element *agent_add_radio(struct agent *a, char *name) return re; } +void derive_radio_mac(uint8_t *mac, const uint8_t *basemac, enum wifi_band band) +{ + trace("%s:--->\n", __func__); + uint8_t hash[32]; + uint8_t seed[16]; + + memcpy(seed, &basemac[3], 3); + seed[3] = (uint8_t)(band & 0xFF); + seed[4] = 0xA5; /* entropy byte to have randomness */ + SHA256(seed, 5, hash); + + memcpy(mac, basemac, 3); + mac[3] = hash[0]; + mac[4] = hash[1]; + mac[5] = hash[2]; + trace("%s:Derived MAC for band 0x%x: " MACFMT "\n", __func__, band, MAC2STR(mac)); +} + static int init_wifi_radios(struct agent *a) { trace("%s: --->\n", __func__); struct agent_config_radio *rcfg; int ret = 0; + char buf[64] = {0}; + uint8_t basemac[6] = {0}; + + chrCmd(buf, sizeof(buf), "db -q get hw.board.basemac"); + if (buf[0] == '\0' || strlen(buf) != 17) { + dbg("Failed to get valid basemac\n"); + return -1; + } + hwaddr_aton(buf, basemac); + list_for_each_entry(rcfg, &a->cfg.radiolist, list) { wifi_object_t r_wobj = WIFI_OBJECT_INVALID; struct wifi_radio_element *re; char r_objname[32] = {0}; + uint8_t derived_mac[6] = {0}; re = agent_add_radio(a, rcfg->name); if (!re) @@ -5789,6 +5819,9 @@ static int init_wifi_radios(struct agent *a) dbg("%s: getting radio:%s status\n", __func__, re->name); ret = ubus_call_object(a, r_wobj, "status", parse_radio, re); + derive_radio_mac(derived_mac, basemac, re->band); + memcpy(re->macaddr, derived_mac, sizeof(re->macaddr)); + /* Get fresh opclass preferences after scan */ wifi_radio_update_opclass_preferences(a, re, 1); agent_set_post_scan_action_pref(a, re, true);