summaryrefslogtreecommitdiff
path: root/package/network/utils/iwinfo
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/utils/iwinfo')
-rw-r--r--package/network/utils/iwinfo/Makefile7
-rwxr-xr-xpackage/network/utils/iwinfo/src/api/mtk.h62
-rw-r--r--package/network/utils/iwinfo/src/iwinfo_nl80211.c72
-rw-r--r--package/network/utils/iwinfo/src/iwinfo_wext.c13
4 files changed, 147 insertions, 7 deletions
diff --git a/package/network/utils/iwinfo/Makefile b/package/network/utils/iwinfo/Makefile
index e4ee73a..955011a 100644
--- a/package/network/utils/iwinfo/Makefile
+++ b/package/network/utils/iwinfo/Makefile
@@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=libiwinfo
-PKG_RELEASE:=50
+PKG_RELEASE:=51
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
PKG_CONFIG_DEPENDS := \
@@ -24,7 +24,7 @@ define Package/libiwinfo
SECTION:=libs
CATEGORY:=Libraries
TITLE:=Generalized Wireless Information Library (iwinfo)
- DEPENDS:=+PACKAGE_kmod-mac80211:libnl-tiny
+ DEPENDS:=+PACKAGE_kmod-mac80211:libnl-tiny +libnl-tiny
ABI_VERSION:=$(PKG_RELEASE)
MAINTAINER:=Jo-Philipp Wich <xm@subsignal.org>
endef
@@ -76,7 +76,8 @@ IWINFO_BACKENDS := \
$(if $(CONFIG_PACKAGE_kmod-brcm-wl-mini),wl) \
$(if $(CONFIG_PACKAGE_kmod-brcm-wl-mimo),wl) \
$(if $(CONFIG_PACKAGE_kmod-madwifi),madwifi) \
- $(if $(CONFIG_PACKAGE_kmod-mac80211),nl80211)
+ $(if $(CONFIG_PACKAGE_kmod-mac80211),nl80211) \
+ nl80211
TARGET_CFLAGS += \
-I$(STAGING_DIR)/usr/include/libnl-tiny \
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;
}