diff options
Diffstat (limited to 'package/network/utils/iw')
5 files changed, 253 insertions, 0 deletions
diff --git a/package/network/utils/iw/Makefile b/package/network/utils/iw/Makefile new file mode 100644 index 000000000..1ee886164 --- /dev/null +++ b/package/network/utils/iw/Makefile @@ -0,0 +1,56 @@ +# +# Copyright (C) 2007-2011 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=iw +PKG_VERSION:=3.10 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=https://www.kernel.org/pub/software/network/iw +PKG_MD5SUM:=0dc736963455937278b10fe8a2157e47 + +PKG_MAINTAINER:=Felix Fietkau <nbd@openwrt.org> + +include $(INCLUDE_DIR)/package.mk + +define Package/iw + SECTION:=net + CATEGORY:=Network + TITLE:=cfg80211 interface configuration utility + URL:=http://wireless.kernel.org/en/users/Documentation/iw + DEPENDS:= +libnl-tiny @(!TARGET_avr32||BROKEN) +endef + +define Build/Configure + echo "const char iw_version[] = \"$(PKG_VERSION)\";" > $(PKG_BUILD_DIR)/version.c + rm -f $(PKG_BUILD_DIR)/version.sh + touch $(PKG_BUILD_DIR)/version.sh + chmod +x $(PKG_BUILD_DIR)/version.sh +endef + +TARGET_CPPFLAGS:= \ + -I$(STAGING_DIR)/usr/include/libnl-tiny \ + $(TARGET_CPPFLAGS) \ + -DCONFIG_LIBNL20 \ + -D_GNU_SOURCE + +MAKE_FLAGS += \ + CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \ + LDFLAGS="$(TARGET_LDFLAGS)" \ + NL1FOUND="" NL2FOUND=Y \ + NLLIBNAME="libnl-tiny" \ + LIBS="-lm -lnl-tiny" \ + V=1 + +define Package/iw/install + $(INSTALL_DIR) $(1)/usr/sbin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/iw $(1)/usr/sbin/ +endef + +$(eval $(call BuildPackage,iw)) diff --git a/package/network/utils/iw/patches/001-nl80211_h_sync.patch b/package/network/utils/iw/patches/001-nl80211_h_sync.patch new file mode 100644 index 000000000..e20484ac2 --- /dev/null +++ b/package/network/utils/iw/patches/001-nl80211_h_sync.patch @@ -0,0 +1,32 @@ +--- a/nl80211.h ++++ b/nl80211.h +@@ -1724,8 +1724,7 @@ enum nl80211_attrs { + NL80211_ATTR_MDID, + NL80211_ATTR_IE_RIC, + +- NL80211_ATTR_CRIT_PROT_ID, +- NL80211_ATTR_MAX_CRIT_PROT_DURATION, ++ NL80211_ATTR_WIPHY_ANTENNA_GAIN, + + /* add attributes here, update the policy in nl80211.c */ + +@@ -1991,6 +1990,10 @@ enum nl80211_sta_bss_param { + * @NL80211_STA_INFO_PEER_PM: peer mesh STA link-specific power mode + * @NL80211_STA_INFO_NONPEER_PM: neighbor mesh STA power save mode towards + * non-peer STA ++ * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU ++ * Contains a nested array of signal strength attributes (u8, dBm) ++ * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average ++ * Same format as NL80211_STA_INFO_CHAIN_SIGNAL. + * @__NL80211_STA_INFO_AFTER_LAST: internal + * @NL80211_STA_INFO_MAX: highest possible station info attribute + */ +@@ -2020,6 +2023,8 @@ enum nl80211_sta_info { + NL80211_STA_INFO_NONPEER_PM, + NL80211_STA_INFO_RX_BYTES64, + NL80211_STA_INFO_TX_BYTES64, ++ NL80211_STA_INFO_CHAIN_SIGNAL, ++ NL80211_STA_INFO_CHAIN_SIGNAL_AVG, + + /* keep last */ + __NL80211_STA_INFO_AFTER_LAST, diff --git a/package/network/utils/iw/patches/100-rx_rate.patch b/package/network/utils/iw/patches/100-rx_rate.patch new file mode 100644 index 000000000..cc23e0750 --- /dev/null +++ b/package/network/utils/iw/patches/100-rx_rate.patch @@ -0,0 +1,60 @@ +--- a/station.c ++++ b/station.c +@@ -43,7 +43,7 @@ static void print_power_mode(struct nlat + } + } + +-void parse_tx_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen) ++void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen) + { + int rate = 0; + char *pos = buf; +@@ -107,6 +107,7 @@ static int print_sta_handler(struct nl_m + [NL80211_STA_INFO_SIGNAL] = { .type = NLA_U8 }, + [NL80211_STA_INFO_T_OFFSET] = { .type = NLA_U64 }, + [NL80211_STA_INFO_TX_BITRATE] = { .type = NLA_NESTED }, ++ [NL80211_STA_INFO_RX_BITRATE] = { .type = NLA_NESTED }, + [NL80211_STA_INFO_LLID] = { .type = NLA_U16 }, + [NL80211_STA_INFO_PLID] = { .type = NLA_U16 }, + [NL80211_STA_INFO_PLINK_STATE] = { .type = NLA_U8 }, +@@ -177,10 +178,17 @@ static int print_sta_handler(struct nl_m + if (sinfo[NL80211_STA_INFO_TX_BITRATE]) { + char buf[100]; + +- parse_tx_bitrate(sinfo[NL80211_STA_INFO_TX_BITRATE], buf, sizeof(buf)); ++ parse_bitrate(sinfo[NL80211_STA_INFO_TX_BITRATE], buf, sizeof(buf)); + printf("\n\ttx bitrate:\t%s", buf); + } + ++ if (sinfo[NL80211_STA_INFO_RX_BITRATE]) { ++ char buf[100]; ++ ++ parse_bitrate(sinfo[NL80211_STA_INFO_RX_BITRATE], buf, sizeof(buf)); ++ printf("\n\trx bitrate:\t%s", buf); ++ } ++ + if (sinfo[NL80211_STA_INFO_LLID]) + printf("\n\tmesh llid:\t%d", + nla_get_u16(sinfo[NL80211_STA_INFO_LLID])); +--- a/iw.h ++++ b/iw.h +@@ -170,7 +170,7 @@ enum print_ie_type { + void print_ies(unsigned char *ie, int ielen, bool unknown, + enum print_ie_type ptype); + +-void parse_tx_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen); ++void parse_bitrate(struct nlattr *bitrate_attr, char *buf, int buflen); + + DECLARE_SECTION(set); + DECLARE_SECTION(get); +--- a/link.c ++++ b/link.c +@@ -165,7 +165,7 @@ static int print_link_sta(struct nl_msg + if (sinfo[NL80211_STA_INFO_TX_BITRATE]) { + char buf[100]; + +- parse_tx_bitrate(sinfo[NL80211_STA_INFO_TX_BITRATE], buf, sizeof(buf)); ++ parse_bitrate(sinfo[NL80211_STA_INFO_TX_BITRATE], buf, sizeof(buf)); + printf("\ttx bitrate: %s\n", buf); + } + diff --git a/package/network/utils/iw/patches/110-per_chain_signal_strength.patch b/package/network/utils/iw/patches/110-per_chain_signal_strength.patch new file mode 100644 index 000000000..e519a86c6 --- /dev/null +++ b/package/network/utils/iw/patches/110-per_chain_signal_strength.patch @@ -0,0 +1,71 @@ +--- a/station.c ++++ b/station.c +@@ -91,6 +91,33 @@ void parse_bitrate(struct nlattr *bitrat + " VHT-NSS %d", nla_get_u8(rinfo[NL80211_RATE_INFO_VHT_NSS])); + } + ++static char *get_chain_signal(struct nlattr *attr_list) ++{ ++ struct nlattr *attr; ++ static char buf[64]; ++ char *cur = buf; ++ int i = 0, rem; ++ const char *prefix; ++ ++ if (!attr_list) ++ return ""; ++ ++ nla_for_each_nested(attr, attr_list, rem) { ++ if (i++ > 0) ++ prefix = ", "; ++ else ++ prefix = "["; ++ ++ cur += snprintf(cur, sizeof(buf) - (cur - buf), "%s%d", prefix, ++ (int8_t) nla_get_u8(attr)); ++ } ++ ++ if (i) ++ snprintf(cur, sizeof(buf) - (cur - buf), "] "); ++ ++ return buf; ++} ++ + static int print_sta_handler(struct nl_msg *msg, void *arg) + { + struct nlattr *tb[NL80211_ATTR_MAX + 1]; +@@ -118,7 +145,10 @@ static int print_sta_handler(struct nl_m + [NL80211_STA_INFO_LOCAL_PM] = { .type = NLA_U32}, + [NL80211_STA_INFO_PEER_PM] = { .type = NLA_U32}, + [NL80211_STA_INFO_NONPEER_PM] = { .type = NLA_U32}, ++ [NL80211_STA_INFO_CHAIN_SIGNAL] = { .type = NLA_NESTED }, ++ [NL80211_STA_INFO_CHAIN_SIGNAL_AVG] = { .type = NLA_NESTED }, + }; ++ char *chain; + + nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); +@@ -165,12 +195,19 @@ static int print_sta_handler(struct nl_m + if (sinfo[NL80211_STA_INFO_TX_FAILED]) + printf("\n\ttx failed:\t%u", + nla_get_u32(sinfo[NL80211_STA_INFO_TX_FAILED])); ++ ++ chain = get_chain_signal(sinfo[NL80211_STA_INFO_CHAIN_SIGNAL]); + if (sinfo[NL80211_STA_INFO_SIGNAL]) +- printf("\n\tsignal: \t%d dBm", +- (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL])); ++ printf("\n\tsignal: \t%d %sdBm", ++ (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL]), ++ chain); ++ ++ chain = get_chain_signal(sinfo[NL80211_STA_INFO_CHAIN_SIGNAL_AVG]); + if (sinfo[NL80211_STA_INFO_SIGNAL_AVG]) +- printf("\n\tsignal avg:\t%d dBm", +- (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL_AVG])); ++ printf("\n\tsignal avg:\t%d %sdBm", ++ (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL_AVG]), ++ chain); ++ + if (sinfo[NL80211_STA_INFO_T_OFFSET]) + printf("\n\tToffset:\t%lld us", + (unsigned long long)nla_get_u64(sinfo[NL80211_STA_INFO_T_OFFSET])); diff --git a/package/network/utils/iw/patches/120-antenna_gain.patch b/package/network/utils/iw/patches/120-antenna_gain.patch new file mode 100644 index 000000000..36043611d --- /dev/null +++ b/package/network/utils/iw/patches/120-antenna_gain.patch @@ -0,0 +1,34 @@ +--- a/phy.c ++++ b/phy.c +@@ -421,3 +421,31 @@ COMMAND(set, antenna, "<bitmap> | all | + NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_antenna, + "Set a bitmap of allowed antennas to use for TX and RX.\n" + "The driver may reject antenna configurations it cannot support."); ++ ++static int handle_antenna_gain(struct nl80211_state *state, ++ struct nl_cb *cb, ++ struct nl_msg *msg, ++ int argc, char **argv, ++ enum id_input id) ++{ ++ char *endptr; ++ int dbm; ++ ++ /* get the required args */ ++ if (argc != 1) ++ return 1; ++ ++ dbm = strtol(argv[0], &endptr, 10); ++ if (*endptr) ++ return 2; ++ ++ NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_GAIN, dbm); ++ ++ return 0; ++ ++ nla_put_failure: ++ return -ENOBUFS; ++} ++COMMAND(set, antenna_gain, "<antenna gain in dBm>", ++ NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_antenna_gain, ++ "Specify antenna gain."); |