2007-05-25 13:01:04

by Matthias Kaehlcke

[permalink] [raw]
Subject: [PATCH 1/2] use list_for_each() for iteration in Host AP driver

Use list_for_each() in the Host AP driver to iterate over the MAC
restrictions and the STA info lists

Signed-off-by: Matthias Kaehlcke <[email protected]>

--

diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c
index 5b3abd5..0718eeb 100644
--- a/drivers/net/wireless/hostap/hostap_ap.c
+++ b/drivers/net/wireless/hostap/hostap_ap.c
@@ -352,8 +352,7 @@ static int ap_control_proc_read(char *page, char **start, off_t off,
p += sprintf(p, "MAC entries: %u\n", ap->mac_restrictions.entries);
p += sprintf(p, "MAC list:\n");
spin_lock_bh(&ap->mac_restrictions.lock);
- for (ptr = ap->mac_restrictions.mac_list.next;
- ptr != &ap->mac_restrictions.mac_list; ptr = ptr->next) {
+ list_for_each(ptr, &ap->mac_restrictions.mac_list) {
if (p - page > PAGE_SIZE - 80) {
p += sprintf(p, "All entries did not fit one page.\n");
break;
@@ -393,8 +392,7 @@ int ap_control_del_mac(struct mac_restrictions *mac_restrictions, u8 *mac)
struct mac_entry *entry;

spin_lock_bh(&mac_restrictions->lock);
- for (ptr = mac_restrictions->mac_list.next;
- ptr != &mac_restrictions->mac_list; ptr = ptr->next) {
+ list_for_each(ptr, &mac_restrictions->mac_list) {
entry = list_entry(ptr, struct mac_entry, list);

if (memcmp(entry->addr, mac, ETH_ALEN) == 0) {
@@ -421,8 +419,7 @@ static int ap_control_mac_deny(struct mac_restrictions *mac_restrictions,
return 0;

spin_lock_bh(&mac_restrictions->lock);
- for (ptr = mac_restrictions->mac_list.next;
- ptr != &mac_restrictions->mac_list; ptr = ptr->next) {
+ list_for_each(ptr, &mac_restrictions->mac_list) {
entry = list_entry(ptr, struct mac_entry, list);

if (memcmp(entry->addr, mac, ETH_ALEN) == 0) {
@@ -529,7 +526,7 @@ static int prism2_ap_proc_read(char *page, char **start, off_t off,

p += sprintf(p, "# BSSID CHAN SIGNAL NOISE RATE SSID FLAGS\n");
spin_lock_bh(&ap->sta_table_lock);
- for (ptr = ap->sta_list.next; ptr != &ap->sta_list; ptr = ptr->next) {
+ list_for_each(ptr, &ap->sta_list) {
struct sta_info *sta = (struct sta_info *) ptr;

if (!sta->ap)
@@ -3205,7 +3202,7 @@ void hostap_update_rates(local_info_t *local)
return;

spin_lock_bh(&ap->sta_table_lock);
- for (ptr = ap->sta_list.next; ptr != &ap->sta_list; ptr = ptr->next) {
+ list_for_each(ptr, &ap->sta_list) {
struct sta_info *sta = (struct sta_info *) ptr;
prism2_check_tx_rates(sta);
}

--
Matthias Kaehlcke
Linux Application Developer
Barcelona

You can chain me, you can torture me, you can even
destroy this body, but you will never imprison my mind
(Mahatma Gandhi)
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-


2007-05-28 06:43:37

by Matthias Kaehlcke

[permalink] [raw]
Subject: Re: [PATCH 1/2] use list_for_each_entry() for iteration in hostap_ap.c

Signed-off-by: Matthias Kaehlcke <[email protected]>

--
Matthias Kaehlcke
Linux Application Developer
Barcelona

La posibilidad de realizar un suenyo es lo
que hace que la vida sea interesante
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-

2007-05-27 10:26:34

by Matthias Kaehlcke

[permalink] [raw]
Subject: [PATCH 1/2] use list_for_each_entry() for iteration in hostap_ap.c

El Fri, May 25, 2007 at 03:30:05PM +0100 Christoph Hellwig ha dit:

> On Fri, May 25, 2007 at 03:03:08PM +0200, Matthias Kaehlcke wrote:
> > Use list_for_each() in the Host AP driver to iterate over the MAC
> > restrictions and the STA info lists
>
> please go all the way to a proper list_for_each_entry.

thanks for your comment, here's a patch that uses
list_for_each_entry(), additionally to the initial patch it
substitutes some list_for_each() loops by list_for_each_entry()

> Then again now that we have mac80211 shouldn't hostap be ported over
> to it and this code go away completely?

i hope the patch can be useful in the meantime, otherwise just ignore
it

--

hostap_ap.c: Use list_for_each_entry() instead of manual iteration and
substitute some list_for_each() loops with list_for_each_entry()

--

diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c
index 5b3abd5..120bc9b 100644
--- a/drivers/net/wireless/hostap/hostap_ap.c
+++ b/drivers/net/wireless/hostap/hostap_ap.c
@@ -326,7 +326,6 @@ static int ap_control_proc_read(char *page, char **start, off_t off,
char *p = page;
struct ap_data *ap = (struct ap_data *) data;
char *policy_txt;
- struct list_head *ptr;
struct mac_entry *entry;

if (off != 0) {
@@ -352,14 +351,12 @@ static int ap_control_proc_read(char *page, char **start, off_t off,
p += sprintf(p, "MAC entries: %u\n", ap->mac_restrictions.entries);
p += sprintf(p, "MAC list:\n");
spin_lock_bh(&ap->mac_restrictions.lock);
- for (ptr = ap->mac_restrictions.mac_list.next;
- ptr != &ap->mac_restrictions.mac_list; ptr = ptr->next) {
+ list_for_each_entry(entry, &ap->mac_restrictions.mac_list, list) {
if (p - page > PAGE_SIZE - 80) {
p += sprintf(p, "All entries did not fit one page.\n");
break;
}

- entry = list_entry(ptr, struct mac_entry, list);
p += sprintf(p, MACSTR "\n", MAC2STR(entry->addr));
}
spin_unlock_bh(&ap->mac_restrictions.lock);
@@ -410,10 +407,10 @@ int ap_control_del_mac(struct mac_restrictions *mac_restrictions, u8 *mac)
}


+
static int ap_control_mac_deny(struct mac_restrictions *mac_restrictions,
u8 *mac)
{
- struct list_head *ptr;
struct mac_entry *entry;
int found = 0;

@@ -421,10 +418,7 @@ static int ap_control_mac_deny(struct mac_restrictions *mac_restrictions,
return 0;

spin_lock_bh(&mac_restrictions->lock);
- for (ptr = mac_restrictions->mac_list.next;
- ptr != &mac_restrictions->mac_list; ptr = ptr->next) {
- entry = list_entry(ptr, struct mac_entry, list);
-
+ list_for_each_entry(entry, &mac_restrictions->mac_list, list) {
if (memcmp(entry->addr, mac, ETH_ALEN) == 0) {
found = 1;
break;
@@ -519,7 +513,7 @@ static int prism2_ap_proc_read(char *page, char **start, off_t off,
{
char *p = page;
struct ap_data *ap = (struct ap_data *) data;
- struct list_head *ptr;
+ struct sta_info *sta;
int i;

if (off > PROC_LIMIT) {
@@ -529,9 +523,7 @@ static int prism2_ap_proc_read(char *page, char **start, off_t off,

p += sprintf(p, "# BSSID CHAN SIGNAL NOISE RATE SSID FLAGS\n");
spin_lock_bh(&ap->sta_table_lock);
- for (ptr = ap->sta_list.next; ptr != &ap->sta_list; ptr = ptr->next) {
- struct sta_info *sta = (struct sta_info *) ptr;
-
+ list_for_each_entry(sta, &ap->sta_list, list) {
if (!sta->ap)
continue;

@@ -861,7 +853,7 @@ void hostap_init_ap_proc(local_info_t *local)

void hostap_free_data(struct ap_data *ap)
{
- struct list_head *n, *ptr;
+ struct sta_info *n, *sta;

if (ap == NULL || !ap->initialized) {
printk(KERN_DEBUG "hostap_free_data: ap has not yet been "
@@ -875,8 +867,7 @@ void hostap_free_data(struct ap_data *ap)
ap->crypt = ap->crypt_priv = NULL;
#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */

- list_for_each_safe(ptr, n, &ap->sta_list) {
- struct sta_info *sta = list_entry(ptr, struct sta_info, list);
+ list_for_each_entry_safe(sta, n, &ap->sta_list, list) {
ap_sta_hash_del(ap, sta);
list_del(&sta->list);
if ((sta->flags & WLAN_STA_ASSOC) && !sta->ap && sta->local)
@@ -3198,15 +3189,14 @@ int hostap_update_rx_stats(struct ap_data *ap,

void hostap_update_rates(local_info_t *local)
{
- struct list_head *ptr;
+ struct sta_info *sta;
struct ap_data *ap = local->ap;

if (!ap)
return;

spin_lock_bh(&ap->sta_table_lock);
- for (ptr = ap->sta_list.next; ptr != &ap->sta_list; ptr = ptr->next) {
- struct sta_info *sta = (struct sta_info *) ptr;
+ list_for_each_entry(sta, &ap->sta_list, list) {
prism2_check_tx_rates(sta);
}
spin_unlock_bh(&ap->sta_table_lock);
@@ -3242,11 +3232,10 @@ void * ap_crypt_get_ptrs(struct ap_data *ap, u8 *addr, int permanent,
void hostap_add_wds_links(local_info_t *local)
{
struct ap_data *ap = local->ap;
- struct list_head *ptr;
+ struct sta_info *sta;

spin_lock_bh(&ap->sta_table_lock);
- list_for_each(ptr, &ap->sta_list) {
- struct sta_info *sta = list_entry(ptr, struct sta_info, list);
+ list_for_each_entry(sta, &ap->sta_list, list) {
if (sta->ap)
hostap_wds_link_oper(local, sta->addr, WDS_ADD);
}

--
Matthias Kaehlcke
Linux Application Developer
Barcelona

You can chain me, you can torture me, you can even
destroy this body, but you will never imprison my mind
(Mahatma Gandhi)
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-

2007-05-25 14:30:10

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH 1/2] use list_for_each() for iteration in Host AP driver

On Fri, May 25, 2007 at 03:03:08PM +0200, Matthias Kaehlcke wrote:
> Use list_for_each() in the Host AP driver to iterate over the MAC
> restrictions and the STA info lists

please go all the way to a proper list_for_each_entry. Then again now
that we have mac80211 shouldn't hostap be ported over to it and this code
go away completely?


2007-05-28 02:51:16

by Jouni Malinen

[permalink] [raw]
Subject: Re: [PATCH 1/2] use list_for_each_entry() for iteration in hostap_ap.c

On Sun, May 27, 2007 at 12:28:24PM +0200, Matthias Kaehlcke wrote:

> thanks for your comment, here's a patch that uses
> list_for_each_entry(), additionally to the initial patch it
> substitutes some list_for_each() loops by list_for_each_entry()

Thanks! I added this to my list of patches for the driver.

Could you please send a Signed-off-by line for this later version of the
patch? You did it for the first version, but just to be sure, it would
be prefered to see this explicitly for each version.

--
Jouni Malinen PGP id EFC895FA