iwinfo: fix kmgmt names

Signed-off-by: Jianhui Zhao <jianhui.zhao@gl-inet.com>
This commit is contained in:
Jianhui Zhao 2022-02-09 15:37:18 +08:00
parent 1261b5876e
commit 55521d9558
2 changed files with 20 additions and 513 deletions

View File

@ -0,0 +1,13 @@
Index: libiwinfo-2021-06-09-c0414642/iwinfo_lib.c
===================================================================
--- libiwinfo-2021-06-09-c0414642.orig/iwinfo_lib.c
+++ libiwinfo-2021-06-09-c0414642/iwinfo_lib.c
@@ -37,6 +37,8 @@ const char *IWINFO_KMGMT_NAMES[] = {
"NONE",
"802.1X",
"PSK",
+ "SAE",
+ "OWE",
};
const char *IWINFO_AUTH_NAMES[] = {

View File

@ -1,4 +1,4 @@
From 8c956cc81d2a9e56675f4dacb790611c07524aa2 Mon Sep 17 00:00:00 2001
From a89b379658c32d1e6374d8f69c060969926a11bd Mon Sep 17 00:00:00 2001
From: Jianhui Zhao <jianhui.zhao@gl-inet.com>
Date: Mon, 2 Aug 2021 18:07:26 +0800
Subject: [PATCH] iwinfo: add some patchs
@ -9,18 +9,14 @@ Signed-off-by: Jianhui Zhao <jianhui.zhao@gl-inet.com>
.../001-add-htmodelist-for-scan-results.patch | 170 ++++++
.../patches/002-fix-station-mode-scan.patch | 28 +
.../patches/003-support-mtk-driver.patch | 166 ++++++
.../patches/004-support-scan-hidden.patch | 316 +++++++++++
.../iwinfo/patches/005-fix-kmgmp-names.patch | 11 +
.../utils/iwinfo/patches/006-async-scan.patch | 155 ++++++
package/network/utils/iwinfo/src/api/mtk.h | 71 +++
package/network/utils/iwinfo/src/iwinfo_mtk.c | 508 ++++++++++++++++++
9 files changed, 1436 insertions(+), 3 deletions(-)
package/network/utils/iwinfo/src/iwinfo_mtk.c | 489 ++++++++++++++++++
7 files changed, 946 insertions(+), 3 deletions(-)
create mode 100644 package/network/utils/iwinfo/patches/001-add-htmodelist-for-scan-results.patch
create mode 100644 package/network/utils/iwinfo/patches/002-fix-station-mode-scan.patch
create mode 100644 package/network/utils/iwinfo/patches/003-support-mtk-driver.patch
create mode 100644 package/network/utils/iwinfo/patches/004-support-scan-hidden.patch
create mode 100644 package/network/utils/iwinfo/patches/005-fix-kmgmp-names.patch
create mode 100644 package/network/utils/iwinfo/patches/006-async-scan.patch
create mode 100644 package/network/utils/iwinfo/src/api/mtk.h
create mode 100644 package/network/utils/iwinfo/src/iwinfo_mtk.c
@ -445,328 +441,6 @@ index 0000000000..3aaa24f6b0
+ (bc[off] == 0x7688) || (bc[off] == 0x8876)) {
+ /* vendor: MediaTek */
+ id->vendor_id = 0x14c3;
diff --git a/package/network/utils/iwinfo/patches/004-support-scan-hidden.patch b/package/network/utils/iwinfo/patches/004-support-scan-hidden.patch
new file mode 100644
index 0000000000..61093c7850
--- /dev/null
+++ b/package/network/utils/iwinfo/patches/004-support-scan-hidden.patch
@@ -0,0 +1,316 @@
+--- a/include/iwinfo.h
++++ b/include/iwinfo.h
+@@ -242,6 +242,7 @@ struct iwinfo_ops {
+ int (*assoclist)(const char *, char *, int *);
+ int (*txpwrlist)(const char *, char *, int *);
+ int (*scanlist)(const char *, char *, int *);
++ int (*scanlist_ssid)(const char *, char *, int *, const char *);
+ int (*freqlist)(const char *, char *, int *);
+ int (*countrylist)(const char *, char *, int *);
+ int (*survey)(const char *, char *, int *);
+--- a/iwinfo_lua.c
++++ b/iwinfo_lua.c
+@@ -382,77 +382,98 @@ static int iwinfo_L_txpwrlist(lua_State
+ }
+
+ /* Wrapper for scan list */
+-static int iwinfo_L_scanlist(lua_State *L, int (*func)(const char *, char *, int *))
++static void parse_scanlist(lua_State *L, char *rv, int len, const char *ssid)
+ {
+- int i, x, h, len = 0;
+- char rv[IWINFO_BUFSIZE];
+- char macstr[18];
+- const char *ifname = luaL_checkstring(L, 1);
+ struct iwinfo_scanlist_entry *e;
++ char macstr[18];
++ int i, x, h;
+
+- lua_newtable(L);
+- memset(rv, 0, sizeof(rv));
+-
+- if (!(*func)(ifname, rv, &len))
++ for (i = 0, x = 1; i < len; i += sizeof(struct iwinfo_scanlist_entry))
+ {
+- for (i = 0, x = 1; i < len; i += sizeof(struct iwinfo_scanlist_entry), x++)
+- {
+- e = (struct iwinfo_scanlist_entry *) &rv[i];
+-
+- lua_newtable(L);
++ e = (struct iwinfo_scanlist_entry *) &rv[i];
+
+- /* BSSID */
+- sprintf(macstr, "%02X:%02X:%02X:%02X:%02X:%02X",
+- e->mac[0], e->mac[1], e->mac[2],
+- e->mac[3], e->mac[4], e->mac[5]);
++ lua_newtable(L);
+
+- lua_pushstring(L, macstr);
+- lua_setfield(L, -2, "bssid");
++ /* BSSID */
++ sprintf(macstr, "%02X:%02X:%02X:%02X:%02X:%02X",
++ e->mac[0], e->mac[1], e->mac[2],
++ e->mac[3], e->mac[4], e->mac[5]);
+
+- /* ESSID */
+- if (e->ssid[0])
+- {
+- lua_pushstring(L, (char *) e->ssid);
+- lua_setfield(L, -2, "ssid");
+- }
++ lua_pushstring(L, macstr);
++ lua_setfield(L, -2, "bssid");
+
+- /* Channel */
+- lua_pushinteger(L, e->channel);
+- lua_setfield(L, -2, "channel");
++ /* ESSID */
++ if (e->ssid[0])
++ {
++ lua_pushstring(L, (char *) e->ssid);
++ lua_setfield(L, -2, "ssid");
++ }
+
+- /* Mode */
+- lua_pushstring(L, IWINFO_OPMODE_NAMES[e->mode]);
+- lua_setfield(L, -2, "mode");
+-
+- /* Quality, Signal */
+- lua_pushinteger(L, e->quality);
+- lua_setfield(L, -2, "quality");
+-
+- lua_pushinteger(L, e->quality_max);
+- lua_setfield(L, -2, "quality_max");
+-
+- lua_pushnumber(L, (e->signal - 0x100));
+- lua_setfield(L, -2, "signal");
+-
+- /* Crypto */
+- iwinfo_L_cryptotable(L, &e->crypto);
+- lua_setfield(L, -2, "encryption");
++ /* Channel */
++ lua_pushinteger(L, e->channel);
++ lua_setfield(L, -2, "channel");
++
++ /* Mode */
++ lua_pushstring(L, IWINFO_OPMODE_NAMES[e->mode]);
++ lua_setfield(L, -2, "mode");
++
++ /* Quality, Signal */
++ lua_pushinteger(L, e->quality);
++ lua_setfield(L, -2, "quality");
++
++ lua_pushinteger(L, e->quality_max);
++ lua_setfield(L, -2, "quality_max");
++
++ lua_pushnumber(L, (e->signal - 0x100));
++ lua_setfield(L, -2, "signal");
++
++ /* Crypto */
++ iwinfo_L_cryptotable(L, &e->crypto);
++ lua_setfield(L, -2, "encryption");
+
+- /* HT Modes */
+- if (e->htmodelist)
++ /* HT Modes */
++ if (e->htmodelist)
++ {
++ lua_newtable(L);
++ for (h = 0; h < ARRAY_SIZE(IWINFO_HTMODE_NAMES); h++)
+ {
+- lua_newtable(L);
+- for (h = 0; h < ARRAY_SIZE(IWINFO_HTMODE_NAMES); h++)
+- {
+- lua_pushboolean(L, e->htmodelist & (1 << h));
+- lua_setfield(L, -2, IWINFO_HTMODE_NAMES[h]);
+- }
+- lua_setfield(L, -2, "htmodelist");
++ lua_pushboolean(L, e->htmodelist & (1 << h));
++ lua_setfield(L, -2, IWINFO_HTMODE_NAMES[h]);
+ }
+-
+- lua_rawseti(L, -2, x);
++ lua_setfield(L, -2, "htmodelist");
+ }
++
++ lua_rawseti(L, -2, x++);
+ }
++}
++
++static int iwinfo_L_scanlist(lua_State *L, int (*func)(const char *, char *, int *))
++{
++ int len = 0;
++ char rv[IWINFO_BUFSIZE];
++ const char *ifname = luaL_checkstring(L, 1);
++
++ lua_newtable(L);
++ memset(rv, 0, sizeof(rv));
++
++ if (!(*func)(ifname, rv, &len))
++ parse_scanlist(L, rv, len, NULL);
++
++ return 1;
++}
++
++static int iwinfo_L_scanlist_ssid(lua_State *L, int (*func)(const char *, char *, int *, const char *))
++{
++ int len = 0;
++ char rv[IWINFO_BUFSIZE];
++ const char *ifname = luaL_checkstring(L, 1);
++ const char *ssid = lua_tostring(L, 2);
++
++ lua_newtable(L);
++ memset(rv, 0, sizeof(rv));
++
++ if (!(*func)(ifname, rv, &len, ssid))
++ parse_scanlist(L, rv, len, ssid);
+
+ return 1;
+ }
+@@ -753,6 +774,7 @@ LUA_WRAP_STRUCT_OP(nl80211,mode)
+ LUA_WRAP_STRUCT_OP(nl80211,assoclist)
+ LUA_WRAP_STRUCT_OP(nl80211,txpwrlist)
+ LUA_WRAP_STRUCT_OP(nl80211,scanlist)
++LUA_WRAP_STRUCT_OP(nl80211,scanlist_ssid)
+ LUA_WRAP_STRUCT_OP(nl80211,freqlist)
+ LUA_WRAP_STRUCT_OP(nl80211,countrylist)
+ LUA_WRAP_STRUCT_OP(nl80211,hwmodelist)
+@@ -783,6 +805,7 @@ LUA_WRAP_STRUCT_OP(mtk,mode)
+ LUA_WRAP_STRUCT_OP(mtk,assoclist)
+ LUA_WRAP_STRUCT_OP(mtk,txpwrlist)
+ LUA_WRAP_STRUCT_OP(mtk,scanlist)
++LUA_WRAP_STRUCT_OP(mtk,scanlist_ssid)
+ LUA_WRAP_STRUCT_OP(mtk,freqlist)
+ LUA_WRAP_STRUCT_OP(mtk,countrylist)
+ LUA_WRAP_STRUCT_OP(mtk,hwmodelist)
+@@ -906,6 +929,7 @@ static const luaL_reg R_nl80211[] = {
+ LUA_REG(nl80211,assoclist),
+ LUA_REG(nl80211,txpwrlist),
+ LUA_REG(nl80211,scanlist),
++ LUA_REG(nl80211,scanlist_ssid),
+ LUA_REG(nl80211,freqlist),
+ LUA_REG(nl80211,countrylist),
+ LUA_REG(nl80211,hwmodelist),
+@@ -939,6 +963,7 @@ static const luaL_reg R_mtk[] = {
+ LUA_REG(mtk,assoclist),
+ LUA_REG(mtk,txpwrlist),
+ LUA_REG(mtk,scanlist),
++ LUA_REG(mtk,scanlist_ssid),
+ LUA_REG(mtk,freqlist),
+ LUA_REG(mtk,countrylist),
+ LUA_REG(mtk,hwmodelist),
+--- a/iwinfo_nl80211.c
++++ b/iwinfo_nl80211.c
+@@ -2476,11 +2476,30 @@ static int nl80211_get_scanlist_cb(struc
+ return NL_SKIP;
+ }
+
+-static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len)
++static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len, const char *ssid)
+ {
+ struct nl80211_scanlist sl = { .e = (struct iwinfo_scanlist_entry *)buf };
++ struct nl80211_msg_conveyor *cv;
++
++ cv = nl80211_msg(ifname, NL80211_CMD_TRIGGER_SCAN, 0);
++ if (!cv)
++ return -ENOMEM;
++
++ if (ssid && ssid[0])
++ {
++ struct nl_msg *ssids = nlmsg_alloc();
++ if (!ssids)
++ {
++ nl80211_free(cv);
++ return -ENOMEM;
++ }
+
+- if (nl80211_request(ifname, NL80211_CMD_TRIGGER_SCAN, 0, NULL, NULL))
++ nla_put(ssids, 1, strlen(ssid), ssid);
++ nla_put_nested(cv->msg, NL80211_ATTR_SCAN_SSIDS, ssids);
++ nlmsg_free(ssids);
++ }
++
++ if (nl80211_send(cv, NULL, NULL))
+ goto out;
+
+ if (nl80211_wait("nl80211", "scan",
+@@ -2709,7 +2728,7 @@ static int nl80211_get_scanlist_wpactl(c
+ return (count >= 0) ? 0 : -1;
+ }
+
+-static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
++static int nl80211_get_scanlist_ssid(const char *ifname, char *buf, int *len, const char *ssid)
+ {
+ char *res;
+ int rv, mode;
+@@ -2722,13 +2741,13 @@ static int nl80211_get_scanlist(const ch
+ /* Reuse existing interface */
+ if ((res = nl80211_phy2ifname(ifname)) != NULL)
+ {
+- return nl80211_get_scanlist(res, buf, len);
++ return nl80211_get_scanlist_ssid(res, buf, len, ssid);
+ }
+
+ /* Need to spawn a temporary iface for scanning */
+ else if ((res = nl80211_ifadd(ifname)) != NULL)
+ {
+- rv = nl80211_get_scanlist(res, buf, len);
++ rv = nl80211_get_scanlist_ssid(res, buf, len, ssid);
+ nl80211_ifdel(res);
+ return rv;
+ }
+@@ -2749,7 +2768,7 @@ static int nl80211_get_scanlist(const ch
+ mode == IWINFO_OPMODE_MONITOR) &&
+ iwinfo_ifup(ifname))
+ {
+- return nl80211_get_scanlist_nl(ifname, buf, len);
++ return nl80211_get_scanlist_nl(ifname, buf, len, ssid);
+ }
+
+ /* AP scan */
+@@ -2761,7 +2780,7 @@ static int nl80211_get_scanlist(const ch
+ if (!iwinfo_ifup(ifname))
+ return -1;
+
+- rv = nl80211_get_scanlist_nl(ifname, buf, len);
++ rv = nl80211_get_scanlist_nl(ifname, buf, len, ssid);
+ iwinfo_ifdown(ifname);
+ return rv;
+ }
+@@ -2778,7 +2797,7 @@ static int nl80211_get_scanlist(const ch
+ * additional interface and there's no need to tear down the ap */
+ if (iwinfo_ifup(res))
+ {
+- rv = nl80211_get_scanlist_nl(res, buf, len);
++ rv = nl80211_get_scanlist_nl(res, buf, len, ssid);
+ iwinfo_ifdown(res);
+ }
+
+@@ -2786,7 +2805,7 @@ static int nl80211_get_scanlist(const ch
+ * during scan */
+ else if (iwinfo_ifdown(ifname) && iwinfo_ifup(res))
+ {
+- rv = nl80211_get_scanlist_nl(res, buf, len);
++ rv = nl80211_get_scanlist_nl(res, buf, len, ssid);
+ iwinfo_ifdown(res);
+ iwinfo_ifup(ifname);
+ nl80211_hostapd_hup(ifname);
+@@ -2800,6 +2819,11 @@ static int nl80211_get_scanlist(const ch
+ return -1;
+ }
+
++static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
++{
++ return nl80211_get_scanlist_ssid(ifname, buf, len, NULL);
++}
++
+ static int nl80211_get_freqlist_cb(struct nl_msg *msg, void *arg)
+ {
+ int bands_remain, freqs_remain;
+@@ -3238,6 +3262,7 @@ const struct iwinfo_ops nl80211_ops = {
+ .assoclist = nl80211_get_assoclist,
+ .txpwrlist = nl80211_get_txpwrlist,
+ .scanlist = nl80211_get_scanlist,
++ .scanlist_ssid = nl80211_get_scanlist_ssid,
+ .freqlist = nl80211_get_freqlist,
+ .countrylist = nl80211_get_countrylist,
+ .survey = nl80211_get_survey,
diff --git a/package/network/utils/iwinfo/patches/005-fix-kmgmp-names.patch b/package/network/utils/iwinfo/patches/005-fix-kmgmp-names.patch
new file mode 100644
index 0000000000..c47f605136
@ -784,167 +458,6 @@ index 0000000000..c47f605136
+ };
+
+ const char *IWINFO_AUTH_NAMES[] = {
diff --git a/package/network/utils/iwinfo/patches/006-async-scan.patch b/package/network/utils/iwinfo/patches/006-async-scan.patch
new file mode 100644
index 0000000000..ef2be89105
--- /dev/null
+++ b/package/network/utils/iwinfo/patches/006-async-scan.patch
@@ -0,0 +1,155 @@
+--- a/include/iwinfo.h
++++ b/include/iwinfo.h
+@@ -94,6 +94,11 @@ enum iwinfo_htmode {
+
+ extern const char *IWINFO_HTMODE_NAMES[IWINFO_HTMODE_COUNT];
+
++enum iwinfo_scan_type {
++ IWINFO_SCAN_DEFAULT,
++ IWINFO_SCAN_TRIGGER,
++ IWINFO_SCAN_DUMP
++};
+
+ struct iwinfo_rate_entry {
+ uint32_t rate;
+@@ -242,7 +247,7 @@ struct iwinfo_ops {
+ int (*assoclist)(const char *, char *, int *);
+ int (*txpwrlist)(const char *, char *, int *);
+ int (*scanlist)(const char *, char *, int *);
+- int (*scanlist_ssid)(const char *, char *, int *, const char *);
++ int (*scanlist_ssid)(const char *, char *, int *, const char *, enum iwinfo_scan_type);
+ int (*freqlist)(const char *, char *, int *);
+ int (*countrylist)(const char *, char *, int *);
+ int (*survey)(const char *, char *, int *);
+--- a/iwinfo_lua.c
++++ b/iwinfo_lua.c
+@@ -462,17 +462,20 @@ static int iwinfo_L_scanlist(lua_State *
+ return 1;
+ }
+
+-static int iwinfo_L_scanlist_ssid(lua_State *L, int (*func)(const char *, char *, int *, const char *))
++static int iwinfo_L_scanlist_ssid(lua_State *L, int (*func)(const char *, char *, int *,
++ const char *, enum iwinfo_scan_type))
+ {
+ int len = 0;
+ char rv[IWINFO_BUFSIZE];
+ const char *ifname = luaL_checkstring(L, 1);
+ const char *ssid = lua_tostring(L, 2);
++ enum iwinfo_scan_type type = lua_tointeger(L, 3);
+
+ lua_newtable(L);
++
+ memset(rv, 0, sizeof(rv));
+
+- if (!(*func)(ifname, rv, &len, ssid))
++ if (!(*func)(ifname, rv, &len, ssid, type))
+ parse_scanlist(L, rv, len, ssid);
+
+ return 1;
+--- a/iwinfo_nl80211.c
++++ b/iwinfo_nl80211.c
+@@ -2476,11 +2476,15 @@ static int nl80211_get_scanlist_cb(struc
+ return NL_SKIP;
+ }
+
+-static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len, const char *ssid)
++static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len,
++ const char *ssid, enum iwinfo_scan_type type)
+ {
+ struct nl80211_scanlist sl = { .e = (struct iwinfo_scanlist_entry *)buf };
+ struct nl80211_msg_conveyor *cv;
+
++ if (type == IWINFO_SCAN_DUMP)
++ goto dump;
++
+ cv = nl80211_msg(ifname, NL80211_CMD_TRIGGER_SCAN, 0);
+ if (!cv)
+ return -ENOMEM;
+@@ -2502,10 +2506,16 @@ static int nl80211_get_scanlist_nl(const
+ if (nl80211_send(cv, NULL, NULL))
+ goto out;
+
++ if (type == IWINFO_SCAN_TRIGGER) {
++ *len = 0;
++ return 0;
++ }
++
+ if (nl80211_wait("nl80211", "scan",
+ NL80211_CMD_NEW_SCAN_RESULTS, NL80211_CMD_SCAN_ABORTED))
+ goto out;
+
++dump:
+ if (nl80211_request(ifname, NL80211_CMD_GET_SCAN, NLM_F_DUMP,
+ nl80211_get_scanlist_cb, &sl))
+ goto out;
+@@ -2728,7 +2738,8 @@ static int nl80211_get_scanlist_wpactl(c
+ return (count >= 0) ? 0 : -1;
+ }
+
+-static int nl80211_get_scanlist_ssid(const char *ifname, char *buf, int *len, const char *ssid)
++static int nl80211_get_scanlist_ssid(const char *ifname, char *buf, int *len,
++ const char *ssid, enum iwinfo_scan_type type)
+ {
+ char *res;
+ int rv, mode;
+@@ -2741,13 +2752,13 @@ static int nl80211_get_scanlist_ssid(con
+ /* Reuse existing interface */
+ if ((res = nl80211_phy2ifname(ifname)) != NULL)
+ {
+- return nl80211_get_scanlist_ssid(res, buf, len, ssid);
++ return nl80211_get_scanlist_ssid(res, buf, len, ssid, type);
+ }
+
+ /* Need to spawn a temporary iface for scanning */
+ else if ((res = nl80211_ifadd(ifname)) != NULL)
+ {
+- rv = nl80211_get_scanlist_ssid(res, buf, len, ssid);
++ rv = nl80211_get_scanlist_ssid(res, buf, len, ssid, type);
+ nl80211_ifdel(res);
+ return rv;
+ }
+@@ -2768,7 +2779,7 @@ static int nl80211_get_scanlist_ssid(con
+ mode == IWINFO_OPMODE_MONITOR) &&
+ iwinfo_ifup(ifname))
+ {
+- return nl80211_get_scanlist_nl(ifname, buf, len, ssid);
++ return nl80211_get_scanlist_nl(ifname, buf, len, ssid, type);
+ }
+
+ /* AP scan */
+@@ -2780,7 +2791,7 @@ static int nl80211_get_scanlist_ssid(con
+ if (!iwinfo_ifup(ifname))
+ return -1;
+
+- rv = nl80211_get_scanlist_nl(ifname, buf, len, ssid);
++ rv = nl80211_get_scanlist_nl(ifname, buf, len, ssid, type);
+ iwinfo_ifdown(ifname);
+ return rv;
+ }
+@@ -2797,7 +2808,7 @@ static int nl80211_get_scanlist_ssid(con
+ * additional interface and there's no need to tear down the ap */
+ if (iwinfo_ifup(res))
+ {
+- rv = nl80211_get_scanlist_nl(res, buf, len, ssid);
++ rv = nl80211_get_scanlist_nl(res, buf, len, ssid, type);
+ iwinfo_ifdown(res);
+ }
+
+@@ -2805,7 +2816,7 @@ static int nl80211_get_scanlist_ssid(con
+ * during scan */
+ else if (iwinfo_ifdown(ifname) && iwinfo_ifup(res))
+ {
+- rv = nl80211_get_scanlist_nl(res, buf, len, ssid);
++ rv = nl80211_get_scanlist_nl(res, buf, len, ssid, type);
+ iwinfo_ifdown(res);
+ iwinfo_ifup(ifname);
+ nl80211_hostapd_hup(ifname);
+@@ -2821,7 +2832,7 @@ static int nl80211_get_scanlist_ssid(con
+
+ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len)
+ {
+- return nl80211_get_scanlist_ssid(ifname, buf, len, NULL);
++ return nl80211_get_scanlist_ssid(ifname, buf, len, NULL, 0);
+ }
+
+ static int nl80211_get_freqlist_cb(struct nl_msg *msg, void *arg)
diff --git a/package/network/utils/iwinfo/src/api/mtk.h b/package/network/utils/iwinfo/src/api/mtk.h
new file mode 100644
index 0000000000..82a5ed7fce
@ -1024,10 +537,10 @@ index 0000000000..82a5ed7fce
+#endif // __MTK_H__
diff --git a/package/network/utils/iwinfo/src/iwinfo_mtk.c b/package/network/utils/iwinfo/src/iwinfo_mtk.c
new file mode 100644
index 0000000000..ab9ccab05a
index 0000000000..0ef10f4ab3
--- /dev/null
+++ b/package/network/utils/iwinfo/src/iwinfo_mtk.c
@@ -0,0 +1,508 @@
@@ -0,0 +1,489 @@
+/*
+ * iwinfo - Wireless Information Library - Linux Wireless Extension Backend
+ *
@ -1297,31 +810,18 @@ index 0000000000..ab9ccab05a
+ int htmodelist;
+};
+
+static int mtk_get_scanlist_ssid(const char *ifname, char *buf, int *len,
+ const char *ssid, enum iwinfo_scan_type type)
+static int mtk_get_scanlist(const char *ifname, char *buf, int *len)
+{
+ struct iwinfo_scanlist_entry sce;
+ char action[64] = "SiteSurvey=";
+ char buf2[IWINFO_BUFSIZE];
+ int i, length;
+
+ if (type == IWINFO_SCAN_DUMP)
+ goto dump;
+
+ if (ssid && ssid[0])
+ snprintf(action, sizeof(action), "SiteSurvey=%s", ssid);
+
+ if(mtk_get80211priv(ifname, RTPRIV_IOCTL_SET, action, sizeof(action)) < 0)
+ return -1;
+
+ if (type == IWINFO_SCAN_TRIGGER) {
+ *len = 0;
+ return 0;
+ }
+
+ sleep(5);
+
+dump:
+ strcpy(buf2, "fine");
+
+ length = mtk_get80211priv(ifname, RTPRIV_IOCTL_GSITESURVEY, buf2, sizeof(buf2));
@ -1359,11 +859,6 @@ index 0000000000..ab9ccab05a
+ return 0;
+}
+
+static int mtk_get_scanlist(const char *ifname, char *buf, int *len)
+{
+ return mtk_get_scanlist_ssid(ifname, buf, len, NULL, 0);
+}
+
+static int mtk_get_freqlist(const char *ifname, char *buf, int *len)
+{
+ return wext_ops.freqlist(ifname, buf, len);
@ -1531,11 +1026,10 @@ index 0000000000..ab9ccab05a
+ .assoclist = mtk_get_assoclist,
+ .txpwrlist = mtk_get_txpwrlist,
+ .scanlist = mtk_get_scanlist,
+ .scanlist_ssid = mtk_get_scanlist_ssid,
+ .freqlist = mtk_get_freqlist,
+ .countrylist = mtk_get_countrylist,
+ .close = mtk_close
+};
--
2.17.1
2.25.1