1204591Sluigi/* 2204591Sluigi * $FreeBSD$ 3204591Sluigi * 4204591Sluigi * library functions for userland testing of dummynet schedulers 5204591Sluigi */ 6204591Sluigi 7204591Sluigi#include "dn_test.h" 8204591Sluigi 9204591Sluigivoid 10204591Sluigim_freem(struct mbuf *m) 11204591Sluigi{ 12204591Sluigi printf("free %p\n", m); 13204591Sluigi} 14204591Sluigi 15204591Sluigiint 16204591Sluigidn_sched_modevent(module_t mod, int cmd, void *arg) 17204591Sluigi{ 18204591Sluigi return 0; 19204591Sluigi} 20204591Sluigi 21204591Sluigivoid 22204591Sluigidn_free_pkts(struct mbuf *m) 23204591Sluigi{ 24204591Sluigi struct mbuf *x; 25204591Sluigi while ( (x = m) ) { 26204591Sluigi m = m->m_nextpkt; 27204591Sluigi m_freem(x); 28204591Sluigi } 29204591Sluigi} 30204591Sluigi 31204591Sluigiint 32204591Sluigidn_delete_queue(void *_q, void *do_free) 33204591Sluigi{ 34204591Sluigi struct dn_queue *q = _q; 35204591Sluigi if (q->mq.head) 36204591Sluigi dn_free_pkts(q->mq.head); 37204591Sluigi free(q); 38204591Sluigi return 0; 39204591Sluigi} 40204591Sluigi 41204591Sluigi/* 42204591Sluigi * This is a simplified function for testing purposes, which does 43204591Sluigi * not implement statistics or random loss. 44204591Sluigi * Enqueue a packet in q, subject to space and queue management policy 45204591Sluigi * (whose parameters are in q->fs). 46204591Sluigi * Update stats for the queue and the scheduler. 47204591Sluigi * Return 0 on success, 1 on drop. The packet is consumed anyways. 48204591Sluigi */ 49204591Sluigiint 50204591Sluigidn_enqueue(struct dn_queue *q, struct mbuf* m, int drop) 51204591Sluigi{ 52204591Sluigi if (drop) 53204591Sluigi goto drop; 54204591Sluigi if (q->ni.length >= 200) 55204591Sluigi goto drop; 56204591Sluigi mq_append(&q->mq, m); 57204591Sluigi q->ni.length++; 58204591Sluigi q->ni.tot_bytes += m->m_pkthdr.len; 59204591Sluigi return 0; 60204591Sluigi 61204591Sluigidrop: 62204591Sluigi q->ni.drops++; 63204591Sluigi return 1; 64204591Sluigi} 65204591Sluigi 66204591Sluigiint 67204591Sluigiipdn_bound_var(int *v, int dflt, int lo, int hi, const char *msg) 68204591Sluigi{ 69204591Sluigi if (*v < lo) { 70204591Sluigi *v = dflt; 71204591Sluigi } else if (*v > hi) { 72204591Sluigi *v = hi; 73204591Sluigi } 74204591Sluigi return *v; 75204591Sluigi} 76204591Sluigi 77204736Sluigi#ifndef __FreeBSD__ 78204736Sluigiint 79204736Sluigifls(int mask) 80204736Sluigi{ 81204736Sluigi int bit; 82204736Sluigi 83204736Sluigi if (mask == 0) 84204736Sluigi return (0); 85204736Sluigi for (bit = 1; mask != 1; bit++) 86204736Sluigi mask = (unsigned int)mask >> 1; 87204736Sluigi return (bit); 88204736Sluigi} 89204736Sluigi#endif 90