|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Copyright (c) 1998 Luigi Rizzo
24: *
25: * Redistribution and use in source forms, with and without modification,
26: * are permitted provided that this entire comment appears intact.
27: *
28: * Redistribution in binary form may occur without any restrictions.
29: * Obviously, it would be nice if you gave credit where credit is due
30: * but requiring it would be too onerous.
31: *
32: * This software is provided ``AS IS'' without any warranties of any kind.
33: *
34: */
35:
36: #ifndef _IP_DUMMYNET_H
37: #define _IP_DUMMYNET_H
38:
39: /*
40: * Definition of dummynet data structures.
41: * Dummynet handles a list of pipes, each one identified by a unique
42: * number (hopefully the list is short so we use a linked list).
43: *
44: * Each list contains a set of parameters identifying the pipe, and
45: * a set of packets queued on the pipe itself.
46: *
47: * I could have used queue macros, but the management i have
48: * is pretty simple and this makes the code more portable.
49: */
50:
51: /*
52: * struct dn_pkt identifies a packet in the dummynet queue. The
53: * first part is really an m_hdr for implementation purposes, and some
54: * fields are saved there. When passing the packet back to the ip_input/
55: * ip_output(), the struct is prepended to the mbuf chain with type
56: * MT_DUMMYNET, and contains the pointer to the matching rule.
57: */
58: struct dn_pkt {
59: struct m_hdr hdr ;
60: #define dn_next hdr.mh_nextpkt /* next element in queue */
61: #define dn_m hdr.mh_next /* packet to be forwarded */
62: #define dn_hlen hdr.mh_len /* hlen, for ip_output */
63: #define dn_dir hdr.mh_flags /* IP_FW_F_IN or IP_FW_F_OUT */
64: int delay; /* stays queued until delay=0 */
65: struct ifnet *ifp; /* interface, for ip_output */
66: struct route ro; /* route, for ip_output. MUST COPY */
67:
68: #if DUMMYNET_DEBUG
69: struct timeval beg, mid; /* testing only */
70: int act_delay; /* testing only */
71: int in_delay; /* testing only */
72: #endif
73: };
74:
75: struct dn_queue {
76: struct dn_pkt *head, *tail;
77: } ;
78:
79: /*
80: * descriptor of a pipe. The flags field will be used to speed up the
81: * forwarding code paths, in case some of the parameters are not
82: * used.
83: */
84: struct dn_pipe { /* a pipe */
85: struct dn_pipe *next ;
86:
87: u_short pipe_nr ; /* number */
88: u_short flags ; /* to speed up things */
89: #define DN_HAVE_BW 1
90: #define DN_HAVE_QUEUE 2
91: #define DN_HAVE_DELAY 4
92: int bandwidth; /* really, bytes/tick. */
93: int queue_size ;
94: int queue_size_bytes ;
95: int delay ; /* really, ticks */
96: int plr ; /* pkt loss rate (2^31-1 means 100%) */
97:
98: struct dn_queue r;
99: int r_len; /* elements in r_queue */
100: int r_len_bytes; /* bytes in r_queue */
101: int r_drops; /* drops from r_queue */
102: struct dn_queue p ;
103: int ticks_from_last_insert;
104: long numbytes; /* which can send or receive */
105: };
106:
107: /*
108: * The following is used to define a new mbuf type that is
109: * prepended to the packet when it comes out of a pipe. The definition
110: * ought to go in /sys/sys/mbuf.h but here it is less intrusive.
111: */
112:
113: #define MT_DUMMYNET MT_CONTROL
114: /*
115: * what to do of a packet when it comes out of a pipe
116: */
117: #define DN_TO_IP_OUT 1
118: #define DN_TO_IP_IN 2
119: #define DN_TO_BDG_FWD 3
120:
121: #if KERNEL
122:
123: MALLOC_DECLARE(M_IPFW);
124:
125: typedef int ip_dn_ctl_t __P((struct sockopt *)) ;
126: extern ip_dn_ctl_t *ip_dn_ctl_ptr;
127:
128: void ip_dn_init(void); /* called in ip_input.c */
129: void dn_rule_delete(void *r); /* used in ip_fw.c */
130: int dummynet_io(int pipe, int dir,
131: struct mbuf *m, struct ifnet *ifp, struct route *ro, int hlen,
132: struct ip_fw_chain *rule);
133: #endif /* KERNEL */
134:
135: #endif /* _IP_DUMMYNET_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.