From: Patrick McHardy <kaber@trash.net>
To: David Miller <davem@davemloft.net>
Cc: Linux Netdev List <netdev@vger.kernel.org>
Subject: [NET]: Fix secondary unicast/multicast address count maintenance
Date: Sat, 30 Jun 2007 18:46:29 +0200 [thread overview]
Message-ID: <468688E5.20106@trash.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 66 bytes --]
Fix a bug introduced by the secondary unicast address patches.
[-- Attachment #2: x --]
[-- Type: text/plain, Size: 4551 bytes --]
[NET]: Fix secondary unicast/multicast address count maintenance
When a reference to an existing address is increased or decreased without
hitting zero, the address count is incorrectly adjusted.
Signed-off-by: Patrick McHardy <kaber@trash.net>
---
commit 84de3fc644b2a98be30519225b088fa8856a8ce4
tree 1ae3a42ed15d68ec21707f72b42a406dad8ee606
parent e1749582c9c230fb2cc0292cf824b30b04f80ee6
author Patrick McHardy <kaber@trash.net> Sat, 30 Jun 2007 17:23:23 +0200
committer Patrick McHardy <kaber@trash.net> Sat, 30 Jun 2007 17:23:23 +0200
include/linux/netdevice.h | 4 ++--
net/core/dev.c | 21 ++++++++++-----------
net/core/dev_mcast.c | 11 ++++-------
3 files changed, 16 insertions(+), 20 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 2c0cc19..296a59b 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1021,8 +1021,8 @@ extern int dev_unicast_add(struct net_device *dev, void *addr, int alen);
extern int dev_mc_delete(struct net_device *dev, void *addr, int alen, int all);
extern int dev_mc_add(struct net_device *dev, void *addr, int alen, int newonly);
extern void dev_mc_discard(struct net_device *dev);
-extern int __dev_addr_delete(struct dev_addr_list **list, void *addr, int alen, int all);
-extern int __dev_addr_add(struct dev_addr_list **list, void *addr, int alen, int newonly);
+extern int __dev_addr_delete(struct dev_addr_list **list, int *count, void *addr, int alen, int all);
+extern int __dev_addr_add(struct dev_addr_list **list, int *count, void *addr, int alen, int newonly);
extern void __dev_addr_discard(struct dev_addr_list **list);
extern void dev_set_promiscuity(struct net_device *dev, int inc);
extern void dev_set_allmulti(struct net_device *dev, int inc);
diff --git a/net/core/dev.c b/net/core/dev.c
index f453127..2ce5546 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2602,8 +2602,8 @@ void dev_set_rx_mode(struct net_device *dev)
netif_tx_unlock_bh(dev);
}
-int __dev_addr_delete(struct dev_addr_list **list, void *addr, int alen,
- int glbl)
+int __dev_addr_delete(struct dev_addr_list **list, int *count,
+ void *addr, int alen, int glbl)
{
struct dev_addr_list *da;
@@ -2621,13 +2621,15 @@ int __dev_addr_delete(struct dev_addr_list **list, void *addr, int alen,
*list = da->next;
kfree(da);
+ (*count)--;
return 0;
}
}
return -ENOENT;
}
-int __dev_addr_add(struct dev_addr_list **list, void *addr, int alen, int glbl)
+int __dev_addr_add(struct dev_addr_list **list, int *count,
+ void *addr, int alen, int glbl)
{
struct dev_addr_list *da;
@@ -2654,6 +2656,7 @@ int __dev_addr_add(struct dev_addr_list **list, void *addr, int alen, int glbl)
da->da_gusers = glbl ? 1 : 0;
da->next = *list;
*list = da;
+ (*count)++;
return 0;
}
@@ -2687,11 +2690,9 @@ int dev_unicast_delete(struct net_device *dev, void *addr, int alen)
ASSERT_RTNL();
netif_tx_lock_bh(dev);
- err = __dev_addr_delete(&dev->uc_list, addr, alen, 0);
- if (!err) {
- dev->uc_count--;
+ err = __dev_addr_delete(&dev->uc_list, &dev->uc_count, addr, alen, 0);
+ if (!err)
__dev_set_rx_mode(dev);
- }
netif_tx_unlock_bh(dev);
return err;
}
@@ -2713,11 +2714,9 @@ int dev_unicast_add(struct net_device *dev, void *addr, int alen)
ASSERT_RTNL();
netif_tx_lock_bh(dev);
- err = __dev_addr_add(&dev->uc_list, addr, alen, 0);
- if (!err) {
- dev->uc_count++;
+ err = __dev_addr_add(&dev->uc_list, &dev->uc_count, addr, alen, 0);
+ if (!err)
__dev_set_rx_mode(dev);
- }
netif_tx_unlock_bh(dev);
return err;
}
diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c
index 5cc9b44..aa38100 100644
--- a/net/core/dev_mcast.c
+++ b/net/core/dev_mcast.c
@@ -72,10 +72,9 @@ int dev_mc_delete(struct net_device *dev, void *addr, int alen, int glbl)
int err;
netif_tx_lock_bh(dev);
- err = __dev_addr_delete(&dev->mc_list, addr, alen, glbl);
+ err = __dev_addr_delete(&dev->mc_list, &dev->mc_count,
+ addr, alen, glbl);
if (!err) {
- dev->mc_count--;
-
/*
* We have altered the list, so the card
* loaded filter is now wrong. Fix it
@@ -96,11 +95,9 @@ int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl)
int err;
netif_tx_lock_bh(dev);
- err = __dev_addr_add(&dev->mc_list, addr, alen, glbl);
- if (!err) {
- dev->mc_count++;
+ err = __dev_addr_add(&dev->mc_list, &dev->mc_count, addr, alen, glbl);
+ if (!err)
__dev_set_rx_mode(dev);
- }
netif_tx_unlock_bh(dev);
return err;
}
next reply other threads:[~2007-06-30 16:48 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-30 16:46 Patrick McHardy [this message]
2007-06-30 20:36 ` [NET]: Fix secondary unicast/multicast address count maintenance David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=468688E5.20106@trash.net \
--to=kaber@trash.net \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.