1204591Sluigi/*
2204591Sluigi * $FreeBSD: releng/10.3/sys/netpfil/ipfw/test/dn_test.h 204866 2010-03-08 11:27:39Z luigi $
3204591Sluigi *
4204591Sluigi * userspace compatibility code for dummynet schedulers
5204591Sluigi */
6204591Sluigi
7204591Sluigi#ifndef _DN_TEST_H
8204591Sluigi#define _DN_TEST_H
9204866Sluigi
10204866Sluigi#ifdef __cplusplus
11204866Sluigiextern "C" {
12204866Sluigi#endif
13204866Sluigi
14204591Sluigi#include <inttypes.h>
15204591Sluigi#include <stdio.h>
16204591Sluigi#include <stdlib.h>
17204591Sluigi#include <strings.h>	/* bzero, ffs, ... */
18204591Sluigi#include <string.h>	/* strcmp */
19204591Sluigi#include <errno.h>
20204591Sluigi#include <sys/queue.h>
21204591Sluigi#include <sys/time.h>
22204591Sluigi
23204591Sluigiextern int debug;
24204591Sluigi#define ND(fmt, args...) do {} while (0)
25204591Sluigi#define D1(fmt, args...) do {} while (0)
26204591Sluigi#define D(fmt, args...) fprintf(stderr, "%-8s " fmt "\n",      \
27204591Sluigi        __FUNCTION__, ## args)
28204591Sluigi#define DX(lev, fmt, args...) do {              \
29204591Sluigi        if (debug > lev) D(fmt, ## args); } while (0)
30204591Sluigi
31204591Sluigi
32204866Sluigi#ifndef offsetof
33204591Sluigi#define offsetof(t,m) (int)((&((t *)0L)->m))
34204866Sluigi#endif
35204591Sluigi
36204591Sluigi#include <mylist.h>
37204591Sluigi
38204591Sluigi/* prevent include of other system headers */
39204591Sluigi#define	_NETINET_IP_VAR_H_	/* ip_fw_args */
40204591Sluigi#define _IPFW2_H
41204591Sluigi#define _SYS_MBUF_H_
42204591Sluigi
43204591Sluigienum	{
44204591Sluigi	DN_QUEUE,
45204591Sluigi};
46204591Sluigi
47204591Sluigienum	{
48204591Sluigi	DN_SCHED_FIFO,
49204591Sluigi	DN_SCHED_WF2QP,
50204591Sluigi};
51204591Sluigi
52204591Sluigistruct dn_id {
53204591Sluigi	int type, subtype, len, id;
54204591Sluigi};
55204866Sluigi
56204591Sluigistruct dn_fs {
57204591Sluigi	int par[4];	/* flowset parameters */
58204591Sluigi
59204591Sluigi	/* simulation entries.
60204591Sluigi	 * 'index' is not strictly necessary
61204591Sluigi	 * y is used for the inverse mapping ,
62204591Sluigi	 */
63204591Sluigi	int index;
64204591Sluigi	int y;	/* inverse mapping */
65204591Sluigi	int base_y;	/* inverse mapping */
66204591Sluigi	int next_y;	/* inverse mapping */
67204591Sluigi	int n_flows;
68204591Sluigi	int first_flow;
69204591Sluigi	int next_flow;	/* first_flow + n_flows */
70204591Sluigi	/*
71204591Sluigi	 * when generating, let 'cur' go from 0 to n_flows-1,
72204591Sluigi	 * then point to flow first_flow + cur
73204591Sluigi	 */
74204591Sluigi	int	cur;
75204591Sluigi};
76204866Sluigi
77204591Sluigistruct dn_sch {
78204591Sluigi};
79204866Sluigi
80204591Sluigistruct dn_flow {
81204591Sluigi	struct dn_id oid;
82204591Sluigi	int length;
83204591Sluigi	int len_bytes;
84204591Sluigi	int drops;
85204591Sluigi	uint64_t tot_bytes;
86204591Sluigi	uint32_t flow_id;
87204591Sluigi	struct list_head h;	/* used by the generator */
88204591Sluigi};
89204866Sluigi
90204591Sluigistruct dn_link {
91204591Sluigi};
92204591Sluigi
93204591Sluigistruct ip_fw_args {
94204591Sluigi};
95204591Sluigi
96204591Sluigistruct mbuf {
97204591Sluigi        struct {
98204591Sluigi                int len;
99204591Sluigi        } m_pkthdr;
100204591Sluigi        struct mbuf *m_nextpkt;
101204591Sluigi	int flow_id;	/* for testing, index of a flow */
102204591Sluigi	//int flowset_id;	/* for testing, index of a flowset */
103204591Sluigi	void *cfg;	/* config args */
104204591Sluigi};
105204591Sluigi
106204591Sluigi#define MALLOC_DECLARE(x)
107204591Sluigi#define KASSERT(x, y)	do { if (!(x)) printf y ; exit(0); } while (0)
108204591Sluigistruct ipfw_flow_id {
109204591Sluigi};
110204591Sluigi
111204591Sluigitypedef void * module_t;
112204866Sluigi
113204591Sluigistruct _md_t {
114204591Sluigi	const char *name;
115204591Sluigi	int (*f)(module_t, int, void *);
116204591Sluigi	void *p;
117204591Sluigi};
118204866Sluigi
119204591Sluigitypedef struct _md_t moduledata_t;
120204866Sluigi
121204591Sluigi#define DECLARE_MODULE(name, b, c, d)	\
122204591Sluigi	moduledata_t *_g_##name = & b
123204591Sluigi#define MODULE_DEPEND(a, b, c, d, e)
124204591Sluigi
125204591Sluigi#ifdef IPFW
126204591Sluigi#include <dn_heap.h>
127204591Sluigi#include <ip_dn_private.h>
128204591Sluigi#include <dn_sched.h>
129204591Sluigi#else
130204591Sluigistruct dn_queue {
131204591Sluigi        struct dn_fsk *fs;             /* parent flowset. */
132204591Sluigi        struct dn_sch_inst *_si;	/* parent sched instance. */
133204591Sluigi};
134204591Sluigistruct dn_schk {
135204591Sluigi};
136204591Sluigistruct dn_fsk {
137204591Sluigi	struct dn_fs fs;
138204591Sluigi	struct dn_schk *sched;
139204591Sluigi};
140204591Sluigistruct dn_sch_inst {
141204591Sluigi	struct dn_schk *sched;
142204591Sluigi};
143204591Sluigistruct dn_alg {
144204591Sluigi	int type;
145204591Sluigi	const char *name;
146204591Sluigi	void *enqueue, *dequeue;
147204591Sluigi	int q_datalen, si_datalen, schk_datalen;
148204591Sluigi	int (*config)(struct dn_schk *);
149204591Sluigi	int (*new_sched)(struct dn_sch_inst *);
150204591Sluigi	int (*new_fsk)(struct dn_fsk *);
151204591Sluigi        int (*new_queue)(struct dn_queue *q);
152204591Sluigi};
153204591Sluigi
154204591Sluigi#endif
155204591Sluigi
156204736Sluigi#ifndef __FreeBSD__
157204736Sluigiint fls(int);
158204736Sluigi#endif
159204736Sluigi
160204591Sluigistatic inline void
161204591Sluigimq_append(struct mq *q, struct mbuf *m)
162204591Sluigi{
163204591Sluigi        if (q->head == NULL)
164204591Sluigi                q->head = m;
165204591Sluigi        else
166204591Sluigi                q->tail->m_nextpkt = m;
167204591Sluigi        q->tail = m;
168204591Sluigi        m->m_nextpkt = NULL;
169204591Sluigi}
170204591Sluigi
171204866Sluigi#ifdef __cplusplus
172204866Sluigi}
173204866Sluigi#endif
174204866Sluigi
175204591Sluigi#endif /* _DN_TEST_H */
176