lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <91b13c310707191851h3bffaf2au7443d32c725dfb45@mail.gmail.com>
Date:	Fri, 20 Jul 2007 09:51:05 +0800
From:	"rae l" <crquan@...il.com>
To:	"David Miller" <davem@...emloft.net>
Cc:	netdev@...r.kernel.org, kuznet@....inr.ac.ru,
	"Patrick McHardy" <kaber@...sh.net>, pekkas@...core.fi,
	jmorris@...ei.org, linux-kernel@...r.kernel.org,
	"Denis Cheng" <crquan@...il.com>
Subject: Re: [PATCH 1/2] net/core: merge the content of dev_mcast.c into dev.c

On 7/18/07, Denis Cheng <crquan@...il.com> wrote:
> - removed three function declarations from header file to mark them static,
> - reduced one file
>
> Signed-off-by: Denis Cheng <crquan@...il.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@....inr.ac.ru>
>   *             Adam Sulmicki <adam@...r.umd.edu>
>   *              Pekka Riikonen <priikone@...sidon.pspt.fi>
> + *              Denis Cheng <crquan@...il.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@...tromo.eeap.cwru.edu>
> + *             Richard Underwood <richard@...z.demon.co.uk>
> + *
> + *     Stir fried together from the IP multicast and CAP patches above
> + *             Alan Cox <Alan.Cox@...ux.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@...tromo.eeap.cwru.edu>
> - *             Richard Underwood <richard@...z.demon.co.uk>
> - *
> - *     Stir fried together from the IP multicast and CAP patches above
> - *             Alan Cox <Alan.Cox@...ux.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.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ