diff options
Diffstat (limited to 'package/mac80211/patches/024-nl80211-get-sta.patch')
-rw-r--r-- | package/mac80211/patches/024-nl80211-get-sta.patch | 208 |
1 files changed, 0 insertions, 208 deletions
diff --git a/package/mac80211/patches/024-nl80211-get-sta.patch b/package/mac80211/patches/024-nl80211-get-sta.patch deleted file mode 100644 index 198ad1876b..0000000000 --- a/package/mac80211/patches/024-nl80211-get-sta.patch +++ /dev/null @@ -1,208 +0,0 @@ -Subject: cfg80211/nl80211: implement station attribute retrieval - -After a station is added to the kernel's structures, userspace -has to be able to retrieve statistics about that station, especially -whether the station was idle and how much bytes were transferred -to and from it. This adds the necessary code to nl80211. - -Signed-off-by: Johannes Berg <johannes@sipsolutions.net> - ---- - include/linux/nl80211.h | 28 ++++++++++++++++ - include/net/cfg80211.h | 35 ++++++++++++++++++++ - net/wireless/nl80211.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++- - 3 files changed, 144 insertions(+), 1 deletion(-) - ---- everything.orig/include/linux/nl80211.h 2007-11-08 17:15:15.961529840 +0100 -+++ everything/include/linux/nl80211.h 2007-11-08 17:17:00.891547364 +0100 -@@ -157,6 +157,9 @@ enum nl80211_commands { - * restriction (at most %NL80211_MAX_SUPP_RATES). - * @NL80211_ATTR_STA_VLAN: interface index of VLAN interface to move station - * to, or the AP interface the station was originally added to to. -+ * @NL80211_ATTR_STA_STATS: statistics for a station, part of station info -+ * given for %NL80211_CMD_GET_STATION, nested attribute containing -+ * info as possible, see &enum nl80211_sta_stats. - * - * @NL80211_ATTR_MAX: highest attribute number currently defined - * @__NL80211_ATTR_AFTER_LAST: internal use -@@ -190,6 +193,7 @@ enum nl80211_attrs { - NL80211_ATTR_STA_LISTEN_INTERVAL, - NL80211_ATTR_STA_SUPPORTED_RATES, - NL80211_ATTR_STA_VLAN, -+ NL80211_ATTR_STA_STATS, - - /* add attributes here, update the policy in nl80211.c */ - -@@ -252,4 +256,28 @@ enum nl80211_sta_flags { - NL80211_STA_FLAG_MAX = __NL80211_STA_FLAG_AFTER_LAST - 1 - }; - -+/** -+ * enum nl80211_sta_stats - station statistics -+ * -+ * These attribute types are used with %NL80211_ATTR_STA_STATS -+ * when getting information about a station. -+ * -+ * @__NL80211_STA_STAT_INVALID: attribute number 0 is reserved -+ * @NL80211_STA_STAT_INACTIVE_TIME: time since last activity (u32, msecs) -+ * @NL80211_STA_STAT_RX_BYTES: total received bytes (u32, from this station) -+ * @NL80211_STA_STAT_TX_BYTES: total transmitted bytes (u32, to this station) -+ * @__NL80211_STA_STAT_AFTER_LAST: internal -+ * @NL80211_STA_STAT_MAX: highest possible station stats attribute -+ */ -+enum nl80211_sta_stats { -+ __NL80211_STA_STAT_INVALID, -+ NL80211_STA_STAT_INACTIVE_TIME, -+ NL80211_STA_STAT_RX_BYTES, -+ NL80211_STA_STAT_TX_BYTES, -+ -+ /* keep last */ -+ __NL80211_STA_STAT_AFTER_LAST, -+ NL80211_STA_STAT_MAX = __NL80211_STA_STAT_AFTER_LAST - 1 -+}; -+ - #endif /* __LINUX_NL80211_H */ ---- everything.orig/include/net/cfg80211.h 2007-11-08 17:15:15.971532444 +0100 -+++ everything/include/net/cfg80211.h 2007-11-08 17:17:00.891547364 +0100 -@@ -130,6 +130,39 @@ struct station_parameters { - u8 supported_rates_len; - }; - -+/** -+ * enum station_stats_flags - station statistics flags -+ * -+ * Used by the driver to indicate which info in &struct station_stats -+ * it has filled in during get_station(). -+ * -+ * @STATION_STAT_INACTIVE_TIME: @inactive_time filled -+ * @STATION_STAT_RX_BYTES: @rx_bytes filled -+ * @STATION_STAT_TX_BYTES: @tx_bytes filled -+ */ -+enum station_stats_flags { -+ STATION_STAT_INACTIVE_TIME = 1<<0, -+ STATION_STAT_RX_BYTES = 1<<1, -+ STATION_STAT_TX_BYTES = 1<<2, -+}; -+ -+/** -+ * struct station_stats - station statistics -+ * -+ * Station information filled by driver for get_station(). -+ * -+ * @filled: bitflag of flags from &enum station_stats_flags -+ * @inactive_time: time since last station activity (tx/rx) in milliseconds -+ * @rx_bytes: bytes received from this station -+ * @tx_bytes: bytes transmitted to this station -+ */ -+struct station_stats { -+ u32 filled; -+ u32 inactive_time; -+ u32 rx_bytes; -+ u32 tx_bytes; -+}; -+ - /* from net/wireless.h */ - struct wiphy; - -@@ -209,6 +242,8 @@ struct cfg80211_ops { - u8 *mac); - int (*change_station)(struct wiphy *wiphy, struct net_device *dev, - u8 *mac, struct station_parameters *params); -+ int (*get_station)(struct wiphy *wiphy, struct net_device *dev, -+ u8 *mac, struct station_stats *stats); - }; - - #endif /* __NET_CFG80211_H */ ---- everything.orig/net/wireless/nl80211.c 2007-11-08 17:15:15.981533909 +0100 -+++ everything/net/wireless/nl80211.c 2007-11-08 17:17:00.901534235 +0100 -@@ -751,9 +751,89 @@ static int parse_station_flags(struct nl - return 0; - } - -+static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq, -+ int flags, struct net_device *dev, -+ u8 *mac_addr, struct station_stats *stats) -+{ -+ void *hdr; -+ struct nlattr *statsattr; -+ -+ hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION); -+ if (!hdr) -+ return -1; -+ -+ NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, dev->ifindex); -+ NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr); -+ -+ statsattr = nla_nest_start(msg, NL80211_ATTR_STA_STATS); -+ if (!statsattr) -+ goto nla_put_failure; -+ if (stats->filled & STATION_STAT_INACTIVE_TIME) -+ NLA_PUT_U32(msg, NL80211_STA_STAT_INACTIVE_TIME, -+ stats->inactive_time); -+ if (stats->filled & STATION_STAT_RX_BYTES) -+ NLA_PUT_U32(msg, NL80211_STA_STAT_RX_BYTES, -+ stats->rx_bytes); -+ if (stats->filled & STATION_STAT_TX_BYTES) -+ NLA_PUT_U32(msg, NL80211_STA_STAT_TX_BYTES, -+ stats->tx_bytes); -+ -+ nla_nest_end(msg, statsattr); -+ -+ return genlmsg_end(msg, hdr); -+ -+ nla_put_failure: -+ return genlmsg_cancel(msg, hdr); -+} -+ -+ - static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) - { -- return -EOPNOTSUPP; -+ struct cfg80211_registered_device *drv; -+ int err; -+ struct net_device *dev; -+ struct station_stats stats; -+ struct sk_buff *msg; -+ u8 *mac_addr = NULL; -+ -+ memset(&stats, 0, sizeof(stats)); -+ -+ if (!info->attrs[NL80211_ATTR_MAC]) -+ return -EINVAL; -+ -+ mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]); -+ -+ err = get_drv_dev_by_info_ifindex(info, &drv, &dev); -+ if (err) -+ return err; -+ -+ if (!drv->ops->get_station) { -+ err = -EOPNOTSUPP; -+ goto out; -+ } -+ -+ rtnl_lock(); -+ err = drv->ops->get_station(&drv->wiphy, dev, mac_addr, &stats); -+ rtnl_unlock(); -+ -+ msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); -+ if (!msg) -+ goto out; -+ -+ if (nl80211_send_station(msg, info->snd_pid, info->snd_seq, 0, -+ dev, mac_addr, &stats) < 0) -+ goto out_free; -+ -+ err = genlmsg_unicast(msg, info->snd_pid); -+ goto out; -+ -+ out_free: -+ nlmsg_free(msg); -+ -+ out: -+ cfg80211_put_dev(drv); -+ dev_put(dev); -+ return err; - } - - /* |