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