Skip to contentSkip to conversation

use list_for_each() for iteration in hostap and prism54 driver

PATCH In review Matthias Kaehlcke 4 participants 9 messages May 25, 2007 – May 29, 2007 Networking drivers (wireless)

lore
Share & tools
lore
#0 lore raw

cover use list_for_each() for iteration in hostap and prism54 driver

This patchset uses the list_for_each() macro instead of manual iteration in the following drivers:

Host AP
Prism54

Signature · 11 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona


  The salvation of mankind lies only in making everything the concern of all
                         (Alexander Solzhenitsyn)
                                                                 .''`.
    using free software / Debian GNU/Linux | http://debian.org  : :'  :
                                                                `. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4                  `-
#1 lore raw

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

--

drivers/net/wireless/hostap/hostap_ap.c +5 -8
index 5b3abd5..0718eeb 100644
@@ -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);
 	}
Signature · 11 lines
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                  `-
#2 lore raw

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

Quoted 2 lines · Matthias Kaehlcke

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?

#3 lore raw

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:

Quoted 5 lines · Matthias Kaehlcke
Quoted 2 lines

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()

Quoted 2 lines

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()

--

drivers/net/wireless/hostap/hostap_ap.c +11 -22
index 5b3abd5..120bc9b 100644
@@ -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);
 	}
Signature · 11 lines
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                  `-
#4 lore raw

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

Quoted 3 lines · Matthias Kaehlcke

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.

Signature · 1 line
Jouni Malinen                                            PGP id EFC895FA
#5 lore raw

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

In reply to Matthias Kaehlcke
Signature · 10 lines
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                  `-
#6 lore raw

PATCH 2/2 use list_for_each() for iteration in Prism 54 driver

In reply to Matthias Kaehlcke

Use list_for_each() in the Prism54 driver to iterate over the MAC list

--

drivers/net/wireless/prism54/isl_ioctl.c +3 -3
index 283be4a..34cf13c 100644
@@ -1861,7 +1861,7 @@ prism54_del_mac(struct net_device *ndev, struct iw_request_info *info,
 
 	if (down_interruptible(&acl->sem))
 		return -ERESTARTSYS;
-	for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
+	list_for_each(ptr, &acl->mac_list) {
 		entry = list_entry(ptr, struct mac_entry, _list);
 
 		if (memcmp(entry->addr, addr->sa_data, ETH_ALEN) == 0) {
@@ -1891,7 +1891,7 @@ prism54_get_mac(struct net_device *ndev, struct iw_request_info *info,
 	if (down_interruptible(&acl->sem))
 		return -ERESTARTSYS;
 
-	for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
+	list_for_each(ptr, &acl->mac_list) {
 		entry = list_entry(ptr, struct mac_entry, _list);
 
 		memcpy(dst->sa_data, entry->addr, ETH_ALEN);
@@ -1972,7 +1972,7 @@ prism54_mac_accept(struct islpci_acl *acl, char *mac)
 		return 1;
 	}
 
-	for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
+	list_for_each(ptr, &acl->mac_list) {
 		entry = list_entry(ptr, struct mac_entry, _list);
 		if (memcmp(entry->addr, mac, ETH_ALEN) == 0) {
 			res = 1;
Signature · 10 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona

               If sharing a thing in no way diminishes it,
               it is not rightly owned if it is not shared
                                                                 .''`.
    using free software / Debian GNU/Linux | http://debian.org  : :'  :
                                                                `. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4                  `-
#7 lore raw

PATCH 2/2 use list_for_each_entry() for iteration in Prism 54 driver

El Fri, May 25, 2007 at 03:04:44PM +0200 Matthias Kaehlcke ha dit:

Quoted 1 line

Use list_for_each() in the Prism54 driver to iterate over the MAC list

In response to a similar patch Christoph Hellwig suggests the use of list_for_each_entry() instead of list_for_each(). Here is a evolution of the patch that takes into account Christophs' suggestion

--

Prism54 driver: Use list_for_each_entry() instead of manual iteration and substitute a list_for_each_safe() loop with list_for_each_entry_safe()

--

drivers/net/wireless/prism54/isl_ioctl.c +6 -16
index 283be4a..585f599 100644
@@ -1853,7 +1853,6 @@ prism54_del_mac(struct net_device *ndev, struct iw_request_info *info,
 	islpci_private *priv = netdev_priv(ndev);
 	struct islpci_acl *acl = &priv->acl;
 	struct mac_entry *entry;
-	struct list_head *ptr;
 	struct sockaddr *addr = (struct sockaddr *) extra;
 
 	if (addr->sa_family != ARPHRD_ETHER)
@@ -1861,11 +1860,9 @@ prism54_del_mac(struct net_device *ndev, struct iw_request_info *info,
 
 	if (down_interruptible(&acl->sem))
 		return -ERESTARTSYS;
-	for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
-		entry = list_entry(ptr, struct mac_entry, _list);
-
+	list_for_each_entry(entry, &acl->mac_list, _list) {
 		if (memcmp(entry->addr, addr->sa_data, ETH_ALEN) == 0) {
-			list_del(ptr);
+			list_del(&entry->_list);
 			acl->size--;
 			kfree(entry);
 			up(&acl->sem);
@@ -1883,7 +1880,6 @@ prism54_get_mac(struct net_device *ndev, struct iw_request_info *info,
 	islpci_private *priv = netdev_priv(ndev);
 	struct islpci_acl *acl = &priv->acl;
 	struct mac_entry *entry;
-	struct list_head *ptr;
 	struct sockaddr *dst = (struct sockaddr *) extra;
 
 	dwrq->length = 0;
@@ -1891,9 +1887,7 @@ prism54_get_mac(struct net_device *ndev, struct iw_request_info *info,
 	if (down_interruptible(&acl->sem))
 		return -ERESTARTSYS;
 
-	for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
-		entry = list_entry(ptr, struct mac_entry, _list);
-
+	list_for_each_entry(entry, &acl->mac_list, _list) {
 		memcpy(dst->sa_data, entry->addr, ETH_ALEN);
 		dst->sa_family = ARPHRD_ETHER;
 		dwrq->length++;
@@ -1960,7 +1954,6 @@ prism54_get_policy(struct net_device *ndev, struct iw_request_info *info,
 static int
 prism54_mac_accept(struct islpci_acl *acl, char *mac)
 {
-	struct list_head *ptr;
 	struct mac_entry *entry;
 	int res = 0;
 
@@ -1972,8 +1965,7 @@ prism54_mac_accept(struct islpci_acl *acl, char *mac)
 		return 1;
 	}
 
-	for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
-		entry = list_entry(ptr, struct mac_entry, _list);
+	list_for_each_entry(entry, &acl->mac_list, _list) {
 		if (memcmp(entry->addr, mac, ETH_ALEN) == 0) {
 			res = 1;
 			break;
@@ -2216,11 +2208,9 @@ prism54_wpa_bss_ie_init(islpci_private *priv)
 void
 prism54_wpa_bss_ie_clean(islpci_private *priv)
 {
-	struct list_head *ptr, *n;
+	struct islpci_bss_wpa_ie *bss, *n;
 
-	list_for_each_safe(ptr, n, &priv->bss_wpa_list) {
-		struct islpci_bss_wpa_ie *bss;
-		bss = list_entry(ptr, struct islpci_bss_wpa_ie, list);
+	list_for_each_entry_safe(bss, n, &priv->bss_wpa_list, list) {
 		kfree(bss);
 	}
 }
Signature · 10 lines
Matthias Kaehlcke
Linux Application Developer
Barcelona

    I am incapable of conceiving infinity, and yet I do not accept finity
                          (Simone de Beauvoir)
                                                                 .''`.
    using free software / Debian GNU/Linux | http://debian.org  : :'  :
                                                                `. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4                  `-
#8 lore raw

Re: [PATCH 2/2] use list_for_each_entry() for iteration in Prism 54 driver

Quoted 8 lines · Matthias Kaehlcke

El Fri, May 25, 2007 at 03:04:44PM +0200 Matthias Kaehlcke ha dit:

Quoted 1 line

Use list_for_each() in the Prism54 driver to iterate over the MAC list

In response to a similar patch Christoph Hellwig suggests the use of list_for_each_entry() instead of list_for_each(). Here is a evolution of the patch that takes into account Christophs' suggestion

Quoted 7 lines

--

Prism54 driver: Use list_for_each_entry() instead of manual iteration and substitute a list_for_each_safe() loop with list_for_each_entry_safe()

Looks good,

Luis

Quoted 96 lines

--

drivers/net/wireless/prism54/isl_ioctl.c +6 -17
index 283be4a..585f599 100644
@@ -1853,7 +1853,6 @@ prism54_del_mac(struct net_device *ndev, struct iw_request_info *info,
        islpci_private *priv = netdev_priv(ndev);
        struct islpci_acl *acl = &priv->acl;
        struct mac_entry *entry;
-       struct list_head *ptr;
        struct sockaddr *addr = (struct sockaddr *) extra;
 
        if (addr->sa_family != ARPHRD_ETHER)
@@ -1861,11 +1860,9 @@ prism54_del_mac(struct net_device *ndev, struct iw_request_info *info,
 
        if (down_interruptible(&acl->sem))
                return -ERESTARTSYS;
-       for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
-               entry = list_entry(ptr, struct mac_entry, _list);
-
+       list_for_each_entry(entry, &acl->mac_list, _list) {
                if (memcmp(entry->addr, addr->sa_data, ETH_ALEN) == 0) {
-                       list_del(ptr);
+                       list_del(&entry->_list);
                        acl->size--;
                        kfree(entry);
                        up(&acl->sem);
@@ -1883,7 +1880,6 @@ prism54_get_mac(struct net_device *ndev, struct iw_request_info *info,
        islpci_private *priv = netdev_priv(ndev);
        struct islpci_acl *acl = &priv->acl;
        struct mac_entry *entry;
-       struct list_head *ptr;
        struct sockaddr *dst = (struct sockaddr *) extra;
 
        dwrq->length = 0;
@@ -1891,9 +1887,7 @@ prism54_get_mac(struct net_device *ndev, struct iw_request_info *info,
        if (down_interruptible(&acl->sem))
                return -ERESTARTSYS;
 
-       for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
-               entry = list_entry(ptr, struct mac_entry, _list);
-
+       list_for_each_entry(entry, &acl->mac_list, _list) {
                memcpy(dst->sa_data, entry->addr, ETH_ALEN);
                dst->sa_family = ARPHRD_ETHER;
                dwrq->length++;
@@ -1960,7 +1954,6 @@ prism54_get_policy(struct net_device *ndev, struct iw_request_info *info,
 static int
 prism54_mac_accept(struct islpci_acl *acl, char *mac)
 {
-       struct list_head *ptr;
        struct mac_entry *entry;
        int res = 0;
 
@@ -1972,8 +1965,7 @@ prism54_mac_accept(struct islpci_acl *acl, char *mac)
                return 1;
        }
 
-       for (ptr = acl->mac_list.next; ptr != &acl->mac_list; ptr = ptr->next) {
-               entry = list_entry(ptr, struct mac_entry, _list);
+       list_for_each_entry(entry, &acl->mac_list, _list) {
                if (memcmp(entry->addr, mac, ETH_ALEN) == 0) {
                        res = 1;
                        break;
@@ -2216,11 +2208,9 @@ prism54_wpa_bss_ie_init(islpci_private *priv)
 void
 prism54_wpa_bss_ie_clean(islpci_private *priv)
 {
-       struct list_head *ptr, *n;
+       struct islpci_bss_wpa_ie *bss, *n;
 
-       list_for_each_safe(ptr, n, &priv->bss_wpa_list) {
-               struct islpci_bss_wpa_ie *bss;
-               bss = list_entry(ptr, struct islpci_bss_wpa_ie, list);
+       list_for_each_entry_safe(bss, n, &priv->bss_wpa_list, list) {
                kfree(bss);
        }
 }
 
--

Matthias Kaehlcke
Linux Application Developer
Barcelona

I am incapable of conceiving infinity, and yet I do not accept finity
(Simone de Beauvoir)
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
. '`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-
-
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html