netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c
       [not found] <11846606051099-git-send-email-crquan@gmail.com>
@ 2007-07-18  2:41 ` Denis Cheng
  2007-07-18  2:41   ` [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one Denis Cheng
  2007-07-18  9:11   ` [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c David Miller
  0 siblings, 2 replies; 18+ messages in thread
From: Denis Cheng @ 2007-07-18  2:41 UTC (permalink / raw)
  To: David S. Miller, Networking Team, Alexey Kuznetsov
  Cc: Pekka Savola, James Morris, Patrick McHardy, netdev, linux-kernel,
	Denis Cheng

Because this function is only called by unregister_netdevice,
this moving could make this non-global function static,
and also remove its declaration in netdevice.h;

Any further, function __dev_addr_discard is also just called by
dev_mc_discard and dev_unicast_discard, keeping this two functions
both in one c file could make __dev_addr_discard also static
and remove its declaration in netdevice.h;

Futhermore, the sequential call to dev_unicast_discard and then
dev_mc_discard in unregister_netdevice have a similar mechanism that:
(netif_tx_lock_bh / __dev_addr_discard / netif_tx_unlock_bh),
they should merged into one to eliminate duplicates in acquiring and
releasing the dev->_xmit_lock, this would be done in my following patch.

Signed-off-by: Denis Cheng <crquan@gmail.com>
---
 include/linux/netdevice.h |    2 --
 net/core/dev.c            |   14 +++++++++++++-
 net/core/dev_mcast.c      |   12 ------------
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index da7a13c..9820ca1 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1098,10 +1098,8 @@ 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 int		dev_mc_sync(struct net_device *to, struct net_device *from);
 extern void		dev_mc_unsync(struct net_device *to, struct net_device *from);
-extern void		dev_mc_discard(struct net_device *dev);
 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);
 extern void		netdev_state_change(struct net_device *dev);
diff --git a/net/core/dev.c b/net/core/dev.c
index 13a0d9f..3ba63aa 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2715,7 +2715,7 @@ int __dev_addr_add(struct dev_addr_list **list, int *count,
 	return 0;
 }
 
-void __dev_addr_discard(struct dev_addr_list **list)
+static void __dev_addr_discard(struct dev_addr_list **list)
 {
 	struct dev_addr_list *tmp;
 
@@ -2785,6 +2785,18 @@ static void dev_unicast_discard(struct net_device *dev)
 	netif_tx_unlock_bh(dev);
 }
 
+/*
+ *	Discard multicast list when a device is downed
+ */
+
+static void dev_mc_discard(struct net_device *dev)
+{
+	netif_tx_lock_bh(dev);
+	__dev_addr_discard(&dev->mc_list);
+	dev->mc_count = 0;
+	netif_tx_unlock_bh(dev);
+}
+
 unsigned dev_get_flags(const struct net_device *dev)
 {
 	unsigned flags;
diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c
index 235a2a8..99aece1 100644
--- a/net/core/dev_mcast.c
+++ b/net/core/dev_mcast.c
@@ -177,18 +177,6 @@ void dev_mc_unsync(struct net_device *to, struct net_device *from)
 }
 EXPORT_SYMBOL(dev_mc_unsync);
 
-/*
- *	Discard multicast list when a device is downed
- */
-
-void dev_mc_discard(struct net_device *dev)
-{
-	netif_tx_lock_bh(dev);
-	__dev_addr_discard(&dev->mc_list);
-	dev->mc_count = 0;
-	netif_tx_unlock_bh(dev);
-}
-
 #ifdef CONFIG_PROC_FS
 static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
 {
-- 
1.5.2.2


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one
  2007-07-18  2:41 ` [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c Denis Cheng
@ 2007-07-18  2:41   ` Denis Cheng
  2007-07-18  2:41     ` [PATCH 3/3] [net/core] move __dev_addr_discard adjacent to dev_addr_discard for readability Denis Cheng
  2007-07-18  9:12     ` [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one David Miller
  2007-07-18  9:11   ` [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c David Miller
  1 sibling, 2 replies; 18+ messages in thread
From: Denis Cheng @ 2007-07-18  2:41 UTC (permalink / raw)
  To: David S. Miller, Networking Team, Alexey Kuznetsov
  Cc: Pekka Savola, James Morris, Patrick McHardy, netdev, linux-kernel,
	Denis Cheng

this two functions could share the dev->_xmit_lock acquired context.

Signed-off-by: Denis Cheng <crquan@gmail.com>
---
 net/core/dev.c |   16 ++++------------
 1 files changed, 4 insertions(+), 12 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index 3ba63aa..17c9cbd 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2777,23 +2777,16 @@ int dev_unicast_add(struct net_device *dev, void *addr, int alen)
 }
 EXPORT_SYMBOL(dev_unicast_add);
 
-static void dev_unicast_discard(struct net_device *dev)
+static void dev_addr_discard(struct net_device *dev)
 {
 	netif_tx_lock_bh(dev);
+
 	__dev_addr_discard(&dev->uc_list);
 	dev->uc_count = 0;
-	netif_tx_unlock_bh(dev);
-}
 
-/*
- *	Discard multicast list when a device is downed
- */
-
-static void dev_mc_discard(struct net_device *dev)
-{
-	netif_tx_lock_bh(dev);
 	__dev_addr_discard(&dev->mc_list);
 	dev->mc_count = 0;
+
 	netif_tx_unlock_bh(dev);
 }
 
@@ -3751,8 +3744,7 @@ void unregister_netdevice(struct net_device *dev)
 	/*
 	 *	Flush the unicast and multicast chains
 	 */
-	dev_unicast_discard(dev);
-	dev_mc_discard(dev);
+	dev_addr_discard(dev);
 
 	if (dev->uninit)
 		dev->uninit(dev);
-- 
1.5.2.2


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 3/3] [net/core] move __dev_addr_discard adjacent to dev_addr_discard for readability
  2007-07-18  2:41   ` [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one Denis Cheng
@ 2007-07-18  2:41     ` Denis Cheng
  2007-07-18  9:13       ` David Miller
  2007-07-18  9:12     ` [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one David Miller
  1 sibling, 1 reply; 18+ messages in thread
From: Denis Cheng @ 2007-07-18  2:41 UTC (permalink / raw)
  To: David S. Miller, Networking Team, Alexey Kuznetsov
  Cc: Pekka Savola, James Morris, Patrick McHardy, netdev, linux-kernel,
	Denis Cheng

Signed-off-by: Denis Cheng <crquan@gmail.com>
---
 net/core/dev.c |   28 ++++++++++++++--------------
 1 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index 17c9cbd..6357f54 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2715,20 +2715,6 @@ int __dev_addr_add(struct dev_addr_list **list, int *count,
 	return 0;
 }
 
-static void __dev_addr_discard(struct dev_addr_list **list)
-{
-	struct dev_addr_list *tmp;
-
-	while (*list != NULL) {
-		tmp = *list;
-		*list = tmp->next;
-		if (tmp->da_users > tmp->da_gusers)
-			printk("__dev_addr_discard: address leakage! "
-			       "da_users=%d\n", tmp->da_users);
-		kfree(tmp);
-	}
-}
-
 /**
  *	dev_unicast_delete	- Release secondary unicast address.
  *	@dev: device
@@ -2777,6 +2763,20 @@ int dev_unicast_add(struct net_device *dev, void *addr, int alen)
 }
 EXPORT_SYMBOL(dev_unicast_add);
 
+static void __dev_addr_discard(struct dev_addr_list **list)
+{
+	struct dev_addr_list *tmp;
+
+	while (*list != NULL) {
+		tmp = *list;
+		*list = tmp->next;
+		if (tmp->da_users > tmp->da_gusers)
+			printk("__dev_addr_discard: address leakage! "
+			       "da_users=%d\n", tmp->da_users);
+		kfree(tmp);
+	}
+}
+
 static void dev_addr_discard(struct net_device *dev)
 {
 	netif_tx_lock_bh(dev);
-- 
1.5.2.2


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c
  2007-07-18  2:41 ` [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c Denis Cheng
  2007-07-18  2:41   ` [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one Denis Cheng
@ 2007-07-18  9:11   ` David Miller
  2007-07-18  9:59     ` rae l
  1 sibling, 1 reply; 18+ messages in thread
From: David Miller @ 2007-07-18  9:11 UTC (permalink / raw)
  To: crquan; +Cc: netdev, kuznet, pekkas, jmorris, kaber, linux-kernel

From: Denis Cheng <crquan@gmail.com>
Date: Wed, 18 Jul 2007 10:41:03 +0800

> Because this function is only called by unregister_netdevice,
> this moving could make this non-global function static,
> and also remove its declaration in netdevice.h;
> 
> Any further, function __dev_addr_discard is also just called by
> dev_mc_discard and dev_unicast_discard, keeping this two functions
> both in one c file could make __dev_addr_discard also static
> and remove its declaration in netdevice.h;
> 
> Futhermore, the sequential call to dev_unicast_discard and then
> dev_mc_discard in unregister_netdevice have a similar mechanism that:
> (netif_tx_lock_bh / __dev_addr_discard / netif_tx_unlock_bh),
> they should merged into one to eliminate duplicates in acquiring and
> releasing the dev->_xmit_lock, this would be done in my following patch.
> 
> Signed-off-by: Denis Cheng <crquan@gmail.com>

Patch applied, thanks.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one
  2007-07-18  2:41   ` [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one Denis Cheng
  2007-07-18  2:41     ` [PATCH 3/3] [net/core] move __dev_addr_discard adjacent to dev_addr_discard for readability Denis Cheng
@ 2007-07-18  9:12     ` David Miller
  1 sibling, 0 replies; 18+ messages in thread
From: David Miller @ 2007-07-18  9:12 UTC (permalink / raw)
  To: crquan; +Cc: netdev, kuznet, pekkas, jmorris, kaber, linux-kernel

From: Denis Cheng <crquan@gmail.com>
Date: Wed, 18 Jul 2007 10:41:04 +0800

> this two functions could share the dev->_xmit_lock acquired context.
> 
> Signed-off-by: Denis Cheng <crquan@gmail.com>

Applied, thanks.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 3/3] [net/core] move __dev_addr_discard adjacent to dev_addr_discard for readability
  2007-07-18  2:41     ` [PATCH 3/3] [net/core] move __dev_addr_discard adjacent to dev_addr_discard for readability Denis Cheng
@ 2007-07-18  9:13       ` David Miller
  0 siblings, 0 replies; 18+ messages in thread
From: David Miller @ 2007-07-18  9:13 UTC (permalink / raw)
  To: crquan; +Cc: netdev, kuznet, pekkas, jmorris, kaber, linux-kernel

From: Denis Cheng <crquan@gmail.com>
Date: Wed, 18 Jul 2007 10:41:05 +0800

> Signed-off-by: Denis Cheng <crquan@gmail.com>

Also applied, thank you.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c
  2007-07-18  9:11   ` [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c David Miller
@ 2007-07-18  9:59     ` rae l
  2007-07-18 10:01       ` Patrick McHardy
  2007-07-18 10:03       ` David Miller
  0 siblings, 2 replies; 18+ messages in thread
From: rae l @ 2007-07-18  9:59 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, kuznet, pekkas, jmorris, kaber, linux-kernel

On 7/18/07, David Miller <davem@davemloft.net> wrote:
> From: Denis Cheng <crquan@gmail.com>
> Date: Wed, 18 Jul 2007 10:41:03 +0800
>
> > Because this function is only called by unregister_netdevice,
> > this moving could make this non-global function static,
> > and also remove its declaration in netdevice.h;
> >
> > Any further, function __dev_addr_discard is also just called by
> > dev_mc_discard and dev_unicast_discard, keeping this two functions
> > both in one c file could make __dev_addr_discard also static
> > and remove its declaration in netdevice.h;
> >
> > Futhermore, the sequential call to dev_unicast_discard and then
> > dev_mc_discard in unregister_netdevice have a similar mechanism that:
> > (netif_tx_lock_bh / __dev_addr_discard / netif_tx_unlock_bh),
> > they should merged into one to eliminate duplicates in acquiring and
> > releasing the dev->_xmit_lock, this would be done in my following patch.
> >
> > Signed-off-by: Denis Cheng <crquan@gmail.com>
>
> Patch applied, thanks.
Thanks for applying, too.

And then the dev_mcast.c is now only 256 lines long(versus dev.c 4052 lines),
just left a few multicast related functions definition and "dev_mcast"
procfs code,
I have an idea to merge all code dev_mcast.c into dev.c, that would:

- remove two functions (__dev_addr_delete, __dev_set_rx_mode) from netdevice.h,
  and then tag them static,
  those two are also defined in dev.c and only called from dev_mcast.c,

- reducing one file would benefit the compilation process.

All in one word, I don't think the single file dev_mcast.c is needed anymore.

>


-- 
Denis Cheng
Linux Application Developer

"One of my most productive days was throwing away 1000 lines of code."
 - Ken Thompson.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c
  2007-07-18  9:59     ` rae l
@ 2007-07-18 10:01       ` Patrick McHardy
  2007-07-18 10:04         ` David Miller
  2007-07-18 10:03       ` David Miller
  1 sibling, 1 reply; 18+ messages in thread
From: Patrick McHardy @ 2007-07-18 10:01 UTC (permalink / raw)
  To: rae l; +Cc: David Miller, netdev, kuznet, pekkas, jmorris, linux-kernel

rae l wrote:
> All in one word, I don't think the single file dev_mcast.c is needed
> anymore.


Agreed. But dev.c is growing larger and larger, maybe dev_addr.c?
Or dev_config.c, with some of the other device configuration functions?

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c
  2007-07-18  9:59     ` rae l
  2007-07-18 10:01       ` Patrick McHardy
@ 2007-07-18 10:03       ` David Miller
  2007-07-18 11:30         ` [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c Denis Cheng
  1 sibling, 1 reply; 18+ messages in thread
From: David Miller @ 2007-07-18 10:03 UTC (permalink / raw)
  To: crquan; +Cc: netdev, kuznet, pekkas, jmorris, kaber, linux-kernel

From: "rae l" <crquan@gmail.com>
Date: Wed, 18 Jul 2007 17:59:52 +0800

> And then the dev_mcast.c is now only 256 lines long(versus dev.c 4052 lines),
> just left a few multicast related functions definition and "dev_mcast"
> procfs code,
> I have an idea to merge all code dev_mcast.c into dev.c, that would:
> 
> - remove two functions (__dev_addr_delete, __dev_set_rx_mode) from netdevice.h,
>   and then tag them static,
>   those two are also defined in dev.c and only called from dev_mcast.c,
> 
> - reducing one file would benefit the compilation process.
> 
> All in one word, I don't think the single file dev_mcast.c is needed anymore.

Agreed.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c
  2007-07-18 10:01       ` Patrick McHardy
@ 2007-07-18 10:04         ` David Miller
  2007-07-18 10:10           ` Patrick McHardy
  0 siblings, 1 reply; 18+ messages in thread
From: David Miller @ 2007-07-18 10:04 UTC (permalink / raw)
  To: kaber; +Cc: crquan, netdev, kuznet, pekkas, jmorris, linux-kernel

From: Patrick McHardy <kaber@trash.net>
Date: Wed, 18 Jul 2007 12:01:38 +0200

> rae l wrote:
> > All in one word, I don't think the single file dev_mcast.c is needed
> > anymore.
> 
> Agreed. But dev.c is growing larger and larger, maybe dev_addr.c?
> Or dev_config.c, with some of the other device configuration functions?

I don't know, a sizable dev.c is inevitable, allows better refactoring
and consolidation.  And the be honest you're going to have to likely
touch things in dev.c whenever you make changes to dev_addr.c or
whatever you want to name it. :-)


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c
  2007-07-18 10:04         ` David Miller
@ 2007-07-18 10:10           ` Patrick McHardy
  0 siblings, 0 replies; 18+ messages in thread
From: Patrick McHardy @ 2007-07-18 10:10 UTC (permalink / raw)
  To: David Miller; +Cc: crquan, netdev, kuznet, pekkas, jmorris, linux-kernel

David Miller wrote:
> From: Patrick McHardy <kaber@trash.net>
> Date: Wed, 18 Jul 2007 12:01:38 +0200
> 
> 
>>rae l wrote:
>>
>>>All in one word, I don't think the single file dev_mcast.c is needed
>>>anymore.
>>
>>Agreed. But dev.c is growing larger and larger, maybe dev_addr.c?
>>Or dev_config.c, with some of the other device configuration functions?
> 
> 
> I don't know, a sizable dev.c is inevitable, allows better refactoring
> and consolidation.  And the be honest you're going to have to likely
> touch things in dev.c whenever you make changes to dev_addr.c or
> whatever you want to name it. :-)


You're probably right. Killing dev_mcast.c makes sense to me though.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c
  2007-07-18 10:03       ` David Miller
@ 2007-07-18 11:30         ` Denis Cheng
  2007-07-18 11:30           ` [PATCH 2/2] net/core: some functions' definition order adjustment for readability Denis Cheng
  2007-07-20  1:51           ` [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c rae l
  0 siblings, 2 replies; 18+ messages in thread
From: Denis Cheng @ 2007-07-18 11:30 UTC (permalink / raw)
  To: David Miller
  Cc: netdev, kuznet, Patrick McHardy, pekkas, jmorris, linux-kernel,
	Denis Cheng

- removed three function declarations from header file to mark them static,
- reduced one file

Signed-off-by: Denis Cheng <crquan@gmail.com>
---

this one is just merging by concatenating, and I'll try to adjust some
function definitions' order to make it more readable.

 include/linux/netdevice.h |    3 -
 net/core/Makefile         |    2 +-
 net/core/dev.c            |  239 +++++++++++++++++++++++++++++++++++++++++-
 net/core/dev_mcast.c      |  255 ---------------------------------------------
 4 files changed, 237 insertions(+), 262 deletions(-)
 delete mode 100644 net/core/dev_mcast.c

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 9820ca1..ca68c58 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1091,15 +1091,12 @@ extern int		register_netdev(struct net_device *dev);
 extern void		unregister_netdev(struct net_device *dev);
 /* Functions used for secondary unicast and multicast support */
 extern void		dev_set_rx_mode(struct net_device *dev);
-extern void		__dev_set_rx_mode(struct net_device *dev);
 extern int		dev_unicast_delete(struct net_device *dev, void *addr, int alen);
 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 int		dev_mc_sync(struct net_device *to, struct net_device *from);
 extern void		dev_mc_unsync(struct net_device *to, struct net_device *from);
-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_set_promiscuity(struct net_device *dev, int inc);
 extern void		dev_set_allmulti(struct net_device *dev, int inc);
 extern void		netdev_state_change(struct net_device *dev);
diff --git a/net/core/Makefile b/net/core/Makefile
index 4751613..54d28dd 100644
--- a/net/core/Makefile
+++ b/net/core/Makefile
@@ -7,7 +7,7 @@ obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \
 
 obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
 
-obj-y		     += dev.o ethtool.o dev_mcast.o dst.o netevent.o \
+obj-y		     += dev.o ethtool.o dst.o netevent.o \
 			neighbour.o rtnetlink.o utils.o link_watch.o filter.o
 
 obj-$(CONFIG_XFRM) += flow.o
diff --git a/net/core/dev.c b/net/core/dev.c
index 6357f54..16842af 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -18,6 +18,7 @@
  *		Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
  *		Adam Sulmicki <adam@cfar.umd.edu>
  *              Pekka Riikonen <priikone@poesidon.pspt.fi>
+ *              Denis Cheng <crquan@gmail.com>
  *
  *	Changes:
  *              D.J. Barrow     :       Fixed bug where dev->refcnt gets set
@@ -70,6 +71,32 @@
  *              			indefinitely on dev->refcnt
  * 		J Hadi Salim	:	- Backlog queue sampling
  *				        - netif_rx() feedback
+ *              Denis Cheng     :       Merge dev_mcast.c into it
+ */
+
+/*
+ * 	The original information in dev_mcast.c:
+ *
+ *	Linux NET3:	Multicast List maintenance.
+ *
+ *	Authors:
+ *		Tim Kordas <tjk@nostromo.eeap.cwru.edu>
+ *		Richard Underwood <richard@wuzz.demon.co.uk>
+ *
+ *	Stir fried together from the IP multicast and CAP patches above
+ *		Alan Cox <Alan.Cox@linux.org>
+ *
+ *	Fixes:
+ *		Alan Cox	:	Update the device on a real delete
+ *					rather than any time but...
+ *		Alan Cox	:	IFF_ALLMULTI support.
+ *		Alan Cox	: 	New format set_multicast_list() calls.
+ *		Gleb Natapov    :       Remove dev_mc_lock.
+ *
+ *	This program is free software; you can redistribute it and/or
+ *	modify it under the terms of the GNU General Public License
+ *	as published by the Free Software Foundation; either version
+ *	2 of the License, or (at your option) any later version.
  */
 
 #include <asm/uaccess.h>
@@ -2622,7 +2649,7 @@ void dev_set_allmulti(struct net_device *dev, int inc)
  *	filtering it is put in promiscous mode while unicast addresses
  *	are present.
  */
-void __dev_set_rx_mode(struct net_device *dev)
+static void __dev_set_rx_mode(struct net_device *dev)
 {
 	/* dev_open will call this function so the list will stay sane. */
 	if (!(dev->flags&IFF_UP))
@@ -2657,7 +2684,7 @@ void dev_set_rx_mode(struct net_device *dev)
 	netif_tx_unlock_bh(dev);
 }
 
-int __dev_addr_delete(struct dev_addr_list **list, int *count,
+static int __dev_addr_delete(struct dev_addr_list **list, int *count,
 		      void *addr, int alen, int glbl)
 {
 	struct dev_addr_list *da;
@@ -2683,7 +2710,7 @@ int __dev_addr_delete(struct dev_addr_list **list, int *count,
 	return -ENOENT;
 }
 
-int __dev_addr_add(struct dev_addr_list **list, int *count,
+static int __dev_addr_add(struct dev_addr_list **list, int *count,
 		   void *addr, int alen, int glbl)
 {
 	struct dev_addr_list *da;
@@ -4049,3 +4076,209 @@ EXPORT_SYMBOL(dev_load);
 #endif
 
 EXPORT_PER_CPU_SYMBOL(softnet_data);
+
+/*
+ *	Device multicast list maintenance.
+ *
+ *	This is used both by IP and by the user level maintenance functions.
+ *	Unlike BSD we maintain a usage count on a given multicast address so
+ *	that a casual user application can add/delete multicasts used by
+ *	protocols without doing damage to the protocols when it deletes the
+ *	entries. It also helps IP as it tracks overlapping maps.
+ *
+ *	Device mc lists are changed by bh at least if IPv6 is enabled,
+ *	so that it must be bh protected.
+ *
+ *	We block accesses to device mc filters with netif_tx_lock.
+ */
+
+/*
+ *	Delete a device level multicast
+ */
+
+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, &dev->mc_count,
+				addr, alen, glbl);
+	if (!err) {
+		/*
+		 *	We have altered the list, so the card
+		 *	loaded filter is now wrong. Fix it
+		 */
+
+		__dev_set_rx_mode(dev);
+	}
+	netif_tx_unlock_bh(dev);
+	return err;
+}
+
+/*
+ *	Add a device level multicast
+ */
+
+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, &dev->mc_count, addr, alen, glbl);
+	if (!err)
+		__dev_set_rx_mode(dev);
+	netif_tx_unlock_bh(dev);
+	return err;
+}
+
+/**
+ *	dev_mc_sync	- Synchronize device's multicast list to another device
+ *	@to: destination device
+ *	@from: source device
+ *
+ * 	Add newly added addresses to the destination device and release
+ * 	addresses that have no users left. The source device must be
+ * 	locked by netif_tx_lock_bh.
+ *
+ *	This function is intended to be called from the dev->set_multicast_list
+ *	function of layered software devices.
+ */
+int dev_mc_sync(struct net_device *to, struct net_device *from)
+{
+	struct dev_addr_list *da;
+	int err = 0;
+
+	netif_tx_lock_bh(to);
+	for (da = from->mc_list; da != NULL; da = da->next) {
+		if (!da->da_synced) {
+			err = __dev_addr_add(&to->mc_list, &to->mc_count,
+					     da->da_addr, da->da_addrlen, 0);
+			if (err < 0)
+				break;
+			da->da_synced = 1;
+			da->da_users++;
+		} else if (da->da_users == 1) {
+			__dev_addr_delete(&to->mc_list, &to->mc_count,
+					  da->da_addr, da->da_addrlen, 0);
+			__dev_addr_delete(&from->mc_list, &from->mc_count,
+					  da->da_addr, da->da_addrlen, 0);
+		}
+	}
+	if (!err)
+		__dev_set_rx_mode(to);
+	netif_tx_unlock_bh(to);
+
+	return err;
+}
+EXPORT_SYMBOL(dev_mc_sync);
+
+
+/**
+ * 	dev_mc_unsync	- Remove synchronized addresses from the destination
+ * 			  device
+ *	@to: destination device
+ *	@from: source device
+ *
+ * 	Remove all addresses that were added to the destination device by
+ * 	dev_mc_sync(). This function is intended to be called from the
+ * 	dev->stop function of layered software devices.
+ */
+void dev_mc_unsync(struct net_device *to, struct net_device *from)
+{
+	struct dev_addr_list *da;
+
+	netif_tx_lock_bh(from);
+	netif_tx_lock_bh(to);
+
+	for (da = from->mc_list; da != NULL; da = da->next) {
+		if (!da->da_synced)
+			continue;
+		__dev_addr_delete(&to->mc_list, &to->mc_count,
+				  da->da_addr, da->da_addrlen, 0);
+		da->da_synced = 0;
+		__dev_addr_delete(&from->mc_list, &from->mc_count,
+				  da->da_addr, da->da_addrlen, 0);
+	}
+	__dev_set_rx_mode(to);
+
+	netif_tx_unlock_bh(to);
+	netif_tx_unlock_bh(from);
+}
+EXPORT_SYMBOL(dev_mc_unsync);
+
+#ifdef CONFIG_PROC_FS
+static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
+{
+	struct net_device *dev;
+	loff_t off = 0;
+
+	read_lock(&dev_base_lock);
+	for_each_netdev(dev) {
+		if (off++ == *pos)
+			return dev;
+	}
+	return NULL;
+}
+
+static void *dev_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+	++*pos;
+	return next_net_device((struct net_device *)v);
+}
+
+static void dev_mc_seq_stop(struct seq_file *seq, void *v)
+{
+	read_unlock(&dev_base_lock);
+}
+
+
+static int dev_mc_seq_show(struct seq_file *seq, void *v)
+{
+	struct dev_addr_list *m;
+	struct net_device *dev = v;
+
+	netif_tx_lock_bh(dev);
+	for (m = dev->mc_list; m; m = m->next) {
+		int i;
+
+		seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex,
+			   dev->name, m->dmi_users, m->dmi_gusers);
+
+		for (i = 0; i < m->dmi_addrlen; i++)
+			seq_printf(seq, "%02x", m->dmi_addr[i]);
+
+		seq_putc(seq, '\n');
+	}
+	netif_tx_unlock_bh(dev);
+	return 0;
+}
+
+static const struct seq_operations dev_mc_seq_ops = {
+	.start = dev_mc_seq_start,
+	.next  = dev_mc_seq_next,
+	.stop  = dev_mc_seq_stop,
+	.show  = dev_mc_seq_show,
+};
+
+static int dev_mc_seq_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &dev_mc_seq_ops);
+}
+
+static const struct file_operations dev_mc_seq_fops = {
+	.owner	 = THIS_MODULE,
+	.open    = dev_mc_seq_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = seq_release,
+};
+
+#endif
+
+void __init dev_mcast_init(void)
+{
+	proc_net_fops_create("dev_mcast", 0, &dev_mc_seq_fops);
+}
+
+EXPORT_SYMBOL(dev_mc_add);
+EXPORT_SYMBOL(dev_mc_delete);
diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c
deleted file mode 100644
index 99aece1..0000000
--- a/net/core/dev_mcast.c
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- *	Linux NET3:	Multicast List maintenance.
- *
- *	Authors:
- *		Tim Kordas <tjk@nostromo.eeap.cwru.edu>
- *		Richard Underwood <richard@wuzz.demon.co.uk>
- *
- *	Stir fried together from the IP multicast and CAP patches above
- *		Alan Cox <Alan.Cox@linux.org>
- *
- *	Fixes:
- *		Alan Cox	:	Update the device on a real delete
- *					rather than any time but...
- *		Alan Cox	:	IFF_ALLMULTI support.
- *		Alan Cox	: 	New format set_multicast_list() calls.
- *		Gleb Natapov    :       Remove dev_mc_lock.
- *
- *	This program is free software; you can redistribute it and/or
- *	modify it under the terms of the GNU General Public License
- *	as published by the Free Software Foundation; either version
- *	2 of the License, or (at your option) any later version.
- */
-
-#include <linux/module.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <linux/bitops.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/socket.h>
-#include <linux/sockios.h>
-#include <linux/in.h>
-#include <linux/errno.h>
-#include <linux/interrupt.h>
-#include <linux/if_ether.h>
-#include <linux/inet.h>
-#include <linux/netdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
-#include <linux/init.h>
-#include <net/ip.h>
-#include <net/route.h>
-#include <linux/skbuff.h>
-#include <net/sock.h>
-#include <net/arp.h>
-
-
-/*
- *	Device multicast list maintenance.
- *
- *	This is used both by IP and by the user level maintenance functions.
- *	Unlike BSD we maintain a usage count on a given multicast address so
- *	that a casual user application can add/delete multicasts used by
- *	protocols without doing damage to the protocols when it deletes the
- *	entries. It also helps IP as it tracks overlapping maps.
- *
- *	Device mc lists are changed by bh at least if IPv6 is enabled,
- *	so that it must be bh protected.
- *
- *	We block accesses to device mc filters with netif_tx_lock.
- */
-
-/*
- *	Delete a device level multicast
- */
-
-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, &dev->mc_count,
-				addr, alen, glbl);
-	if (!err) {
-		/*
-		 *	We have altered the list, so the card
-		 *	loaded filter is now wrong. Fix it
-		 */
-
-		__dev_set_rx_mode(dev);
-	}
-	netif_tx_unlock_bh(dev);
-	return err;
-}
-
-/*
- *	Add a device level multicast
- */
-
-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, &dev->mc_count, addr, alen, glbl);
-	if (!err)
-		__dev_set_rx_mode(dev);
-	netif_tx_unlock_bh(dev);
-	return err;
-}
-
-/**
- *	dev_mc_sync	- Synchronize device's multicast list to another device
- *	@to: destination device
- *	@from: source device
- *
- * 	Add newly added addresses to the destination device and release
- * 	addresses that have no users left. The source device must be
- * 	locked by netif_tx_lock_bh.
- *
- *	This function is intended to be called from the dev->set_multicast_list
- *	function of layered software devices.
- */
-int dev_mc_sync(struct net_device *to, struct net_device *from)
-{
-	struct dev_addr_list *da;
-	int err = 0;
-
-	netif_tx_lock_bh(to);
-	for (da = from->mc_list; da != NULL; da = da->next) {
-		if (!da->da_synced) {
-			err = __dev_addr_add(&to->mc_list, &to->mc_count,
-					     da->da_addr, da->da_addrlen, 0);
-			if (err < 0)
-				break;
-			da->da_synced = 1;
-			da->da_users++;
-		} else if (da->da_users == 1) {
-			__dev_addr_delete(&to->mc_list, &to->mc_count,
-					  da->da_addr, da->da_addrlen, 0);
-			__dev_addr_delete(&from->mc_list, &from->mc_count,
-					  da->da_addr, da->da_addrlen, 0);
-		}
-	}
-	if (!err)
-		__dev_set_rx_mode(to);
-	netif_tx_unlock_bh(to);
-
-	return err;
-}
-EXPORT_SYMBOL(dev_mc_sync);
-
-
-/**
- * 	dev_mc_unsync	- Remove synchronized addresses from the destination
- * 			  device
- *	@to: destination device
- *	@from: source device
- *
- * 	Remove all addresses that were added to the destination device by
- * 	dev_mc_sync(). This function is intended to be called from the
- * 	dev->stop function of layered software devices.
- */
-void dev_mc_unsync(struct net_device *to, struct net_device *from)
-{
-	struct dev_addr_list *da;
-
-	netif_tx_lock_bh(from);
-	netif_tx_lock_bh(to);
-
-	for (da = from->mc_list; da != NULL; da = da->next) {
-		if (!da->da_synced)
-			continue;
-		__dev_addr_delete(&to->mc_list, &to->mc_count,
-				  da->da_addr, da->da_addrlen, 0);
-		da->da_synced = 0;
-		__dev_addr_delete(&from->mc_list, &from->mc_count,
-				  da->da_addr, da->da_addrlen, 0);
-	}
-	__dev_set_rx_mode(to);
-
-	netif_tx_unlock_bh(to);
-	netif_tx_unlock_bh(from);
-}
-EXPORT_SYMBOL(dev_mc_unsync);
-
-#ifdef CONFIG_PROC_FS
-static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
-{
-	struct net_device *dev;
-	loff_t off = 0;
-
-	read_lock(&dev_base_lock);
-	for_each_netdev(dev) {
-		if (off++ == *pos)
-			return dev;
-	}
-	return NULL;
-}
-
-static void *dev_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
-{
-	++*pos;
-	return next_net_device((struct net_device *)v);
-}
-
-static void dev_mc_seq_stop(struct seq_file *seq, void *v)
-{
-	read_unlock(&dev_base_lock);
-}
-
-
-static int dev_mc_seq_show(struct seq_file *seq, void *v)
-{
-	struct dev_addr_list *m;
-	struct net_device *dev = v;
-
-	netif_tx_lock_bh(dev);
-	for (m = dev->mc_list; m; m = m->next) {
-		int i;
-
-		seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex,
-			   dev->name, m->dmi_users, m->dmi_gusers);
-
-		for (i = 0; i < m->dmi_addrlen; i++)
-			seq_printf(seq, "%02x", m->dmi_addr[i]);
-
-		seq_putc(seq, '\n');
-	}
-	netif_tx_unlock_bh(dev);
-	return 0;
-}
-
-static const struct seq_operations dev_mc_seq_ops = {
-	.start = dev_mc_seq_start,
-	.next  = dev_mc_seq_next,
-	.stop  = dev_mc_seq_stop,
-	.show  = dev_mc_seq_show,
-};
-
-static int dev_mc_seq_open(struct inode *inode, struct file *file)
-{
-	return seq_open(file, &dev_mc_seq_ops);
-}
-
-static const struct file_operations dev_mc_seq_fops = {
-	.owner	 = THIS_MODULE,
-	.open    = dev_mc_seq_open,
-	.read    = seq_read,
-	.llseek  = seq_lseek,
-	.release = seq_release,
-};
-
-#endif
-
-void __init dev_mcast_init(void)
-{
-	proc_net_fops_create("dev_mcast", 0, &dev_mc_seq_fops);
-}
-
-EXPORT_SYMBOL(dev_mc_add);
-EXPORT_SYMBOL(dev_mc_delete);
-- 
1.5.2.2


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/2] net/core: some functions' definition order adjustment for readability
  2007-07-18 11:30         ` [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c Denis Cheng
@ 2007-07-18 11:30           ` Denis Cheng
  2007-07-18 12:39             ` Patrick McHardy
  2007-07-20  1:51           ` [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c rae l
  1 sibling, 1 reply; 18+ messages in thread
From: Denis Cheng @ 2007-07-18 11:30 UTC (permalink / raw)
  To: David Miller
  Cc: netdev, kuznet, Patrick McHardy, pekkas, jmorris, linux-kernel,
	Denis Cheng

Signed-off-by: Denis Cheng <crquan@gmail.com>
---
 net/core/dev.c |  407 ++++++++++++++++++++++++++++----------------------------
 1 files changed, 201 insertions(+), 206 deletions(-)

diff --git a/net/core/dev.c b/net/core/dev.c
index 16842af..ee567dd 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2790,6 +2790,134 @@ int dev_unicast_add(struct net_device *dev, void *addr, int alen)
 }
 EXPORT_SYMBOL(dev_unicast_add);
 
+/*
+ *	Device multicast list maintenance.
+ *
+ *	This is used both by IP and by the user level maintenance functions.
+ *	Unlike BSD we maintain a usage count on a given multicast address so
+ *	that a casual user application can add/delete multicasts used by
+ *	protocols without doing damage to the protocols when it deletes the
+ *	entries. It also helps IP as it tracks overlapping maps.
+ *
+ *	Device mc lists are changed by bh at least if IPv6 is enabled,
+ *	so that it must be bh protected.
+ *
+ *	We block accesses to device mc filters with netif_tx_lock.
+ */
+
+/*
+ *	Delete a device level multicast
+ */
+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, &dev->mc_count,
+				addr, alen, glbl);
+	if (!err) {
+		/*
+		 *	We have altered the list, so the card
+		 *	loaded filter is now wrong. Fix it
+		 */
+
+		__dev_set_rx_mode(dev);
+	}
+	netif_tx_unlock_bh(dev);
+	return err;
+}
+EXPORT_SYMBOL(dev_mc_delete);
+
+/*
+ *	Add a device level multicast
+ */
+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, &dev->mc_count, addr, alen, glbl);
+	if (!err)
+		__dev_set_rx_mode(dev);
+	netif_tx_unlock_bh(dev);
+	return err;
+}
+EXPORT_SYMBOL(dev_mc_add);
+
+/**
+ *	dev_mc_sync	- Synchronize device's multicast list to another device
+ *	@to: destination device
+ *	@from: source device
+ *
+ * 	Add newly added addresses to the destination device and release
+ * 	addresses that have no users left. The source device must be
+ * 	locked by netif_tx_lock_bh.
+ *
+ *	This function is intended to be called from the dev->set_multicast_list
+ *	function of layered software devices.
+ */
+int dev_mc_sync(struct net_device *to, struct net_device *from)
+{
+	struct dev_addr_list *da;
+	int err = 0;
+
+	netif_tx_lock_bh(to);
+	for (da = from->mc_list; da != NULL; da = da->next) {
+		if (!da->da_synced) {
+			err = __dev_addr_add(&to->mc_list, &to->mc_count,
+					     da->da_addr, da->da_addrlen, 0);
+			if (err < 0)
+				break;
+			da->da_synced = 1;
+			da->da_users++;
+		} else if (da->da_users == 1) {
+			__dev_addr_delete(&to->mc_list, &to->mc_count,
+					  da->da_addr, da->da_addrlen, 0);
+			__dev_addr_delete(&from->mc_list, &from->mc_count,
+					  da->da_addr, da->da_addrlen, 0);
+		}
+	}
+	if (!err)
+		__dev_set_rx_mode(to);
+	netif_tx_unlock_bh(to);
+
+	return err;
+}
+EXPORT_SYMBOL(dev_mc_sync);
+
+/**
+ * 	dev_mc_unsync	- Remove synchronized addresses from the destination
+ * 			  device
+ *	@to: destination device
+ *	@from: source device
+ *
+ * 	Remove all addresses that were added to the destination device by
+ * 	dev_mc_sync(). This function is intended to be called from the
+ * 	dev->stop function of layered software devices.
+ */
+void dev_mc_unsync(struct net_device *to, struct net_device *from)
+{
+	struct dev_addr_list *da;
+
+	netif_tx_lock_bh(from);
+	netif_tx_lock_bh(to);
+
+	for (da = from->mc_list; da != NULL; da = da->next) {
+		if (!da->da_synced)
+			continue;
+		__dev_addr_delete(&to->mc_list, &to->mc_count,
+				  da->da_addr, da->da_addrlen, 0);
+		da->da_synced = 0;
+		__dev_addr_delete(&from->mc_list, &from->mc_count,
+				  da->da_addr, da->da_addrlen, 0);
+	}
+	__dev_set_rx_mode(to);
+
+	netif_tx_unlock_bh(to);
+	netif_tx_unlock_bh(from);
+}
+EXPORT_SYMBOL(dev_mc_unsync);
+
 static void __dev_addr_discard(struct dev_addr_list **list)
 {
 	struct dev_addr_list *tmp;
@@ -3963,6 +4091,79 @@ static int __init netdev_dma_register(void)
 static int __init netdev_dma_register(void) { return -ENODEV; }
 #endif /* CONFIG_NET_DMA */
 
+#ifdef CONFIG_PROC_FS
+static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
+{
+	struct net_device *dev;
+	loff_t off = 0;
+
+	read_lock(&dev_base_lock);
+	for_each_netdev(dev) {
+		if (off++ == *pos)
+			return dev;
+	}
+	return NULL;
+}
+
+static void *dev_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+	++*pos;
+	return next_net_device((struct net_device *)v);
+}
+
+static void dev_mc_seq_stop(struct seq_file *seq, void *v)
+{
+	read_unlock(&dev_base_lock);
+}
+
+static int dev_mc_seq_show(struct seq_file *seq, void *v)
+{
+	struct dev_addr_list *m;
+	struct net_device *dev = v;
+
+	netif_tx_lock_bh(dev);
+	for (m = dev->mc_list; m; m = m->next) {
+		int i;
+
+		seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex,
+			   dev->name, m->dmi_users, m->dmi_gusers);
+
+		for (i = 0; i < m->dmi_addrlen; i++)
+			seq_printf(seq, "%02x", m->dmi_addr[i]);
+
+		seq_putc(seq, '\n');
+	}
+	netif_tx_unlock_bh(dev);
+	return 0;
+}
+
+static const struct seq_operations dev_mc_seq_ops = {
+	.start = dev_mc_seq_start,
+	.next  = dev_mc_seq_next,
+	.stop  = dev_mc_seq_stop,
+	.show  = dev_mc_seq_show,
+};
+
+static int dev_mc_seq_open(struct inode *inode, struct file *file)
+{
+	return seq_open(file, &dev_mc_seq_ops);
+}
+
+static const struct file_operations dev_mc_seq_fops = {
+	.owner	 = THIS_MODULE,
+	.open    = dev_mc_seq_open,
+	.read    = seq_read,
+	.llseek  = seq_lseek,
+	.release = seq_release,
+};
+
+#endif
+
+void __init dev_mcast_init(void)
+{
+	proc_net_fops_create("dev_mcast", 0, &dev_mc_seq_fops);
+}
+
 /*
  *	Initialize the DEV module. At boot time this walks the device list and
  *	unhooks any devices that fail to initialise (normally hardware not
@@ -4076,209 +4277,3 @@ EXPORT_SYMBOL(dev_load);
 #endif
 
 EXPORT_PER_CPU_SYMBOL(softnet_data);
-
-/*
- *	Device multicast list maintenance.
- *
- *	This is used both by IP and by the user level maintenance functions.
- *	Unlike BSD we maintain a usage count on a given multicast address so
- *	that a casual user application can add/delete multicasts used by
- *	protocols without doing damage to the protocols when it deletes the
- *	entries. It also helps IP as it tracks overlapping maps.
- *
- *	Device mc lists are changed by bh at least if IPv6 is enabled,
- *	so that it must be bh protected.
- *
- *	We block accesses to device mc filters with netif_tx_lock.
- */
-
-/*
- *	Delete a device level multicast
- */
-
-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, &dev->mc_count,
-				addr, alen, glbl);
-	if (!err) {
-		/*
-		 *	We have altered the list, so the card
-		 *	loaded filter is now wrong. Fix it
-		 */
-
-		__dev_set_rx_mode(dev);
-	}
-	netif_tx_unlock_bh(dev);
-	return err;
-}
-
-/*
- *	Add a device level multicast
- */
-
-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, &dev->mc_count, addr, alen, glbl);
-	if (!err)
-		__dev_set_rx_mode(dev);
-	netif_tx_unlock_bh(dev);
-	return err;
-}
-
-/**
- *	dev_mc_sync	- Synchronize device's multicast list to another device
- *	@to: destination device
- *	@from: source device
- *
- * 	Add newly added addresses to the destination device and release
- * 	addresses that have no users left. The source device must be
- * 	locked by netif_tx_lock_bh.
- *
- *	This function is intended to be called from the dev->set_multicast_list
- *	function of layered software devices.
- */
-int dev_mc_sync(struct net_device *to, struct net_device *from)
-{
-	struct dev_addr_list *da;
-	int err = 0;
-
-	netif_tx_lock_bh(to);
-	for (da = from->mc_list; da != NULL; da = da->next) {
-		if (!da->da_synced) {
-			err = __dev_addr_add(&to->mc_list, &to->mc_count,
-					     da->da_addr, da->da_addrlen, 0);
-			if (err < 0)
-				break;
-			da->da_synced = 1;
-			da->da_users++;
-		} else if (da->da_users == 1) {
-			__dev_addr_delete(&to->mc_list, &to->mc_count,
-					  da->da_addr, da->da_addrlen, 0);
-			__dev_addr_delete(&from->mc_list, &from->mc_count,
-					  da->da_addr, da->da_addrlen, 0);
-		}
-	}
-	if (!err)
-		__dev_set_rx_mode(to);
-	netif_tx_unlock_bh(to);
-
-	return err;
-}
-EXPORT_SYMBOL(dev_mc_sync);
-
-
-/**
- * 	dev_mc_unsync	- Remove synchronized addresses from the destination
- * 			  device
- *	@to: destination device
- *	@from: source device
- *
- * 	Remove all addresses that were added to the destination device by
- * 	dev_mc_sync(). This function is intended to be called from the
- * 	dev->stop function of layered software devices.
- */
-void dev_mc_unsync(struct net_device *to, struct net_device *from)
-{
-	struct dev_addr_list *da;
-
-	netif_tx_lock_bh(from);
-	netif_tx_lock_bh(to);
-
-	for (da = from->mc_list; da != NULL; da = da->next) {
-		if (!da->da_synced)
-			continue;
-		__dev_addr_delete(&to->mc_list, &to->mc_count,
-				  da->da_addr, da->da_addrlen, 0);
-		da->da_synced = 0;
-		__dev_addr_delete(&from->mc_list, &from->mc_count,
-				  da->da_addr, da->da_addrlen, 0);
-	}
-	__dev_set_rx_mode(to);
-
-	netif_tx_unlock_bh(to);
-	netif_tx_unlock_bh(from);
-}
-EXPORT_SYMBOL(dev_mc_unsync);
-
-#ifdef CONFIG_PROC_FS
-static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
-{
-	struct net_device *dev;
-	loff_t off = 0;
-
-	read_lock(&dev_base_lock);
-	for_each_netdev(dev) {
-		if (off++ == *pos)
-			return dev;
-	}
-	return NULL;
-}
-
-static void *dev_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
-{
-	++*pos;
-	return next_net_device((struct net_device *)v);
-}
-
-static void dev_mc_seq_stop(struct seq_file *seq, void *v)
-{
-	read_unlock(&dev_base_lock);
-}
-
-
-static int dev_mc_seq_show(struct seq_file *seq, void *v)
-{
-	struct dev_addr_list *m;
-	struct net_device *dev = v;
-
-	netif_tx_lock_bh(dev);
-	for (m = dev->mc_list; m; m = m->next) {
-		int i;
-
-		seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex,
-			   dev->name, m->dmi_users, m->dmi_gusers);
-
-		for (i = 0; i < m->dmi_addrlen; i++)
-			seq_printf(seq, "%02x", m->dmi_addr[i]);
-
-		seq_putc(seq, '\n');
-	}
-	netif_tx_unlock_bh(dev);
-	return 0;
-}
-
-static const struct seq_operations dev_mc_seq_ops = {
-	.start = dev_mc_seq_start,
-	.next  = dev_mc_seq_next,
-	.stop  = dev_mc_seq_stop,
-	.show  = dev_mc_seq_show,
-};
-
-static int dev_mc_seq_open(struct inode *inode, struct file *file)
-{
-	return seq_open(file, &dev_mc_seq_ops);
-}
-
-static const struct file_operations dev_mc_seq_fops = {
-	.owner	 = THIS_MODULE,
-	.open    = dev_mc_seq_open,
-	.read    = seq_read,
-	.llseek  = seq_lseek,
-	.release = seq_release,
-};
-
-#endif
-
-void __init dev_mcast_init(void)
-{
-	proc_net_fops_create("dev_mcast", 0, &dev_mc_seq_fops);
-}
-
-EXPORT_SYMBOL(dev_mc_add);
-EXPORT_SYMBOL(dev_mc_delete);
-- 
1.5.2.2


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] net/core: some functions' definition order adjustment for readability
  2007-07-18 11:30           ` [PATCH 2/2] net/core: some functions' definition order adjustment for readability Denis Cheng
@ 2007-07-18 12:39             ` Patrick McHardy
  2007-07-18 14:31               ` rae l
  0 siblings, 1 reply; 18+ messages in thread
From: Patrick McHardy @ 2007-07-18 12:39 UTC (permalink / raw)
  To: Denis Cheng; +Cc: David Miller, netdev, kuznet, pekkas, jmorris, linux-kernel

This could be done in the patch moving it .. anyways,


Denis Cheng wrote:
> +#ifdef CONFIG_PROC_FS
> +static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)


If you're interested in doing more work, it would be nice to
generalize the seq-file functions for unicast and multicast
address lists and add /proc/net/dev_unicast or something like
that.

OTOH we could also export this using rtnetlink. The main reason
why I didn't do that is that it can only be read, not changed,
but this is also true for statistics etc. Any opinions on this?


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] net/core: some functions' definition order adjustment for readability
  2007-07-18 12:39             ` Patrick McHardy
@ 2007-07-18 14:31               ` rae l
  0 siblings, 0 replies; 18+ messages in thread
From: rae l @ 2007-07-18 14:31 UTC (permalink / raw)
  To: Patrick McHardy
  Cc: David Miller, netdev, kuznet, pekkas, jmorris, linux-kernel

On 7/18/07, Patrick McHardy <kaber@trash.net> wrote:
> This could be done in the patch moving it .. anyways,
What?

>
>
> Denis Cheng wrote:
> > +#ifdef CONFIG_PROC_FS
> > +static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
>
>
> If you're interested in doing more work, it would be nice to
> generalize the seq-file functions for unicast and multicast
> address lists and add /proc/net/dev_unicast or something like
> that.
Eh, there is already a dev_multicast file but lack of dev_unicast,
but is dev_unicast really useful?

>
> OTOH we could also export this using rtnetlink. The main reason
> why I didn't do that is that it can only be read, not changed,
> but this is also true for statistics etc. Any opinions on this?
how to do that?

>
>


-- 
Denis Cheng
Linux Application Developer

"One of my most productive days was throwing away 1000 lines of code."
 - Ken Thompson.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c
  2007-07-18 11:30         ` [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c Denis Cheng
  2007-07-18 11:30           ` [PATCH 2/2] net/core: some functions' definition order adjustment for readability Denis Cheng
@ 2007-07-20  1:51           ` rae l
  2007-07-20  3:04             ` David Miller
  1 sibling, 1 reply; 18+ messages in thread
From: rae l @ 2007-07-20  1:51 UTC (permalink / raw)
  To: David Miller
  Cc: netdev, kuznet, Patrick McHardy, pekkas, jmorris, linux-kernel,
	Denis Cheng

On 7/18/07, Denis Cheng <crquan@gmail.com> wrote:
> - removed three function declarations from header file to mark them static,
> - reduced one file
>
> Signed-off-by: Denis Cheng <crquan@gmail.com>
> ---
>
> this one is just merging by concatenating, and I'll try to adjust some
> function definitions' order to make it more readable.
>
>  include/linux/netdevice.h |    3 -
>  net/core/Makefile         |    2 +-
>  net/core/dev.c            |  239 +++++++++++++++++++++++++++++++++++++++++-
>  net/core/dev_mcast.c      |  255 ---------------------------------------------
>  4 files changed, 237 insertions(+), 262 deletions(-)
>  delete mode 100644 net/core/dev_mcast.c
>
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index 9820ca1..ca68c58 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -1091,15 +1091,12 @@ extern int              register_netdev(struct net_device *dev);
>  extern void            unregister_netdev(struct net_device *dev);
>  /* Functions used for secondary unicast and multicast support */
>  extern void            dev_set_rx_mode(struct net_device *dev);
> -extern void            __dev_set_rx_mode(struct net_device *dev);
>  extern int             dev_unicast_delete(struct net_device *dev, void *addr, int alen);
>  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 int             dev_mc_sync(struct net_device *to, struct net_device *from);
>  extern void            dev_mc_unsync(struct net_device *to, struct net_device *from);
> -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_set_promiscuity(struct net_device *dev, int inc);
>  extern void            dev_set_allmulti(struct net_device *dev, int inc);
>  extern void            netdev_state_change(struct net_device *dev);
> diff --git a/net/core/Makefile b/net/core/Makefile
> index 4751613..54d28dd 100644
> --- a/net/core/Makefile
> +++ b/net/core/Makefile
> @@ -7,7 +7,7 @@ obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \
>
>  obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
>
> -obj-y               += dev.o ethtool.o dev_mcast.o dst.o netevent.o \
> +obj-y               += dev.o ethtool.o dst.o netevent.o \
>                         neighbour.o rtnetlink.o utils.o link_watch.o filter.o
>
>  obj-$(CONFIG_XFRM) += flow.o
> diff --git a/net/core/dev.c b/net/core/dev.c
> index 6357f54..16842af 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -18,6 +18,7 @@
>   *             Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
>   *             Adam Sulmicki <adam@cfar.umd.edu>
>   *              Pekka Riikonen <priikone@poesidon.pspt.fi>
> + *              Denis Cheng <crquan@gmail.com>
>   *
>   *     Changes:
>   *              D.J. Barrow     :       Fixed bug where dev->refcnt gets set
> @@ -70,6 +71,32 @@
>   *                                     indefinitely on dev->refcnt
>   *             J Hadi Salim    :       - Backlog queue sampling
>   *                                     - netif_rx() feedback
> + *              Denis Cheng     :       Merge dev_mcast.c into it
> + */
> +
> +/*
> + *     The original information in dev_mcast.c:
> + *
> + *     Linux NET3:     Multicast List maintenance.
> + *
> + *     Authors:
> + *             Tim Kordas <tjk@nostromo.eeap.cwru.edu>
> + *             Richard Underwood <richard@wuzz.demon.co.uk>
> + *
> + *     Stir fried together from the IP multicast and CAP patches above
> + *             Alan Cox <Alan.Cox@linux.org>
> + *
> + *     Fixes:
> + *             Alan Cox        :       Update the device on a real delete
> + *                                     rather than any time but...
> + *             Alan Cox        :       IFF_ALLMULTI support.
> + *             Alan Cox        :       New format set_multicast_list() calls.
> + *             Gleb Natapov    :       Remove dev_mc_lock.
> + *
> + *     This program is free software; you can redistribute it and/or
> + *     modify it under the terms of the GNU General Public License
> + *     as published by the Free Software Foundation; either version
> + *     2 of the License, or (at your option) any later version.
>   */
>
>  #include <asm/uaccess.h>
> @@ -2622,7 +2649,7 @@ void dev_set_allmulti(struct net_device *dev, int inc)
>   *     filtering it is put in promiscous mode while unicast addresses
>   *     are present.
>   */
> -void __dev_set_rx_mode(struct net_device *dev)
> +static void __dev_set_rx_mode(struct net_device *dev)
>  {
>         /* dev_open will call this function so the list will stay sane. */
>         if (!(dev->flags&IFF_UP))
> @@ -2657,7 +2684,7 @@ void dev_set_rx_mode(struct net_device *dev)
>         netif_tx_unlock_bh(dev);
>  }
>
> -int __dev_addr_delete(struct dev_addr_list **list, int *count,
> +static int __dev_addr_delete(struct dev_addr_list **list, int *count,
>                       void *addr, int alen, int glbl)
>  {
>         struct dev_addr_list *da;
> @@ -2683,7 +2710,7 @@ int __dev_addr_delete(struct dev_addr_list **list, int *count,
>         return -ENOENT;
>  }
>
> -int __dev_addr_add(struct dev_addr_list **list, int *count,
> +static int __dev_addr_add(struct dev_addr_list **list, int *count,
>                    void *addr, int alen, int glbl)
>  {
>         struct dev_addr_list *da;
> @@ -4049,3 +4076,209 @@ EXPORT_SYMBOL(dev_load);
>  #endif
>
>  EXPORT_PER_CPU_SYMBOL(softnet_data);
> +
> +/*
> + *     Device multicast list maintenance.
> + *
> + *     This is used both by IP and by the user level maintenance functions.
> + *     Unlike BSD we maintain a usage count on a given multicast address so
> + *     that a casual user application can add/delete multicasts used by
> + *     protocols without doing damage to the protocols when it deletes the
> + *     entries. It also helps IP as it tracks overlapping maps.
> + *
> + *     Device mc lists are changed by bh at least if IPv6 is enabled,
> + *     so that it must be bh protected.
> + *
> + *     We block accesses to device mc filters with netif_tx_lock.
> + */
> +
> +/*
> + *     Delete a device level multicast
> + */
> +
> +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, &dev->mc_count,
> +                               addr, alen, glbl);
> +       if (!err) {
> +               /*
> +                *      We have altered the list, so the card
> +                *      loaded filter is now wrong. Fix it
> +                */
> +
> +               __dev_set_rx_mode(dev);
> +       }
> +       netif_tx_unlock_bh(dev);
> +       return err;
> +}
> +
> +/*
> + *     Add a device level multicast
> + */
> +
> +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, &dev->mc_count, addr, alen, glbl);
> +       if (!err)
> +               __dev_set_rx_mode(dev);
> +       netif_tx_unlock_bh(dev);
> +       return err;
> +}
> +
> +/**
> + *     dev_mc_sync     - Synchronize device's multicast list to another device
> + *     @to: destination device
> + *     @from: source device
> + *
> + *     Add newly added addresses to the destination device and release
> + *     addresses that have no users left. The source device must be
> + *     locked by netif_tx_lock_bh.
> + *
> + *     This function is intended to be called from the dev->set_multicast_list
> + *     function of layered software devices.
> + */
> +int dev_mc_sync(struct net_device *to, struct net_device *from)
> +{
> +       struct dev_addr_list *da;
> +       int err = 0;
> +
> +       netif_tx_lock_bh(to);
> +       for (da = from->mc_list; da != NULL; da = da->next) {
> +               if (!da->da_synced) {
> +                       err = __dev_addr_add(&to->mc_list, &to->mc_count,
> +                                            da->da_addr, da->da_addrlen, 0);
> +                       if (err < 0)
> +                               break;
> +                       da->da_synced = 1;
> +                       da->da_users++;
> +               } else if (da->da_users == 1) {
> +                       __dev_addr_delete(&to->mc_list, &to->mc_count,
> +                                         da->da_addr, da->da_addrlen, 0);
> +                       __dev_addr_delete(&from->mc_list, &from->mc_count,
> +                                         da->da_addr, da->da_addrlen, 0);
> +               }
> +       }
> +       if (!err)
> +               __dev_set_rx_mode(to);
> +       netif_tx_unlock_bh(to);
> +
> +       return err;
> +}
> +EXPORT_SYMBOL(dev_mc_sync);
> +
> +
> +/**
> + *     dev_mc_unsync   - Remove synchronized addresses from the destination
> + *                       device
> + *     @to: destination device
> + *     @from: source device
> + *
> + *     Remove all addresses that were added to the destination device by
> + *     dev_mc_sync(). This function is intended to be called from the
> + *     dev->stop function of layered software devices.
> + */
> +void dev_mc_unsync(struct net_device *to, struct net_device *from)
> +{
> +       struct dev_addr_list *da;
> +
> +       netif_tx_lock_bh(from);
> +       netif_tx_lock_bh(to);
> +
> +       for (da = from->mc_list; da != NULL; da = da->next) {
> +               if (!da->da_synced)
> +                       continue;
> +               __dev_addr_delete(&to->mc_list, &to->mc_count,
> +                                 da->da_addr, da->da_addrlen, 0);
> +               da->da_synced = 0;
> +               __dev_addr_delete(&from->mc_list, &from->mc_count,
> +                                 da->da_addr, da->da_addrlen, 0);
> +       }
> +       __dev_set_rx_mode(to);
> +
> +       netif_tx_unlock_bh(to);
> +       netif_tx_unlock_bh(from);
> +}
> +EXPORT_SYMBOL(dev_mc_unsync);
> +
> +#ifdef CONFIG_PROC_FS
> +static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
> +{
> +       struct net_device *dev;
> +       loff_t off = 0;
> +
> +       read_lock(&dev_base_lock);
> +       for_each_netdev(dev) {
> +               if (off++ == *pos)
> +                       return dev;
> +       }
> +       return NULL;
> +}
> +
> +static void *dev_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
> +{
> +       ++*pos;
> +       return next_net_device((struct net_device *)v);
> +}
> +
> +static void dev_mc_seq_stop(struct seq_file *seq, void *v)
> +{
> +       read_unlock(&dev_base_lock);
> +}
> +
> +
> +static int dev_mc_seq_show(struct seq_file *seq, void *v)
> +{
> +       struct dev_addr_list *m;
> +       struct net_device *dev = v;
> +
> +       netif_tx_lock_bh(dev);
> +       for (m = dev->mc_list; m; m = m->next) {
> +               int i;
> +
> +               seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex,
> +                          dev->name, m->dmi_users, m->dmi_gusers);
> +
> +               for (i = 0; i < m->dmi_addrlen; i++)
> +                       seq_printf(seq, "%02x", m->dmi_addr[i]);
> +
> +               seq_putc(seq, '\n');
> +       }
> +       netif_tx_unlock_bh(dev);
> +       return 0;
> +}
> +
> +static const struct seq_operations dev_mc_seq_ops = {
> +       .start = dev_mc_seq_start,
> +       .next  = dev_mc_seq_next,
> +       .stop  = dev_mc_seq_stop,
> +       .show  = dev_mc_seq_show,
> +};
> +
> +static int dev_mc_seq_open(struct inode *inode, struct file *file)
> +{
> +       return seq_open(file, &dev_mc_seq_ops);
> +}
> +
> +static const struct file_operations dev_mc_seq_fops = {
> +       .owner   = THIS_MODULE,
> +       .open    = dev_mc_seq_open,
> +       .read    = seq_read,
> +       .llseek  = seq_lseek,
> +       .release = seq_release,
> +};
> +
> +#endif
> +
> +void __init dev_mcast_init(void)
> +{
> +       proc_net_fops_create("dev_mcast", 0, &dev_mc_seq_fops);
> +}
> +
> +EXPORT_SYMBOL(dev_mc_add);
> +EXPORT_SYMBOL(dev_mc_delete);
> diff --git a/net/core/dev_mcast.c b/net/core/dev_mcast.c
> deleted file mode 100644
> index 99aece1..0000000
> --- a/net/core/dev_mcast.c
> +++ /dev/null
> @@ -1,255 +0,0 @@
> -/*
> - *     Linux NET3:     Multicast List maintenance.
> - *
> - *     Authors:
> - *             Tim Kordas <tjk@nostromo.eeap.cwru.edu>
> - *             Richard Underwood <richard@wuzz.demon.co.uk>
> - *
> - *     Stir fried together from the IP multicast and CAP patches above
> - *             Alan Cox <Alan.Cox@linux.org>
> - *
> - *     Fixes:
> - *             Alan Cox        :       Update the device on a real delete
> - *                                     rather than any time but...
> - *             Alan Cox        :       IFF_ALLMULTI support.
> - *             Alan Cox        :       New format set_multicast_list() calls.
> - *             Gleb Natapov    :       Remove dev_mc_lock.
> - *
> - *     This program is free software; you can redistribute it and/or
> - *     modify it under the terms of the GNU General Public License
> - *     as published by the Free Software Foundation; either version
> - *     2 of the License, or (at your option) any later version.
> - */
> -
> -#include <linux/module.h>
> -#include <asm/uaccess.h>
> -#include <asm/system.h>
> -#include <linux/bitops.h>
> -#include <linux/types.h>
> -#include <linux/kernel.h>
> -#include <linux/string.h>
> -#include <linux/mm.h>
> -#include <linux/socket.h>
> -#include <linux/sockios.h>
> -#include <linux/in.h>
> -#include <linux/errno.h>
> -#include <linux/interrupt.h>
> -#include <linux/if_ether.h>
> -#include <linux/inet.h>
> -#include <linux/netdevice.h>
> -#include <linux/etherdevice.h>
> -#include <linux/proc_fs.h>
> -#include <linux/seq_file.h>
> -#include <linux/init.h>
> -#include <net/ip.h>
> -#include <net/route.h>
> -#include <linux/skbuff.h>
> -#include <net/sock.h>
> -#include <net/arp.h>
> -
> -
> -/*
> - *     Device multicast list maintenance.
> - *
> - *     This is used both by IP and by the user level maintenance functions.
> - *     Unlike BSD we maintain a usage count on a given multicast address so
> - *     that a casual user application can add/delete multicasts used by
> - *     protocols without doing damage to the protocols when it deletes the
> - *     entries. It also helps IP as it tracks overlapping maps.
> - *
> - *     Device mc lists are changed by bh at least if IPv6 is enabled,
> - *     so that it must be bh protected.
> - *
> - *     We block accesses to device mc filters with netif_tx_lock.
> - */
> -
> -/*
> - *     Delete a device level multicast
> - */
> -
> -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, &dev->mc_count,
> -                               addr, alen, glbl);
> -       if (!err) {
> -               /*
> -                *      We have altered the list, so the card
> -                *      loaded filter is now wrong. Fix it
> -                */
> -
> -               __dev_set_rx_mode(dev);
> -       }
> -       netif_tx_unlock_bh(dev);
> -       return err;
> -}
> -
> -/*
> - *     Add a device level multicast
> - */
> -
> -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, &dev->mc_count, addr, alen, glbl);
> -       if (!err)
> -               __dev_set_rx_mode(dev);
> -       netif_tx_unlock_bh(dev);
> -       return err;
> -}
> -
> -/**
> - *     dev_mc_sync     - Synchronize device's multicast list to another device
> - *     @to: destination device
> - *     @from: source device
> - *
> - *     Add newly added addresses to the destination device and release
> - *     addresses that have no users left. The source device must be
> - *     locked by netif_tx_lock_bh.
> - *
> - *     This function is intended to be called from the dev->set_multicast_list
> - *     function of layered software devices.
> - */
> -int dev_mc_sync(struct net_device *to, struct net_device *from)
> -{
> -       struct dev_addr_list *da;
> -       int err = 0;
> -
> -       netif_tx_lock_bh(to);
> -       for (da = from->mc_list; da != NULL; da = da->next) {
> -               if (!da->da_synced) {
> -                       err = __dev_addr_add(&to->mc_list, &to->mc_count,
> -                                            da->da_addr, da->da_addrlen, 0);
> -                       if (err < 0)
> -                               break;
> -                       da->da_synced = 1;
> -                       da->da_users++;
> -               } else if (da->da_users == 1) {
> -                       __dev_addr_delete(&to->mc_list, &to->mc_count,
> -                                         da->da_addr, da->da_addrlen, 0);
> -                       __dev_addr_delete(&from->mc_list, &from->mc_count,
> -                                         da->da_addr, da->da_addrlen, 0);
> -               }
> -       }
> -       if (!err)
> -               __dev_set_rx_mode(to);
> -       netif_tx_unlock_bh(to);
> -
> -       return err;
> -}
> -EXPORT_SYMBOL(dev_mc_sync);
> -
> -
> -/**
> - *     dev_mc_unsync   - Remove synchronized addresses from the destination
> - *                       device
> - *     @to: destination device
> - *     @from: source device
> - *
> - *     Remove all addresses that were added to the destination device by
> - *     dev_mc_sync(). This function is intended to be called from the
> - *     dev->stop function of layered software devices.
> - */
> -void dev_mc_unsync(struct net_device *to, struct net_device *from)
> -{
> -       struct dev_addr_list *da;
> -
> -       netif_tx_lock_bh(from);
> -       netif_tx_lock_bh(to);
> -
> -       for (da = from->mc_list; da != NULL; da = da->next) {
> -               if (!da->da_synced)
> -                       continue;
> -               __dev_addr_delete(&to->mc_list, &to->mc_count,
> -                                 da->da_addr, da->da_addrlen, 0);
> -               da->da_synced = 0;
> -               __dev_addr_delete(&from->mc_list, &from->mc_count,
> -                                 da->da_addr, da->da_addrlen, 0);
> -       }
> -       __dev_set_rx_mode(to);
> -
> -       netif_tx_unlock_bh(to);
> -       netif_tx_unlock_bh(from);
> -}
> -EXPORT_SYMBOL(dev_mc_unsync);
> -
> -#ifdef CONFIG_PROC_FS
> -static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
> -{
> -       struct net_device *dev;
> -       loff_t off = 0;
> -
> -       read_lock(&dev_base_lock);
> -       for_each_netdev(dev) {
> -               if (off++ == *pos)
> -                       return dev;
> -       }
> -       return NULL;
> -}
> -
> -static void *dev_mc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
> -{
> -       ++*pos;
> -       return next_net_device((struct net_device *)v);
> -}
> -
> -static void dev_mc_seq_stop(struct seq_file *seq, void *v)
> -{
> -       read_unlock(&dev_base_lock);
> -}
> -
> -
> -static int dev_mc_seq_show(struct seq_file *seq, void *v)
> -{
> -       struct dev_addr_list *m;
> -       struct net_device *dev = v;
> -
> -       netif_tx_lock_bh(dev);
> -       for (m = dev->mc_list; m; m = m->next) {
> -               int i;
> -
> -               seq_printf(seq, "%-4d %-15s %-5d %-5d ", dev->ifindex,
> -                          dev->name, m->dmi_users, m->dmi_gusers);
> -
> -               for (i = 0; i < m->dmi_addrlen; i++)
> -                       seq_printf(seq, "%02x", m->dmi_addr[i]);
> -
> -               seq_putc(seq, '\n');
> -       }
> -       netif_tx_unlock_bh(dev);
> -       return 0;
> -}
> -
> -static const struct seq_operations dev_mc_seq_ops = {
> -       .start = dev_mc_seq_start,
> -       .next  = dev_mc_seq_next,
> -       .stop  = dev_mc_seq_stop,
> -       .show  = dev_mc_seq_show,
> -};
> -
> -static int dev_mc_seq_open(struct inode *inode, struct file *file)
> -{
> -       return seq_open(file, &dev_mc_seq_ops);
> -}
> -
> -static const struct file_operations dev_mc_seq_fops = {
> -       .owner   = THIS_MODULE,
> -       .open    = dev_mc_seq_open,
> -       .read    = seq_read,
> -       .llseek  = seq_lseek,
> -       .release = seq_release,
> -};
> -
> -#endif
> -
> -void __init dev_mcast_init(void)
> -{
> -       proc_net_fops_create("dev_mcast", 0, &dev_mc_seq_fops);
> -}
> -
> -EXPORT_SYMBOL(dev_mc_add);
> -EXPORT_SYMBOL(dev_mc_delete);
> --
> 1.5.2.2
Is there any more comments on this?

>
>


-- 
Denis Cheng
Linux Application Developer

"One of my most productive days was throwing away 1000 lines of code."
 - Ken Thompson.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c
  2007-07-20  1:51           ` [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c rae l
@ 2007-07-20  3:04             ` David Miller
  2007-07-20  3:22               ` rae l
  0 siblings, 1 reply; 18+ messages in thread
From: David Miller @ 2007-07-20  3:04 UTC (permalink / raw)
  To: crquan; +Cc: netdev, kuznet, kaber, pekkas, jmorris, linux-kernel

From: "rae l" <crquan@gmail.com>
Date: Fri, 20 Jul 2007 09:51:05 +0800

> Is there any more comments on this?

Please don't quote a big huge patch just to say one sentence that
doesn't apply to any particular specific part of a patch.

That's wastes bandwidth, annoys people you might actually want
a response from, and is bad netiquette in general.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c
  2007-07-20  3:04             ` David Miller
@ 2007-07-20  3:22               ` rae l
  0 siblings, 0 replies; 18+ messages in thread
From: rae l @ 2007-07-20  3:22 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, kuznet, kaber, pekkas, jmorris, linux-kernel

On 7/20/07, David Miller <davem@davemloft.net> wrote:
> Please don't quote a big huge patch just to say one sentence that
> doesn't apply to any particular specific part of a patch.
>
> That's wastes bandwidth, annoys people you might actually want
> a response from, and is bad netiquette in general.
Thanks.

>

-- 
Denis Cheng
Linux Application Developer

"One of my most productive days was throwing away 1000 lines of code."
 - Ken Thompson.

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2007-07-20  3:22 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <11846606051099-git-send-email-crquan@gmail.com>
2007-07-18  2:41 ` [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c Denis Cheng
2007-07-18  2:41   ` [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one Denis Cheng
2007-07-18  2:41     ` [PATCH 3/3] [net/core] move __dev_addr_discard adjacent to dev_addr_discard for readability Denis Cheng
2007-07-18  9:13       ` David Miller
2007-07-18  9:12     ` [PATCH 2/3] [net/core] merge dev_unicast_discard and dev_mc_discard into one David Miller
2007-07-18  9:11   ` [PATCH 1/3] [net/core] move dev_mc_discard from dev_mcast.c to dev.c David Miller
2007-07-18  9:59     ` rae l
2007-07-18 10:01       ` Patrick McHardy
2007-07-18 10:04         ` David Miller
2007-07-18 10:10           ` Patrick McHardy
2007-07-18 10:03       ` David Miller
2007-07-18 11:30         ` [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c Denis Cheng
2007-07-18 11:30           ` [PATCH 2/2] net/core: some functions' definition order adjustment for readability Denis Cheng
2007-07-18 12:39             ` Patrick McHardy
2007-07-18 14:31               ` rae l
2007-07-20  1:51           ` [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c rae l
2007-07-20  3:04             ` David Miller
2007-07-20  3:22               ` rae l

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).