Add support for sysfs attributes for rate_control modules. Signed-off-by: Jiri Benc <[EMAIL PROTECTED]>
--- net/d80211/ieee80211.c | 13 ++++++++++++- net/d80211/rate_control.c | 42 ++++++++++++++++++++++++++++++++++++++++++ net/d80211/rate_control.h | 36 ++++++++++++++++++++++++++++++++++++ net/d80211/sta_info.c | 4 ++++ 4 files changed, 94 insertions(+), 1 deletions(-) 9acfab1d1a4e4a82dace4055a089d605d5efa97f diff --git a/net/d80211/ieee80211.c b/net/d80211/ieee80211.c index 75aaa99..e4ac701 100644 --- a/net/d80211/ieee80211.c +++ b/net/d80211/ieee80211.c @@ -4215,6 +4215,13 @@ int ieee80211_register_hw(struct net_dev "algorithm\n", dev->name); goto fail_rate; } + result = rate_control_add_attrs(local, local->rate_ctrl_priv, + &local->class_dev.kobj); + if (result < 0) { + printk(KERN_DEBUG "%s: Failed to register sysfs attributes " + "for rate control\n", dev->name); + goto fail_rate_attrs; + } /* TODO: add rtnl locking around device creation and qdisc install */ ieee80211_install_qdisc(dev); @@ -4233,6 +4240,8 @@ int ieee80211_register_hw(struct net_dev return 0; +fail_rate_attrs: + rate_control_free(local); fail_rate: ieee80211_sysfs_remove_netdevice(dev); fail_if_sysfs: @@ -4308,6 +4317,8 @@ void ieee80211_unregister_hw(struct net_ rtnl_unlock(); sta_info_stop(local); + rate_control_remove_attrs(local, local->rate_ctrl_priv, + &local->class_dev.kobj); ieee80211_dev_sysfs_del(local); for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) @@ -4327,7 +4338,6 @@ void ieee80211_unregister_hw(struct net_ skb_queue_purge(&local->skb_queue); skb_queue_purge(&local->skb_queue_unreliable); - rate_control_free(local); ieee80211_dev_free_index(local); } @@ -4341,6 +4351,7 @@ void ieee80211_free_hw(struct net_device void ieee80211_release_hw(struct ieee80211_local *local) { + rate_control_free(local); kfree(local); } diff --git a/net/d80211/rate_control.c b/net/d80211/rate_control.c index e7e6791..33ba8e2 100644 --- a/net/d80211/rate_control.c +++ b/net/d80211/rate_control.c @@ -350,6 +350,46 @@ static int rate_control_simple_status_gl return 0; } +static ssize_t show_sta_tx_avg_rate_sum(const struct sta_info *sta, char *buf) +{ + struct sta_rate_control *srctrl = sta->rate_ctrl_priv; + + return sprintf(buf, "%d\n", srctrl->tx_avg_rate_sum); +} + +static ssize_t show_sta_tx_avg_rate_num(const struct sta_info *sta, char *buf) +{ + struct sta_rate_control *srctrl = sta->rate_ctrl_priv; + + return sprintf(buf, "%d\n", srctrl->tx_avg_rate_num); +} + +static struct sta_attribute sta_attr_tx_avg_rate_sum = + __ATTR(tx_avg_rate_sum, S_IRUSR, show_sta_tx_avg_rate_sum, NULL); +static struct sta_attribute sta_attr_tx_avg_rate_num = + __ATTR(tx_avg_rate_num, S_IRUSR, show_sta_tx_avg_rate_num, NULL); + +static struct attribute *rate_control_simple_sta_attrs[] = { + &sta_attr_tx_avg_rate_sum.attr, + &sta_attr_tx_avg_rate_num.attr, + NULL, +}; + +static struct attribute_group rate_control_simple_sta_group = { + .name = "rate_control_simple", + .attrs = rate_control_simple_sta_attrs, +}; + +static int rate_control_simple_add_sta_attrs(void *priv, struct kobject *kobj) +{ + return sysfs_create_group(kobj, &rate_control_simple_sta_group); +} + +static void rate_control_simple_remove_sta_attrs(void *priv, + struct kobject *kobj) +{ + sysfs_remove_group(kobj, &rate_control_simple_sta_group); +} static struct rate_control_ops rate_control_simple = { .name = "simple", @@ -363,6 +403,8 @@ static struct rate_control_ops rate_cont .free = rate_control_simple_free, .alloc_sta = rate_control_simple_alloc_sta, .free_sta = rate_control_simple_free_sta, + .add_sta_attrs = rate_control_simple_add_sta_attrs, + .remove_sta_attrs = rate_control_simple_remove_sta_attrs, }; diff --git a/net/d80211/rate_control.h b/net/d80211/rate_control.h index b509539..7705fb2 100644 --- a/net/d80211/rate_control.h +++ b/net/d80211/rate_control.h @@ -53,6 +53,11 @@ struct rate_control_ops { void (*free)(void *priv); void * (*alloc_sta)(void); void (*free_sta)(void *priv); + + int (*add_attrs)(void *priv, struct kobject *kobj); + void (*remove_attrs)(void *priv, struct kobject *kobj); + int (*add_sta_attrs)(void *priv, struct kobject *kobj); + void (*remove_sta_attrs)(void *priv, struct kobject *kobj); }; @@ -132,4 +137,35 @@ static inline void rate_control_free_sta local->rate_ctrl->free_sta(priv); } +static inline int rate_control_add_attrs(struct ieee80211_local *local, + void *priv, struct kobject *kobj) +{ + if (local->rate_ctrl->add_attrs) + return local->rate_ctrl->add_attrs(priv, kobj); + return 0; +} + +static inline void rate_control_remove_attrs(struct ieee80211_local *local, + void *priv, struct kobject *kobj) +{ + if (local->rate_ctrl->remove_attrs) + local->rate_ctrl->remove_attrs(priv, kobj); +} + +static inline int rate_control_add_sta_attrs(struct ieee80211_local *local, + void *priv, struct kobject *kobj) +{ + if (local->rate_ctrl->add_sta_attrs) + return local->rate_ctrl->add_sta_attrs(priv, kobj); + return 0; +} + +static inline void rate_control_remove_sta_attrs(struct ieee80211_local *local, + void *priv, + struct kobject *kobj) +{ + if (local->rate_ctrl->remove_sta_attrs) + local->rate_ctrl->remove_sta_attrs(priv, kobj); +} + #endif /* RATE_CONTROL */ diff --git a/net/d80211/sta_info.c b/net/d80211/sta_info.c index 9c6adaa..96e8dc4 100644 --- a/net/d80211/sta_info.c +++ b/net/d80211/sta_info.c @@ -178,6 +178,8 @@ #endif /* CONFIG_D80211_VERBOSE_DEBUG */ if (!in_interrupt()) { sta->sysfs_registered = 1; ieee80211_sta_sysfs_add(sta); + rate_control_add_sta_attrs(local, sta->rate_ctrl_priv, + &sta->kobj); ieee80211_proc_init_sta(local, sta); } else { /* procfs entry adding might sleep, so schedule process context @@ -197,6 +199,7 @@ #ifdef CONFIG_D80211_VERBOSE_DEBUG local->mdev->name, MAC2STR(sta->addr)); #endif /* CONFIG_D80211_VERBOSE_DEBUG */ + rate_control_remove_sta_attrs(local, sta->rate_ctrl_priv, &sta->kobj); ieee80211_proc_deinit_sta(local, sta); ieee80211_sta_sysfs_remove(sta); @@ -367,6 +370,7 @@ static void sta_info_proc_add_task(void sta->sysfs_registered = 1; ieee80211_sta_sysfs_add(sta); + rate_control_add_sta_attrs(local, sta->rate_ctrl_priv, &sta->kobj); ieee80211_proc_init_sta(local, sta); sta_info_put(sta); } -- 1.3.0 - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html