lede/package/network/utils/iwinfo/patches/001-ralink.patch
2021-06-16 11:14:54 +08:00

1538 lines
45 KiB
Diff

--- /dev/null
+++ b/api/ralink.h
@@ -0,0 +1,207 @@
+#ifndef _RALINK_H
+#define _RALINK_H
+
+#define MAX_NUMBER_OF_MAC 64
+
+#define MODE_CCK 0
+#define MODE_OFDM 1
+#define MODE_HTMIX 2
+#define MODE_HTGREENFIELD 3
+
+#define BW_20 0
+#define BW_40 1
+#define BW_BOTH 2
+#define BW_10 3
+
+#define MAC_ADDR_LEN 6
+#define ETH_LENGTH_OF_ADDRESS 6
+#define MAX_LEN_OF_MAC_TABLE 64
+
+#define RT_PRIV_IOCTL (SIOCIWFIRSTPRIV + 0x01)
+#define RTPRIV_IOCTL_SET (SIOCIWFIRSTPRIV + 0x02)
+
+#define RTPRIV_IOCTL_BBP (SIOCIWFIRSTPRIV + 0x03)
+#define RTPRIV_IOCTL_MAC (SIOCIWFIRSTPRIV + 0x05)
+#define RTPRIV_IOCTL_E2P (SIOCIWFIRSTPRIV + 0x07)
+
+#define RTPRIV_IOCTL_STATISTICS (SIOCIWFIRSTPRIV + 0x09)
+#define RTPRIV_IOCTL_ADD_PMKID_CACHE (SIOCIWFIRSTPRIV + 0x0A)
+#define RTPRIV_IOCTL_RADIUS_DATA (SIOCIWFIRSTPRIV + 0x0C)
+#define RTPRIV_IOCTL_GSITESURVEY (SIOCIWFIRSTPRIV + 0x0D)
+#define RTPRIV_IOCTL_ADD_WPA_KEY (SIOCIWFIRSTPRIV + 0x0E)
+#define RTPRIV_IOCTL_GET_MAC_TABLE (SIOCIWFIRSTPRIV + 0x0F)
+#define RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT (SIOCIWFIRSTPRIV + 0x1F)
+#define RTPRIV_IOCTL_STATIC_WEP_COPY (SIOCIWFIRSTPRIV + 0x10)
+#define RTPRIV_IOCTL_WSC_PROFILE (SIOCIWFIRSTPRIV + 0x12)
+#define RTPRIV_IOCTL_GSTAINFO (SIOCIWFIRSTPRIV + 0x1A)
+#define RTPRIV_IOCTL_GSTAT (SIOCIWFIRSTPRIV + 0x1B)
+#define RTPRIV_IOCTL_GRSSI (SIOCIWFIRSTPRIV + 0x1C)
+#define RTPRIV_IOCTL_GTXBFCALP (SIOCIWFIRSTPRIV + 0x1D)
+
+#define RT_QUERY_ATE_TXDONE_COUNT 0x0401
+#define OID_GET_SET_TOGGLE 0x8000
+
+#define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0103
+#define OID_802_11_NETWORK_TYPE_IN_USE 0x0104
+#define OID_802_11_RSSI_TRIGGER 0x0107
+#define RT_OID_802_11_RSSI 0x0108 //rt2860 only , kathy
+#define RT_OID_802_11_RSSI_1 0x0109 //rt2860 only , kathy
+#define RT_OID_802_11_RSSI_2 0x010A //rt2860 only , kathy
+#define OID_802_11_NUMBER_OF_ANTENNAS 0x010B
+#define OID_802_11_RX_ANTENNA_SELECTED 0x010C
+#define OID_802_11_TX_ANTENNA_SELECTED 0x010D
+#define OID_802_11_SUPPORTED_RATES 0x010E
+#define OID_802_11_ADD_WEP 0x0112
+#define OID_802_11_REMOVE_WEP 0x0113
+#define OID_802_11_DISASSOCIATE 0x0114
+#define OID_802_11_PRIVACY_FILTER 0x0118
+#define OID_802_11_ASSOCIATION_INFORMATION 0x011E
+#define OID_802_11_TEST 0x011F
+#define RT_OID_802_11_COUNTRY_REGION 0x0507
+#define OID_802_11_BSSID_LIST_SCAN 0x0508
+#define OID_802_11_SSID 0x0509
+#define OID_802_11_BSSID 0x050A
+#define RT_OID_802_11_RADIO 0x050B
+#define RT_OID_802_11_PHY_MODE 0x050C
+#define RT_OID_802_11_STA_CONFIG 0x050D
+#define OID_802_11_DESIRED_RATES 0x050E
+#define RT_OID_802_11_PREAMBLE 0x050F
+#define OID_802_11_WEP_STATUS 0x0510
+#define OID_802_11_AUTHENTICATION_MODE 0x0511
+#define OID_802_11_INFRASTRUCTURE_MODE 0x0512
+#define RT_OID_802_11_RESET_COUNTERS 0x0513
+#define OID_802_11_RTS_THRESHOLD 0x0514
+#define OID_802_11_FRAGMENTATION_THRESHOLD 0x0515
+#define OID_802_11_POWER_MODE 0x0516
+#define OID_802_11_TX_POWER_LEVEL 0x0517
+#define RT_OID_802_11_ADD_WPA 0x0518
+#define OID_802_11_REMOVE_KEY 0x0519
+#define OID_802_11_ADD_KEY 0x0520
+#define OID_802_11_CONFIGURATION 0x0521
+#define OID_802_11_TX_PACKET_BURST 0x0522
+#define RT_OID_802_11_QUERY_NOISE_LEVEL 0x0523
+#define RT_OID_802_11_EXTRA_INFO 0x0524
+#define RT_OID_802_11_HARDWARE_REGISTER 0x0525
+#define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS
+
+#define RT_OID_DEVICE_NAME 0x0607
+#define RT_OID_VERSION_INFO 0x0608
+#define OID_802_11_BSSID_LIST 0x0609
+#define OID_802_3_CURRENT_ADDRESS 0x060A
+#define OID_GEN_MEDIA_CONNECT_STATUS 0x060B
+#define RT_OID_802_11_QUERY_LINK_STATUS 0x060C
+#define OID_802_11_RSSI 0x060D
+#define OID_802_11_STATISTICS 0x060E
+#define OID_GEN_RCV_OK 0x060F
+#define OID_GEN_RCV_NO_BUFFER 0x0610
+#define RT_OID_802_11_QUERY_EEPROM_VERSION 0x0611
+#define RT_OID_802_11_QUERY_FIRMWARE_VERSION 0x0612
+#define RT_OID_802_11_QUERY_LAST_RX_RATE 0x0613
+#define RT_OID_802_11_TX_POWER_LEVEL_1 0x0614
+#define RT_OID_802_11_QUERY_PIDVID 0x0615
+
+//#if WPA_SUPPLICANT_SUPPORT
+#define OID_SET_COUNTERMEASURES 0x0616
+#define OID_802_11_SET_IEEE8021X 0x0617
+#define OID_802_11_SET_IEEE8021X_REQUIRE_KEY 0x0618
+#define OID_802_11_PMKID 0x0620
+#define RT_OID_WPA_SUPPLICANT_SUPPORT 0x0621
+#define RT_OID_WE_VERSION_COMPILED 0x0622
+//#endif
+
+//rt2860 , kathy
+#define RT_OID_802_11_SNR_0 0x0630
+#define RT_OID_802_11_SNR_1 0x0631
+#define RT_OID_802_11_QUERY_LAST_TX_RATE 0x0632
+#define RT_OID_802_11_QUERY_HT_PHYMODE 0x0633
+#define RT_OID_802_11_SET_HT_PHYMODE 0x0634
+#define OID_802_11_RELOAD_DEFAULTS 0x0635
+#define RT_OID_802_11_QUERY_APSD_SETTING 0x0636
+#define RT_OID_802_11_SET_APSD_SETTING 0x0637
+#define RT_OID_802_11_QUERY_APSD_PSM 0x0638
+#define RT_OID_802_11_SET_APSD_PSM 0x0639
+#define RT_OID_802_11_QUERY_DLS 0x063A
+#define RT_OID_802_11_SET_DLS 0x063B
+#define RT_OID_802_11_QUERY_DLS_PARAM 0x063C
+#define RT_OID_802_11_SET_DLS_PARAM 0x063D
+#define RT_OID_802_11_QUERY_WMM 0x063E
+#define RT_OID_802_11_SET_WMM 0x063F
+#define RT_OID_802_11_QUERY_IMME_BA_CAP 0x0640
+#define RT_OID_802_11_SET_IMME_BA_CAP 0x0641
+#define RT_OID_802_11_QUERY_BATABLE 0x0642
+#define RT_OID_802_11_ADD_IMME_BA 0x0643
+#define RT_OID_802_11_TEAR_IMME_BA 0x0644
+#define RT_OID_DRIVER_DEVICE_NAME 0x0645
+#define RT_OID_802_11_QUERY_DAT_HT_PHYMODE 0x0646
+#define RT_OID_QUERY_MULTIPLE_CARD_SUPPORT 0x0647
+#define OID_802_11_SET_PSPXLINK_MODE 0x0648
+#define OID_802_11_SET_PASSPHRASE 0x0649
+#define RT_OID_802_11_SNR_2 0x064a
+#define RT_OID_802_11_STREAM_SNR 0x064b
+#define RT_OID_802_11_QUERY_TXBF_TABLE 0x0650
+#define RT_OID_802_11_WSC_QUERY_PROFILE 0x0750
+#define RT_OID_WSC_UUID 0x0753
+
+
+#define RT_OID_802_11_BSSID (OID_GET_SET_TOGGLE | OID_802_11_BSSID)
+#define RT_OID_802_11_SSID (OID_GET_SET_TOGGLE | OID_802_11_SSID)
+#define RT_OID_802_11_INFRASTRUCTURE_MODE (OID_GET_SET_TOGGLE | OID_802_11_INFRASTRUCTURE_MODE)
+#define RT_OID_802_11_ADD_WEP (OID_GET_SET_TOGGLE | OID_802_11_ADD_WEP)
+#define RT_OID_802_11_ADD_KEY (OID_GET_SET_TOGGLE | OID_802_11_ADD_KEY)
+#define RT_OID_802_11_REMOVE_WEP (OID_GET_SET_TOGGLE | OID_802_11_REMOVE_WEP)
+#define RT_OID_802_11_REMOVE_KEY (OID_GET_SET_TOGGLE | OID_802_11_REMOVE_KEY)
+#define RT_OID_802_11_DISASSOCIATE (OID_GET_SET_TOGGLE | OID_802_11_DISASSOCIATE)
+#define RT_OID_802_11_AUTHENTICATION_MODE (OID_GET_SET_TOGGLE | OID_802_11_AUTHENTICATION_MODE)
+#define RT_OID_802_11_PRIVACY_FILTER (OID_GET_SET_TOGGLE | OID_802_11_PRIVACY_FILTER)
+#define RT_OID_802_11_BSSID_LIST_SCAN (OID_GET_SET_TOGGLE | OID_802_11_BSSID_LIST_SCAN)
+#define RT_OID_802_11_WEP_STATUS (OID_GET_SET_TOGGLE | OID_802_11_WEP_STATUS)
+#define RT_OID_802_11_RELOAD_DEFAULTS (OID_GET_SET_TOGGLE | OID_802_11_RELOAD_DEFAULTS)
+#define RT_OID_802_11_NETWORK_TYPE_IN_USE (OID_GET_SET_TOGGLE | OID_802_11_NETWORK_TYPE_IN_USE)
+#define RT_OID_802_11_TX_POWER_LEVEL (OID_GET_SET_TOGGLE | OID_802_11_TX_POWER_LEVEL)
+#define RT_OID_802_11_RSSI_TRIGGER (OID_GET_SET_TOGGLE | OID_802_11_RSSI_TRIGGER)
+#define RT_OID_802_11_FRAGMENTATION_THRESHOLD (OID_GET_SET_TOGGLE | OID_802_11_FRAGMENTATION_THRESHOLD)
+#define RT_OID_802_11_RTS_THRESHOLD (OID_GET_SET_TOGGLE | OID_802_11_RTS_THRESHOLD)
+#define RT_OID_802_11_RX_ANTENNA_SELECTED (OID_GET_SET_TOGGLE | OID_802_11_RX_ANTENNA_SELECTED)
+#define RT_OID_802_11_TX_ANTENNA_SELECTED (OID_GET_SET_TOGGLE | OID_802_11_TX_ANTENNA_SELECTED)
+#define RT_OID_802_11_SUPPORTED_RATES (OID_GET_SET_TOGGLE | OID_802_11_SUPPORTED_RATES)
+#define RT_OID_802_11_DESIRED_RATES (OID_GET_SET_TOGGLE | OID_802_11_DESIRED_RATES)
+#define RT_OID_802_11_CONFIGURATION (OID_GET_SET_TOGGLE | OID_802_11_CONFIGURATION)
+#define RT_OID_802_11_POWER_MODE (OID_GET_SET_TOGGLE | OID_802_11_POWER_MODE)
+
+typedef union _MACHTTRANSMIT_SETTING {
+ struct {
+ unsigned short MCS:6; // MCS
+ unsigned short ldpc:1;
+ unsigned short BW:2; //channel bandwidth 20MHz or 40 MHz
+ unsigned short ShortGI:1;
+ unsigned short STBC:1; //SPACE
+ unsigned short eTxBF:1;
+ unsigned short iTxBF:1;
+ unsigned short MODE:3; // Use definition MODE_xxx.
+ } field;
+ unsigned short word;
+} MACHTTRANSMIT_SETTING;
+
+typedef struct _RT_802_11_MAC_ENTRY {
+ unsigned char ApIdx;
+ unsigned char Addr[6];
+ unsigned char Aid;
+ unsigned char Psm; // 0:PWR_ACTIVE, 1:PWR_SAVE
+ unsigned char MimoPs; // 0:MMPS_STATIC, 1:MMPS_DYNAMIC, 3:MMPS_Enabled
+ char AvgRssi0;
+ char AvgRssi1;
+ char AvgRssi2;
+ unsigned int ConnectedTime;
+ MACHTTRANSMIT_SETTING TxRate;
+ unsigned int LastRxRate;
+
+ short StreamSnr[3];
+ short SoundingRespSnr[3];
+} RT_802_11_MAC_ENTRY;
+
+typedef struct _RT_802_11_MAC_TABLE {
+ unsigned long Num;
+ RT_802_11_MAC_ENTRY Entry[64]; //MAX_LEN_OF_MAC_TABLE = 64
+} RT_802_11_MAC_TABLE;
+
+#endif
--- a/include/iwinfo/lua.h
+++ b/include/iwinfo/lua.h
@@ -37,6 +37,10 @@
#define IWINFO_MADWIFI_META "iwinfo.madwifi"
#endif
+#ifdef USE_RA
+#define IWINFO_RA_META "iwinfo.ra"
+#endif
+
#ifdef USE_NL80211
#define IWINFO_NL80211_META "iwinfo.nl80211"
#endif
--- a/include/iwinfo.h
+++ b/include/iwinfo.h
@@ -259,6 +259,7 @@ extern const struct iwinfo_ops wext_ops;
extern const struct iwinfo_ops madwifi_ops;
extern const struct iwinfo_ops nl80211_ops;
extern const struct iwinfo_ops wl_ops;
+extern const struct iwinfo_ops ra_ops;
#include "iwinfo/utils.h"
--- a/iwinfo_lib.c
+++ b/iwinfo_lib.c
@@ -334,6 +334,9 @@ static const struct iwinfo_ops *backends
#ifdef USE_WL
&wl_ops,
#endif
+#ifdef USE_RA
+ &ra_ops,
+#endif
&wext_ops,
};
--- a/iwinfo_lua.c
+++ b/iwinfo_lua.c
@@ -659,6 +659,35 @@ static int iwinfo_L_countrylist(lua_Stat
return 1;
}
+#ifdef USE_RA
+/* Ralink */
+LUA_WRAP_INT_OP(ra,channel)
+LUA_WRAP_INT_OP(ra,frequency)
+LUA_WRAP_INT_OP(ra,frequency_offset)
+LUA_WRAP_INT_OP(ra,txpower)
+LUA_WRAP_INT_OP(ra,txpower_offset)
+LUA_WRAP_INT_OP(ra,bitrate)
+LUA_WRAP_INT_OP(ra,signal)
+LUA_WRAP_INT_OP(ra,noise)
+LUA_WRAP_INT_OP(ra,quality)
+LUA_WRAP_INT_OP(ra,quality_max)
+LUA_WRAP_STRING_OP(ra,ssid)
+LUA_WRAP_STRING_OP(ra,bssid)
+LUA_WRAP_STRING_OP(ra,country)
+LUA_WRAP_STRING_OP(ra,hardware_name)
+LUA_WRAP_STRING_OP(ra,phyname)
+LUA_WRAP_STRUCT_OP(ra,mode)
+LUA_WRAP_STRUCT_OP(ra,assoclist)
+LUA_WRAP_STRUCT_OP(ra,txpwrlist)
+LUA_WRAP_STRUCT_OP(ra,scanlist)
+LUA_WRAP_STRUCT_OP(ra,freqlist)
+LUA_WRAP_STRUCT_OP(ra,countrylist)
+LUA_WRAP_STRUCT_OP(ra,hwmodelist)
+LUA_WRAP_STRUCT_OP(ra,htmodelist)
+LUA_WRAP_STRUCT_OP(ra,encryption)
+LUA_WRAP_STRUCT_OP(ra,mbssid_support)
+LUA_WRAP_STRUCT_OP(ra,hardware_id)
+#endif
#ifdef USE_WL
/* Broadcom */
@@ -908,6 +937,41 @@ static const luaL_reg R_wext[] = {
{ NULL, NULL }
};
+#ifdef USE_RA
+/* Ralink table */
+static const luaL_reg R_ra[] = {
+ LUA_REG(ra,channel),
+ LUA_REG(ra,frequency),
+ LUA_REG(ra,frequency_offset),
+ LUA_REG(ra,txpower),
+ LUA_REG(ra,txpower_offset),
+ LUA_REG(ra,bitrate),
+ LUA_REG(ra,signal),
+ LUA_REG(ra,noise),
+ LUA_REG(ra,quality),
+ LUA_REG(ra,quality_max),
+ LUA_REG(ra,mode),
+ LUA_REG(ra,ssid),
+ LUA_REG(ra,bssid),
+ LUA_REG(ra,country),
+ LUA_REG(ra,assoclist),
+ LUA_REG(ra,txpwrlist),
+ LUA_REG(ra,scanlist),
+ LUA_REG(ra,freqlist),
+ LUA_REG(ra,countrylist),
+ LUA_REG(ra,hwmodelist),
+ LUA_REG(ra,htmodelist),
+ LUA_REG(ra,encryption),
+ LUA_REG(ra,mbssid_support),
+ LUA_REG(ra,hardware_id),
+ LUA_REG(ra,hardware_name),
+ LUA_REG(ra,phyname),
+ { NULL, NULL }
+};
+
+#endif
+
+
/* Common */
static const luaL_reg R_common[] = {
{ "type", iwinfo_L_type },
@@ -919,6 +983,15 @@ static const luaL_reg R_common[] = {
LUALIB_API int luaopen_iwinfo(lua_State *L) {
luaL_register(L, IWINFO_META, R_common);
+
+#ifdef USE_RA
+ luaL_newmetatable(L, IWINFO_RA_META);
+ luaL_register(L, NULL, R_ra);
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -2, "__index");
+ lua_setfield(L, -2, "ra");
+#endif
+
#ifdef USE_WL
luaL_newmetatable(L, IWINFO_WL_META);
luaL_register(L, NULL, R_common);
--- /dev/null
+++ b/iwinfo_ra.c
@@ -0,0 +1,1000 @@
+#include "iwinfo.h"
+#include "iwinfo_ra.h"
+#include "iwinfo_wext.h"
+
+#define MIDFIX5G "x"
+
+/*
+ * Ralink ISO 3166 to Country/Region Code mapping.
+ */
+
+static struct ISO3166_to_CCode
+{
+ u_int16_t iso3166;
+ u_int16_t ccode;
+} CountryCodes[] =
+ {
+ {0x3030 /* 00 */, 0}, /* World */
+ {0x4145 /* AE */, 784}, /* U.A.E. */
+ {0x414C /* AL */, 8}, /* Albania */
+ {0x414D /* AM */, 51}, /* Armenia */
+ {0x4152 /* AR */, 32}, /* Argentina */
+ {0x4154 /* AT */, 40}, /* Austria */
+ {0x4155 /* AU */, 36}, /* Australia */
+ {0x415A /* AZ */, 31}, /* Azerbaijan */
+ {0x4245 /* BE */, 56}, /* Belgium */
+ {0x4247 /* BG */, 100}, /* Bulgaria */
+ {0x4248 /* BH */, 48}, /* Bahrain */
+ {0x424E /* BN */, 96}, /* Brunei Darussalam */
+ {0x424F /* BO */, 68}, /* Bolivia */
+ {0x4252 /* BR */, 76}, /* Brazil */
+ {0x4259 /* BY */, 112}, /* Belarus */
+ {0x425A /* BZ */, 84}, /* Belize */
+ {0x4341 /* CA */, 124}, /* Canada */
+ {0x4348 /* CH */, 756}, /* Switzerland */
+ {0x434C /* CL */, 152}, /* Chile */
+ {0x434E /* CN */, 156}, /* People's Republic of China */
+ {0x434F /* CO */, 170}, /* Colombia */
+ {0x4352 /* CR */, 188}, /* Costa Rica */
+ {0x4359 /* CY */, 196}, /* Cyprus */
+ {0x435A /* CZ */, 203}, /* Czech Republic */
+ {0x4445 /* DE */, 276}, /* Germany */
+ {0x444B /* DK */, 208}, /* Denmark */
+ {0x444F /* DO */, 214}, /* Dominican Republic */
+ {0x445A /* DZ */, 12}, /* Algeria */
+ {0x4543 /* EC */, 218}, /* Ecuador */
+ {0x4545 /* EE */, 233}, /* Estonia */
+ {0x4547 /* EG */, 818}, /* Egypt */
+ {0x4553 /* ES */, 724}, /* Spain */
+ {0x4649 /* FI */, 246}, /* Finland */
+ {0x464F /* FO */, 234}, /* Faeroe Islands */
+ {0x4652 /* FR */, 250}, /* France */
+ {0x4652 /* FR */, 255}, /* France2 */
+ {0x4742 /* GB */, 826}, /* United Kingdom */
+ {0x4745 /* GE */, 268}, /* Georgia */
+ {0x4752 /* GR */, 300}, /* Greece */
+ {0x4754 /* GT */, 320}, /* Guatemala */
+ {0x484B /* HK */, 344}, /* Hong Kong S.A.R., P.R.C. */
+ {0x484E /* HN */, 340}, /* Honduras */
+ {0x4852 /* HR */, 191}, /* Croatia */
+ {0x4855 /* HU */, 348}, /* Hungary */
+ {0x4944 /* ID */, 360}, /* Indonesia */
+ {0x4945 /* IE */, 372}, /* Ireland */
+ {0x494C /* IL */, 376}, /* Israel */
+ {0x494E /* IN */, 356}, /* India */
+ {0x4951 /* IQ */, 368}, /* Iraq */
+ {0x4952 /* IR */, 364}, /* Iran */
+ {0x4953 /* IS */, 352}, /* Iceland */
+ {0x4954 /* IT */, 380}, /* Italy */
+ {0x4A4D /* JM */, 388}, /* Jamaica */
+ {0x4A4F /* JO */, 400}, /* Jordan */
+ {0x4A50 /* JP */, 392}, /* Japan */
+ {0x4A50 /* JP */, 393}, /* Japan (JP1) */
+ {0x4A50 /* JP */, 394}, /* Japan (JP0) */
+ {0x4A50 /* JP */, 395}, /* Japan (JP1-1) */
+ {0x4A50 /* JP */, 396}, /* Japan (JE1) */
+ {0x4A50 /* JP */, 397}, /* Japan (JE2) */
+ {0x4A50 /* JP */, 399}, /* Japan (JP6) */
+ {0x4A50 /* JP */, 900}, /* Japan */
+ {0x4A50 /* JP */, 901}, /* Japan */
+ {0x4A50 /* JP */, 902}, /* Japan */
+ {0x4A50 /* JP */, 903}, /* Japan */
+ {0x4A50 /* JP */, 904}, /* Japan */
+ {0x4A50 /* JP */, 905}, /* Japan */
+ {0x4A50 /* JP */, 906}, /* Japan */
+ {0x4A50 /* JP */, 907}, /* Japan */
+ {0x4A50 /* JP */, 908}, /* Japan */
+ {0x4A50 /* JP */, 909}, /* Japan */
+ {0x4A50 /* JP */, 910}, /* Japan */
+ {0x4A50 /* JP */, 911}, /* Japan */
+ {0x4A50 /* JP */, 912}, /* Japan */
+ {0x4A50 /* JP */, 913}, /* Japan */
+ {0x4A50 /* JP */, 914}, /* Japan */
+ {0x4A50 /* JP */, 915}, /* Japan */
+ {0x4A50 /* JP */, 916}, /* Japan */
+ {0x4A50 /* JP */, 917}, /* Japan */
+ {0x4A50 /* JP */, 918}, /* Japan */
+ {0x4A50 /* JP */, 919}, /* Japan */
+ {0x4A50 /* JP */, 920}, /* Japan */
+ {0x4A50 /* JP */, 921}, /* Japan */
+ {0x4A50 /* JP */, 922}, /* Japan */
+ {0x4A50 /* JP */, 923}, /* Japan */
+ {0x4A50 /* JP */, 924}, /* Japan */
+ {0x4A50 /* JP */, 925}, /* Japan */
+ {0x4A50 /* JP */, 926}, /* Japan */
+ {0x4A50 /* JP */, 927}, /* Japan */
+ {0x4A50 /* JP */, 928}, /* Japan */
+ {0x4A50 /* JP */, 929}, /* Japan */
+ {0x4A50 /* JP */, 930}, /* Japan */
+ {0x4A50 /* JP */, 931}, /* Japan */
+ {0x4A50 /* JP */, 932}, /* Japan */
+ {0x4A50 /* JP */, 933}, /* Japan */
+ {0x4A50 /* JP */, 934}, /* Japan */
+ {0x4A50 /* JP */, 935}, /* Japan */
+ {0x4A50 /* JP */, 936}, /* Japan */
+ {0x4A50 /* JP */, 937}, /* Japan */
+ {0x4A50 /* JP */, 938}, /* Japan */
+ {0x4A50 /* JP */, 939}, /* Japan */
+ {0x4A50 /* JP */, 940}, /* Japan */
+ {0x4A50 /* JP */, 941}, /* Japan */
+ {0x4B45 /* KE */, 404}, /* Kenya */
+ {0x4B50 /* KP */, 408}, /* North Korea */
+ {0x4B52 /* KR */, 410}, /* South Korea */
+ {0x4B52 /* KR */, 411}, /* South Korea */
+ {0x4B57 /* KW */, 414}, /* Kuwait */
+ {0x4B5A /* KZ */, 398}, /* Kazakhstan */
+ {0x4C42 /* LB */, 422}, /* Lebanon */
+ {0x4C49 /* LI */, 438}, /* Liechtenstein */
+ {0x4C54 /* LT */, 440}, /* Lithuania */
+ {0x4C55 /* LU */, 442}, /* Luxembourg */
+ {0x4C56 /* LV */, 428}, /* Latvia */
+ {0x4C59 /* LY */, 434}, /* Libya */
+ {0x4D41 /* MA */, 504}, /* Morocco */
+ {0x4D43 /* MC */, 492}, /* Principality of Monaco */
+ {0x4D4B /* MK */, 807}, /* the Former Yugoslav Republic of Macedonia */
+ {0x4D4F /* MO */, 446}, /* Macau */
+ {0x4D58 /* MX */, 484}, /* Mexico */
+ {0x4D59 /* MY */, 458}, /* Malaysia */
+ {0x4E49 /* NI */, 558}, /* Nicaragua */
+ {0x4E4C /* NL */, 528}, /* Netherlands */
+ {0x4E4F /* NO */, 578}, /* Norway */
+ {0x4E5A /* NZ */, 554}, /* New Zealand */
+ {0x4F4D /* OM */, 512}, /* Oman */
+ {0x5041 /* PA */, 591}, /* Panama */
+ {0x5045 /* PE */, 604}, /* Peru */
+ {0x5048 /* PH */, 608}, /* Republic of the Philippines */
+ {0x504B /* PK */, 586}, /* Islamic Republic of Pakistan */
+ {0x504C /* PL */, 616}, /* Poland */
+ {0x5052 /* PR */, 630}, /* Puerto Rico */
+ {0x5054 /* PT */, 620}, /* Portugal */
+ {0x5059 /* PY */, 600}, /* Paraguay */
+ {0x5141 /* QA */, 634}, /* Qatar */
+ {0x524F /* RO */, 642}, /* Romania */
+ {0x5255 /* RU */, 643}, /* Russia */
+ {0x5341 /* SA */, 682}, /* Saudi Arabia */
+ {0x5345 /* SE */, 752}, /* Sweden */
+ {0x5347 /* SG */, 702}, /* Singapore */
+ {0x5349 /* SI */, 705}, /* Slovenia */
+ {0x534B /* SK */, 703}, /* Slovak Republic */
+ {0x5356 /* SV */, 222}, /* El Salvador */
+ {0x5359 /* SY */, 760}, /* Syria */
+ {0x5448 /* TH */, 764}, /* Thailand */
+ {0x544E /* TN */, 788}, /* Tunisia */
+ {0x5452 /* TR */, 792}, /* Turkey */
+ {0x5454 /* TT */, 780}, /* Trinidad y Tobago */
+ {0x5457 /* TW */, 158}, /* Taiwan */
+ {0x5541 /* UA */, 804}, /* Ukraine */
+ {0x554B /* UK */, 826}, /* United Kingdom */
+ {0x5553 /* US */, 840}, /* United States */
+ {0x5553 /* US */, 842}, /* United States (Public Safety)*/
+ {0x5559 /* UY */, 858}, /* Uruguay */
+ {0x555A /* UZ */, 860}, /* Uzbekistan */
+ {0x5645 /* VE */, 862}, /* Venezuela */
+ {0x564E /* VN */, 704}, /* Viet Nam */
+ {0x5945 /* YE */, 887}, /* Yemen */
+ {0x5A41 /* ZA */, 710}, /* South Africa */
+ {0x5A57 /* ZW */, 716}, /* Zimbabwe */
+};
+
+int is_5g(const char *ifname)
+{
+ if (!strncmp(ifname, "ra"MIDFIX5G, 3))
+ return 1;
+ else if (!strncmp(ifname, "wds"MIDFIX5G, 4))
+ return 1;
+ else if (!strncmp(ifname, "apcli"MIDFIX5G, 6))
+ return 1;
+
+ return 0;
+}
+
+static int ra_ioctl(const char *ifname, int cmd, struct iwreq *wrq)
+{
+ if (!strncmp(ifname, "mon.", 4))
+ strncpy(wrq->ifr_name, &ifname[4], IFNAMSIZ);
+ else
+ strncpy(wrq->ifr_name, ifname, IFNAMSIZ);
+
+ return iwinfo_ioctl(cmd, wrq);
+}
+
+int ra_oid_ioctl(const char *ifname, unsigned long oid, char *ptr, unsigned long ptr_len)
+{
+ struct iwreq wrq;
+ int cmd = RT_PRIV_IOCTL;
+ strcpy(wrq.ifr_name, ifname);
+ wrq.u.data.length = ptr_len;
+ wrq.u.data.pointer = ptr;
+ wrq.u.data.flags = oid;
+
+ return iwinfo_ioctl(RT_PRIV_IOCTL, &wrq);
+}
+
+int iwpriv_set(const char *name, const char *key, const char *val)
+{
+ int socket_id, ret = 0;
+ struct iwreq wrq;
+ char data[64];
+ snprintf(data, 64, "%s=%s", key, val);
+ socket_id = socket(AF_INET, SOCK_DGRAM, 0);
+
+ wrq.u.data.length = strlen(data);
+ wrq.u.data.pointer = data;
+ wrq.u.data.flags = 0;
+ ret = ra_ioctl(name, RTPRIV_IOCTL_SET, &wrq);
+ close(socket_id);
+ return ret;
+}
+
+int ra_probe(const char *ifname)
+{
+ unsigned char data[12];
+ int version;
+ if (strncmp(ifname, "ra", 2) && strncmp(ifname, "wds", 3) && strncmp(ifname, "apcli", 5))
+ return 0;
+ if (ra_oid_ioctl(ifname, RT_OID_VERSION_INFO, data, sizeof(data)) == 0)
+ {
+ data[1] = data[2];
+ data[2] = data[4];
+ data[3] = data[6];
+ data[4] = '\0';
+ version = atoi(data);
+ if (version >= 2500)
+ return 1;
+ else
+ return 0;
+ }
+ else
+ return -1;
+}
+
+void ra_close(void)
+{
+ iwinfo_close();
+}
+
+int ra_get_mode(const char *ifname, int *buf)
+{
+ if (strncmp(ifname, "ra", 2) == 0)
+ *buf = IWINFO_OPMODE_MASTER;
+ else if (strncmp(ifname, "apcli", 5) == 0)
+ *buf = IWINFO_OPMODE_CLIENT;
+ else if (strncmp(ifname, "wds", 3) == 0)
+ *buf = IWINFO_OPMODE_WDS;
+ else
+ *buf = IWINFO_OPMODE_UNKNOWN;
+
+ return 0;
+}
+
+int ra_get_ssid(const char *ifname, char *buf)
+{
+ struct iwreq wrq;
+
+ wrq.u.essid.pointer = (caddr_t)buf;
+ wrq.u.essid.length = IW_ESSID_MAX_SIZE + 1;
+ wrq.u.essid.flags = 0;
+
+ if (ra_ioctl(ifname, SIOCGIWESSID, &wrq) >= 0)
+ return 0;
+
+ return -1;
+}
+
+int ra_get_bssid(const char *ifname, char *buf)
+{
+ struct iwreq wrq;
+
+ if (ra_ioctl(ifname, SIOCGIWAP, &wrq) >= 0)
+ {
+ sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
+ (uint8_t)wrq.u.ap_addr.sa_data[0], (uint8_t)wrq.u.ap_addr.sa_data[1],
+ (uint8_t)wrq.u.ap_addr.sa_data[2], (uint8_t)wrq.u.ap_addr.sa_data[3],
+ (uint8_t)wrq.u.ap_addr.sa_data[4], (uint8_t)wrq.u.ap_addr.sa_data[5]);
+
+ return 0;
+ }
+
+ return -1;
+}
+
+static int32_t ra_freq2mhz(const struct iw_freq *in)
+{
+ int i;
+ int32_t res = in->m;
+ if (in->e == 6) {
+ return res;
+ } else if (in->e > 6) {
+ for (i=in->e; i>6; --i) {
+ res *= 10;
+ }
+ } else {
+ for (i=in->e; i<6; ++i) {
+ res /= 10;
+ }
+ }
+ return res;
+}
+
+int ra_get_channel(const char *ifname, int *buf)
+{
+ struct iwreq wrq;
+
+ if (ra_ioctl(ifname, SIOCGIWFREQ, &wrq) >= 0)
+ {
+ *buf = wrq.u.freq.i;
+ return 0;
+ }
+
+ return -1;
+}
+
+int ra_get_frequency(const char *ifname, int *buf)
+{
+ struct iwreq wrq;
+
+ if (ra_ioctl(ifname, SIOCGIWFREQ, &wrq) >= 0)
+ {
+ *buf = ra_freq2mhz(&wrq.u.freq);
+ return 0;
+ }
+ return -1;
+}
+
+int ra_get_txpower(const char *ifname, int *buf)
+{
+ *buf = 20;
+ return 0;
+}
+
+int ra_get_bitrate(const char *ifname, int *buf)
+{
+ struct iwreq wrq;
+
+ if (ra_ioctl(ifname, SIOCGIWRATE, &wrq) >= 0)
+ {
+ *buf = (wrq.u.bitrate.value / 1000);
+ return 0;
+ }
+
+ return -1;
+}
+
+int ra_get_signal(const char *ifname, int *buf)
+{
+ int ra_snr_sum, num;
+ char tmp_buf[8192];
+ struct iwinfo_assoclist_entry tmp;
+ int ret_len, i;
+
+ if (ra_get_assoclist(ifname, tmp_buf, &ret_len) == 0)
+ {
+ num = ret_len / sizeof(struct iwinfo_assoclist_entry);
+ ra_snr_sum = 0;
+ for (i = 0; i < num; i++)
+ {
+ memset(&tmp, 0, sizeof(struct iwinfo_assoclist_entry));
+ memcpy(&tmp, tmp_buf + i * sizeof(struct iwinfo_assoclist_entry), sizeof(struct iwinfo_assoclist_entry));
+
+ ra_snr_sum -= tmp.signal;
+ }
+ if (num > 0)
+ *buf = -(ra_snr_sum / num);
+ else
+ *buf = -95;
+
+ return 0;
+ }
+ else
+ return -1;
+}
+
+int ra_get_noise(const char *ifname, int *buf)
+{
+ *buf = -95;
+ return 0;
+}
+
+int ra_get_quality(const char *ifname, int *buf)
+{
+ int tmp;
+
+ if (ra_get_signal(ifname, &tmp) == 0)
+ *buf = 100 - (tmp / -95 * 100);
+ else
+ *buf = 100;
+
+ return 0;
+}
+
+int ra_get_quality_max(const char *ifname, int *buf)
+{
+ *buf = 100;
+ return 0;
+}
+
+static char *ra_array_get(char *p, int idx) {
+ int i;
+ char *tail;
+ for (i=0; i<idx; ++i) {
+ p = strchr(p, ';');
+ if (p == NULL) {
+ return NULL;
+ }
+ p += 1;
+ }
+ tail = strchr(p, ';');
+ if (!tail) {
+ tail = strchr(p, '\n');
+ }
+ if (!tail) {
+ *tail = '\0';
+ }
+ return p;
+}
+
+int ra_get_encryption(const char *ifname, char *buf)
+{
+ FILE *fp;
+ const char *filename;
+ long filesize;
+ int ret = -1;
+ char buffer[256] = {0};
+ char *p = NULL;
+ int idx;
+ int aes = 0;
+
+ struct iwinfo_crypto_entry *enc = (struct iwinfo_crypto_entry *)buf;
+
+ char data[10];
+ if (ra_oid_ioctl(ifname, RT_OID_VERSION_INFO, data, sizeof(data)) < 0)
+ return -1;
+
+ if (is_5g(ifname)) {
+ filename = "/tmp/profiles/mt_dbdc_5g.dat";
+ } else {
+ filename = "/tmp/profiles/mt_dbdc_2g.dat";
+ }
+ fp = fopen(filename, "r");
+ if (fp == NULL)
+ {
+ fprintf(stderr, "open ifname:%s failed.\n", ifname);
+ return -1;
+ }
+ idx = ifname[strlen(ifname)-1] - '0';
+ while (fgets(buffer, sizeof(buffer), fp) != NULL) {
+ if (!strncmp(buffer, "AuthMode=", 9)) {
+ p = buffer + 9;
+ p = ra_array_get(p, idx);
+ if (!p)
+ goto end;
+ if (strstr(p, "WPA"))
+ {
+ enc->enabled = 1;
+ if (strstr(p, "WPA1PSKWPA2PSK"))
+ enc->wpa_version = 3;
+ else if (strstr(p, "WPA2PSK"))
+ enc->wpa_version = 2;
+ else if (strstr(p, "WPAPSK"))
+ enc->wpa_version = 1;
+ else
+ enc->wpa_version = 1;
+
+ enc->auth_suites |= IWINFO_KMGMT_PSK;
+ }
+ else if (strstr(p, "WEP"))
+ {
+ enc->enabled = 1;
+ enc->auth_algs |= IWINFO_AUTH_OPEN;
+ enc->pair_ciphers |= IWINFO_CIPHER_WEP104;
+ enc->auth_suites |= IWINFO_KMGMT_NONE;
+ enc->group_ciphers = enc->pair_ciphers;
+ }
+ } else if (!strncmp(buffer, "EncrypType=", 11)) {
+ if (enc->pair_ciphers & IWINFO_CIPHER_WEP104)
+ continue;
+ p = buffer + 11;
+ p = ra_array_get(p, idx);
+ if (!p)
+ goto end;
+ if (strstr(p, "AES"))
+ aes = 1;
+ }
+ }
+
+ if (enc->enabled && enc->auth_suites & IWINFO_KMGMT_PSK) {
+ if (aes)
+ enc->pair_ciphers |= IWINFO_CIPHER_CCMP;
+ else
+ enc->pair_ciphers |= IWINFO_CIPHER_TKIP;
+
+ enc->group_ciphers = enc->pair_ciphers;
+ }
+
+ ret = 0;
+end:
+ fclose(fp);
+ return ret;
+}
+
+int ra_get_phyname(const char *ifname, char *buf) {
+ if (is_5g(ifname)) {
+ strcpy(buf, "ra"MIDFIX5G);
+ } else {
+ strcpy(buf, "ra");
+ }
+ return 0;
+}
+
+int getRate(MACHTTRANSMIT_SETTING HTSetting)
+{
+ int MCSMappingRateTable[] =
+ {
+ 2, 4, 11, 22, /* CCK*/
+ 12, 18, 24, 36, 48, 72, 96, 108, /* OFDM*/
+ 13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, /* 20MHz, 800ns GI, MCS: 0 ~ 15*/
+ 39, 78, 117, 156, 234, 312, 351, 390, /* 20MHz, 800ns GI, MCS: 16 ~ 23*/
+ 27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540, /* 40MHz, 800ns GI, MCS: 0 ~ 15*/
+ 81, 162, 243, 324, 486, 648, 729, 810, /* 40MHz, 800ns GI, MCS: 16 ~ 23*/
+ 14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, /* 20MHz, 400ns GI, MCS: 0 ~ 15*/
+ 43, 87, 130, 173, 260, 317, 390, 433, /* 20MHz, 400ns GI, MCS: 16 ~ 23*/
+ 30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600, /* 40MHz, 400ns GI, MCS: 0 ~ 15*/
+ 90, 180, 270, 360, 540, 720, 810, 900,
+ 13, 26, 39, 52, 78, 104, 117, 130, 156, /* 11ac: 20Mhz, 800ns GI, MCS: 0~8 */
+ 27, 54, 81, 108, 162, 216, 243, 270, 324, 360, /*11ac: 40Mhz, 800ns GI, MCS: 0~9 */
+ 59, 117, 176, 234, 351, 468, 527, 585, 702, 780, /*11ac: 80Mhz, 800ns GI, MCS: 0~9 */
+ 14, 29, 43, 57, 87, 115, 130, 144, 173, /* 11ac: 20Mhz, 400ns GI, MCS: 0~8 */
+ 30, 60, 90, 120, 180, 240, 270, 300, 360, 400, /*11ac: 40Mhz, 400ns GI, MCS: 0~9 */
+ 65, 130, 195, 260, 390, 520, 585, 650, 780, 867 /*11ac: 80Mhz, 400ns GI, MCS: 0~9 */
+ };
+
+ int rate_count = sizeof(MCSMappingRateTable) / sizeof(int);
+ int rate_index = 0;
+ int value = 0;
+
+ if (HTSetting.field.MODE >= 4)
+ {
+ if (HTSetting.field.BW == 0)
+ {
+ rate_index = 108 +
+ ((unsigned char)HTSetting.field.ShortGI * 29) +
+ ((unsigned char)HTSetting.field.MCS);
+ }
+ else if (HTSetting.field.BW == 1)
+ {
+ rate_index = 117 +
+ ((unsigned char)HTSetting.field.ShortGI * 29) +
+ ((unsigned char)HTSetting.field.MCS);
+ }
+ else if (HTSetting.field.BW == 2)
+ {
+ rate_index = 127 +
+ ((unsigned char)HTSetting.field.ShortGI * 29) +
+ ((unsigned char)HTSetting.field.MCS);
+ }
+ }
+ else if (HTSetting.field.MODE >= 2)
+ {
+ /* rate_index = 12 + ((UCHAR)ht_setting.field.BW *16) + ((UCHAR)ht_setting.field.ShortGI *32) + ((UCHAR)ht_setting.field.MCS);*/
+ rate_index = 12 + ((unsigned char)HTSetting.field.BW * 24) + ((unsigned char)HTSetting.field.ShortGI * 48) + ((unsigned char)HTSetting.field.MCS);
+ }
+ else if (HTSetting.field.MODE == 1)
+ rate_index = (unsigned char)(HTSetting.field.MCS) + 4;
+ else if (HTSetting.field.MODE == 0)
+ rate_index = (unsigned char)(HTSetting.field.MCS);
+
+ if (rate_index < 0)
+ rate_index = 0;
+
+ if (rate_index >= rate_count)
+ rate_index = rate_count - 1;
+
+ return (MCSMappingRateTable[rate_index] * 5 * 100);
+}
+
+int ra_get_assoclist(const char *ifname, char *buf, int *len)
+{
+ int ret, i;
+ int bl = 0, tl, noise;
+ struct iwreq wrq;
+ struct iwinfo_assoclist_entry entry;
+
+ if (!strncmp(ifname, "apcli", 5))
+ return -1;
+
+ char table[8192];
+
+ strcpy(wrq.ifr_ifrn.ifrn_name, ifname);
+ wrq.u.data.pointer = (caddr_t)&table;
+ wrq.u.data.flags = 0;
+
+ ret = ra_ioctl(ifname, RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT, &wrq);
+ if (ret < 0)
+ {
+ fprintf(stderr, "assoclist ioctl fails\n");
+ return -1;
+ }
+
+ RT_802_11_MAC_TABLE *a = &table;
+
+ *len = a->Num * sizeof(struct iwinfo_assoclist_entry);
+
+ for (i = 0; i < a->Num; i++)
+ {
+ RT_802_11_MAC_ENTRY *pe = &(a->Entry[i]);
+ memset(&entry, 0, sizeof(entry));
+
+ entry.signal = ((int)(pe->AvgRssi0) + (int)(pe->AvgRssi1)) / 2;
+
+ entry.noise = -95;
+ entry.inactive = pe->ConnectedTime * 1000;
+
+ memcpy(&entry.mac, &pe->Addr, sizeof(entry.mac));
+
+ entry.tx_packets = 0;
+ entry.rx_packets = 0;
+
+ entry.tx_rate.rate = getRate(pe->TxRate);
+ entry.tx_rate.mcs = pe->TxRate.field.MCS;
+ entry.tx_rate.is_40mhz = pe->TxRate.field.BW;
+ entry.tx_rate.is_short_gi = pe->TxRate.field.ShortGI;
+
+ entry.rx_rate = entry.tx_rate;
+
+ memcpy(&buf[bl], &entry, sizeof(struct iwinfo_assoclist_entry));
+
+ bl += sizeof(struct iwinfo_assoclist_entry);
+
+ *len = bl;
+ }
+ return 0;
+}
+
+int ra_get_txpwrlist(const char *ifname, char *buf, int *len)
+{
+ struct iwinfo_txpwrlist_entry entry;
+ uint8_t dbm[9] = {0, 6, 8, 10, 12, 14, 16, 18, 20};
+ uint8_t mw[9] = {1, 3, 6, 10, 15, 25, 39, 63, 100};
+ int i;
+
+ for (i = 0; i < 9; i++)
+ {
+ entry.dbm = dbm[i];
+ entry.mw = mw[i];
+ memcpy(&buf[i * sizeof(entry)], &entry, sizeof(entry));
+ }
+
+ *len = 9 * sizeof(entry);
+ return 0;
+}
+
+static void bssid2mac(char *macStr, unsigned char *mac)
+{
+ unsigned int iMac[6];
+ int i;
+ sscanf(macStr, "%x:%x:%x:%x:%x:%x", &iMac[0], &iMac[1], &iMac[2], &iMac[3], &iMac[4], &iMac[5]);
+ for (i = 0; i < 6; i++)
+ mac[i] = (unsigned char)iMac[i];
+}
+
+static void parse_security(char *sec, struct iwinfo_crypto_entry *enc)
+{
+ memset(enc, 0, sizeof(struct iwinfo_crypto_entry));
+ enc->enabled = 0;
+ if (strstr(sec, "WPA"))
+ {
+ enc->enabled = 1;
+ if (strstr(sec, "WPAPSKWPA2PSK"))
+ enc->wpa_version = 3;
+ else if (strstr(sec, "WPA2PSK"))
+ enc->wpa_version = 2;
+ else if (strstr(sec, "WPAPSK"))
+ enc->wpa_version = 1;
+ else if (strstr(sec, "WPA"))
+ enc->wpa_version = 1;
+
+ enc->auth_suites |= IWINFO_KMGMT_PSK;
+
+ if (strstr(sec, "AES"))
+ enc->pair_ciphers |= IWINFO_CIPHER_CCMP;
+ if (strstr(sec, "TKIP"))
+ enc->pair_ciphers |= IWINFO_CIPHER_TKIP;
+
+ enc->group_ciphers = enc->pair_ciphers;
+ }
+ else if (strstr(sec, "WEP"))
+ {
+ enc->enabled = 1;
+ enc->auth_algs |= IWINFO_AUTH_OPEN;
+ enc->pair_ciphers |= IWINFO_CIPHER_WEP104;
+ enc->auth_suites |= IWINFO_KMGMT_NONE;
+ enc->group_ciphers = enc->pair_ciphers;
+ }
+}
+
+int rtrim(char *s)
+{
+ int i;
+
+ i = strlen(s) - 1;
+ while ((s[i] == ' ' || s[i] == '\t') && i >= 0)
+ {
+ i--;
+ };
+ s[i + 1] = '\0';
+ return i + 1;
+}
+
+static void fill_find_entry(char *sp, struct iwinfo_scanlist_entry *e)
+{
+ char site_channel[4];
+ char site_ssid[33];
+ char site_bssid[20];
+ char site_security[23];
+ char site_signal[9];
+ char site_wirelessmode[7];
+ char ssid_str[128];
+ int len;
+
+ sp += 4; // skip No
+ memcpy(site_channel, sp, 4);
+ memcpy(site_ssid, sp + 4, 33);
+ memcpy(site_bssid, sp + 37, 20);
+ memcpy(site_security, sp + 57, 23);
+ memcpy(site_signal, sp + 80, 9);
+
+ rtrim(site_bssid);
+ rtrim(site_channel);
+ rtrim(site_security);
+ rtrim(site_signal);
+
+ e->channel = atoi(site_channel);
+ bssid2mac((unsigned char *)site_bssid, (unsigned char *)e->mac);
+ e->mode = IWINFO_OPMODE_MASTER;
+ //e->crypto.enable = 0;
+ parse_security((char *)site_security, &e->crypto);
+
+ int quality = atoi(site_signal);
+ int8_t rssi;
+ rssi = (quality * 95 / 100) - 95;
+
+ if (quality < 5)
+ {
+ rssi = -95;
+ }
+
+ e->signal = rssi;
+ e->quality = quality;
+ e->quality_max = 100;
+
+ len = rtrim(site_ssid);
+ if (!strlen(site_ssid))
+ {
+ strcpy(site_ssid, "???");
+ len = 3;
+ }
+ memcpy(e->ssid, site_ssid, len);
+}
+
+static char *next_line(char *sp) {
+ while (*sp != '\n' && *sp != '\0')
+ ++sp;
+ if (*sp == '\n')
+ ++sp; // skip \n
+ return sp;
+}
+
+int ra_get_scanlist(const char *ifname, char *buf, int *len)
+{
+ struct iwreq wrq;
+ char data[8192];
+ char *sp, *empty, *end;
+
+ int line_len, i;
+
+ int is5g = is_5g(ifname);
+
+ iwpriv_set(ifname, "SiteSurvey", "1");
+ sleep(3);
+
+ memset(data, 0, sizeof(data));
+ wrq.u.data.length = sizeof(data);
+ wrq.u.data.pointer = data;
+ wrq.u.data.flags = 0;
+
+ if (ra_ioctl(ifname, RTPRIV_IOCTL_GSITESURVEY, &wrq) >= 0)
+ {
+ struct iwinfo_scanlist_entry e;
+ // No Ch SSID BSSID Security Siganl(%)W-Mode ExtCH NT SSID_Len WPS DPID BcnRept
+ line_len = 4 + 4 + 33 + 20 + 23 + 9 + 8 + 7 + 3 + 9; // WPS DPID may not present
+ if (wrq.u.data.length < line_len + 3 + 10)
+ return -1;
+ sp = wrq.u.data.pointer;
+ for (i = 0; i < 3; ++i) {
+ // skip \n+'Total=xxxx'+\n+HEADER+\n
+ sp = next_line(sp);
+ }
+ end = sp + strlen(sp);
+ i = 0;
+ while (*sp >= '0' && end > sp)
+ {
+ memset(&e, 0, sizeof(struct iwinfo_scanlist_entry));
+
+ fill_find_entry(sp, &e);
+ if ((e.channel < 34) ^ is5g) {
+ memcpy(&buf[i * sizeof(struct iwinfo_scanlist_entry)], &e, sizeof(struct iwinfo_scanlist_entry));
+ i++;
+ }
+ sp += line_len;
+ sp = next_line(sp);
+ }
+ *len = i * sizeof(struct iwinfo_scanlist_entry);
+ return 0;
+ }
+ return -1;
+}
+
+#define RA_MAX_CH_2G 13
+static const uint8_t CH5G[]={
+ /* 802.11 UNI / HyperLan 2 */
+ 36, 40, 44, 48, 52, 56, 60, 64, //8
+
+ /* 802.11 HyperLan 2 */
+ 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, //10
+
+ /* 802.11 UNII */
+ 140, 144, 149, 153, 157, 161, 165
+};
+
+int ra_get_freqlist(const char *ifname, char *buf, int *len)
+{
+
+ struct iwinfo_freqlist_entry entry;
+ int i, bl;
+ bl = 0;
+
+ if (is_5g(ifname)) {
+ for (i=0; i<ARRAY_SIZE(CH5G); ++i) {
+ entry.mhz = 5000 + 5 * CH5G[i];
+ entry.channel = CH5G[i];
+ entry.restricted = 0;
+
+ memcpy(&buf[bl], &entry, sizeof(struct iwinfo_freqlist_entry));
+ bl += sizeof(struct iwinfo_freqlist_entry);
+ }
+ } else {
+ for (i = 0; i < RA_MAX_CH_2G; i++)
+ {
+ entry.mhz = 2412 + 5 * i;
+ entry.channel = i + 1;
+ entry.restricted = 0;
+
+ memcpy(&buf[bl], &entry, sizeof(struct iwinfo_freqlist_entry));
+ bl += sizeof(struct iwinfo_freqlist_entry);
+ }
+ }
+
+ *len = bl;
+ return 0;
+}
+
+int ra_get_country(const char *ifname, char *buf)
+{
+ char data[10];
+ if (ra_oid_ioctl(ifname, RT_OID_VERSION_INFO, data, sizeof(data)) < 0)
+ return -1;
+ strncpy(buf, "US", 2);
+ return 0;
+}
+
+int ra_get_countrylist(const char *ifname, char *buf, int *len)
+{
+
+ int i, count;
+ struct ISO3166_to_CCode *e, *p = NULL;
+ struct iwinfo_country_entry *c = (struct iwinfo_country_entry *)buf;
+ char data[10];
+ if (ra_oid_ioctl(ifname, RT_OID_VERSION_INFO, data, sizeof(data)) < 0)
+ return -1;
+ count = 0;
+
+ for (int i = 0; i < (sizeof(CountryCodes) / sizeof(CountryCodes[0])); i++)
+ {
+ e = &CountryCodes[i];
+
+ if (!p || (e->iso3166 != p->iso3166))
+ {
+ c->iso3166 = e->iso3166;
+ snprintf(c->ccode, sizeof(c->ccode), "%i", e->ccode);
+
+ c++;
+ count++;
+ }
+
+ p = e;
+ }
+
+ *len = (count * sizeof(struct iwinfo_country_entry));
+ return 0;
+}
+
+int ra_get_hwmodelist(const char *ifname, int *buf)
+{
+ char data[10];
+
+ if (ra_oid_ioctl(ifname, RT_OID_VERSION_INFO, data, sizeof(data)) < 0)
+ return -1;
+ if (is_5g(ifname))
+ {
+ *buf |= IWINFO_80211_A;
+ *buf |= IWINFO_80211_N;
+ *buf |= IWINFO_80211_AC;
+ }
+ else
+ {
+ *buf |= IWINFO_80211_B;
+ *buf |= IWINFO_80211_G;
+ *buf |= IWINFO_80211_N;
+ }
+
+ return 0;
+}
+
+int ra_get_htmodelist(const char *ifname, int *buf) {
+ *buf = IWINFO_HTMODE_HT20 | IWINFO_HTMODE_HT40 | IWINFO_HTMODE_VHT20 | IWINFO_HTMODE_VHT40 | IWINFO_HTMODE_VHT80;
+
+ return 0;
+}
+
+int ra_get_mbssid_support(const char *ifname, int *buf)
+{
+ char data[10];
+
+ if (ra_oid_ioctl(ifname, RT_OID_VERSION_INFO, data, sizeof(data)) < 0)
+ return -1;
+ *buf = 1;
+ return 0;
+}
+
+int iwinfo_hardware_id_from_mtd(struct iwinfo_hardware_id *id);
+
+int ra_get_hardware_id(const char *ifname, char *buf)
+{
+ struct iwinfo_hardware_id *id = (struct iwinfo_hardware_id *)buf;
+ memset(id, 0, sizeof(struct iwinfo_hardware_id));
+ char data[10];
+ if (ra_oid_ioctl(ifname, RT_OID_VERSION_INFO, data, sizeof(data)) < 0)
+ return -1;
+ return iwinfo_hardware_id_from_mtd(id);
+}
+
+struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id);
+
+int ra_get_hardware_name(const char *ifname, char *buf)
+{
+ struct iwinfo_hardware_id id;
+ struct iwinfo_hardware_entry *e;
+
+ if (ra_get_hardware_id(ifname, (char *)&id))
+ return -1;
+
+ e = iwinfo_hardware(&id);
+ if (!e)
+ return -1;
+
+ strcpy(buf, e->device_name);
+
+ return 0;
+}
+
+int ra_get_txpower_offset(const char *ifname, int *buf)
+{
+ /* Stub */
+ *buf = 0;
+ return -1;
+}
+
+int ra_get_frequency_offset(const char *ifname, int *buf)
+{
+ return ra_get_frequency(ifname, buf);
+}
--- /dev/null
+++ b/iwinfo_ra.h
@@ -0,0 +1,74 @@
+#ifndef __IWINFO_RA_H_
+#define __IWINFO_RA_H_
+
+#include <fcntl.h>
+
+#include "iwinfo.h"
+#include "iwinfo/utils.h"
+
+
+#include "api/ralink.h"
+
+int ra_probe(const char *ifname);
+int ra_get_mode(const char *ifname, int *buf);
+int ra_get_ssid(const char *ifname, char *buf);
+int ra_get_bssid(const char *ifname, char *buf);
+int ra_get_country(const char *ifname, char *buf);
+int ra_get_channel(const char *ifname, int *buf);
+int ra_get_frequency(const char *ifname, int *buf);
+int ra_get_frequency_offset(const char *ifname, int *buf);
+int ra_get_txpower(const char *ifname, int *buf);
+int ra_get_txpower_offset(const char *ifname, int *buf);
+int ra_get_bitrate(const char *ifname, int *buf);
+int ra_get_signal(const char *ifname, int *buf);
+int ra_get_noise(const char *ifname, int *buf);
+int ra_get_quality(const char *ifname, int *buf);
+int ra_get_quality_max(const char *ifname, int *buf);
+int ra_get_enctype(const char *ifname, char *buf);
+int ra_get_encryption(const char *ifname, char *buf);
+int ra_get_phyname(const char *ifname, char *buf);
+int ra_get_assoclist(const char *ifname, char *buf, int *len);
+int ra_get_txpwrlist(const char *ifname, char *buf, int *len);
+int ra_get_scanlist(const char *ifname, char *buf, int *len);
+int ra_get_freqlist(const char *ifname, char *buf, int *len);
+int ra_get_countrylist(const char *ifname, char *buf, int *len);
+int ra_get_hwmodelist(const char *ifname, int *buf);
+int ra_get_htmodelist(const char *ifname, int *buf);
+int ra_get_mbssid_support(const char *ifname, int *buf);
+int ra_get_hardware_id(const char *ifname, char *buf);
+int ra_get_hardware_name(const char *ifname, char *buf);
+void ra_close(void);
+
+const struct iwinfo_ops ra_ops = {
+ .name = "ra",
+ .probe = ra_probe,
+ .channel = ra_get_channel,
+ .frequency = ra_get_frequency,
+ .frequency_offset = ra_get_frequency_offset,
+ .txpower = ra_get_txpower,
+ .txpower_offset = ra_get_txpower_offset,
+ .bitrate = ra_get_bitrate,
+ .signal = ra_get_signal,
+ .noise = ra_get_noise,
+ .quality = ra_get_quality,
+ .quality_max = ra_get_quality_max,
+ .mbssid_support = ra_get_mbssid_support,
+ .hwmodelist = ra_get_hwmodelist,
+ .htmodelist = ra_get_htmodelist,
+ .mode = ra_get_mode,
+ .ssid = ra_get_ssid,
+ .bssid = ra_get_bssid,
+ .country = ra_get_country,
+ .hardware_id = ra_get_hardware_id,
+ .hardware_name = ra_get_hardware_name,
+ .encryption = ra_get_encryption,
+ .phyname = ra_get_phyname,
+ .assoclist = ra_get_assoclist,
+ .txpwrlist = ra_get_txpwrlist,
+ .scanlist = ra_get_scanlist,
+ .freqlist = ra_get_freqlist,
+ .countrylist = ra_get_countrylist,
+ .close = ra_close
+};
+
+#endif
--- a/iwinfo_wext.c
+++ b/iwinfo_wext.c
@@ -185,7 +185,7 @@ static int wext_get_channel(const char *
return -1;
}
-static int wext_get_frequency(const char *ifname, int *buf)
+int wext_get_frequency(const char *ifname, int *buf)
{
struct iwreq wrq;
struct iw_range range;
@@ -282,7 +282,7 @@ static int wext_get_noise(const char *if
return -1;
}
-static int wext_get_quality(const char *ifname, int *buf)
+int wext_get_quality(const char *ifname, int *buf)
{
struct iwreq wrq;
struct iw_statistics stats;
@@ -300,7 +300,7 @@ static int wext_get_quality(const char *
return -1;
}
-static int wext_get_quality_max(const char *ifname, int *buf)
+int wext_get_quality_max(const char *ifname, int *buf)
{
struct iwreq wrq;
struct iw_range range;
@@ -365,7 +365,7 @@ static int wext_get_txpwrlist(const char
return -1;
}
-static int wext_get_freqlist(const char *ifname, char *buf, int *len)
+int wext_get_freqlist(const char *ifname, char *buf, int *len)
{
struct iwreq wrq;
struct iw_range range;
@@ -409,7 +409,7 @@ static int wext_get_countrylist(const ch
return -1;
}
-static int wext_get_hwmodelist(const char *ifname, int *buf)
+int wext_get_hwmodelist(const char *ifname, int *buf)
{
char chans[IWINFO_BUFSIZE] = { 0 };
struct iwinfo_freqlist_entry *e = NULL;
--- a/Makefile
+++ b/Makefile
@@ -32,6 +32,15 @@ ifneq ($(filter nl80211,$(IWINFO_BACKEND
IWINFO_LIB_OBJ += iwinfo_nl80211.o
endif
+ifneq ($(filter ra,$(IWINFO_BACKENDS)),)
+ IWINFO_CFLAGS += -DUSE_RA
+ IWINFO_LIB_OBJ += iwinfo_ra.o
+endif
+
+ifneq ($(filter rt2860v2,$(IWINFO_BACKENDS)),)
+ IWINFO_CFLAGS += -DUSE_RA -DUSE_RT2860
+ IWINFO_LIB_OBJ += iwinfo_ra.o
+endif
%.o: %.c
$(CC) $(IWINFO_CFLAGS) $(FPIC) -c -o $@ $<
--- a/hardware.txt
+++ b/hardware.txt
@@ -173,6 +173,36 @@
0x1814 0x3662 0x1814 0x000d 0 0 "Ralink" "Rt3662"
0x1814 0x3883 0x1814 0x000d 0 0 "Ralink" "Rt3883"
0x1814 0x5350 0x1814 0x000f 0 0 "Ralink" "Rt5350"
+/* MT7620 */
+0x1814 0x7620 0x1814 0x0000 0 0 "Mediatek" "MT7620"
+0x1814 0x7620 0x1814 0xffff 0 0 "Mediatek" "MT7620"
+0x1814 0x7620 0x1814 0x7620 0 0 "Mediatek" "MT7620"
+/* MT7610 */
+0x1814 0x7610 0x1814 0x0000 0 0 "Mediatek" "MT7610"
+0x1814 0x7610 0x1814 0xffff 0 0 "Mediatek" "MT7610"
+0x1814 0x7610 0x1814 0x7610 0 0 "Mediatek" "MT7610"
+/* MT7602/MT7612/MT7662 */
+0x1814 0x7662 0x1814 0x0000 0 0 "Mediatek" "MT7612"
+0x1814 0x7662 0x1814 0xffff 0 0 "Mediatek" "MT7612"
+0x1814 0x7662 0x1814 0x7602 0 0 "Mediatek" "MT7602"
+0x1814 0x7662 0x1814 0x7612 0 0 "Mediatek" "MT7612"
+0x1814 0x7662 0x1814 0x7662 0 0 "Mediatek" "MT7662"
+/* MT7603 */
+0x1814 0x7603 0x1814 0x0000 0 0 "Mediatek" "MT7603"
+0x1814 0x7603 0x1814 0xffff 0 0 "Mediatek" "MT7603"
+0x1814 0x7603 0x1814 0x7603 0 0 "Mediatek" "MT7603"
+/* MT7628/MT7688 */
+0x1814 0x7628 0x1814 0x0000 0 0 "Mediatek" "MT7628"
+0x1814 0x7628 0x1814 0xffff 0 0 "Mediatek" "MT7628"
+0x1814 0x7628 0x1814 0x7628 0 0 "Mediatek" "MT7628"
+0x1814 0x7628 0x1814 0x7688 0 0 "Mediatek" "MT7688"
+/* MT7615 */
+0x1814 0x7615 0x1814 0x0000 0 0 "Mediatek" "MT7615"
+0x1814 0x7615 0x1814 0xffff 0 0 "Mediatek" "MT7615"
+0x1814 0x7615 0x1814 0x7615 0 0 "Mediatek" "MT7615"
+
+0x14c3 0x7615 0x14c3 0x0000 0 0 "MediaTek" "MT7615E"
+
0x11ab 0x2a55 0x11ab 0x0000 0 0 "Marvell" "88W8864"
0x02df 0x9135 0x0000 0x0000 0 0 "Marvell" "88W8887"
0x11ab 0x2b40 0x11ab 0x0000 0 0 "Marvell" "88W8964"
--- a/iwinfo_utils.c
+++ b/iwinfo_utils.c
@@ -259,7 +259,8 @@ int iwinfo_hardware_id_from_mtd(struct i
/* subsystem from EEPROM_NIC_CONF0_RF_TYPE */
id->subsystem_device_id = (bc[off + 0x1a] & 0x0f00) >> 8;
- } else if ((bc[off] == 0x7620) || (bc[off] == 0x2076) ||
+ } else if ((bc[off] == 0x7615) || (bc[off] == 0x1576) ||
+ (bc[off] == 0x7620) || (bc[off] == 0x2076) ||
(bc[off] == 0x7628) || (bc[off] == 0x2876) ||
(bc[off] == 0x7688) || (bc[off] == 0x8876)) {
/* vendor: MediaTek */