/* * Equalizer Load-balancer for serial network interfaces. * * (c) Copyright 1995 Simon "Guru Aleph-Null" Janes * NCM: Network and Communications Management, Inc. * * (c) Copyright 2002 David S. Miller ([email protected]) * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * * The author may be reached as [email protected], or C/O * NCM * Attn: Simon Janes * 6803 Whittier Ave * McLean VA 22101 * Phone: 1-703-847-0040 ext 103 */ /* * Sources: * skeleton.c by Donald Becker. * Inspirations: * The Harried and Overworked Alan Cox * Conspiracies: * The Alan Cox and Mike McLagan plot to get someone else to do the code, * which turned out to be me. */ /* * $Log: eql.c,v $ * Revision 1.2 1996/04/11 17:51:52 guru * Added one-line eql_remove_slave patch. * * Revision 1.1 1996/04/11 17:44:17 guru * Initial revision * * Revision 3.13 1996/01/21 15:17:18 alan * tx_queue_len changes. * reformatted. * * Revision 3.12 1995/03/22 21:07:51 anarchy * Added capable() checks on configuration. * Moved header file. * * Revision 3.11 1995/01/19 23:14:31 guru * slave_load = (ULONG_MAX - (ULONG_MAX / 2)) - * (priority_Bps) + bytes_queued * 8; * * Revision 3.10 1995/01/19 23:07:53 guru * back to * slave_load = (ULONG_MAX - (ULONG_MAX / 2)) - * (priority_Bps) + bytes_queued; * * Revision 3.9 1995/01/19 22:38:20 guru * slave_load = (ULONG_MAX - (ULONG_MAX / 2)) - * (priority_Bps) + bytes_queued * 4; * * Revision 3.8 1995/01/19 22:30:55 guru * slave_load = (ULONG_MAX - (ULONG_MAX / 2)) - * (priority_Bps) + bytes_queued * 2; * * Revision 3.7 1995/01/19 21:52:35 guru * printk's trimmed out. * * Revision 3.6 1995/01/19 21:49:56 guru * This is working pretty well. I gained 1 K/s in speed.. now it's just * robustness and printk's to be diked out. * * Revision 3.5 1995/01/18 22:29:59 guru * still crashes the kernel when the lock_wait thing is woken up. * * Revision 3.4 1995/01/18 21:59:47 guru * Broken set-bit locking snapshot * * Revision 3.3 1995/01/17 22:09:18 guru * infinite sleep in a lock somewhere.. * * Revision 3.2 1995/01/15 16:46:06 guru * Log trimmed of non-pertinent 1.x branch messages * * Revision 3.1 1995/01/15 14:41:45 guru * New Scheduler and timer stuff... * * Revision 1.15 1995/01/15 14:29:02 guru * Will make 1.14 (now 1.15) the 3.0 branch, and the 1.12 the 2.0 branch, the one * with the dumber scheduler * * Revision 1.14 1995/01/15 02:37:08 guru * shock.. the kept-new-versions could have zonked working * stuff.. shudder * * Revision 1.13 1995/01/15 02:36:31 guru * big changes * * scheduler was torn out and replaced with something smarter * * global names not prefixed with eql_ were renamed to protect * against namespace collisions * * a few more abstract interfaces were added to facilitate any * potential change of datastructure. the driver is still using * a linked list of slaves. going to a heap would be a bit of * an overkill. * * this compiles fine with no warnings. * * the locking mechanism and timer stuff must be written however, * this version will not work otherwise * * Sorry, I had to rewrite most of this for 2.5.x -DaveM */ #define pr_fmt(fmt) … #include <linux/compat.h> #include <linux/capability.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/timer.h> #include <linux/netdevice.h> #include <net/net_namespace.h> #include <linux/if.h> #include <linux/if_arp.h> #include <linux/if_eql.h> #include <linux/pkt_sched.h> #include <linux/uaccess.h> static int eql_open(struct net_device *dev); static int eql_close(struct net_device *dev); static int eql_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data, int cmd); static netdev_tx_t eql_slave_xmit(struct sk_buff *skb, struct net_device *dev); #define eql_is_slave(dev) … #define eql_is_master(dev) … static void eql_kill_one_slave(slave_queue_t *queue, slave_t *slave); static void eql_timer(struct timer_list *t) { … } static const char version[] __initconst = …; static const struct net_device_ops eql_netdev_ops = …; static void __init eql_setup(struct net_device *dev) { … } static int eql_open(struct net_device *dev) { … } static void eql_kill_one_slave(slave_queue_t *queue, slave_t *slave) { … } static void eql_kill_slave_queue(slave_queue_t *queue) { … } static int eql_close(struct net_device *dev) { … } static int eql_enslave(struct net_device *dev, slaving_request_t __user *srq); static int eql_emancipate(struct net_device *dev, slaving_request_t __user *srq); static int eql_g_slave_cfg(struct net_device *dev, slave_config_t __user *sc); static int eql_s_slave_cfg(struct net_device *dev, slave_config_t __user *sc); static int eql_g_master_cfg(struct net_device *dev, master_config_t __user *mc); static int eql_s_master_cfg(struct net_device *dev, master_config_t __user *mc); static int eql_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data, int cmd) { … } /* queue->lock must be held */ static slave_t *__eql_schedule_slaves(slave_queue_t *queue) { … } static netdev_tx_t eql_slave_xmit(struct sk_buff *skb, struct net_device *dev) { … } /* * Private ioctl functions */ /* queue->lock must be held */ static slave_t *__eql_find_slave_dev(slave_queue_t *queue, struct net_device *dev) { … } static inline int eql_is_full(slave_queue_t *queue) { … } /* queue->lock must be held */ static int __eql_insert_slave(slave_queue_t *queue, slave_t *slave) { … } static int eql_enslave(struct net_device *master_dev, slaving_request_t __user *srqp) { … } static int eql_emancipate(struct net_device *master_dev, slaving_request_t __user *srqp) { … } static int eql_g_slave_cfg(struct net_device *dev, slave_config_t __user *scp) { … } static int eql_s_slave_cfg(struct net_device *dev, slave_config_t __user *scp) { … } static int eql_g_master_cfg(struct net_device *dev, master_config_t __user *mcp) { … } static int eql_s_master_cfg(struct net_device *dev, master_config_t __user *mcp) { … } static struct net_device *dev_eql; static int __init eql_init_module(void) { … } static void __exit eql_cleanup_module(void) { … } module_init(…) …; module_exit(eql_cleanup_module); MODULE_DESCRIPTION(…) …; MODULE_LICENSE(…) …;