1/* 2 * $FreeBSD$ 3 * 4 * library functions for userland testing of dummynet schedulers 5 */ 6 7#include "dn_test.h" 8 9void 10m_freem(struct mbuf *m) 11{ 12 printf("free %p\n", m); 13} 14 15int 16dn_sched_modevent(module_t mod, int cmd, void *arg) 17{ 18 return 0; 19} 20 21void 22dn_free_pkts(struct mbuf *m) 23{ 24 struct mbuf *x; 25 while ( (x = m) ) { 26 m = m->m_nextpkt; 27 m_freem(x); 28 } 29} 30 31int 32dn_delete_queue(void *_q, void *do_free) 33{ 34 struct dn_queue *q = _q; 35 if (q->mq.head) 36 dn_free_pkts(q->mq.head); 37 free(q); 38 return 0; 39} 40 41/* 42 * This is a simplified function for testing purposes, which does 43 * not implement statistics or random loss. 44 * Enqueue a packet in q, subject to space and queue management policy 45 * (whose parameters are in q->fs). 46 * Update stats for the queue and the scheduler. 47 * Return 0 on success, 1 on drop. The packet is consumed anyways. 48 */ 49int 50dn_enqueue(struct dn_queue *q, struct mbuf* m, int drop) 51{ 52 if (drop) 53 goto drop; 54 if (q->ni.length >= 200) 55 goto drop; 56 mq_append(&q->mq, m); 57 q->ni.length++; 58 q->ni.tot_bytes += m->m_pkthdr.len; 59 return 0; 60 61drop: 62 q->ni.drops++; 63 return 1; 64} 65 66int 67ipdn_bound_var(int *v, int dflt, int lo, int hi, const char *msg) 68{ 69 if (*v < lo) { 70 *v = dflt; 71 } else if (*v > hi) { 72 *v = hi; 73 } 74 return *v; 75} 76 77#ifndef __FreeBSD__ 78int 79fls(int mask) 80{ 81 int bit; 82 83 if (mask == 0) 84 return (0); 85 for (bit = 1; mask != 1; bit++) 86 mask = (unsigned int)mask >> 1; 87 return (bit); 88} 89#endif 90