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