dn_test.h revision 204736
1/*
2 * $FreeBSD: head/sys/netinet/ipfw/test/dn_test.h 204736 2010-03-04 21:52:40Z luigi $
3 *
4 * userspace compatibility code for dummynet schedulers
5 */
6
7#ifndef _DN_TEST_H
8#define _DN_TEST_H
9#include <inttypes.h>
10#include <stdio.h>
11#include <stdlib.h>
12#include <strings.h>	/* bzero, ffs, ... */
13#include <string.h>	/* strcmp */
14#include <errno.h>
15#include <sys/queue.h>
16#include <sys/time.h>
17
18extern int debug;
19#define ND(fmt, args...) do {} while (0)
20#define D1(fmt, args...) do {} while (0)
21#define D(fmt, args...) fprintf(stderr, "%-8s " fmt "\n",      \
22        __FUNCTION__, ## args)
23#define DX(lev, fmt, args...) do {              \
24        if (debug > lev) D(fmt, ## args); } while (0)
25
26
27#define offsetof(t,m) (int)((&((t *)0L)->m))
28
29#include <mylist.h>
30
31/* prevent include of other system headers */
32#define	_NETINET_IP_VAR_H_	/* ip_fw_args */
33#define _IPFW2_H
34#define _SYS_MBUF_H_
35
36enum	{
37	DN_QUEUE,
38};
39
40enum	{
41	DN_SCHED_FIFO,
42	DN_SCHED_WF2QP,
43};
44
45struct dn_id {
46	int type, subtype, len, id;
47};
48struct dn_fs {
49	int par[4];	/* flowset parameters */
50
51	/* simulation entries.
52	 * 'index' is not strictly necessary
53	 * y is used for the inverse mapping ,
54	 */
55	int index;
56	int y;	/* inverse mapping */
57	int base_y;	/* inverse mapping */
58	int next_y;	/* inverse mapping */
59	int n_flows;
60	int first_flow;
61	int next_flow;	/* first_flow + n_flows */
62	/*
63	 * when generating, let 'cur' go from 0 to n_flows-1,
64	 * then point to flow first_flow + cur
65	 */
66	int	cur;
67};
68struct dn_sch {
69};
70struct dn_flow {
71	struct dn_id oid;
72	int length;
73	int len_bytes;
74	int drops;
75	uint64_t tot_bytes;
76	uint32_t flow_id;
77	struct list_head h;	/* used by the generator */
78};
79struct dn_link {
80};
81
82struct ip_fw_args {
83};
84
85struct mbuf {
86        struct {
87                int len;
88        } m_pkthdr;
89        struct mbuf *m_nextpkt;
90	int flow_id;	/* for testing, index of a flow */
91	//int flowset_id;	/* for testing, index of a flowset */
92	void *cfg;	/* config args */
93};
94
95#define MALLOC_DECLARE(x)
96#define KASSERT(x, y)	do { if (!(x)) printf y ; exit(0); } while (0)
97struct ipfw_flow_id {
98};
99
100typedef void * module_t;
101struct _md_t {
102	const char *name;
103	int (*f)(module_t, int, void *);
104	void *p;
105};
106typedef struct _md_t moduledata_t;
107#define DECLARE_MODULE(name, b, c, d)	\
108	moduledata_t *_g_##name = & b
109#define MODULE_DEPEND(a, b, c, d, e)
110
111#ifdef IPFW
112#include <dn_heap.h>
113#include <ip_dn_private.h>
114#include <dn_sched.h>
115#else
116struct dn_queue {
117        struct dn_fsk *fs;             /* parent flowset. */
118        struct dn_sch_inst *_si;	/* parent sched instance. */
119};
120struct dn_schk {
121};
122struct dn_fsk {
123	struct dn_fs fs;
124	struct dn_schk *sched;
125};
126struct dn_sch_inst {
127	struct dn_schk *sched;
128};
129struct dn_alg {
130	int type;
131	const char *name;
132	void *enqueue, *dequeue;
133	int q_datalen, si_datalen, schk_datalen;
134	int (*config)(struct dn_schk *);
135	int (*new_sched)(struct dn_sch_inst *);
136	int (*new_fsk)(struct dn_fsk *);
137        int (*new_queue)(struct dn_queue *q);
138};
139
140#endif
141
142#ifndef __FreeBSD__
143int fls(int);
144#endif
145
146static inline void
147mq_append(struct mq *q, struct mbuf *m)
148{
149        if (q->head == NULL)
150                q->head = m;
151        else
152                q->tail->m_nextpkt = m;
153        q->tail = m;
154        m->m_nextpkt = NULL;
155}
156
157#endif /* _DN_TEST_H */
158