eql.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:24k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Equalizer Load-balancer for serial network interfaces.
  3.  *
  4.  * (c) Copyright 1995 Simon "Guru Aleph-Null" Janes
  5.  * NCM: Network and Communications Management, Inc.
  6.  *
  7.  *
  8.  * This software may be used and distributed according to the terms
  9.  * of the GNU General Public License, incorporated herein by reference.
  10.  * 
  11.  * The author may be reached as simon@ncm.com, or C/O
  12.  *    NCM
  13.  *    Attn: Simon Janes
  14.  *    6803 Whittier Ave
  15.  *    McLean VA 22101
  16.  *    Phone: 1-703-847-0040 ext 103
  17.  */
  18. /*
  19.  * Sources:
  20.  *   skeleton.c by Donald Becker.
  21.  * Inspirations:
  22.  *   The Harried and Overworked Alan Cox
  23.  * Conspiracies:
  24.  *   The Alan Cox and Mike McLagan plot to get someone else to do the code, 
  25.  *   which turned out to be me.
  26.  */
  27. /*
  28.  * $Log: eql.c,v $
  29.  * Revision 1.2  1996/04/11 17:51:52  guru
  30.  * Added one-line eql_remove_slave patch.
  31.  *
  32.  * Revision 1.1  1996/04/11 17:44:17  guru
  33.  * Initial revision
  34.  *
  35.  * Revision 3.13  1996/01/21  15:17:18  alan
  36.  * tx_queue_len changes.
  37.  * reformatted.
  38.  *
  39.  * Revision 3.12  1995/03/22  21:07:51  anarchy
  40.  * Added capable() checks on configuration.
  41.  * Moved header file.
  42.  *
  43.  * Revision 3.11  1995/01/19  23:14:31  guru
  44.  *        slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
  45.  *  (priority_Bps) + bytes_queued * 8;
  46.  *
  47.  * Revision 3.10  1995/01/19  23:07:53  guru
  48.  * back to
  49.  *        slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
  50.  *  (priority_Bps) + bytes_queued;
  51.  *
  52.  * Revision 3.9  1995/01/19  22:38:20  guru
  53.  *        slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
  54.  *  (priority_Bps) + bytes_queued * 4;
  55.  *
  56.  * Revision 3.8  1995/01/19  22:30:55  guru
  57.  *       slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
  58.  *  (priority_Bps) + bytes_queued * 2;
  59.  *
  60.  * Revision 3.7  1995/01/19  21:52:35  guru
  61.  * printk's trimmed out.
  62.  *
  63.  * Revision 3.6  1995/01/19  21:49:56  guru
  64.  * This is working pretty well. I gained 1 K/s in speed.. now it's just
  65.  * robustness and printk's to be diked out.
  66.  *
  67.  * Revision 3.5  1995/01/18  22:29:59  guru
  68.  * still crashes the kernel when the lock_wait thing is woken up.
  69.  *
  70.  * Revision 3.4  1995/01/18  21:59:47  guru
  71.  * Broken set-bit locking snapshot
  72.  *
  73.  * Revision 3.3  1995/01/17  22:09:18  guru
  74.  * infinite sleep in a lock somewhere..
  75.  *
  76.  * Revision 3.2  1995/01/15  16:46:06  guru
  77.  * Log trimmed of non-pertinent 1.x branch messages
  78.  *
  79.  * Revision 3.1  1995/01/15  14:41:45  guru
  80.  * New Scheduler and timer stuff...
  81.  *
  82.  * Revision 1.15  1995/01/15  14:29:02  guru
  83.  * Will make 1.14 (now 1.15) the 3.0 branch, and the 1.12 the 2.0 branch, the one
  84.  * with the dumber scheduler
  85.  *
  86.  * Revision 1.14  1995/01/15  02:37:08  guru
  87.  * shock.. the kept-new-versions could have zonked working
  88.  * stuff.. shudder
  89.  *
  90.  * Revision 1.13  1995/01/15  02:36:31  guru
  91.  * big changes
  92.  *
  93.  *  scheduler was torn out and replaced with something smarter
  94.  *
  95.  *  global names not prefixed with eql_ were renamed to protect
  96.  *  against namespace collisions
  97.  *
  98.  *  a few more abstract interfaces were added to facilitate any
  99.  *  potential change of datastructure.  the driver is still using
  100.  *  a linked list of slaves.  going to a heap would be a bit of
  101.  *  an overkill.
  102.  *
  103.  *  this compiles fine with no warnings.
  104.  *
  105.  *  the locking mechanism and timer stuff must be written however,
  106.  *  this version will not work otherwise
  107.  *
  108.  */
  109. #include <linux/module.h>
  110. #include <linux/kernel.h>
  111. #include <linux/init.h>
  112. #include <linux/timer.h>
  113. #include <linux/netdevice.h>
  114. #include <linux/if.h>
  115. #include <linux/if_arp.h>
  116. #include <linux/if_eql.h>
  117. #include <asm/uaccess.h>
  118. static char version[] __initdata = 
  119. "Equalizer1996: $Revision: 1.2.1 $ $Date: 1996/09/22 13:52:00 $ Simon Janes (simon@ncm.com)n";
  120. #ifndef EQL_DEBUG
  121. /* #undef EQL_DEBUG      -* print nothing at all, not even a boot-banner */
  122. /* #define EQL_DEBUG 1   -* print only the boot-banner */
  123. /* #define EQL_DEBUG 5   -* print major function entries */
  124. /* #define EQL_DEBUG 20  -* print subfunction entries */
  125. /* #define EQL_DEBUG 50  -* print utility entries */
  126. /* #define EQL_DEBUG 100 -* print voluminous function entries */
  127. #define EQL_DEBUG 1
  128. #endif
  129. static unsigned int eql_debug = EQL_DEBUG;
  130. static int eql_init(struct net_device *dev); /*  */
  131. static int eql_open(struct net_device *dev); /*  */
  132. static int eql_close(struct net_device *dev); /*  */
  133. static int eql_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); /*  */
  134. static int eql_slave_xmit(struct sk_buff *skb, struct net_device *dev); /*  */
  135. static struct net_device_stats *eql_get_stats(struct net_device *dev); /*  */
  136. /* ioctl() handlers
  137.    ---------------- */
  138. static int eql_enslave(struct net_device *dev,  slaving_request_t *srq); /*  */
  139. static int eql_emancipate(struct net_device *dev, slaving_request_t *srq); /*  */
  140. static int eql_g_slave_cfg(struct net_device *dev, slave_config_t *sc); /*  */
  141. static int eql_s_slave_cfg(struct net_device *dev, slave_config_t *sc); /*  */
  142. static int eql_g_master_cfg(struct net_device *dev, master_config_t *mc); /*  */
  143. static int eql_s_master_cfg(struct net_device *dev, master_config_t *mc); /*  */
  144. static inline int eql_is_slave(struct net_device *dev); /*  */
  145. static inline int eql_is_master(struct net_device *dev); /*  */
  146. static slave_t *eql_new_slave(void); /*  */
  147. static void eql_delete_slave(slave_t *slave); /*  */
  148. /* static long eql_slave_priority(slave_t *slave); -*  */
  149. static inline int eql_number_slaves(slave_queue_t *queue); /*  */
  150. static inline int eql_is_empty(slave_queue_t *queue); /*  */
  151. static inline int eql_is_full(slave_queue_t *queue); /*  */
  152. static slave_queue_t *eql_new_slave_queue(struct net_device *dev); /*  */
  153. static void eql_delete_slave_queue(slave_queue_t *queue); /*  */
  154. static int eql_insert_slave(slave_queue_t *queue, slave_t *slave); /*  */
  155. static slave_t *eql_remove_slave(slave_queue_t *queue, slave_t *slave); /*  */
  156. /* static int eql_insert_slave_dev(slave_queue_t *queue, struct net_device *dev); -*  */
  157. static int eql_remove_slave_dev(slave_queue_t *queue, struct net_device *dev); /*  */
  158. static inline struct net_device *eql_best_slave_dev(slave_queue_t *queue); /*  */
  159. static inline slave_t *eql_best_slave(slave_queue_t *queue); /*  */
  160. static inline slave_t *eql_first_slave(slave_queue_t *queue); /*  */
  161. static inline slave_t *eql_next_slave(slave_queue_t *queue, slave_t *slave); /*  */
  162. static inline void eql_set_best_slave(slave_queue_t *queue, slave_t *slave); /*  */
  163. static inline void eql_schedule_slaves(slave_queue_t *queue); /*  */
  164. static slave_t *eql_find_slave_dev(slave_queue_t *queue, struct net_device *dev); /*  */
  165. /* static inline eql_lock_slave_queue(slave_queue_t *queue); -*  */
  166. /* static inline eql_unlock_slave_queue(slave_queue_t *queue); -*  */
  167. static void eql_timer(unsigned long param); /*  */
  168. /* struct net_device * interface functions 
  169.    ---------------------------------------------------------
  170.    */
  171. static int __init eql_init(struct net_device *dev)
  172. {
  173. static unsigned version_printed;
  174. /* static unsigned num_masters     = 0; */
  175. equalizer_t *eql = 0;
  176. SET_MODULE_OWNER(dev);
  177. if ( version_printed++ == 0 && eql_debug > 0)
  178. printk(version);
  179. /*
  180.  * Initialize the device structure. 
  181.  */
  182. dev->priv = kmalloc (sizeof (equalizer_t), GFP_KERNEL);
  183. if (dev->priv == NULL)
  184. return -ENOMEM;
  185. memset (dev->priv, 0, sizeof (equalizer_t));
  186. eql = (equalizer_t *) dev->priv;
  187. eql->stats = kmalloc (sizeof (struct net_device_stats), GFP_KERNEL);
  188. if (eql->stats == NULL) 
  189. {
  190. kfree(dev->priv);
  191. dev->priv = NULL;
  192. return -ENOMEM;
  193. }
  194. memset (eql->stats, 0, sizeof (struct net_device_stats));
  195. init_timer (&eql->timer);
  196. eql->timer.data      = (unsigned long) dev->priv;
  197. eql->timer.expires   = jiffies+EQL_DEFAULT_RESCHED_IVAL;
  198. eql->timer.function  = &eql_timer;
  199. eql->timer_on        = 0;
  200. dev->open = eql_open;
  201. dev->stop = eql_close;
  202. dev->do_ioctl = eql_ioctl;
  203. dev->hard_start_xmit = eql_slave_xmit;
  204. dev->get_stats = eql_get_stats;
  205.   
  206.    /*
  207.     * Fill in the fields of the device structure with 
  208.  * eql-generic values. 
  209.  */
  210. /*
  211.  * Now we undo some of the things that eth_setup does
  212.  *  that we don't like 
  213.  */
  214.  
  215. dev->mtu         = EQL_DEFAULT_MTU; /* set to 576 in eql.h */
  216. dev->flags       = IFF_MASTER;
  217. dev->type        = ARPHRD_SLIP;
  218. dev->tx_queue_len  = 5; /* Hands them off fast */
  219. return 0;
  220. }
  221. static int eql_open(struct net_device *dev)
  222. {
  223. equalizer_t *eql = (equalizer_t *) dev->priv;
  224. slave_queue_t *new_queue;
  225. #ifdef EQL_DEBUG
  226. if (eql_debug >= 5)
  227. printk ("%s: openn", dev->name);
  228. #endif
  229. printk ("%s: remember to turn off Van-Jacobson compression on your slave devices.n", dev->name);
  230. new_queue = eql_new_slave_queue (dev);
  231.     
  232. if (new_queue != 0)
  233. {
  234. new_queue->master_dev = dev;
  235. eql->queue = new_queue;
  236. eql->queue->lock = 0;
  237. eql->min_slaves = 1;
  238. eql->max_slaves = EQL_DEFAULT_MAX_SLAVES; /* 4 usually... */
  239. printk ("%s: adding timern", dev->name);
  240. eql->timer_on = 1;
  241. add_timer (&eql->timer);
  242. return 0;
  243. }
  244. return -ENOMEM;
  245. }
  246. static int eql_close(struct net_device *dev)
  247. {
  248. equalizer_t *eql = (equalizer_t *) dev->priv;
  249. #ifdef EQL_DEBUG
  250. if ( eql_debug >= 5)
  251. printk ("%s: closen", dev->name);
  252. #endif
  253. /*
  254.  * The timer has to be stopped first before we start hacking away
  255.  * at the data structure it scans every so often... 
  256.  */
  257. #ifdef EQL_DEBUG
  258. printk ("%s: stopping timern", dev->name);
  259. #endif
  260. eql->timer_on = 0;
  261. del_timer (&eql->timer);
  262. eql_delete_slave_queue (eql->queue);
  263. return 0;
  264. }
  265. static int eql_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
  266. {  
  267. if(cmd!=EQL_GETMASTRCFG && cmd!=EQL_GETSLAVECFG && 
  268.    !capable(CAP_NET_ADMIN))
  269.    return -EPERM;
  270. switch (cmd)
  271. {
  272. case EQL_ENSLAVE:
  273. return eql_enslave (dev, (slaving_request_t *) ifr->ifr_data);
  274. case EQL_EMANCIPATE:
  275. return eql_emancipate (dev, (slaving_request_t *) ifr->ifr_data);
  276. case EQL_GETSLAVECFG:
  277. return eql_g_slave_cfg (dev, (slave_config_t *) ifr->ifr_data);
  278. case EQL_SETSLAVECFG:
  279. return eql_s_slave_cfg (dev, (slave_config_t *) ifr->ifr_data);
  280. case EQL_GETMASTRCFG:
  281. return eql_g_master_cfg (dev, (master_config_t *) ifr->ifr_data);
  282. case EQL_SETMASTRCFG:
  283. return eql_s_master_cfg (dev, (master_config_t *) ifr->ifr_data);
  284. default:
  285. return -EOPNOTSUPP;
  286. }
  287. }
  288. static int eql_slave_xmit(struct sk_buff *skb, struct net_device *dev)
  289. {
  290. equalizer_t *eql = (equalizer_t *) dev->priv;
  291. struct net_device *slave_dev = 0;
  292. slave_t *slave;
  293. if (skb == NULL)
  294. return 0;
  295. eql_schedule_slaves (eql->queue);
  296.   
  297. slave = eql_best_slave (eql->queue); 
  298. slave_dev = slave ? slave->dev : 0;
  299. if ( slave_dev != 0 )
  300. {
  301. #ifdef EQL_DEBUG
  302. if (eql_debug >= 100)
  303. printk ("%s: %d slaves xmitng %d B %sn", 
  304. dev->name, eql_number_slaves (eql->queue), skb->len,
  305. slave_dev->name);
  306. #endif
  307. skb->dev = slave_dev;
  308. skb->priority = 1;
  309. slave->bytes_queued += skb->len; 
  310. dev_queue_xmit (skb);
  311. eql->stats->tx_packets++;
  312. }
  313. else
  314. {
  315. /*
  316.  * The alternative for this is the return 1 and have
  317.  * dev_queue_xmit just queue it up on the eql's queue. 
  318.  */
  319. eql->stats->tx_dropped++;
  320. dev_kfree_skb(skb);
  321. }   
  322. return 0;
  323. }
  324. static struct net_device_stats * eql_get_stats(struct net_device *dev)
  325. {
  326. equalizer_t *eql = (equalizer_t *) dev->priv;
  327. return eql->stats;
  328. }
  329. /*
  330.  * Private ioctl functions
  331.  */
  332. static int eql_enslave(struct net_device *dev, slaving_request_t *srqp)
  333. {
  334. struct net_device *master_dev;
  335. struct net_device *slave_dev;
  336. slaving_request_t srq;
  337. if (copy_from_user(&srq, srqp, sizeof (slaving_request_t)))
  338.   {
  339. #ifdef EQL_DEBUG
  340. if (eql_debug >= 20)
  341. printk ("EQL enslave: error detected by copy_from_usern");
  342. #endif  
  343. return -EFAULT;
  344.   }
  345. #ifdef EQL_DEBUG
  346. if (eql_debug >= 20)
  347. printk ("%s: enslave '%s' %ld bpsn", dev->name, 
  348. srq.slave_name, srq.priority);
  349. #endif  
  350. master_dev = dev; /* for "clarity" */
  351. slave_dev  = __dev_get_by_name (srq.slave_name);
  352. if (master_dev != 0 && slave_dev != 0)
  353. {
  354. if ((master_dev->flags & IFF_UP) == IFF_UP)
  355.                 {
  356. /*slave is not a master & not already a slave:*/
  357. if (! eql_is_master (slave_dev)  &&
  358.     ! eql_is_slave (slave_dev) )
  359. {
  360. slave_t *s = eql_new_slave ();
  361. equalizer_t *eql = 
  362. (equalizer_t *) master_dev->priv;
  363. if (!s)
  364. return -ENOMEM;
  365. s->dev = slave_dev;
  366. s->priority = srq.priority;
  367. s->priority_bps = srq.priority;
  368. s->priority_Bps = srq.priority / 8;
  369. slave_dev->flags |= IFF_SLAVE;
  370. eql_insert_slave (eql->queue, s);
  371. return 0;
  372. }
  373. #ifdef EQL_DEBUG
  374. else if (eql_debug >= 20)
  375. printk ("EQL enslave: slave is master or slave is already slaven");
  376. #endif  
  377. }
  378. #ifdef EQL_DEBUG
  379. else if (eql_debug >= 20)
  380. printk ("EQL enslave: master device not up!n");
  381. #endif  
  382. }
  383. #ifdef EQL_DEBUG
  384. else if (eql_debug >= 20)
  385. printk ("EQL enslave: master or slave are NULL");
  386. #endif  
  387. return -EINVAL;
  388. }
  389. static int eql_emancipate(struct net_device *dev, slaving_request_t *srqp)
  390. {
  391. struct net_device *master_dev;
  392. struct net_device *slave_dev;
  393. slaving_request_t srq;
  394. if (copy_from_user(&srq, srqp, sizeof (slaving_request_t)))
  395. return -EFAULT;
  396. #ifdef EQL_DEBUG
  397. if (eql_debug >= 20)
  398. printk ("%s: emancipate `%s`n", dev->name, srq.slave_name);
  399. #endif
  400. master_dev = dev; /* for "clarity" */
  401. slave_dev  = __dev_get_by_name (srq.slave_name);
  402. if ( eql_is_slave (slave_dev) ) /* really is a slave */
  403. {
  404. equalizer_t *eql = (equalizer_t *) master_dev->priv;
  405. slave_dev->flags = slave_dev->flags & ~IFF_SLAVE;
  406. eql_remove_slave_dev (eql->queue, slave_dev);
  407. return 0;
  408. }
  409. return -EINVAL;
  410. }
  411. static int eql_g_slave_cfg(struct net_device *dev, slave_config_t *scp)
  412. {
  413. slave_t *slave;
  414. equalizer_t *eql;
  415. struct net_device *slave_dev;
  416. slave_config_t sc;
  417. if (copy_from_user (&sc, scp, sizeof (slave_config_t)))
  418. return -EFAULT;
  419. #ifdef EQL_DEBUG
  420. if (eql_debug >= 20)
  421. printk ("%s: get config for slave `%s'n", dev->name, sc.slave_name);
  422. #endif
  423. eql = (equalizer_t *) dev->priv;
  424. slave_dev = __dev_get_by_name (sc.slave_name);
  425. if ( eql_is_slave (slave_dev) )
  426. {
  427. slave = eql_find_slave_dev (eql->queue,  slave_dev);
  428. if (slave != 0)
  429. {
  430. sc.priority = slave->priority;
  431. if (copy_to_user (scp, &sc, sizeof (slave_config_t)))
  432. return -EFAULT;
  433. return 0;
  434. }
  435. }
  436. return -EINVAL;
  437. }
  438. static int eql_s_slave_cfg(struct net_device *dev, slave_config_t *scp)
  439. {
  440. slave_t *slave;
  441. equalizer_t *eql;
  442. struct net_device *slave_dev;
  443. slave_config_t sc;
  444. if (copy_from_user (&sc, scp, sizeof (slave_config_t)))
  445. return -EFAULT;
  446. #ifdef EQL_DEBUG
  447. if (eql_debug >= 20)
  448. printk ("%s: set config for slave `%s'n", dev->name, sc.slave_name);
  449. #endif
  450.   
  451. eql = (equalizer_t *) dev->priv;
  452. slave_dev = __dev_get_by_name (sc.slave_name);
  453. if ( eql_is_slave (slave_dev) )
  454. {
  455. slave = eql_find_slave_dev (eql->queue, slave_dev);
  456. if (slave != 0)
  457. {
  458. slave->priority = sc.priority;
  459. slave->priority_bps = sc.priority;
  460. slave->priority_Bps = sc.priority / 8;
  461. return 0;
  462. }
  463. }
  464. return -EINVAL;
  465. }
  466. static int eql_g_master_cfg(struct net_device *dev, master_config_t *mcp)
  467. {
  468. equalizer_t *eql;
  469. master_config_t mc;
  470. #if EQL_DEBUG
  471. if (eql_debug >= 20)
  472. printk ("%s: get master confign", dev->name);
  473. #endif
  474. if ( eql_is_master (dev) )
  475. {
  476. eql = (equalizer_t *) dev->priv;
  477. mc.max_slaves = eql->max_slaves;
  478. mc.min_slaves = eql->min_slaves;
  479. if (copy_to_user (mcp, &mc, sizeof (master_config_t)))
  480. return -EFAULT;
  481. return 0;
  482. }
  483. return -EINVAL;
  484. }
  485. static int eql_s_master_cfg(struct net_device *dev, master_config_t *mcp)
  486. {
  487. equalizer_t *eql;
  488. master_config_t mc;
  489. if (copy_from_user (&mc, mcp, sizeof (master_config_t)))
  490. return -EFAULT;
  491. #if EQL_DEBUG
  492. if (eql_debug >= 20)
  493. printk ("%s: set master confign", dev->name);
  494. #endif
  495. if ( eql_is_master (dev) )
  496. {
  497. eql = (equalizer_t *) dev->priv;
  498. eql->max_slaves = mc.max_slaves;
  499. eql->min_slaves = mc.min_slaves;
  500. return 0;
  501. }
  502. return -EINVAL;
  503. }
  504. /*
  505.  * Private device support functions
  506.  */
  507. static inline int eql_is_slave(struct net_device *dev)
  508. {
  509. if (dev)
  510. {
  511. if ((dev->flags & IFF_SLAVE) == IFF_SLAVE)
  512. return 1;
  513. }
  514. return 0;
  515. }
  516. static inline int eql_is_master(struct net_device *dev)
  517. {
  518. if (dev)
  519. {
  520. if ((dev->flags & IFF_MASTER) == IFF_MASTER)
  521. return 1;
  522. }
  523. return 0;
  524. }
  525. static slave_t *eql_new_slave(void)
  526. {
  527. slave_t *slave;
  528. slave = (slave_t *) kmalloc (sizeof (slave_t), GFP_KERNEL);
  529. if (slave)
  530. memset(slave, 0, sizeof (slave_t));
  531. return slave;
  532. }
  533. static void eql_delete_slave(slave_t *slave)
  534. {
  535. kfree (slave);
  536. }
  537. #if 0 /* not currently used, will be used
  538.    when we really use a priority queue */
  539. static long slave_Bps(slave_t *slave)
  540. {
  541. return (slave->priority_Bps);
  542. }
  543. static long slave_bps(slave_t *slave)
  544. {
  545. return (slave->priority_bps);
  546. }
  547. #endif
  548. static inline int eql_number_slaves(slave_queue_t *queue)
  549. {
  550. return queue->num_slaves;
  551. }
  552. static inline int eql_is_empty(slave_queue_t *queue)
  553. {
  554. if (eql_number_slaves (queue) == 0)
  555. return 1;
  556. return 0;
  557. }
  558. static inline int eql_is_full(slave_queue_t *queue)
  559. {
  560. equalizer_t *eql = (equalizer_t *) queue->master_dev->priv;
  561. if (eql_number_slaves (queue) == eql->max_slaves)
  562. return 1;
  563. return 0;
  564. }
  565. static slave_queue_t *eql_new_slave_queue(struct net_device *dev)
  566. {
  567. slave_queue_t *queue;
  568. slave_t *head_slave;
  569. slave_t *tail_slave;
  570. queue = (slave_queue_t *) kmalloc (sizeof (slave_queue_t), GFP_KERNEL);
  571. if (!queue)
  572. goto err_out;
  573. head_slave = eql_new_slave ();
  574. if (!head_slave)
  575. goto err_out_queue;
  576. tail_slave = eql_new_slave ();
  577. if (!tail_slave)
  578. goto err_out_hs;
  579. memset (queue, 0, sizeof (slave_queue_t));
  580. head_slave->next = tail_slave;
  581. tail_slave->next = 0;
  582. queue->head = head_slave;
  583. queue->num_slaves = 0;
  584. queue->master_dev = dev;
  585. return queue;
  586. err_out_hs:
  587. kfree (head_slave);
  588. err_out_queue:
  589. kfree (queue);
  590. err_out:
  591. return NULL;
  592. }
  593. static void eql_delete_slave_queue(slave_queue_t *queue)
  594. slave_t *zapped;
  595. /*
  596.  * This should only be called when there isn't a
  597.  * timer running that scans the data periodically.. 
  598.  * dev_close stops the timer... 
  599.  */
  600. while ( ! eql_is_empty (queue) )
  601. {
  602. zapped = eql_remove_slave (queue, queue->head->next);
  603. eql_delete_slave (zapped);
  604. }
  605. kfree (queue->head->next);
  606. kfree (queue->head);
  607. kfree (queue);
  608. }
  609. static int eql_insert_slave(slave_queue_t *queue, slave_t *slave)
  610. {
  611. unsigned long flags;
  612. save_flags(flags);
  613. cli ();
  614. if ( ! eql_is_full (queue) )
  615. {
  616. slave_t *duplicate_slave = 0;
  617. duplicate_slave = eql_find_slave_dev (queue, slave->dev);
  618. if (duplicate_slave != 0)
  619. {
  620. /*   printk ("%s: found a duplicate, killing it and replacingn",
  621.   queue->master_dev->name); */
  622. eql_delete_slave (eql_remove_slave (queue, duplicate_slave));
  623. }
  624. slave->next = queue->head->next;
  625. queue->head->next = slave;
  626. queue->num_slaves++;
  627. restore_flags(flags);
  628. return 0;
  629. }
  630. restore_flags(flags);
  631. return 1;
  632. }
  633. static slave_t *eql_remove_slave(slave_queue_t *queue, slave_t *slave)
  634. {
  635. slave_t *prev;
  636. slave_t *curr;
  637. unsigned long flags;
  638. save_flags(flags);
  639. cli ();
  640. prev = queue->head;
  641. curr = queue->head->next;
  642. while (curr != slave && 
  643. curr->dev != 0 )
  644. {
  645. /*  printk ("%s: remove_slave; searching...n", queue->master_dev->name); */
  646. prev = curr;
  647. curr = curr->next;
  648. }
  649. if (curr == slave)
  650. {
  651. prev->next = curr->next;
  652. queue->num_slaves--;
  653. curr->dev->flags = curr->dev->flags & ~IFF_SLAVE;
  654. restore_flags(flags);
  655. return curr;
  656. }
  657. restore_flags(flags);
  658. return 0; /* not found */
  659. }
  660. static int eql_remove_slave_dev(slave_queue_t *queue, struct net_device *dev)
  661. {
  662. slave_t *prev;
  663. slave_t *curr;
  664. slave_t *target;
  665. target = eql_find_slave_dev (queue, dev);
  666. if (target != 0)
  667. {
  668. unsigned long flags;
  669. save_flags(flags);
  670. cli ();
  671. prev = queue->head;
  672. curr = prev->next;
  673. while (curr != target)
  674. {
  675. prev = curr;
  676. curr = curr->next;
  677. }
  678. prev->next = curr->next;
  679. queue->num_slaves--;
  680. restore_flags(flags);
  681. eql_delete_slave (curr);
  682. return 0;
  683. }
  684. return 1;
  685. }
  686. static inline struct net_device *eql_best_slave_dev(slave_queue_t *queue)
  687. {
  688. if (queue->best_slave != 0)
  689. {
  690. if (queue->best_slave->dev != 0)
  691. return queue->best_slave->dev;
  692. else
  693. return 0;
  694. }
  695. else
  696. return 0;
  697. }
  698. static inline slave_t *eql_best_slave(slave_queue_t *queue)
  699. {
  700. return queue->best_slave;
  701. }
  702. static inline void eql_schedule_slaves(slave_queue_t *queue)
  703. {
  704. struct net_device *master_dev = queue->master_dev;
  705. slave_t *best_slave = 0;
  706. slave_t *slave_corpse = 0;
  707. #ifdef EQL_DEBUG
  708. if (eql_debug >= 100)
  709. printk ("%s: schedule %d slavesn", 
  710. master_dev->name, eql_number_slaves (queue));
  711. #endif
  712. if ( eql_is_empty (queue) )
  713. {
  714. /*
  715.  * No slaves to play with 
  716.  */
  717. eql_set_best_slave (queue, (slave_t *) 0);
  718. return;
  719. }
  720. else
  721. {
  722. /*
  723.  * Make a pass to set the best slave 
  724.  */
  725. unsigned long best_load = (unsigned long) ULONG_MAX;
  726. slave_t *slave = 0;
  727. unsigned long flags;
  728. int i;
  729. save_flags(flags);
  730. cli ();
  731. for (i = 1, slave = eql_first_slave (queue);
  732. i <= eql_number_slaves (queue);
  733. i++, slave = eql_next_slave (queue, slave))
  734. {
  735. /*
  736.  * Go through the slave list once, updating best_slave 
  737.  *      whenever a new best_load is found, whenever a dead
  738.  * slave is found, it is marked to be pulled out of the 
  739.  * queue 
  740.  */
  741. unsigned long slave_load;
  742. unsigned long bytes_queued; 
  743. unsigned long priority_Bps; 
  744.   
  745.    if (slave != 0)
  746. {
  747. bytes_queued = slave->bytes_queued;
  748. priority_Bps = slave->priority_Bps;    
  749. if ( slave->dev != 0)
  750. {
  751. if ((slave->dev->flags & IFF_UP) == IFF_UP )
  752. {
  753. slave_load = (ULONG_MAX - (ULONG_MAX / 2)) - 
  754. (priority_Bps) + bytes_queued * 8;
  755.        if (slave_load < best_load)
  756. {
  757. best_load = slave_load;
  758. best_slave = slave;
  759. }
  760. }
  761. else /* we found a dead slave */
  762. {
  763. /* 
  764.  * We only bury one slave at a time, if more than
  765.  * one slave dies, we will bury him on the next 
  766.  * reschedule. slaves don't die all at once that 
  767.  * much anyway 
  768.  */
  769. slave_corpse = slave;
  770. }
  771. }
  772. }
  773. } /* for */
  774. restore_flags(flags);
  775. eql_set_best_slave (queue, best_slave);
  776. } /* else */
  777. if (slave_corpse != 0)
  778. {
  779. printk ("eql: scheduler found dead slave, burying...n");
  780. eql_delete_slave (eql_remove_slave (queue, slave_corpse));
  781. }
  782. return;
  783. }
  784. static slave_t * eql_find_slave_dev(slave_queue_t *queue, struct net_device *dev)
  785. {
  786. slave_t *slave = 0;
  787. slave = eql_first_slave(queue);
  788. while (slave != 0 && slave->dev != dev && slave != 0)
  789. {
  790. #if 0
  791. if (slave->dev != 0)
  792. printk ("eql: find_slave_dev; looked at '%s'...n", slave->dev->name);
  793. else
  794. printk ("eql: find_slave_dev; looked at nothing...n");
  795. #endif
  796. slave = slave->next;
  797. }
  798. return slave;
  799. }
  800. static inline slave_t *eql_first_slave(slave_queue_t *queue)
  801. {
  802. return queue->head->next;
  803. }
  804. static inline slave_t *eql_next_slave(slave_queue_t *queue, slave_t *slave)
  805. {
  806. return slave->next;
  807. }
  808. static inline void eql_set_best_slave(slave_queue_t *queue, slave_t *slave)
  809. {
  810. queue->best_slave = slave;
  811. }
  812. static void eql_timer(unsigned long param)
  813. {
  814. equalizer_t *eql = (equalizer_t *) param;
  815. slave_t *slave;
  816. slave_t *slave_corpse = 0;
  817. int i;
  818. unsigned long flags;
  819. if ( ! eql_is_empty (eql->queue) )
  820. {
  821. save_flags(flags);
  822. cli ();
  823. for (i = 1, slave = eql_first_slave (eql->queue);
  824. i <= eql_number_slaves (eql->queue);
  825. i++, slave = eql_next_slave (eql->queue, slave))
  826. {
  827. if (slave != 0)
  828. {
  829. if ((slave->dev->flags & IFF_UP) == IFF_UP )
  830. {
  831. slave->bytes_queued -= slave->priority_Bps;
  832. if (slave->bytes_queued < 0)
  833. slave->bytes_queued = 0;
  834. }
  835. else
  836. slave_corpse = slave;
  837. }
  838. }
  839. restore_flags(flags);
  840. if (slave_corpse != 0)
  841. {
  842. printk ("eql: timer found dead slave, burying...n");
  843. eql_delete_slave (eql_remove_slave (eql->queue, slave_corpse));
  844. }
  845. }
  846. if (eql->timer_on != 0) 
  847. {
  848. eql->timer.expires = jiffies+EQL_DEFAULT_RESCHED_IVAL;
  849. add_timer (&eql->timer);
  850. }
  851. }
  852. static struct net_device dev_eql;
  853. static int __init eql_init_module(void)
  854. {
  855. strcpy(dev_eql.name, "eql");
  856. dev_eql.init = eql_init;
  857. if (register_netdev(&dev_eql) != 0) {
  858. printk("eql: register_netdev() returned non-zero.n");
  859. return -EIO;
  860. }
  861. return 0;
  862. }
  863. static void __exit eql_cleanup_module(void)
  864. {
  865. kfree(((equalizer_t *)dev_eql.priv)->stats );
  866. kfree(dev_eql.priv);
  867. unregister_netdev(&dev_eql);
  868. }
  869. module_init(eql_init_module);
  870. module_exit(eql_cleanup_module);
  871. MODULE_LICENSE("GPL");
  872. /*
  873.  * Local Variables: 
  874.  * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c eql.c"
  875.  * version-control: t
  876.  * kept-new-versions: 20
  877.  * End:
  878.  */