From 3315d56c2d5363df1f44406302cf3e009e5adb6d Mon Sep 17 00:00:00 2001
From: Marina Maslova <Marina.Maslova@iopsys.eu>
Date: Tue, 7 May 2024 17:44:08 +0400
Subject: [PATCH] hostapd: harmonize ubus channel and bandwith events

---
 .../99952-hostad-ubus-format-events.patch     | 229 ++++++++++++++++++
 1 file changed, 229 insertions(+)
 create mode 100644 package/network/services/hostapd/patches/99952-hostad-ubus-format-events.patch

diff --git a/package/network/services/hostapd/patches/99952-hostad-ubus-format-events.patch b/package/network/services/hostapd/patches/99952-hostad-ubus-format-events.patch
new file mode 100644
index 00000000000..964994b072b
--- /dev/null
+++ b/package/network/services/hostapd/patches/99952-hostad-ubus-format-events.patch
@@ -0,0 +1,229 @@
+--- a/src/ap/ubus.c
++++ b/src/ap/ubus.c
+@@ -135,11 +135,11 @@ static void hostapd_ubus_ap_enable(struc
+ 		data = blobmsg_open_table(&b, "data");
+ 		if (!data)
+ 			goto exit;
+-		if (blobmsg_add_string(&b, "freq", argv[1] + strlen("freq=")))
++		if (blobmsg_add_u32(&b, "freq", atoi(argv[1] + strlen("freq="))))
+ 			goto exit;
+-		if (blobmsg_add_u32(&b, "dfs", atoi(argv[2] + strlen("dfs="))))
++		if (blobmsg_add_u32(&b, "bandwidth", atoi(argv[3] + strlen("width="))))
+ 			goto exit;
+-		if (blobmsg_add_u32(&b, "width", atoi(argv[3] + strlen("width="))))
++		if (blobmsg_add_u32(&b, "dfs", atoi(argv[2] + strlen("dfs="))))
+ 			goto exit;
+ 		blobmsg_close_table(&b, data);
+ 	}
+@@ -876,13 +876,10 @@ static void hostapd_ubus_dfs_radar(struc
+ 	char service[] = "wifi.radio";
+ 	struct blob_buf b;
+ 	unsigned char channel;
+-	char chan[8];
+ 	char *argv[8];
+ 	int argc;
+ 	void *data;
+ 	char *str;
+-	char  width_buf[50];
+-	char *width;
+ 	int   chwidth;
+ 
+ 	/* freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d */
+@@ -908,22 +905,18 @@ static void hostapd_ubus_dfs_radar(struc
+ 	chwidth = atoi(argv[4] + strlen("chan_width="));
+ 
+ 	chwidth = get_real_chan_width(chwidth);
+-	snprintf(width_buf, sizeof(width_buf), "%d", chwidth);
+-	width = width_buf;
+-
+ 
+ 	data = blobmsg_open_table(&b, "data");
+ 	if (!data)
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "freq", argv[1] + strlen("freq=")))
++	if (blobmsg_add_u32(&b, "freq", atoi(argv[1] + strlen("freq="))))
+ 		goto exit;
+ 
+ 	ieee80211_freq_to_chan(atoi(argv[1] + strlen("freq=")), &channel);
+-	snprintf(chan, sizeof(chan), "%u", channel);
+ 
+-	if (blobmsg_add_string(&b, "channel", chan))
++	if (blobmsg_add_u32(&b, "channel", channel))
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "bandwidth", width))
++	if (blobmsg_add_u32(&b, "bandwidth", chwidth))
+ 		goto exit;
+ 	blobmsg_close_table(&b, data);
+ 
+@@ -965,9 +958,9 @@ static void hostapd_ubus_dfs_new_channel
+ 	data = blobmsg_open_table(&b, "data");
+ 	if (!data)
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "freq", argv[1] + strlen("freq=")))
++	if (blobmsg_add_u32(&b, "freq", atoi(argv[1] + strlen("freq="))))
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "channel", argv[2] + strlen("chan=")))
++	if (blobmsg_add_u32(&b, "channel", atoi(argv[2] + strlen("chan="))))
+ 		goto exit;
+ 	blobmsg_close_table(&b, data);
+ 
+@@ -988,8 +981,6 @@ static void hostapd_ubus_dfs_cac_start(s
+ 	char *str;
+ 	int   chwidth;
+ 	int   sec_chan;
+-	char  width_buf[50];
+-	char *width;
+ 
+ 	/* freq=%d chan=%d sec_chan=%d, width=%d, seg0=%d, seg1=%d, cac_time=%d */
+ 	memset(&b, 0, sizeof(b));
+@@ -1019,8 +1010,6 @@ static void hostapd_ubus_dfs_cac_start(s
+ 	}
+ 
+ 	chwidth = get_real_chan_width(chwidth);
+-	snprintf(width_buf, sizeof(width_buf), "%d", chwidth);
+-	width = width_buf;
+ 
+ 	if (blobmsg_add_string(&b, "ifname", hapd->conf->iface))
+ 		goto exit;
+@@ -1030,13 +1019,13 @@ static void hostapd_ubus_dfs_cac_start(s
+ 	data = blobmsg_open_table(&b, "data");
+ 	if (!data)
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "freq", argv[1] + strlen("freq=")))
++	if (blobmsg_add_u32(&b, "freq", atoi(argv[1] + strlen("freq="))))
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "channel", argv[2] + strlen("chan=")))
++	if (blobmsg_add_u32(&b, "channel", atoi(argv[2] + strlen("chan="))))
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "bandwidth", width))
++	if (blobmsg_add_u32(&b, "bandwidth", chwidth))
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "cac_time", argv[7] + strlen("cac_time=")))
++	if (blobmsg_add_u32(&b, "cac_time", atoi(argv[7] + strlen("cac_time="))))
+ 		goto exit;
+ 	blobmsg_close_table(&b, data);
+ 
+@@ -1052,14 +1041,11 @@ static void hostapd_ubus_dfs_cac_complet
+ 	char service[] = "wifi.radio";
+ 	struct blob_buf b;
+ 	unsigned char channel;
+-	char chan[8];
+ 	char *argv[12];
+ 	int argc;
+ 	void *data;
+ 	char *str;
+-	char  width_buf[50];
+-	int   chwidth;
+-	char *width;
++	int chwidth;
+ 
+ 	/* success=%d freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d */
+ 	memset(&b, 0, sizeof(b));
+@@ -1085,23 +1071,20 @@ static void hostapd_ubus_dfs_cac_complet
+ 	chwidth = atoi(argv[5] + strlen("chan_width="));
+ 
+ 	chwidth = get_real_chan_width(chwidth);
+-	snprintf(width_buf, sizeof(width_buf), "%d", chwidth);
+-	width = width_buf;
+ 
+ 	data = blobmsg_open_table(&b, "data");
+ 	if (!data)
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "freq", argv[2] + strlen("freq=")))
++	if (blobmsg_add_u32(&b, "freq", atoi(argv[2] + strlen("freq="))))
+ 		goto exit;
+ 
+ 	ieee80211_freq_to_chan(atoi(argv[2] + strlen("freq=")), &channel);
+-	snprintf(chan, sizeof(chan), "%u", channel);
+-	if (blobmsg_add_string(&b, "channel", chan))
++	if (blobmsg_add_u32(&b, "channel", channel))
+ 		goto exit;
+ 
+-	if (blobmsg_add_string(&b, "bandwidth", width))
++	if (blobmsg_add_u32(&b, "bandwidth", chwidth))
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "success", argv[1] + strlen("success=")))
++	if (blobmsg_add_u32(&b, "success", atoi(argv[1] + strlen("success="))))
+ 		goto exit;
+ 	blobmsg_close_table(&b, data);
+ 
+@@ -1117,14 +1100,11 @@ static void hostapd_ubus_dfs_nop_finishe
+ 	char service[] = "wifi.radio";
+ 	struct blob_buf b;
+ 	unsigned char channel;
+-	char chan[8];
+ 	char *argv[8];
+ 	int argc;
+ 	void *data;
+ 	char *str;
+-	char  width_buf[50];
+ 	int   chwidth;
+-	char *width;
+ 
+ 	/* freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d */
+ 	memset(&b, 0, sizeof(b));
+@@ -1148,21 +1128,18 @@ static void hostapd_ubus_dfs_nop_finishe
+ 	chwidth = atoi(argv[4] + strlen("chan_width="));
+ 
+ 	chwidth = get_real_chan_width(chwidth);
+-	snprintf(width_buf, sizeof(width_buf), "%d", chwidth);
+-	width = width_buf;
+ 
+ 	data = blobmsg_open_table(&b, "data");
+ 	if (!data)
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "freq", argv[1] + strlen("freq=")))
++	if (blobmsg_add_u32(&b, "freq", atoi(argv[1] + strlen("freq="))))
+ 		goto exit;
+ 
+ 	ieee80211_freq_to_chan(atoi(argv[1] + strlen("freq=")), &channel);
+-	snprintf(chan, sizeof(chan), "%u", channel);
+-	if (blobmsg_add_string(&b, "channel", chan))
++	if (blobmsg_add_u32(&b, "channel", channel))
+ 		goto exit;
+ 
+-	if (blobmsg_add_string(&b, "bandwidth", width))
++	if (blobmsg_add_u32(&b, "bandwidth", chwidth))
+ 		goto exit;
+ 	blobmsg_close_table(&b, data);
+ 
+@@ -1178,14 +1155,11 @@ static void hostapd_ubus_dfs_pre_cac_exp
+ 	char service[] = "wifi.radio";
+ 	struct blob_buf b;
+ 	unsigned char channel;
+-	char chan[8];
+ 	char *argv[8];
+ 	int argc;
+ 	void *data;
+ 	char *str;
+-	char  width_buf[50];
+ 	int   chwidth;
+-	char *width;
+ 
+ 	/* freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d */
+ 	memset(&b, 0, sizeof(b));
+@@ -1209,21 +1183,18 @@ static void hostapd_ubus_dfs_pre_cac_exp
+ 	chwidth = atoi(argv[4] + strlen("chan_width="));
+ 
+ 	chwidth = get_real_chan_width(chwidth);
+-	snprintf(width_buf, sizeof(width_buf), "%d", chwidth);
+-	width = width_buf;
+ 
+ 	data = blobmsg_open_table(&b, "data");
+ 	if (!data)
+ 		goto exit;
+-	if (blobmsg_add_string(&b, "freq", argv[1] + strlen("freq=")))
++	if (blobmsg_add_u32(&b, "freq", atoi(argv[1] + strlen("freq="))))
+ 		goto exit;
+ 
+ 	ieee80211_freq_to_chan(atoi(argv[1] + strlen("freq=")), &channel);
+-	snprintf(chan, sizeof(chan), "%u", channel);
+-	if (blobmsg_add_string(&b, "channel", chan))
++	if (blobmsg_add_u32(&b, "channel", channel))
+ 		goto exit;
+ 
+-	if (blobmsg_add_string(&b, "bandwidth", width))
++	if (blobmsg_add_u32(&b, "bandwidth", chwidth))
+ 		goto exit;
+ 	blobmsg_close_table(&b, data);
+ 
-- 
GitLab