1/*
2 * $FreeBSD$
3 *
4 * userspace compatibility code for dummynet schedulers
5 */
6
7#ifndef _DN_TEST_H
8#define _DN_TEST_H
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
14#include <inttypes.h>
15#include <stdio.h>
16#include <stdlib.h>
17#include <strings.h>	/* bzero, ffs, ... */
18#include <string.h>	/* strcmp */
19#include <errno.h>
20#include <sys/queue.h>
21#include <sys/time.h>
22
23extern int debug;
24#define ND(fmt, args...) do {} while (0)
25#define D1(fmt, args...) do {} while (0)
26#define D(fmt, args...) fprintf(stderr, "%-10s %4d %-8s " fmt "\n",      \
27        __FILE__, __LINE__, __FUNCTION__, ## args)
28#define DX(lev, fmt, args...) do {              \
29        if (debug > lev) D(fmt, ## args); } while (0)
30
31
32#ifndef offsetof
33#define offsetof(t,m) (int)(intptr_t)((&((t *)0L)->m))
34#endif
35
36#if defined(__APPLE__) // XXX osx
37typedef unsigned int u_int;
38#endif /* osx */
39
40#include <mylist.h>
41
42/* prevent include of other system headers */
43#define	_NETINET_IP_VAR_H_	/* ip_fw_args */
44#define _IPFW2_H
45#define _SYS_MBUF_H_
46
47enum	{
48	DN_QUEUE,
49};
50
51enum	{
52	DN_SCHED_FIFO,
53	DN_SCHED_WF2QP,
54};
55
56/* from ip_dummynet.h, fields used in ip_dn_private.h */
57struct dn_id {
58	uint16_t 	len; /* total len inc. this header */
59	uint8_t		type;
60	uint8_t		subtype;
61//	uint32_t	id;	/* generic id */
62};
63
64/* (from ip_dummynet.h)
65 * A flowset, which is a template for flows. Contains parameters
66 * from the command line: id, target scheduler, queue sizes, plr,
67 * flow masks, buckets for the flow hash, and possibly scheduler-
68 * specific parameters (weight, quantum and so on).
69 */
70struct dn_fs {
71        /* generic scheduler parameters. Leave them at -1 if unset.
72         * Now we use 0: weight, 1: lmax, 2: priority
73         */
74	int par[4];	/* flowset parameters */
75
76	/* simulation entries.
77	 * 'index' is not strictly necessary
78	 * y is used for the inverse mapping ,
79	 */
80	int index;
81	int y;	/* inverse mapping */
82	int base_y;	/* inverse mapping */
83	int next_y;	/* inverse mapping */
84	int n_flows;
85	int first_flow;
86	int next_flow;	/* first_flow + n_flows */
87	/*
88	 * when generating, let 'cur' go from 0 to n_flows-1,
89	 * then point to flow first_flow + cur
90	 */
91	int	cur;
92};
93
94/* (ip_dummynet.h)
95 * scheduler template, indicating nam, number, mask and buckets
96 */
97struct dn_sch {
98};
99
100/* (from ip_dummynet.h)
101 * dn_flow collects flow_id and stats for queues and scheduler
102 * instances, and is used to pass these info to userland.
103 * oid.type/oid.subtype describe the object, oid.id is number
104 * of the parent object.
105 */
106struct dn_flow {
107	struct dn_id oid;
108	uint64_t tot_pkts;
109	uint64_t tot_bytes;
110	uint32_t length;	/* Queue length, in packets */
111	uint32_t len_bytes;	/* Queue length, in bytes */
112	uint32_t drops;
113	//uint32_t flow_id;
114
115	/* the following fields are used by the traffic generator.
116	 */
117	struct list_head h;	/* used by the generator */
118
119	/* bytes served by the flow since the last backlog time */
120	uint64_t bytes;
121	/* bytes served by the system at the last backlog time  */
122	uint64_t sch_bytes;
123};
124
125/* the link */
126struct dn_link {
127};
128
129struct ip_fw_args {
130};
131
132struct mbuf {
133        struct {
134                int len;
135        } m_pkthdr;
136        struct mbuf *m_nextpkt;
137	uint32_t flow_id;	/* for testing, index of a flow */
138	//int flowset_id;	/* for testing, index of a flowset */
139	//void *cfg;	/* config args */
140};
141
142#define MALLOC_DECLARE(x)	extern volatile int __dummy__ ## x
143#define KASSERT(x, y)	do { if (!(x)) printf y ; exit(0); } while (0)
144struct ipfw_flow_id {
145};
146
147typedef void * module_t;
148
149struct _md_t {
150	const char *name;
151	int (*f)(module_t, int, void *);
152	void *p;
153};
154
155typedef struct _md_t moduledata_t;
156
157#define DECLARE_MODULE(name, b, c, d)	\
158	moduledata_t *_g_##name = & b
159#define MODULE_DEPEND(a, b, c, d, e)
160
161#include <dn_heap.h>
162#include <ip_dn_private.h>
163#include <dn_sched.h>
164
165#ifndef __FreeBSD__
166int fls(int);
167#endif
168
169static inline void
170mq_append(struct mq *q, struct mbuf *m)
171{
172        if (q->head == NULL)
173                q->head = m;
174        else
175                q->tail->m_nextpkt = m;
176        q->tail = m;
177        m->m_nextpkt = NULL;
178}
179
180#ifdef __cplusplus
181}
182#endif
183
184#endif /* _DN_TEST_H */
185