Patchwork [2/2] ipv6: add mc_count to inet6_dev

login
register
mail settings
Submitter Rami Rosen
Date Oct. 1, 2008, 7:09 a.m.
Message ID <b25312890810010009p73ebdfci88608455a3075c18@mail.gmail.com>
Download mbox | patch
Permalink /patch/2162/
State Rejected
Delegated to: David Miller
Headers show

Comments

Rami Rosen - Oct. 1, 2008, 7:09 a.m.
Hi,
  This patch adds mc_count to struct inet6_dev
and updates increment/decrement/initilaize of this field.

Regards,
Rami Rosen


Signed-off-by: Rami Rosen <ramirose@gmail.com>

On Wed, Oct 1, 2008 at 9:57 AM, Rami Rosen <roszenrami@gmail.com> wrote:
> Hi,
>    - This patch set adds mc_count to  struct in_device (IPv4) and to
> struct inet6_dev (IPv6) and updates increment/decrement/initialization
> of this field in IPv4 and in IPv6.
>
> - Also printing the /proc entry (/proc/net/igmp) is adjusted to use
> the new mc_count.
>
>  - Thanks to David Stevens for his feedback.
>
> Regards,
> Rami Rosen
>
> On Thu, Sep 25, 2008 at 10:35 AM, David Stevens <dlstevens@us.ibm.com> wrote:
>> netdev-owner@vger.kernel.org wrote on 09/24/2008 11:44:45 PM:
>>
>>> Hi,
>>>
>>> - I had noticed a long ago that the IP addresses under
>>>  /proc/net/igmp are in Hexa format. I am preparing a patch to fix it
>>> and it will be send very soon.
>>
>> I don't think we can do that, since I believe netstat expects
>> to see this the way it is. Maybe if we change netstat to support
>> both and wait a year for all distros to get it... :-)
>>
>>
>>> So indeed , the count (mc_count of netdevice) shows both IPv4 and IPv6
>> igmp
>>> groups, but in current implementation it is not immediate
>>> to change it. Currently, net_device struct does not have specific
>>> fields for ipv4 or ipv6.  One way of preparing a patch
>>> is to change net_device to have mc_count4 and mc_count6;
>>> I am really willing to prepare such a patch, but I am not sure such a
>>> change in net_device is a proper and a justified
>>> change to do.
>>
>>        These belong with mc_list in inet6_dev and in_device. Really,
>> I'd just add "mc_count" as a field right next to mc_list and inc/dec
>> it when calling the group join/leave functions-- use the list lock
>> to protect it. The structure it's in distinguishes the protocol,
>> and the names are otherwise common.
>>
>>                                                                +-DLS
>>
>>
>

Patch

diff --git a/include/net/if_inet6.h b/include/net/if_inet6.h
index c8effa4..9e9139c 100644
--- a/include/net/if_inet6.h
+++ b/include/net/if_inet6.h
@@ -163,6 +163,7 @@  struct inet6_dev
 	struct inet6_ifaddr	*addr_list;
 
 	struct ifmcaddr6	*mc_list;
+	int			mc_count;	          /* Number of installed mcasts	*/
 	struct ifmcaddr6	*mc_tomb;
 	rwlock_t		mc_lock;
 	unsigned char		mc_qrv;
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index e7c03bc..835521d 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -922,6 +922,7 @@  int ipv6_dev_mc_inc(struct net_device *dev, const struct in6_addr *addr)
 
 	mc->next = idev->mc_list;
 	idev->mc_list = mc;
+	mc->idev->mc_count++;
 	write_unlock_bh(&idev->lock);
 
 	mld_del_delrec(idev, &mc->mca_addr);
@@ -943,7 +944,7 @@  int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr)
 			if (--ma->mca_users == 0) {
 				*map = ma->next;
 				write_unlock_bh(&idev->lock);
-
+				idev->mc_count--;
 				igmp6_group_dropped(ma);
 
 				ma_put(ma);
@@ -2288,6 +2289,7 @@  void ipv6_mc_init_dev(struct inet6_dev *idev)
 			(unsigned long)idev);
 	idev->mc_tomb = NULL;
 	idev->mc_ifc_count = 0;
+	idev->mc_count=0;
 	setup_timer(&idev->mc_ifc_timer, mld_ifc_timer_expire,
 			(unsigned long)idev);
 	idev->mc_qrv = MLD_QRV_DEFAULT;