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 PHC | |
Open Source and information security mailing list archives
| ||
|
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