diff options
Diffstat (limited to 'package/iw')
-rw-r--r-- | package/iw/Makefile | 54 | ||||
-rw-r--r-- | package/iw/patches/001-nl80211_h_sync.patch | 96 | ||||
-rw-r--r-- | package/iw/patches/100-rx_rate.patch | 105 | ||||
-rw-r--r-- | package/iw/patches/110-per_chain_signal_strength.patch | 71 | ||||
-rw-r--r-- | package/iw/patches/120-tdls_peer_indentation.patch | 11 | ||||
-rw-r--r-- | package/iw/patches/130-antenna_gain.patch | 34 |
6 files changed, 371 insertions, 0 deletions
diff --git a/package/iw/Makefile b/package/iw/Makefile new file mode 100644 index 000000000..f47d76b17 --- /dev/null +++ b/package/iw/Makefile @@ -0,0 +1,54 @@ +# +# 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.6 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_URL:=http://wireless.kernel.org/download/iw/ +PKG_MD5SUM:=1c18bfbbc8773629e5e8ac733a39540c + +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||TARGET_etrax)||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/iw/patches/001-nl80211_h_sync.patch b/package/iw/patches/001-nl80211_h_sync.patch new file mode 100644 index 000000000..8e776643b --- /dev/null +++ b/package/iw/patches/001-nl80211_h_sync.patch @@ -0,0 +1,96 @@ +--- a/nl80211.h ++++ b/nl80211.h +@@ -565,6 +565,14 @@ + * %NL80211_ATTR_IFINDEX is now on %NL80211_ATTR_WIPHY_FREQ with + * %NL80211_ATTR_WIPHY_CHANNEL_TYPE. + * ++ * @NL80211_CMD_START_P2P_DEVICE: Start the given P2P Device, identified by ++ * its %NL80211_ATTR_WDEV identifier. It must have been created with ++ * %NL80211_CMD_NEW_INTERFACE previously. After it has been started, the ++ * P2P Device can be used for P2P operations, e.g. remain-on-channel and ++ * public action frame TX. ++ * @NL80211_CMD_STOP_P2P_DEVICE: Stop the given P2P Device, identified by ++ * its %NL80211_ATTR_WDEV identifier. ++ * + * @NL80211_CMD_MAX: highest used command number + * @__NL80211_CMD_AFTER_LAST: internal use + */ +@@ -708,6 +716,9 @@ enum nl80211_commands { + + NL80211_CMD_CH_SWITCH_NOTIFY, + ++ NL80211_CMD_START_P2P_DEVICE, ++ NL80211_CMD_STOP_P2P_DEVICE, ++ + /* add new commands above here */ + + /* used to define NL80211_CMD_MAX below */ +@@ -1506,6 +1517,8 @@ enum nl80211_attrs { + + NL80211_ATTR_USER_REG_HINT_TYPE, + ++ NL80211_ATTR_WIPHY_ANTENNA_GAIN, ++ + /* add attributes here, update the policy in nl80211.c */ + + __NL80211_ATTR_AFTER_LAST, +@@ -1575,6 +1588,10 @@ enum nl80211_attrs { + * @NL80211_IFTYPE_MESH_POINT: mesh point + * @NL80211_IFTYPE_P2P_CLIENT: P2P client + * @NL80211_IFTYPE_P2P_GO: P2P group owner ++ * @NL80211_IFTYPE_P2P_DEVICE: P2P device interface type, this is not a netdev ++ * and therefore can't be created in the normal ways, use the ++ * %NL80211_CMD_START_P2P_DEVICE and %NL80211_CMD_STOP_P2P_DEVICE ++ * commands to create and destroy one + * @NL80211_IFTYPE_MAX: highest interface type number currently defined + * @NUM_NL80211_IFTYPES: number of defined interface types + * +@@ -1593,6 +1610,7 @@ enum nl80211_iftype { + NL80211_IFTYPE_MESH_POINT, + NL80211_IFTYPE_P2P_CLIENT, + NL80211_IFTYPE_P2P_GO, ++ NL80211_IFTYPE_P2P_DEVICE, + + /* keep last */ + NUM_NL80211_IFTYPES, +@@ -1744,6 +1762,8 @@ enum nl80211_sta_bss_param { + * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update. + * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32) + * @NL80211_STA_INFO_T_OFFSET: timing offset with respect to this STA (s64) ++ * @NL80211_STA_INFO_CHAIN_SIGNAL: per-chain signal strength of last PPDU ++ * @NL80211_STA_INFO_CHAIN_SIGNAL_AVG: per-chain signal strength average + * @__NL80211_STA_INFO_AFTER_LAST: internal + * @NL80211_STA_INFO_MAX: highest possible station info attribute + */ +@@ -1768,6 +1788,8 @@ enum nl80211_sta_info { + NL80211_STA_INFO_STA_FLAGS, + NL80211_STA_INFO_BEACON_LOSS, + NL80211_STA_INFO_T_OFFSET, ++ NL80211_STA_INFO_CHAIN_SIGNAL, ++ NL80211_STA_INFO_CHAIN_SIGNAL_AVG, + + /* keep last */ + __NL80211_STA_INFO_AFTER_LAST, +@@ -2994,12 +3016,18 @@ enum nl80211_ap_sme_features { + * @NL80211_FEATURE_CELL_BASE_REG_HINTS: This driver has been tested + * to work properly to suppport receiving regulatory hints from + * cellular base stations. ++ * @NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL: If this is set, an active ++ * P2P Device (%NL80211_IFTYPE_P2P_DEVICE) requires its own channel ++ * in the interface combinations, even when it's only used for scan ++ * and remain-on-channel. This could be due to, for example, the ++ * remain-on-channel implementation requiring a channel context. + */ + enum nl80211_feature_flags { +- NL80211_FEATURE_SK_TX_STATUS = 1 << 0, +- NL80211_FEATURE_HT_IBSS = 1 << 1, +- NL80211_FEATURE_INACTIVITY_TIMER = 1 << 2, +- NL80211_FEATURE_CELL_BASE_REG_HINTS = 1 << 3, ++ NL80211_FEATURE_SK_TX_STATUS = 1 << 0, ++ NL80211_FEATURE_HT_IBSS = 1 << 1, ++ NL80211_FEATURE_INACTIVITY_TIMER = 1 << 2, ++ NL80211_FEATURE_CELL_BASE_REG_HINTS = 1 << 3, ++ NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL = 1 << 4, + }; + + /** diff --git a/package/iw/patches/100-rx_rate.patch b/package/iw/patches/100-rx_rate.patch new file mode 100644 index 000000000..642b9f357 --- /dev/null +++ b/package/iw/patches/100-rx_rate.patch @@ -0,0 +1,105 @@ +--- a/station.c ++++ b/station.c +@@ -29,13 +29,47 @@ enum plink_actions { + PLINK_ACTION_BLOCK, + }; + ++static void print_sta_bitrate(struct nlattr *nla, const char *name) ++{ ++ struct nlattr *rinfo[NL80211_RATE_INFO_MAX + 1]; ++ ++ static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = { ++ [NL80211_RATE_INFO_BITRATE] = { .type = NLA_U16 }, ++ [NL80211_RATE_INFO_BITRATE32] = { .type = NLA_U32 }, ++ [NL80211_RATE_INFO_MCS] = { .type = NLA_U8 }, ++ [NL80211_RATE_INFO_40_MHZ_WIDTH] = { .type = NLA_FLAG }, ++ [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG }, ++ }; ++ ++ if (!nla) ++ return; ++ ++ if (nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX, nla, rate_policy)) { ++ fprintf(stderr, "failed to parse nested rate attributes!\n"); ++ } else { ++ int rate = 0; ++ printf("\n\t%s:\t", name); ++ if (rinfo[NL80211_RATE_INFO_BITRATE32]) ++ rate = nla_get_u32(rinfo[NL80211_RATE_INFO_BITRATE32]); ++ else if (rinfo[NL80211_RATE_INFO_BITRATE]) ++ rate = nla_get_u16(rinfo[NL80211_RATE_INFO_BITRATE]); ++ if (rate > 0) ++ printf("%d.%d MBit/s", rate / 10, rate % 10); ++ ++ if (rinfo[NL80211_RATE_INFO_MCS]) ++ printf(" MCS %d", nla_get_u8(rinfo[NL80211_RATE_INFO_MCS])); ++ if (rinfo[NL80211_RATE_INFO_40_MHZ_WIDTH]) ++ printf(" 40Mhz"); ++ if (rinfo[NL80211_RATE_INFO_SHORT_GI]) ++ printf(" short GI"); ++ } ++} + + static int print_sta_handler(struct nl_msg *msg, void *arg) + { + struct nlattr *tb[NL80211_ATTR_MAX + 1]; + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + struct nlattr *sinfo[NL80211_STA_INFO_MAX + 1]; +- struct nlattr *rinfo[NL80211_RATE_INFO_MAX + 1]; + char mac_addr[20], state_name[10], dev[20]; + struct nl80211_sta_flag_update *sta_flags; + static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = { +@@ -47,6 +81,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 }, +@@ -56,14 +91,6 @@ static int print_sta_handler(struct nl_m + { .minlen = sizeof(struct nl80211_sta_flag_update) }, + }; + +- static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = { +- [NL80211_RATE_INFO_BITRATE] = { .type = NLA_U16 }, +- [NL80211_RATE_INFO_BITRATE32] = { .type = NLA_U32 }, +- [NL80211_RATE_INFO_MCS] = { .type = NLA_U8 }, +- [NL80211_RATE_INFO_40_MHZ_WIDTH] = { .type = NLA_FLAG }, +- [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG }, +- }; +- + nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + +@@ -119,28 +146,8 @@ static int print_sta_handler(struct nl_m + printf("\n\tToffset:\t%lld us", + (unsigned long long)nla_get_u64(sinfo[NL80211_STA_INFO_T_OFFSET])); + +- if (sinfo[NL80211_STA_INFO_TX_BITRATE]) { +- if (nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX, +- sinfo[NL80211_STA_INFO_TX_BITRATE], rate_policy)) { +- fprintf(stderr, "failed to parse nested rate attributes!\n"); +- } else { +- int rate = 0; +- printf("\n\ttx bitrate:\t"); +- if (rinfo[NL80211_RATE_INFO_BITRATE32]) +- rate = nla_get_u32(rinfo[NL80211_RATE_INFO_BITRATE32]); +- else if (rinfo[NL80211_RATE_INFO_BITRATE]) +- rate = nla_get_u16(rinfo[NL80211_RATE_INFO_BITRATE]); +- if (rate > 0) +- printf("%d.%d MBit/s", rate / 10, rate % 10); +- +- if (rinfo[NL80211_RATE_INFO_MCS]) +- printf(" MCS %d", nla_get_u8(rinfo[NL80211_RATE_INFO_MCS])); +- if (rinfo[NL80211_RATE_INFO_40_MHZ_WIDTH]) +- printf(" 40Mhz"); +- if (rinfo[NL80211_RATE_INFO_SHORT_GI]) +- printf(" short GI"); +- } +- } ++ print_sta_bitrate(sinfo[NL80211_STA_INFO_TX_BITRATE], "tx bitrate"); ++ print_sta_bitrate(sinfo[NL80211_STA_INFO_RX_BITRATE], "rx bitrate"); + + if (sinfo[NL80211_STA_INFO_LLID]) + printf("\n\tmesh llid:\t%d", diff --git a/package/iw/patches/110-per_chain_signal_strength.patch b/package/iw/patches/110-per_chain_signal_strength.patch new file mode 100644 index 000000000..813a7d916 --- /dev/null +++ b/package/iw/patches/110-per_chain_signal_strength.patch @@ -0,0 +1,71 @@ +--- a/station.c ++++ b/station.c +@@ -65,6 +65,33 @@ static void print_sta_bitrate(struct nla + } + } + ++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]; +@@ -89,7 +116,10 @@ static int print_sta_handler(struct nl_m + [NL80211_STA_INFO_TX_FAILED] = { .type = NLA_U32 }, + [NL80211_STA_INFO_STA_FLAGS] = + { .minlen = sizeof(struct nl80211_sta_flag_update) }, ++ [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); +@@ -136,12 +166,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/iw/patches/120-tdls_peer_indentation.patch b/package/iw/patches/120-tdls_peer_indentation.patch new file mode 100644 index 000000000..68368734e --- /dev/null +++ b/package/iw/patches/120-tdls_peer_indentation.patch @@ -0,0 +1,11 @@ +--- a/station.c ++++ b/station.c +@@ -267,7 +267,7 @@ static int print_sta_handler(struct nl_m + } + + if (sta_flags->mask & BIT(NL80211_STA_FLAG_TDLS_PEER)) { +- printf("\n\tTDLS peer:\t\t"); ++ printf("\n\tTDLS peer:\t"); + if (sta_flags->set & BIT(NL80211_STA_FLAG_TDLS_PEER)) + printf("yes"); + else diff --git a/package/iw/patches/130-antenna_gain.patch b/package/iw/patches/130-antenna_gain.patch new file mode 100644 index 000000000..f3ca691e5 --- /dev/null +++ b/package/iw/patches/130-antenna_gain.patch @@ -0,0 +1,34 @@ +--- a/phy.c ++++ b/phy.c +@@ -359,3 +359,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."); |