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);