From 09b83bea2fabf11f42fefe72c58931b390044179 Mon Sep 17 00:00:00 2001
From: Filip Matusiak <filip.matusiak@iopsys.eu>
Date: Fri, 6 Jun 2025 12:30:59 +0200
Subject: [PATCH] wsc: read sha256 hash from file once upon restart

---
 src/agent.c      |  6 ++++++
 src/agent_map.c  |  1 +
 src/autoconfig.c | 11 +++++++++--
 src/autoconfig.h |  2 +-
 4 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/agent.c b/src/agent.c
index 561edfea..45e93a44 100644
--- a/src/agent.c
+++ b/src/agent.c
@@ -5774,6 +5774,7 @@ struct wifi_radio_element *agent_add_radio(struct agent *a, char *name)
 	timer_init(&re->bk.steer_timeout, bsta_steer_cb);
 	timer_init(&re->unassoc_sta_meas_timer,
 				agent_unassoc_sta_meas_timer_cb);
+
 	return re;
 }
 
@@ -5803,6 +5804,11 @@ 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);
 
+		if (!ret && !re->autconfig.sha256[0])
+			if (autoconfig_read_hash_from_file(re->macaddr, re->autconfig.sha256))
+				dbg("%s: Autoconfig SHA256 for radio %s is unset\n",
+					__func__, re->name);
+
 		/* Get fresh opclass preferences after scan */
 		wifi_radio_update_opclass_preferences(a, re, 1);
 		agent_set_post_scan_action_pref(a, re, true);
diff --git a/src/agent_map.c b/src/agent_map.c
index c2190d3c..b8b41dd7 100644
--- a/src/agent_map.c
+++ b/src/agent_map.c
@@ -2425,6 +2425,7 @@ int handle_ap_autoconfig_wsc(void *agent, struct cmdu_buff *rx_cmdu,
 		return -1;
 
 	dbg("|%s:%d| found radio = %s\n", __func__, __LINE__, radio->name);
+
 	if (!autoconfig_has_wsc_changed(&radio->autconfig, tv,
 				AP_AUTOCONFIGURATION_WSC_M2_NUM_OF_TLV_TYPES,
 				new_sha256)) {
diff --git a/src/autoconfig.c b/src/autoconfig.c
index 4709d767..3f3bc0d4 100644
--- a/src/autoconfig.c
+++ b/src/autoconfig.c
@@ -151,7 +151,8 @@ bool autoconfig_has_wsc_changed(struct wsc_data *data,
 		 data->sha256[4], data->sha256[5]);
 
 	agnt_dbg(LOG_APCFG, "%s: new SHA256:     %02x%02x%02x%02x%02x%02x...\n", __func__,
-		 new_sha256[0], new_sha256[1], new_sha256[2], new_sha256[3],
+		 new_sha256[0], new_sha256[1],
+		 new_sha256[2], new_sha256[3],
 		 new_sha256[4], new_sha256[5]);
 
 	memcpy(sha256_out, new_sha256, SHA256_LENGTH);
@@ -160,6 +161,7 @@ bool autoconfig_has_wsc_changed(struct wsc_data *data,
 
 error_cleanup:
 	EVP_MD_CTX_free(ctx);
+
 	return ret;
 }
 
@@ -350,7 +352,6 @@ int autoconfig_read_hash_from_file(uint8_t *macaddr, uint8_t *sha256_out)
 		uint8_t radio_mac[6] = {0};
 		char *sh256_str;
 		int blen;
-		//char * data;
 
 		blobmsg_parse(radio_attr, ARRAY_SIZE(radio_attr), tb1, blobmsg_data(b), blob_len(b));
 		if (!tb1[0] || !tb1[1])
@@ -382,6 +383,12 @@ int autoconfig_read_hash_from_file(uint8_t *macaddr, uint8_t *sha256_out)
 		strtob(sh256_str, blen, sha256_out);
 	}
 
+	dbg("%s: Read autoconfig SHA256 for radio " MACFMT ": %02x%02x%02x%02x%02x%02x...\n",
+		__func__, MAC2STR(macaddr),
+		sha256_out[0], sha256_out[1],
+		sha256_out[2], sha256_out[3],
+		sha256_out[4], sha256_out[5]);
+
 out:
 	blob_buf_free(&radios);
 
diff --git a/src/autoconfig.h b/src/autoconfig.h
index 026d5278..a46467d9 100644
--- a/src/autoconfig.h
+++ b/src/autoconfig.h
@@ -24,7 +24,7 @@ struct wsc_data {
 
 void autoconfig_clean_wsc_hash(struct wsc_data *wsc);
 void autoconfig_update_wsc_hash(struct wsc_data *data, uint8_t *new_sha256);
-bool autoconfig_has_wsc_changed(struct wsc_data *wsc,
+bool autoconfig_has_wsc_changed(struct wsc_data *data,
 			  struct tlv *tlvs[][TLV_MAXNUM],
 			  size_t tlvs_size,
 			  uint8_t *sha256_out);
-- 
GitLab