diff options
Diffstat (limited to 'package/network/utils/iwinfo/src')
-rwxr-xr-x | package/network/utils/iwinfo/src/api/mtk.h | 62 | ||||
-rw-r--r-- | package/network/utils/iwinfo/src/iwinfo_nl80211.c | 72 | ||||
-rw-r--r-- | package/network/utils/iwinfo/src/iwinfo_wext.c | 13 |
3 files changed, 143 insertions, 4 deletions
diff --git a/package/network/utils/iwinfo/src/api/mtk.h b/package/network/utils/iwinfo/src/api/mtk.h new file mode 100755 index 0000000..ca5dbe4 --- /dev/null +++ b/package/network/utils/iwinfo/src/api/mtk.h @@ -0,0 +1,62 @@ +#ifndef __MTK_H__ +#define __MTK_H__ + +#define MAC_ADDR_LENGTH 6 +#define MAX_NUMBER_OF_MAC 32 +typedef unsigned char UCHAR; +typedef char CHAR; +typedef unsigned int UINT32; +typedef unsigned short USHORT; +typedef short SHORT; +typedef unsigned long ULONG; + +#if WIRELESS_EXT <= 11 +#ifndef SIOCDEVPRIVATE +#define SIOCDEVPRIVATE 0x8BE0 +#endif +#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE +#endif + +#define RTPRIV_IOCTL_GET_MAC_TABLE (SIOCIWFIRSTPRIV + 0x0F) +#define RTPRIV_IOCTL_GET_MAC_TABLE_STRUCT (SIOCIWFIRSTPRIV + 0x1F) /* modified by Red@Ralink, 2009/09/30 */ + + +/* MIMO Tx parameter, ShortGI, MCS, STBC, etc. these are fields in TXWI. Don't change this definition!!! */ +typedef union _MACHTTRANSMIT_SETTING { + struct { + USHORT MCS:7; /* MCS */ + USHORT BW:1; /*channel bandwidth 20MHz or 40 MHz */ + USHORT ShortGI:1; + USHORT STBC:2; /*SPACE */ + USHORT rsv:3; + USHORT MODE:2; /* Use definition MODE_xxx. */ + } field; + USHORT word; +} MACHTTRANSMIT_SETTING, *PMACHTTRANSMIT_SETTING; + +typedef struct _RT_802_11_MAC_ENTRY { + UCHAR ApIdx; + UCHAR Addr[MAC_ADDR_LENGTH]; + UCHAR Aid; + UCHAR Psm; /* 0:PWR_ACTIVE, 1:PWR_SAVE */ + UCHAR MimoPs; /* 0:MMPS_STATIC, 1:MMPS_DYNAMIC, 3:MMPS_Enabled */ + CHAR AvgRssi0; + CHAR AvgRssi1; + CHAR AvgRssi2; + UINT32 ConnectedTime; + MACHTTRANSMIT_SETTING TxRate; + UINT32 LastRxRate; + SHORT StreamSnr[3]; /* BF SNR from RXWI. Units=0.25 dB. 22 dB offset removed */ + SHORT SoundingRespSnr[3]; /* SNR from Sounding Response. Units=0.25 dB. 22 dB offset removed */ +/* SHORT TxPER; */ /* TX PER over the last second. Percent */ +/* SHORT reserved;*/ +} RT_802_11_MAC_ENTRY, *PRT_802_11_MAC_ENTRY; + +typedef struct _RT_802_11_MAC_TABLE { + ULONG Num; + RT_802_11_MAC_ENTRY Entry[MAX_NUMBER_OF_MAC]; +} RT_802_11_MAC_TABLE, *PRT_802_11_MAC_TABLE; + + +#endif // __MTK_H__ + diff --git a/package/network/utils/iwinfo/src/iwinfo_nl80211.c b/package/network/utils/iwinfo/src/iwinfo_nl80211.c index 33c6238..d69dc3d 100644 --- a/package/network/utils/iwinfo/src/iwinfo_nl80211.c +++ b/package/network/utils/iwinfo/src/iwinfo_nl80211.c @@ -1146,6 +1146,7 @@ static void nl80211_fill_signal(const char *ifname, struct nl80211_rssi_rate *r) static int nl80211_get_bitrate(const char *ifname, int *buf) { +#if 0 struct nl80211_rssi_rate rr; nl80211_fill_signal(ifname, &rr); @@ -1157,10 +1158,14 @@ static int nl80211_get_bitrate(const char *ifname, int *buf) } return -1; +#endif + return wext_ops.bitrate(ifname, buf); + } static int nl80211_get_signal(const char *ifname, int *buf) { +#if 0 struct nl80211_rssi_rate rr; nl80211_fill_signal(ifname, &rr); @@ -1172,6 +1177,8 @@ static int nl80211_get_signal(const char *ifname, int *buf) } return -1; +#endif + return wext_ops.signal(ifname, buf); } static int nl80211_get_noise_cb(struct nl_msg *msg, void *arg) @@ -1881,11 +1888,70 @@ static int nl80211_get_scanlist_nl(const char *ifname, char *buf, int *len) return *len ? 0 : -1; } +static int wpasupp_ssid_decode(const char *in, char *out, int outlen) +{ +#define hex(x) \ + (((x) >= 'a') ? ((x) - 'a' + 10) : \ + (((x) >= 'A') ? ((x) - 'A' + 10) : ((x) - '0'))) + + int len = 0; + + while (*in) + { + if (len + 1 >= outlen) + break; + + switch (*in) + { + case '\\': + in++; + switch (*in) + { + case 'n': + out[len++] = '\n'; in++; + break; + + case 'r': + out[len++] = '\r'; in++; + break; + + case 't': + out[len++] = '\t'; in++; + break; + + case 'e': + out[len++] = '\e'; in++; + break; + + case 'x': + if (isxdigit(*(in+1)) && isxdigit(*(in+2))) + out[len++] = hex(*(in+1)) * 16 + hex(*(in+2)); + in += 3; + break; + + default: + out[len++] = *in++; + break; + } + break; + + default: + out[len++] = *in++; + break; + } + } + + if (outlen > len) + out[len] = '\0'; + + return len; +} + static int nl80211_get_scanlist(const char *ifname, char *buf, int *len) { int freq, rssi, qmax, count, mode; char *res; - char ssid[128] = { 0 }; + char ssid[129] = { 0 }; char bssid[18] = { 0 }; char cipher[256] = { 0 }; @@ -1930,7 +1996,7 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len) count++; goto nextline; } - if (sscanf(res, "%17s %d %d %255s%*[ \t]%127[^\n]\n", + if (sscanf(res, "%17s %d %d %255s%*[ \t]%128[^\n]\n", bssid, &freq, &rssi, cipher, ssid) < 5) { /* skip malformed lines */ @@ -1945,7 +2011,7 @@ static int nl80211_get_scanlist(const char *ifname, char *buf, int *len) e->mac[5] = strtol(&bssid[15], NULL, 16); /* SSID */ - memcpy(e->ssid, ssid, min(strlen(ssid), sizeof(e->ssid) - 1)); + wpasupp_ssid_decode(ssid, e->ssid, sizeof(e->ssid)); /* Mode (assume master) */ if (strstr(cipher,"[MESH]")) diff --git a/package/network/utils/iwinfo/src/iwinfo_wext.c b/package/network/utils/iwinfo/src/iwinfo_wext.c index a6cc516..a4b94e3 100644 --- a/package/network/utils/iwinfo/src/iwinfo_wext.c +++ b/package/network/utils/iwinfo/src/iwinfo_wext.c @@ -123,7 +123,16 @@ static int wext_get_bssid(const char *ifname, char *buf) { struct iwreq wrq; - if(wext_ioctl(ifname, SIOCGIWAP, &wrq) >= 0) + char cmd[256]; + FILE *fp = NULL; + + memset(cmd, 0, sizeof(cmd)); + sprintf(cmd, "ifconfig %s | grep UP", ifname); + fp = popen(cmd, "r"); + fscanf(fp, "%s\n", buf); + pclose(fp); + + if(strlen(buf)>=2 && wext_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], @@ -132,6 +141,8 @@ static int wext_get_bssid(const char *ifname, char *buf) return 0; } + else + sprintf(buf, "00:00:00:00:00:00"); return -1; } |