comparison spandsp-0.0.6pre17/spandsp-sim/g1050.c @ 4:26cd8f1ef0b1

import spandsp-0.0.6pre17
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 15:50:58 +0200
parents
children
comparison
equal deleted inserted replaced
3:c6c5a16ce2f2 4:26cd8f1ef0b1
1 /*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * g1050.c - IP network modeling, as per G.1050/TIA-921.
5 *
6 * Written by Steve Underwood <steveu@coppice.org>
7 *
8 * Copyright (C) 2007 Steve Underwood
9 *
10 * All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2, as
14 * published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *
25 * $Id: g1050.c,v 1.17 2009/06/02 14:55:36 steveu Exp $
26 */
27
28 #if defined(HAVE_CONFIG_H)
29 #include "config.h"
30 #endif
31
32 #include <stdlib.h>
33 #include <unistd.h>
34 #include <inttypes.h>
35 #include <string.h>
36 #include <time.h>
37 #include <stdio.h>
38 #include <fcntl.h>
39 #if defined(HAVE_TGMATH_H)
40 #include <tgmath.h>
41 #endif
42 #if defined(HAVE_MATH_H)
43 #define GEN_CONST
44 #include <math.h>
45 #endif
46 #include "floating_fudge.h"
47
48 #include "spandsp.h"
49 #include "spandsp/g1050.h"
50
51 #define PACKET_LOSS_TIME -1
52
53 #define FALSE 0
54 #define TRUE (!FALSE)
55
56 g1050_constants_t g1050_constants[1] =
57 {
58 {
59 {
60 { /* Side A LAN */
61 {
62 0.004, /*! Probability of loss rate change low->high */
63 0.1 /*! Probability of loss rate change high->low */
64 },
65 {
66 {
67 0.0, /*! Probability of an impulse */
68 0.0,
69 },
70 {
71 0.5,
72 0.0
73 }
74 },
75 1.0, /*! Impulse height, based on MTU and bit rate */
76 0.0, /*! Impulse decay coefficient */
77 0.001, /*! Probability of packet loss due to occupancy. */
78 0.15 /*! Probability of packet loss due to a multiple access collision. */
79 },
80 { /* Side A access link */
81 {
82 0.0002, /*! Probability of loss rate change low->high */
83 0.2 /*! Probability of loss rate change high->low */
84 },
85 {
86 {
87 0.001, /*! Probability of an impulse */
88 0.0,
89 },
90 {
91 0.3,
92 0.4
93 }
94 },
95 40.0, /*! Impulse height, based on MTU and bit rate */
96 0.75, /*! Impulse decay coefficient */
97 0.0005, /*! Probability of packet loss due to occupancy. */
98 0.0 /*! Probability of packet loss due to a multiple access collision. */
99 },
100 { /* Side B access link */
101 {
102 0.0002, /*! Probability of loss rate change low->high */
103 0.2 /*! Probability of loss rate change high->low */
104 },
105 {
106 {
107 0.001, /*! Probability of an impulse */
108 0.0,
109 },
110 {
111 0.3,
112 0.4
113 }
114 },
115 40.0, /*! Impulse height, based on MTU and bit rate */
116 0.75, /*! Impulse decay coefficient */
117 0.0005, /*! Probability of packet loss due to occupancy. */
118 0.0 /*! Probability of packet loss due to a multiple access collision. */
119 },
120 { /* Side B LAN */
121 {
122 0.004, /*! Probability of loss rate change low->high */
123 0.1 /*! Probability of loss rate change high->low */
124 },
125 {
126 {
127 0.0, /*! Probability of an impulse */
128 0.0,
129 },
130 {
131 0.5,
132 0.0
133 }
134 },
135 1.0, /*! Impulse height, based on MTU and bit rate */
136 0.0, /*! Impulse decay coefficient */
137 0.001, /*! Probability of packet loss due to occupancy. */
138 0.15 /*! Probability of packet loss due to a multiple access collision. */
139 }
140 }
141 }
142 };
143
144 g1050_channel_speeds_t g1050_speed_patterns[168] =
145 {
146 { 4000000, 0, 128000, 768000, 0, 4000000, 0, 128000, 768000, 0, 0.360},
147 { 4000000, 0, 128000, 768000, 0, 20000000, 0, 128000, 768000, 0, 0.720},
148 { 4000000, 0, 128000, 768000, 0, 100000000, 0, 128000, 768000, 0, 0.360},
149 { 20000000, 0, 128000, 768000, 0, 20000000, 0, 128000, 768000, 0, 0.360},
150 { 20000000, 0, 128000, 768000, 0, 100000000, 0, 128000, 768000, 0, 0.360},
151 {100000000, 0, 128000, 768000, 0, 100000000, 0, 128000, 768000, 0, 0.090},
152 { 4000000, 0, 128000, 1536000, 0, 4000000, 0, 384000, 768000, 0, 0.720},
153 { 4000000, 0, 128000, 1536000, 0, 20000000, 0, 384000, 768000, 0, 1.470},
154 { 4000000, 0, 128000, 1536000, 0, 100000000, 0, 384000, 768000, 0, 0.840},
155 { 20000000, 0, 128000, 1536000, 0, 20000000, 0, 384000, 768000, 0, 0.750},
156 { 20000000, 0, 128000, 1536000, 0, 100000000, 0, 384000, 768000, 0, 0.855},
157 {100000000, 0, 128000, 1536000, 0, 100000000, 0, 384000, 768000, 0, 0.240},
158 { 4000000, 0, 128000, 3000000, 0, 4000000, 0, 384000, 768000, 0, 0.120},
159 { 4000000, 0, 128000, 3000000, 0, 20000000, 0, 384000, 768000, 0, 0.420},
160 { 4000000, 0, 128000, 3000000, 0, 100000000, 0, 384000, 768000, 0, 0.840},
161 { 20000000, 0, 128000, 3000000, 0, 20000000, 0, 384000, 768000, 0, 0.300},
162 { 20000000, 0, 128000, 3000000, 0, 100000000, 0, 384000, 768000, 0, 0.930},
163 {100000000, 0, 128000, 3000000, 0, 100000000, 0, 384000, 768000, 0, 0.390},
164 { 4000000, 0, 384000, 768000, 0, 4000000, 0, 128000, 1536000, 0, 0.720},
165 { 4000000, 0, 384000, 768000, 0, 20000000, 0, 128000, 1536000, 0, 1.470},
166 { 4000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 1536000, 0, 0.840},
167 { 20000000, 0, 384000, 768000, 0, 20000000, 0, 128000, 1536000, 0, 0.750},
168 { 20000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 1536000, 0, 0.855},
169 {100000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 1536000, 0, 0.240},
170 { 4000000, 0, 384000, 1536000, 0, 4000000, 0, 384000, 1536000, 0, 1.440},
171 { 4000000, 0, 384000, 1536000, 0, 20000000, 0, 384000, 1536000, 0, 3.000},
172 { 4000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 1.920},
173 { 20000000, 0, 384000, 1536000, 0, 20000000, 0, 384000, 1536000, 0, 1.563},
174 { 20000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 2.000},
175 {100000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 0.640},
176 { 4000000, 0, 384000, 3000000, 0, 4000000, 0, 384000, 1536000, 0, 0.240},
177 { 4000000, 0, 384000, 3000000, 0, 20000000, 0, 384000, 1536000, 0, 0.850},
178 { 4000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 1.720},
179 { 20000000, 0, 384000, 3000000, 0, 20000000, 0, 384000, 1536000, 0, 0.625},
180 { 20000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 2.025},
181 {100000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 1.040},
182 { 4000000, 0, 384000, 768000, 0, 4000000, 0, 128000, 3000000, 0, 0.120},
183 { 4000000, 0, 384000, 768000, 0, 20000000, 0, 128000, 3000000, 0, 0.420},
184 { 4000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 3000000, 0, 0.840},
185 { 20000000, 0, 384000, 768000, 0, 20000000, 0, 128000, 3000000, 0, 0.300},
186 { 20000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 3000000, 0, 0.930},
187 {100000000, 0, 384000, 768000, 0, 100000000, 0, 128000, 3000000, 0, 0.390},
188 { 4000000, 0, 384000, 1536000, 0, 4000000, 0, 384000, 3000000, 0, 0.240},
189 { 4000000, 0, 384000, 1536000, 0, 20000000, 0, 384000, 3000000, 0, 0.850},
190 { 4000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 3000000, 0, 1.720},
191 { 20000000, 0, 384000, 1536000, 0, 20000000, 0, 384000, 3000000, 0, 0.625},
192 { 20000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 3000000, 0, 2.025},
193 {100000000, 0, 384000, 1536000, 0, 100000000, 0, 384000, 3000000, 0, 1.040},
194 { 4000000, 0, 384000, 3000000, 0, 4000000, 0, 384000, 3000000, 0, 0.040},
195 { 4000000, 0, 384000, 3000000, 0, 20000000, 0, 384000, 3000000, 0, 0.200},
196 { 4000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 3000000, 0, 0.520},
197 { 20000000, 0, 384000, 3000000, 0, 20000000, 0, 384000, 3000000, 0, 0.250},
198 { 20000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 3000000, 0, 1.300},
199 {100000000, 0, 384000, 3000000, 0, 100000000, 0, 384000, 3000000, 0, 1.690},
200 { 4000000, 0, 128000, 1536000, 0, 20000000, 0, 768000, 1536000, 0, 0.090},
201 { 4000000, 0, 128000, 1536000, 0, 100000000, 0, 768000, 1536000, 0, 0.360},
202 { 20000000, 0, 128000, 1536000, 0, 20000000, 0, 768000, 1536000, 0, 0.090},
203 { 20000000, 0, 128000, 1536000, 0, 100000000, 0, 768000, 1536000, 0, 0.405},
204 {100000000, 0, 128000, 1536000, 0, 100000000, 0, 768000, 1536000, 0, 0.180},
205 { 4000000, 0, 128000, 7000000, 0, 20000000, 0, 768000, 768000, 0, 0.270},
206 { 4000000, 0, 128000, 7000000, 0, 100000000, 0, 768000, 768000, 0, 1.080},
207 { 20000000, 0, 128000, 7000000, 0, 20000000, 0, 768000, 768000, 0, 0.270},
208 { 20000000, 0, 128000, 7000000, 0, 100000000, 0, 768000, 768000, 0, 1.215},
209 {100000000, 0, 128000, 7000000, 0, 100000000, 0, 768000, 768000, 0, 0.540},
210 { 4000000, 0, 128000, 13000000, 0, 20000000, 0, 768000, 13000000, 0, 0.030},
211 { 4000000, 0, 128000, 13000000, 0, 100000000, 0, 768000, 13000000, 0, 0.120},
212 { 20000000, 0, 128000, 13000000, 0, 20000000, 0, 768000, 13000000, 0, 0.030},
213 { 20000000, 0, 128000, 13000000, 0, 100000000, 0, 768000, 13000000, 0, 0.135},
214 {100000000, 0, 128000, 13000000, 0, 100000000, 0, 768000, 13000000, 0, 0.060},
215 { 4000000, 0, 384000, 1536000, 0, 20000000, 0, 1536000, 1536000, 0, 0.180},
216 { 4000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 0.720},
217 { 20000000, 0, 384000, 1536000, 0, 20000000, 0, 1536000, 1536000, 0, 0.188},
218 { 20000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 0.870},
219 {100000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 0.480},
220 { 4000000, 0, 384000, 7000000, 0, 20000000, 0, 768000, 1536000, 0, 0.540},
221 { 4000000, 0, 384000, 7000000, 0, 100000000, 0, 768000, 1536000, 0, 2.160},
222 { 20000000, 0, 384000, 7000000, 0, 20000000, 0, 768000, 1536000, 0, 0.563},
223 { 20000000, 0, 384000, 7000000, 0, 100000000, 0, 768000, 1536000, 0, 2.610},
224 {100000000, 0, 384000, 7000000, 0, 100000000, 0, 768000, 1536000, 0, 1.440},
225 { 4000000, 0, 384000, 13000000, 0, 20000000, 0, 1536000, 13000000, 0, 0.060},
226 { 4000000, 0, 384000, 13000000, 0, 100000000, 0, 1536000, 13000000, 0, 0.240},
227 { 20000000, 0, 384000, 13000000, 0, 20000000, 0, 1536000, 13000000, 0, 0.063},
228 { 20000000, 0, 384000, 13000000, 0, 100000000, 0, 1536000, 13000000, 0, 0.290},
229 {100000000, 0, 384000, 13000000, 0, 100000000, 0, 1536000, 13000000, 0, 0.160},
230 { 4000000, 0, 384000, 1536000, 0, 20000000, 0, 1536000, 3000000, 0, 0.030},
231 { 4000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 3000000, 0, 0.120},
232 { 20000000, 0, 384000, 1536000, 0, 20000000, 0, 1536000, 3000000, 0, 0.075},
233 { 20000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 3000000, 0, 0.495},
234 {100000000, 0, 384000, 1536000, 0, 100000000, 0, 1536000, 3000000, 0, 0.780},
235 { 4000000, 0, 384000, 7000000, 0, 20000000, 0, 768000, 3000000, 0, 0.090},
236 { 4000000, 0, 384000, 7000000, 0, 100000000, 0, 768000, 3000000, 0, 0.360},
237 { 20000000, 0, 384000, 7000000, 0, 20000000, 0, 768000, 3000000, 0, 0.225},
238 { 20000000, 0, 384000, 7000000, 0, 100000000, 0, 768000, 3000000, 0, 1.485},
239 {100000000, 0, 384000, 7000000, 0, 100000000, 0, 768000, 3000000, 0, 2.340},
240 { 4000000, 0, 384000, 13000000, 0, 20000000, 0, 3000000, 13000000, 0, 0.010},
241 { 4000000, 0, 384000, 13000000, 0, 100000000, 0, 3000000, 13000000, 0, 0.040},
242 { 20000000, 0, 384000, 13000000, 0, 20000000, 0, 3000000, 13000000, 0, 0.025},
243 { 20000000, 0, 384000, 13000000, 0, 100000000, 0, 3000000, 13000000, 0, 0.165},
244 {100000000, 0, 384000, 13000000, 0, 100000000, 0, 3000000, 13000000, 0, 0.260},
245 { 4000000, 0, 768000, 1536000, 0, 20000000, 0, 128000, 1536000, 0, 0.090},
246 { 20000000, 0, 768000, 1536000, 0, 20000000, 0, 128000, 1536000, 0, 0.090},
247 { 20000000, 0, 768000, 1536000, 0, 100000000, 0, 128000, 1536000, 0, 0.405},
248 { 4000000, 0, 768000, 1536000, 0, 100000000, 0, 128000, 1536000, 0, 0.360},
249 {100000000, 0, 768000, 1536000, 0, 100000000, 0, 128000, 1536000, 0, 0.180},
250 { 4000000, 0, 1536000, 1536000, 0, 20000000, 0, 384000, 1536000, 0, 0.180},
251 { 20000000, 0, 1536000, 1536000, 0, 20000000, 0, 384000, 1536000, 0, 0.188},
252 { 20000000, 0, 1536000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 0.870},
253 { 4000000, 0, 1536000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 0.720},
254 {100000000, 0, 1536000, 1536000, 0, 100000000, 0, 384000, 1536000, 0, 0.480},
255 { 4000000, 0, 1536000, 3000000, 0, 20000000, 0, 384000, 1536000, 0, 0.030},
256 { 20000000, 0, 1536000, 3000000, 0, 20000000, 0, 384000, 1536000, 0, 0.075},
257 { 20000000, 0, 1536000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 0.495},
258 { 4000000, 0, 1536000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 0.120},
259 {100000000, 0, 1536000, 3000000, 0, 100000000, 0, 384000, 1536000, 0, 0.780},
260 { 4000000, 0, 768000, 768000, 0, 20000000, 0, 128000, 7000000, 0, 0.270},
261 { 20000000, 0, 768000, 768000, 0, 20000000, 0, 128000, 7000000, 0, 0.270},
262 { 20000000, 0, 768000, 768000, 0, 100000000, 0, 128000, 7000000, 0, 1.215},
263 { 4000000, 0, 768000, 768000, 0, 100000000, 0, 128000, 7000000, 0, 1.080},
264 {100000000, 0, 768000, 768000, 0, 100000000, 0, 128000, 7000000, 0, 0.540},
265 { 4000000, 0, 768000, 1536000, 0, 20000000, 0, 384000, 7000000, 0, 0.540},
266 { 20000000, 0, 768000, 1536000, 0, 20000000, 0, 384000, 7000000, 0, 0.563},
267 { 20000000, 0, 768000, 1536000, 0, 100000000, 0, 384000, 7000000, 0, 2.610},
268 { 4000000, 0, 768000, 1536000, 0, 100000000, 0, 384000, 7000000, 0, 2.160},
269 {100000000, 0, 768000, 1536000, 0, 100000000, 0, 384000, 7000000, 0, 1.440},
270 { 4000000, 0, 768000, 3000000, 0, 20000000, 0, 384000, 7000000, 0, 0.090},
271 { 20000000, 0, 768000, 3000000, 0, 20000000, 0, 384000, 7000000, 0, 0.225},
272 { 20000000, 0, 768000, 3000000, 0, 100000000, 0, 384000, 7000000, 0, 1.485},
273 { 4000000, 0, 768000, 3000000, 0, 100000000, 0, 384000, 7000000, 0, 0.360},
274 {100000000, 0, 768000, 3000000, 0, 100000000, 0, 384000, 7000000, 0, 2.340},
275 { 4000000, 0, 768000, 13000000, 0, 20000000, 0, 128000, 13000000, 0, 0.030},
276 { 20000000, 0, 768000, 13000000, 0, 20000000, 0, 128000, 13000000, 0, 0.030},
277 { 20000000, 0, 768000, 13000000, 0, 100000000, 0, 128000, 13000000, 0, 0.135},
278 { 4000000, 0, 768000, 13000000, 0, 100000000, 0, 128000, 13000000, 0, 0.120},
279 {100000000, 0, 768000, 13000000, 0, 100000000, 0, 128000, 13000000, 0, 0.060},
280 { 4000000, 0, 1536000, 13000000, 0, 20000000, 0, 384000, 13000000, 0, 0.060},
281 { 20000000, 0, 1536000, 13000000, 0, 20000000, 0, 384000, 13000000, 0, 0.063},
282 { 20000000, 0, 1536000, 13000000, 0, 100000000, 0, 384000, 13000000, 0, 0.290},
283 { 4000000, 0, 1536000, 13000000, 0, 100000000, 0, 384000, 13000000, 0, 0.240},
284 {100000000, 0, 1536000, 13000000, 0, 100000000, 0, 384000, 13000000, 0, 0.160},
285 { 4000000, 0, 3000000, 13000000, 0, 20000000, 0, 384000, 13000000, 0, 0.010},
286 { 20000000, 0, 3000000, 13000000, 0, 20000000, 0, 384000, 13000000, 0, 0.025},
287 { 20000000, 0, 3000000, 13000000, 0, 100000000, 0, 384000, 13000000, 0, 0.165},
288 { 4000000, 0, 3000000, 13000000, 0, 100000000, 0, 384000, 13000000, 0, 0.040},
289 {100000000, 0, 3000000, 13000000, 0, 100000000, 0, 384000, 13000000, 0, 0.260},
290 { 20000000, 0, 1536000, 1536000, 0, 20000000, 0, 1536000, 1536000, 0, 0.023},
291 { 20000000, 0, 1536000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 0.180},
292 {100000000, 0, 1536000, 1536000, 0, 100000000, 0, 1536000, 1536000, 0, 0.360},
293 { 20000000, 0, 1536000, 7000000, 0, 20000000, 0, 768000, 1536000, 0, 0.068},
294 { 20000000, 0, 1536000, 7000000, 0, 100000000, 0, 768000, 1536000, 0, 0.540},
295 {100000000, 0, 1536000, 7000000, 0, 100000000, 0, 768000, 1536000, 0, 1.080},
296 { 20000000, 0, 1536000, 13000000, 0, 20000000, 0, 1536000, 13000000, 0, 0.015},
297 { 20000000, 0, 1536000, 13000000, 0, 100000000, 0, 1536000, 13000000, 0, 0.120},
298 {100000000, 0, 1536000, 13000000, 0, 100000000, 0, 1536000, 13000000, 0, 0.240},
299 { 20000000, 0, 768000, 1536000, 0, 20000000, 0, 1536000, 7000000, 0, 0.068},
300 { 20000000, 0, 768000, 1536000, 0, 100000000, 0, 1536000, 7000000, 0, 0.540},
301 {100000000, 0, 768000, 1536000, 0, 100000000, 0, 1536000, 7000000, 0, 1.080},
302 { 20000000, 0, 768000, 7000000, 0, 20000000, 0, 768000, 7000000, 0, 0.203},
303 { 20000000, 0, 768000, 7000000, 0, 100000000, 0, 768000, 7000000, 0, 1.620},
304 {100000000, 0, 768000, 7000000, 0, 100000000, 0, 768000, 7000000, 0, 3.240},
305 { 20000000, 0, 768000, 13000000, 0, 20000000, 0, 7000000, 13000000, 0, 0.023},
306 { 20000000, 0, 768000, 13000000, 0, 100000000, 0, 7000000, 13000000, 0, 0.180},
307 {100000000, 0, 768000, 13000000, 0, 100000000, 0, 7000000, 13000000, 0, 0.360},
308 { 20000000, 0, 7000000, 13000000, 0, 20000000, 0, 768000, 13000000, 0, 0.023},
309 { 20000000, 0, 7000000, 13000000, 0, 100000000, 0, 768000, 13000000, 0, 0.180},
310 {100000000, 0, 7000000, 13000000, 0, 100000000, 0, 768000, 13000000, 0, 0.360},
311 { 20000000, 0, 13000000, 13000000, 0, 20000000, 0, 13000000, 13000000, 0, 0.003},
312 { 20000000, 0, 13000000, 13000000, 0, 100000000, 0, 13000000, 13000000, 0, 0.020},
313 {100000000, 0, 13000000, 13000000, 0, 100000000, 0, 13000000, 13000000, 0, 0.040}
314 };
315
316 g1050_model_t g1050_standard_models[9] =
317 {
318 { /* Severity 0 - no impairment */
319 {
320 0, /*! Percentage likelihood of occurance in scenario A */
321 0, /*! Percentage likelihood of occurance in scenario B */
322 0, /*! Percentage likelihood of occurance in scenario C */
323 },
324 {
325 0.0, /*! Percentage occupancy */
326 1508, /*! MTU */
327 0.0 /*! Peak jitter */
328 },
329 {
330 0.0, /*! Percentage occupancy */
331 512, /*! MTU */
332 0.0 /*! Peak jitter */
333 },
334 {
335 0.0, /*! Basic delay of the regional backbone, in seconds */
336 0.0, /*! Basic delay of the intercontinental backbone, in seconds */
337 0.0, /*! Percentage packet loss of the backbone */
338 0.0, /*! Maximum jitter of the backbone, in seconds */
339 0.0, /*! Interval between the backbone route flapping between two paths, in seconds */
340 0.0, /*! The difference in backbone delay between the two routes we flap between, in seconds */
341 0.0, /*! The interval between link failures, in seconds */
342 0.0, /*! The duration of link failures, in seconds */
343 0.0, /*! Probability of packet loss in the backbone, in percent */
344 0.0 /*! Probability of a packet going out of sequence in the backbone. */
345 },
346 {
347 0.0, /*! Percentage occupancy */
348 512, /*! MTU */
349 0.0 /*! Peak jitter */
350 },
351 {
352 0.0, /*! Percentage occupancy */
353 1508, /*! MTU */
354 0.0 /*! Peak jitter */
355 }
356 },
357 { /* Severity A */
358 {
359 50, /*! Percentage likelihood of occurance in scenario A */
360 5, /*! Percentage likelihood of occurance in scenario B */
361 5, /*! Percentage likelihood of occurance in scenario C */
362 },
363 {
364 1.0, /*! Percentage occupancy */
365 1508, /*! MTU */
366 0.0015 /*! Peak jitter */
367 },
368 {
369 0.0, /*! Percentage occupancy */
370 512, /*! MTU */
371 0.0 /*! Peak jitter */
372 },
373 {
374 0.004, /*! Basic delay of the regional backbone, in seconds */
375 0.016, /*! Basic delay of the intercontinental backbone, in seconds */
376 0.0, /*! Percentage packet loss of the backbone */
377 0.005, /*! Maximum jitter of the backbone, in seconds */
378 0.0, /*! Interval between the backbone route flapping between two paths, in seconds */
379 0.0, /*! The difference in backbone delay between the two routes we flap between, in seconds */
380 0.0, /*! The interval between link failures, in seconds */
381 0.0, /*! The duration of link failures, in seconds */
382 0.0, /*! Probability of packet loss in the backbone, in percent */
383 0.0 /*! Probability of a packet going out of sequence in the backbone. */
384 },
385 {
386 0.0, /*! Percentage occupancy */
387 512, /*! MTU */
388 0.0 /*! Peak jitter */
389 },
390 {
391 1.0, /*! Percentage occupancy */
392 1508, /*! MTU */
393 0.0015 /*! Peak jitter */
394 }
395 },
396 { /* Severity B */
397 {
398 30, /*! Percentage likelihood of occurance in scenario A */
399 25, /*! Percentage likelihood of occurance in scenario B */
400 5, /*! Percentage likelihood of occurance in scenario C */
401 },
402 {
403 2.0, /*! Percentage occupancy */
404 1508, /*! MTU */
405 0.0015 /*! Peak jitter */
406 },
407 {
408 1.0, /*! Percentage occupancy */
409 512, /*! MTU */
410 0.0 /*! Peak jitter */
411 },
412 {
413 0.008, /*! Basic delay of the regional backbone, in seconds */
414 0.032, /*! Basic delay of the intercontinental backbone, in seconds */
415 0.01, /*! Percentage packet loss of the backbone */
416 0.01, /*! Maximum jitter of the backbone, in seconds */
417 3600.0, /*! Interval between the backbone route flapping between two paths, in seconds */
418 0.002, /*! The difference in backbone delay between the two routes we flap between, in seconds */
419 3600.0, /*! The interval between link failures, in seconds */
420 0.064, /*! The duration of link failures, in seconds */
421 0.0, /*! Probability of packet loss in the backbone, in percent */
422 0.0 /*! Probability of a packet going out of sequence in the backbone. */
423 },
424 {
425 1.0, /*! Percentage occupancy */
426 512, /*! MTU */
427 0.0 /*! Peak jitter */
428 },
429 {
430 2.0, /*! Percentage occupancy */
431 1508, /*! MTU */
432 0.0015 /*! Peak jitter */
433 }
434 },
435 { /* Severity C */
436 {
437 15, /*! Percentage likelihood of occurance in scenario A */
438 30, /*! Percentage likelihood of occurance in scenario B */
439 10, /*! Percentage likelihood of occurance in scenario C */
440 },
441 {
442 3.0, /*! Percentage occupancy */
443 1508, /*! MTU */
444 0.0015 /*! Peak jitter */
445 },
446 {
447 2.0, /*! Percentage occupancy */
448 1508, /*! MTU */
449 0.0 /*! Peak jitter */
450 },
451 {
452 0.016, /*! Basic delay of the regional backbone, in seconds */
453 0.064, /*! Basic delay of the intercontinental backbone, in seconds */
454 0.02, /*! Percentage packet loss of the backbone */
455 0.016, /*! Maximum jitter of the backbone, in seconds */
456 1800.0, /*! Interval between the backbone route flapping between two paths, in seconds */
457 0.004, /*! The difference in backbone delay between the two routes we flap between, in seconds */
458 1800.0, /*! The interval between link failures, in seconds */
459 0.128, /*! The duration of link failures, in seconds */
460 0.0, /*! Probability of packet loss in the backbone, in percent */
461 0.0 /*! Probability of a packet going out of sequence in the backbone. */
462 },
463 {
464 2.0, /*! Percentage occupancy */
465 1508, /*! MTU */
466 0.0 /*! Peak jitter */
467 },
468 {
469 3.0, /*! Percentage occupancy */
470 1508, /*! MTU */
471 0.0015 /*! Peak jitter */
472 }
473 },
474 { /* Severity D */
475 {
476 5, /*! Percentage likelihood of occurance in scenario A */
477 25, /*! Percentage likelihood of occurance in scenario B */
478 15, /*! Percentage likelihood of occurance in scenario C */
479 },
480 {
481 5.0, /*! Percentage occupancy */
482 1508, /*! MTU */
483 0.0015 /*! Peak jitter */
484 },
485 {
486 4.0, /*! Percentage occupancy */
487 1508, /*! MTU */
488 0.0 /*! Peak jitter */
489 },
490 {
491 0.032, /*! Basic delay of the regional backbone, in seconds */
492 0.128, /*! Basic delay of the intercontinental backbone, in seconds */
493 0.04, /*! Percentage packet loss of the backbone */
494 0.04, /*! Maximum jitter of the backbone, in seconds */
495 900.0, /*! Interval between the backbone route flapping between two paths, in seconds */
496 0.008, /*! The difference in backbone delay between the two routes we flap between, in seconds */
497 900.0, /*! The interval between link failures, in seconds */
498 0.256, /*! The duration of link failures, in seconds */
499 0.0, /*! Probability of packet loss in the backbone, in percent */
500 0.0 /*! Probability of a packet going out of sequence in the backbone. */
501 },
502 {
503 4.0, /*! Percentage occupancy */
504 1508, /*! MTU */
505 0.0 /*! Peak jitter */
506 },
507 {
508 5.0, /*! Percentage occupancy */
509 1508, /*! MTU */
510 0.0015 /*! Peak jitter */
511 }
512 },
513 { /* Severity E */
514 {
515 0, /*! Percentage likelihood of occurance in scenario A */
516 10, /*! Percentage likelihood of occurance in scenario B */
517 20, /*! Percentage likelihood of occurance in scenario C */
518 },
519 {
520 8.0, /*! Percentage occupancy */
521 1508, /*! MTU */
522 0.0015 /*! Peak jitter */
523 },
524 {
525 8.0, /*! Percentage occupancy */
526 1508, /*! MTU */
527 0.0 /*! Peak jitter */
528 },
529 {
530 0.064, /*! Basic delay of the regional backbone, in seconds */
531 0.196, /*! Basic delay of the intercontinental backbone, in seconds */
532 0.1, /*! Percentage packet loss of the backbone */
533 0.07, /*! Maximum jitter of the backbone, in seconds */
534 480.0, /*! Interval between the backbone route flapping between two paths, in seconds */
535 0.016, /*! The difference in backbone delay between the two routes we flap between, in seconds */
536 480.0, /*! The interval between link failures, in seconds */
537 0.4, /*! The duration of link failures, in seconds */
538 0.0, /*! Probability of packet loss in the backbone, in percent */
539 0.0 /*! Probability of a packet going out of sequence in the backbone. */
540 },
541 {
542 8.0, /*! Percentage occupancy */
543 1508, /*! MTU */
544 0.0 /*! Peak jitter */
545 },
546 {
547 8.0, /*! Percentage occupancy */
548 1508, /*! MTU */
549 0.0015 /*! Peak jitter */
550 }
551 },
552 { /* Severity F */
553 {
554 0, /*! Percentage likelihood of occurance in scenario A */
555 0, /*! Percentage likelihood of occurance in scenario B */
556 25, /*! Percentage likelihood of occurance in scenario C */
557 },
558 {
559 12.0, /*! Percentage occupancy */
560 1508, /*! MTU */
561 0.0015 /*! Peak jitter */
562 },
563 {
564 15.0, /*! Percentage occupancy */
565 1508, /*! MTU */
566 0.0 /*! Peak jitter */
567 },
568 {
569 0.128, /*! Basic delay of the regional backbone, in seconds */
570 0.256, /*! Basic delay of the intercontinental backbone, in seconds */
571 0.2, /*! Percentage packet loss of the backbone */
572 0.1, /*! Maximum jitter of the backbone, in seconds */
573 240.0, /*! Interval between the backbone route flapping between two paths, in seconds */
574 0.032, /*! The difference in backbone delay between the two routes we flap between, in seconds */
575 240.0, /*! The interval between link failures, in seconds */
576 0.8, /*! The duration of link failures, in seconds */
577 0.0, /*! Probability of packet loss in the backbone, in percent */
578 0.0 /*! Probability of a packet going out of sequence in the backbone. */
579 },
580 {
581 15.0, /*! Percentage occupancy */
582 1508, /*! MTU */
583 0.0 /*! Peak jitter */
584 },
585 {
586 12.0, /*! Percentage occupancy */
587 1508, /*! MTU */
588 0.0015 /*! Peak jitter */
589 }
590 },
591 { /* Severity G */
592 {
593 0, /*! Percentage likelihood of occurance in scenario A */
594 0, /*! Percentage likelihood of occurance in scenario B */
595 15, /*! Percentage likelihood of occurance in scenario C */
596 },
597 {
598 16.0, /*! Percentage occupancy */
599 1508, /*! MTU */
600 0.0015 /*! Peak jitter */
601 },
602 {
603 30.0, /*! Percentage occupancy */
604 1508, /*! MTU */
605 0.0 /*! Peak jitter */
606 },
607 {
608 0.256, /*! Basic delay of the regional backbone, in seconds */
609 0.512, /*! Basic delay of the intercontinental backbone, in seconds */
610 0.5, /*! Percentage packet loss of the backbone */
611 0.15, /*! Maximum jitter of the backbone, in seconds */
612 120.0, /*! Interval between the backbone route flapping between two paths, in seconds */
613 0.064, /*! The difference in backbone delay between the two routes we flap between, in seconds */
614 120.0, /*! The interval between link failures, in seconds */
615 1.6, /*! The duration of link failures, in seconds */
616 0.0, /*! Probability of packet loss in the backbone, in percent */
617 0.0 /*! Probability of a packet going out of sequence in the backbone. */
618 },
619 {
620 30.0, /*! Percentage occupancy */
621 1508, /*! MTU */
622 0.0 /*! Peak jitter */
623 },
624 {
625 16.0, /*! Percentage occupancy */
626 1508, /*! MTU */
627 0.0015 /*! Peak jitter */
628 }
629 },
630 { /* Severity H */
631 {
632 0, /*! Percentage likelihood of occurance in scenario A */
633 0, /*! Percentage likelihood of occurance in scenario B */
634 5, /*! Percentage likelihood of occurance in scenario C */
635 },
636 {
637 20.0, /*! Percentage occupancy */
638 1508, /*! MTU */
639 0.0015 /*! Peak jitter */
640 },
641 {
642 50.0, /*! Percentage occupancy */
643 1508, /*! MTU */
644 0.0 /*! Peak jitter */
645 },
646 {
647 0.512, /*! Basic delay of the regional backbone, in seconds */
648 0.768, /*! Basic delay of the intercontinental backbone, in seconds */
649 1.0, /*! Percentage packet loss of the backbone */
650 0.5, /*! Maximum jitter of the backbone, in seconds */
651 60.0, /*! Interval between the backbone route flapping between two paths, in seconds */
652 0.128, /*! The difference in backbone delay between the two routes we flap between, in seconds */
653 60.0, /*! The interval between link failures, in seconds */
654 3.0, /*! The duration of link failures, in seconds */
655 1.0, /*! Probability of packet loss in the backbone, in percent */
656 1.0 /*! Probability of a packet going out of sequence in the backbone. */
657 },
658 {
659 50.0, /*! Percentage occupancy */
660 1508, /*! MTU */
661 0.0 /*! Peak jitter */
662 },
663 {
664 20.0, /*! Percentage occupancy */
665 1508, /*! MTU */
666 0.0015 /*! Peak jitter */
667 }
668 }
669 };
670
671 #if defined(HAVE_DRAND48)
672 static __inline__ void q1050_rand_init(void)
673 {
674 srand48(time(NULL));
675 }
676 /*- End of function --------------------------------------------------------*/
677
678 static __inline__ double q1050_rand(void)
679 {
680 return drand48();
681 }
682 /*- End of function --------------------------------------------------------*/
683 #else
684 static __inline__ void q1050_rand_init(void)
685 {
686 srand(time(NULL));
687 }
688 /*- End of function --------------------------------------------------------*/
689
690 static __inline__ double q1050_rand(void)
691 {
692 return (double) rand()/(double) RAND_MAX;
693 }
694 /*- End of function --------------------------------------------------------*/
695 #endif
696
697 static __inline__ double scale_probability(double prob, double scale)
698 {
699 /* Re-calculate probability based on a different time interval */
700 return 1.0 - pow(1.0 - prob, scale);
701 }
702 /*- End of function --------------------------------------------------------*/
703
704 static void g1050_segment_init(g1050_segment_state_t *s,
705 int link_type,
706 g1050_segment_constants_t *constants,
707 g1050_segment_model_t *parms,
708 int bit_rate,
709 int multiple_access,
710 int qos_enabled,
711 int packet_size,
712 int packet_rate)
713 {
714 double x;
715 double packet_interval;
716
717 memset(s, 0, sizeof(*s));
718
719 packet_interval = 1000.0/packet_rate;
720 /* Some calculatons are common to both LAN and access links, and those that are not. */
721 s->link_type = link_type;
722 s->prob_loss_rate_change[0] = scale_probability(constants->prob_loss_rate_change[0]*parms->percentage_occupancy, 1.0/packet_interval);
723
724 s->serial_delay = packet_size*8.0/bit_rate;
725 if (link_type == G1050_LAN_LINK)
726 {
727 s->prob_loss_rate_change[1] = scale_probability(constants->prob_loss_rate_change[1], 1.0/packet_interval);
728 s->prob_impulse[0] = constants->prob_impulse[0][0];
729 s->prob_impulse[1] = constants->prob_impulse[1][0];
730 s->impulse_coeff = constants->impulse_coeff;
731 s->impulse_height = parms->mtu*(8.0/bit_rate)*(1.0 + parms->percentage_occupancy/constants->impulse_height);
732 }
733 else if (link_type == G1050_ACCESS_LINK)
734 {
735 s->prob_loss_rate_change[1] = scale_probability(constants->prob_loss_rate_change[1]/(1.0 + parms->percentage_occupancy), 1.0/packet_interval);
736 s->prob_impulse[0] = scale_probability(constants->prob_impulse[0][0] + (parms->percentage_occupancy/2000.0), 1.0/packet_interval);
737 s->prob_impulse[1] = scale_probability(constants->prob_impulse[1][0] + (constants->prob_impulse[1][1]*parms->percentage_occupancy/100.0), 1.0/packet_interval);
738 s->impulse_coeff = 1.0 - scale_probability(1.0 - constants->impulse_coeff, 1.0/packet_interval);
739 x = (1.0 - constants->impulse_coeff)/(1.0 - s->impulse_coeff);
740 s->impulse_height = x*parms->mtu*(8.0/bit_rate)*(1.0 + parms->percentage_occupancy/constants->impulse_height);
741 }
742
743 /* The following are calculated the same way for LAN and access links */
744 s->prob_packet_loss = constants->prob_packet_loss*parms->percentage_occupancy;
745 s->qos_enabled = qos_enabled;
746 s->multiple_access = multiple_access;
747 s->prob_packet_collision_loss = constants->prob_packet_collision_loss;
748 s->max_jitter = parms->max_jitter;
749
750 /* The following is common state information to all links. */
751 s->high_loss = FALSE;
752 s->congestion_delay = 0.0;
753 s->last_arrival_time = 0.0;
754
755 /* Count of packets lost in this segment. */
756 s->lost_packets = 0;
757 s->lost_packets_2 = 0;
758 }
759 /*- End of function --------------------------------------------------------*/
760
761 static void g1050_core_init(g1050_core_state_t *s, g1050_core_model_t *parms, int packet_rate)
762 {
763 memset(s, 0, sizeof(*s));
764
765 /* Set up route flapping. */
766 /* This is the length of the period of both the delayed duration and the non-delayed. */
767 s->route_flap_interval = parms->route_flap_interval*G1050_TICKS_PER_SEC;
768
769 /* How much additional delay is added or subtracted during route flaps. */
770 s->route_flap_delta = parms->route_flap_delay;
771
772 /* Current tick count. This is initialized so that we are part way into the first
773 CLEAN interval before the first change occurs. This is a random portion of the
774 period. When we reach the first flap, the flapping in both directions becomes
775 periodic. */
776 s->route_flap_counter = s->route_flap_interval - 99 - floor(s->route_flap_interval*q1050_rand());
777 s->link_failure_interval_ticks = parms->link_failure_interval*G1050_TICKS_PER_SEC;
778
779 /* Link failures occur when the count reaches this number of ticks. */
780 /* Duration of a failure. */
781 s->link_failure_duration_ticks = floor((G1050_TICKS_PER_SEC*parms->link_failure_duration));
782 /* How far into the first CLEAN interval we are. This is like the route flap initialzation. */
783 s->link_failure_counter = s->link_failure_interval_ticks - 99 - floor(s->link_failure_interval_ticks*q1050_rand());
784 s->link_recovery_counter = s->link_failure_duration_ticks;
785
786 s->base_delay = parms->base_regional_delay;
787 s->max_jitter = parms->max_jitter;
788 s->prob_packet_loss = parms->prob_packet_loss/100.0;
789 s->prob_oos = parms->prob_oos/100.0;
790 s->last_arrival_time = 0.0;
791 s->delay_delta = 0;
792
793 /* Count of packets lost in this segment. */
794 s->lost_packets = 0;
795 s->lost_packets_2 = 0;
796 }
797 /*- End of function --------------------------------------------------------*/
798
799 static void g1050_segment_model(g1050_segment_state_t *s, double delays[], int len)
800 {
801 int i;
802 int lose;
803 int was_high_loss;
804 double impulse;
805 double slice_delay;
806
807 /* Compute delay and loss value for each time slice. */
808 for (i = 0; i < len; i++)
809 {
810 lose = FALSE;
811 /* Initialize delay to the serial delay plus some jitter. */
812 slice_delay = s->serial_delay + s->max_jitter*q1050_rand();
813 /* If no QoS, do congestion delay and packet loss analysis. */
814 if (!s->qos_enabled)
815 {
816 /* To match the logic in G.1050 we need to record the current loss state, before
817 checking if we should change. */
818 was_high_loss = s->high_loss;
819 /* Toggle between the low-loss and high-loss states, based on the transition probability. */
820 if (q1050_rand() < s->prob_loss_rate_change[was_high_loss])
821 s->high_loss = !s->high_loss;
822 impulse = 0.0;
823 if (q1050_rand() < s->prob_impulse[was_high_loss])
824 {
825 impulse = s->impulse_height;
826 if (!was_high_loss || s->link_type == G1050_LAN_LINK)
827 impulse *= q1050_rand();
828 }
829
830 if (was_high_loss && q1050_rand() < s->prob_packet_loss)
831 lose = TRUE;
832 /* Single pole LPF for the congestion delay impulses. */
833 s->congestion_delay = s->congestion_delay*s->impulse_coeff + impulse*(1.0 - s->impulse_coeff);
834 slice_delay += s->congestion_delay;
835 }
836 /* If duplex mismatch on LAN, packet loss based on loss probability. */
837 if (s->multiple_access && (q1050_rand() < s->prob_packet_collision_loss))
838 lose = TRUE;
839 /* Put computed delay into time slice array. */
840 if (lose)
841 {
842 delays[i] = PACKET_LOSS_TIME;
843 s->lost_packets++;
844 }
845 else
846 {
847 delays[i] = slice_delay;
848 }
849 }
850 }
851 /*- End of function --------------------------------------------------------*/
852
853 static void g1050_core_model(g1050_core_state_t *s, double delays[], int len)
854 {
855 int32_t i;
856 int lose;
857 double jitter_delay;
858
859 for (i = 0; i < len; i++)
860 {
861 lose = FALSE;
862 jitter_delay = s->base_delay + s->max_jitter*q1050_rand();
863 /* Route flapping */
864 if (--s->route_flap_counter <= 0)
865 {
866 /* Route changed */
867 s->delay_delta = s->route_flap_delta - s->delay_delta;
868 s->route_flap_counter = s->route_flap_interval;
869 }
870 if (q1050_rand() < s->prob_packet_loss)
871 lose = TRUE;
872 /* Link failures */
873 if (--s->link_failure_counter <= 0)
874 {
875 /* We are in a link failure */
876 lose = TRUE;
877 if (--s->link_recovery_counter <= 0)
878 {
879 /* Leave failure state. */
880 s->link_failure_counter = s->link_failure_interval_ticks;
881 s->link_recovery_counter = s->link_failure_duration_ticks;
882 lose = FALSE;
883 }
884 }
885 if (lose)
886 {
887 delays[i] = PACKET_LOSS_TIME;
888 s->lost_packets++;
889 }
890 else
891 {
892 delays[i] = jitter_delay + s->delay_delta;
893 }
894 }
895 }
896 /*- End of function --------------------------------------------------------*/
897
898 static int g1050_segment_delay(g1050_segment_state_t *s,
899 double base_time,
900 double arrival_times[],
901 double delays[],
902 int num_packets)
903 {
904 int i;
905 int32_t departure_time;
906 int lost_packets;
907
908 /* Add appropriate delays to the packets for the segments before the core. */
909 lost_packets = 0;
910 for (i = 0; i < num_packets; i++)
911 {
912 /* Apply half a millisecond of rounding, as we working in millisecond steps. */
913 departure_time = (arrival_times[i] + 0.0005 - base_time)*G1050_TICKS_PER_SEC;
914 if (arrival_times[i] == PACKET_LOSS_TIME)
915 {
916 /* Lost already */
917 }
918 else if (delays[departure_time] == PACKET_LOSS_TIME)
919 {
920 arrival_times[i] = PACKET_LOSS_TIME;
921 lost_packets++;
922 }
923 else
924 {
925 arrival_times[i] += delays[departure_time];
926 if (arrival_times[i] < s->last_arrival_time)
927 arrival_times[i] = s->last_arrival_time;
928 else
929 s->last_arrival_time = arrival_times[i];
930 }
931 }
932 return lost_packets;
933 }
934 /*- End of function --------------------------------------------------------*/
935
936 static int g1050_segment_delay_preserve_order(g1050_segment_state_t *s,
937 double base_time,
938 double arrival_times_a[],
939 double arrival_times_b[],
940 double delays[],
941 int num_packets)
942 {
943 int i;
944 int j;
945 int departure_time;
946 double last_arrival_time;
947 double last_arrival_time_temp;
948 int lost_packets;
949
950 /* Add appropriate delays to the packets for the segments after the core. */
951 last_arrival_time = 0.0;
952 last_arrival_time_temp = 0.0;
953 lost_packets = 0;
954 for (i = 0; i < num_packets; i++)
955 {
956 /* We need to preserve the order that came out of the core, so we
957 use an alternate array for the results. */
958 /* Apply half a millisecond of rounding, as we working in millisecond steps. */
959 departure_time = (arrival_times_a[i] + 0.0005 - base_time)*G1050_TICKS_PER_SEC;
960 if (arrival_times_a[i] == PACKET_LOSS_TIME)
961 {
962 /* Lost already */
963 arrival_times_b[i] = PACKET_LOSS_TIME;
964 }
965 else if (delays[departure_time] == PACKET_LOSS_TIME)
966 {
967 arrival_times_b[i] = PACKET_LOSS_TIME;
968 lost_packets++;
969 }
970 else
971 {
972 arrival_times_b[i] = arrival_times_a[i] + delays[departure_time];
973 if (arrival_times_a[i] < last_arrival_time)
974 {
975 /* If a legitimate out of sequence packet is detected, search
976 back a fixed amount of time to preserve order. */
977 for (j = i - 1; j >= 0; j--)
978 {
979 if ((arrival_times_a[j] != PACKET_LOSS_TIME)
980 &&
981 (arrival_times_b[j] != PACKET_LOSS_TIME))
982 {
983 if ((arrival_times_a[i] - arrival_times_a[j]) > SEARCHBACK_PERIOD)
984 break;
985 if ((arrival_times_a[j] > arrival_times_a[i])
986 &&
987 (arrival_times_b[j] < arrival_times_b[i]))
988 {
989 arrival_times_b[j] = arrival_times_b[i];
990 }
991 }
992 }
993 }
994 else
995 {
996 last_arrival_time = arrival_times_a[i];
997 if (arrival_times_b[i] < last_arrival_time_temp)
998 arrival_times_b[i] = last_arrival_time_temp;
999 else
1000 last_arrival_time_temp = arrival_times_b[i];
1001 }
1002 }
1003 }
1004 return lost_packets;
1005 }
1006 /*- End of function --------------------------------------------------------*/
1007
1008 static int g1050_core_delay(g1050_core_state_t *s,
1009 double base_time,
1010 double arrival_times[],
1011 double delays[],
1012 int num_packets)
1013 {
1014 int i;
1015 int departure_time;
1016 int lost_packets;
1017
1018 /* This element does NOT preserve packet order. */
1019 lost_packets = 0;
1020 for (i = 0; i < num_packets; i++)
1021 {
1022 /* Apply half a millisecond of rounding, as we working in millisecond steps. */
1023 departure_time = (arrival_times[i] + 0.0005 - base_time)*G1050_TICKS_PER_SEC;
1024 if (arrival_times[i] == PACKET_LOSS_TIME)
1025 {
1026 /* Lost already */
1027 }
1028 else if (delays[departure_time] == PACKET_LOSS_TIME)
1029 {
1030 arrival_times[i] = PACKET_LOSS_TIME;
1031 lost_packets++;
1032 }
1033 else
1034 {
1035 /* Not lost. Compute arrival time. */
1036 arrival_times[i] += delays[departure_time];
1037 if (arrival_times[i] < s->last_arrival_time)
1038 {
1039 /* This packet is EARLIER than the last one. It is out of order! */
1040 /* Do we allow it to stay out of order? */
1041 if (q1050_rand() >= s->prob_oos)
1042 arrival_times[i] = s->last_arrival_time;
1043 }
1044 else
1045 {
1046 /* Packet is in the correct order, relative to the last one. */
1047 s->last_arrival_time = arrival_times[i];
1048 }
1049 }
1050 }
1051 return lost_packets;
1052 }
1053 /*- End of function --------------------------------------------------------*/
1054
1055 static void g1050_simulate_chunk(g1050_state_t *s)
1056 {
1057 int i;
1058
1059 s->base_time += 1.0;
1060
1061 memcpy(&s->segment[0].delays[0], &s->segment[0].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[0].delays[0]));
1062 g1050_segment_model(&s->segment[0], &s->segment[0].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC);
1063
1064 memcpy(&s->segment[1].delays[0], &s->segment[1].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[1].delays[0]));
1065 g1050_segment_model(&s->segment[1], &s->segment[1].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC);
1066
1067 memcpy(&s->core.delays[0], &s->core.delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->core.delays[0]));
1068 g1050_core_model(&s->core, &s->core.delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC);
1069
1070 memcpy(&s->segment[2].delays[0], &s->segment[2].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[2].delays[0]));
1071 g1050_segment_model(&s->segment[2], &s->segment[2].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC);
1072
1073 memcpy(&s->segment[3].delays[0], &s->segment[3].delays[G1050_TICKS_PER_SEC], 2*G1050_TICKS_PER_SEC*sizeof(s->segment[3].delays[0]));
1074 g1050_segment_model(&s->segment[3], &s->segment[3].delays[2*G1050_TICKS_PER_SEC], G1050_TICKS_PER_SEC);
1075
1076 memcpy(&s->arrival_times_1[0], &s->arrival_times_1[s->packet_rate], 2*s->packet_rate*sizeof(s->arrival_times_1[0]));
1077 memcpy(&s->arrival_times_2[0], &s->arrival_times_2[s->packet_rate], 2*s->packet_rate*sizeof(s->arrival_times_2[0]));
1078 for (i = 0; i < s->packet_rate; i++)
1079 {
1080 s->arrival_times_1[2*s->packet_rate + i] = s->base_time + 2.0 + (double) i/(double) s->packet_rate;
1081 s->arrival_times_2[2*s->packet_rate + i] = 0.0;
1082 }
1083
1084 s->segment[0].lost_packets_2 += g1050_segment_delay(&s->segment[0], s->base_time, s->arrival_times_1, s->segment[0].delays, s->packet_rate);
1085 s->segment[1].lost_packets_2 += g1050_segment_delay(&s->segment[1], s->base_time, s->arrival_times_1, s->segment[1].delays, s->packet_rate);
1086 s->core.lost_packets_2 += g1050_core_delay(&s->core, s->base_time, s->arrival_times_1, s->core.delays, s->packet_rate);
1087 s->segment[2].lost_packets_2 += g1050_segment_delay_preserve_order(&s->segment[2], s->base_time, s->arrival_times_1, s->arrival_times_2, s->segment[2].delays, s->packet_rate);
1088 s->segment[3].lost_packets_2 += g1050_segment_delay_preserve_order(&s->segment[3], s->base_time, s->arrival_times_2, s->arrival_times_1, s->segment[3].delays, s->packet_rate);
1089 }
1090 /*- End of function --------------------------------------------------------*/
1091
1092 SPAN_DECLARE(g1050_state_t *) g1050_init(int model,
1093 int speed_pattern,
1094 int packet_size,
1095 int packet_rate)
1096 {
1097 g1050_state_t *s;
1098 g1050_constants_t *constants;
1099 g1050_channel_speeds_t *sp;
1100 g1050_model_t *mo;
1101 int i;
1102
1103 /* If the random generator has not been seeded it might give endless
1104 zeroes - it depends on the platform. */
1105 for (i = 0; i < 10; i++)
1106 {
1107 if (q1050_rand() != 0.0)
1108 break;
1109 }
1110 if (i >= 10)
1111 q1050_rand_init();
1112 if ((s = (g1050_state_t *) malloc(sizeof(*s))) == NULL)
1113 return NULL;
1114 memset(s, 0, sizeof(*s));
1115
1116 constants = &g1050_constants[0];
1117 sp = &g1050_speed_patterns[speed_pattern - 1];
1118 mo = &g1050_standard_models[model];
1119
1120 memset(s, 0, sizeof(*s));
1121
1122 s->packet_rate = packet_rate;
1123 s->packet_size = packet_size;
1124
1125 g1050_segment_init(&s->segment[0],
1126 G1050_LAN_LINK,
1127 &constants->segment[0],
1128 &mo->sidea_lan,
1129 sp->sidea_lan_bit_rate,
1130 sp->sidea_lan_multiple_access,
1131 FALSE,
1132 packet_size,
1133 packet_rate);
1134 g1050_segment_init(&s->segment[1],
1135 G1050_ACCESS_LINK,
1136 &constants->segment[1],
1137 &mo->sidea_access_link,
1138 sp->sidea_access_link_bit_rate_ab,
1139 FALSE,
1140 sp->sidea_access_link_qos_enabled,
1141 packet_size,
1142 packet_rate);
1143 g1050_core_init(&s->core, &mo->core, packet_rate);
1144 g1050_segment_init(&s->segment[2],
1145 G1050_ACCESS_LINK,
1146 &constants->segment[2],
1147 &mo->sideb_access_link,
1148 sp->sideb_access_link_bit_rate_ba,
1149 FALSE,
1150 sp->sideb_access_link_qos_enabled,
1151 packet_size,
1152 packet_rate);
1153 g1050_segment_init(&s->segment[3],
1154 G1050_LAN_LINK,
1155 &constants->segment[3],
1156 &mo->sideb_lan,
1157 sp->sideb_lan_bit_rate,
1158 sp->sideb_lan_multiple_access,
1159 FALSE,
1160 packet_size,
1161 packet_rate);
1162
1163 s->base_time = 0.0;
1164 /* Start with enough of the future modelled to allow for the worst jitter.
1165 After this we will always keep at least 2 seconds of the future modelled. */
1166 g1050_segment_model(&s->segment[0], s->segment[0].delays, 3*G1050_TICKS_PER_SEC);
1167 g1050_segment_model(&s->segment[1], s->segment[1].delays, 3*G1050_TICKS_PER_SEC);
1168 g1050_core_model(&s->core, s->core.delays, 3*G1050_TICKS_PER_SEC);
1169 g1050_segment_model(&s->segment[2], s->segment[2].delays, 3*G1050_TICKS_PER_SEC);
1170 g1050_segment_model(&s->segment[3], s->segment[3].delays, 3*G1050_TICKS_PER_SEC);
1171
1172 /* Initialise the arrival times to the departure times */
1173 for (i = 0; i < 3*s->packet_rate; i++)
1174 {
1175 s->arrival_times_1[i] = s->base_time + (double) i/(double)s->packet_rate;
1176 s->arrival_times_2[i] = 0.0;
1177 }
1178
1179 s->segment[0].lost_packets_2 += g1050_segment_delay(&s->segment[0], s->base_time, s->arrival_times_1, s->segment[0].delays, s->packet_rate);
1180 s->segment[1].lost_packets_2 += g1050_segment_delay(&s->segment[1], s->base_time, s->arrival_times_1, s->segment[1].delays, s->packet_rate);
1181 s->core.lost_packets_2 += g1050_core_delay(&s->core, s->base_time, s->arrival_times_1, s->core.delays, s->packet_rate);
1182 s->segment[2].lost_packets_2 += g1050_segment_delay_preserve_order(&s->segment[2], s->base_time, s->arrival_times_1, s->arrival_times_2, s->segment[2].delays, s->packet_rate);
1183 s->segment[3].lost_packets_2 += g1050_segment_delay_preserve_order(&s->segment[3], s->base_time, s->arrival_times_2, s->arrival_times_1, s->segment[3].delays, s->packet_rate);
1184
1185 s->first = NULL;
1186 s->last = NULL;
1187 return s;
1188 }
1189 /*- End of function --------------------------------------------------------*/
1190
1191 SPAN_DECLARE(void) g1050_dump_parms(int model, int speed_pattern)
1192 {
1193 g1050_channel_speeds_t *sp;
1194 g1050_model_t *mo;
1195
1196 sp = &g1050_speed_patterns[speed_pattern - 1];
1197 mo = &g1050_standard_models[model];
1198
1199 printf("Model %d%c\n", speed_pattern, 'A' + model - 1);
1200 printf("LOO %.6f%% %.6f%% %.6f%%\n", mo->loo[0]*sp->loo/100.0, mo->loo[1]*sp->loo/100.0, mo->loo[2]*sp->loo/100.0);
1201 printf("Side A LAN %dbps, %.3f%% occupancy, MTU %d, %s MA\n", sp->sidea_lan_bit_rate, mo->sidea_lan.percentage_occupancy, mo->sidea_lan.mtu, (sp->sidea_lan_multiple_access) ? "" : "no");
1202 printf("Side A access %dbps, %.3f%% occupancy, MTU %d, %s QoS\n", sp->sidea_access_link_bit_rate_ab, mo->sidea_access_link.percentage_occupancy, mo->sidea_access_link.mtu, (sp->sidea_access_link_qos_enabled) ? "" : "no");
1203 printf("Core delay %.4fs (%.4fs), peak jitter %.4fs, prob loss %.4f%%, prob OOS %.4f%%\n", mo->core.base_regional_delay, mo->core.base_intercontinental_delay, mo->core.max_jitter, mo->core.prob_packet_loss, mo->core.prob_oos);
1204 printf(" Route flap interval %.4fs, delay change %.4fs\n", mo->core.route_flap_interval, mo->core.route_flap_delay);
1205 printf(" Link failure interval %.4fs, duration %.4fs\n", mo->core.link_failure_interval, mo->core.link_failure_duration);
1206 printf("Side B access %dbps, %.3f%% occupancy, MTU %d, %s QoS\n", sp->sideb_access_link_bit_rate_ba, mo->sideb_access_link.percentage_occupancy, mo->sideb_access_link.mtu, (sp->sideb_access_link_qos_enabled) ? "" : "no");
1207 printf("Side B LAN %dbps, %.3f%% occupancy, MTU %d, %s MA\n", sp->sideb_lan_bit_rate, mo->sideb_lan.percentage_occupancy, mo->sideb_lan.mtu, (sp->sideb_lan_multiple_access) ? "" : "no");
1208 }
1209 /*- End of function --------------------------------------------------------*/
1210
1211 SPAN_DECLARE(int) g1050_put(g1050_state_t *s, const uint8_t buf[], int len, int seq_no, double departure_time)
1212 {
1213 g1050_queue_element_t *element;
1214 g1050_queue_element_t *e;
1215 double arrival_time;
1216
1217 while (departure_time >= s->base_time + 1.0)
1218 g1050_simulate_chunk(s);
1219 arrival_time = s->arrival_times_1[(int) ((departure_time - s->base_time)*(double) s->packet_rate + 0.5)];
1220 if (arrival_time < 0)
1221 {
1222 /* This packet is lost */
1223 return 0;
1224 }
1225 if ((element = (g1050_queue_element_t *) malloc(sizeof(*element) + len)) == NULL)
1226 return -1;
1227 element->next = NULL;
1228 element->prev = NULL;
1229 element->seq_no = seq_no;
1230 element->departure_time = departure_time;
1231 element->arrival_time = arrival_time;
1232 element->len = len;
1233 memcpy(element->pkt, buf, len);
1234 /* Add it to the queue, in order */
1235 if (s->last == NULL)
1236 {
1237 /* The queue is empty */
1238 s->first =
1239 s->last = element;
1240 }
1241 else
1242 {
1243 for (e = s->last; e; e = e->prev)
1244 {
1245 if (e->arrival_time <= arrival_time)
1246 break;
1247 }
1248 if (e)
1249 {
1250 element->next = e->next;
1251 element->prev = e;
1252 e->next = element;
1253 }
1254 else
1255 {
1256 element->next = s->first;
1257 s->first = element;
1258 }
1259 if (element->next)
1260 element->next->prev = element;
1261 else
1262 s->last = element;
1263 }
1264 //printf(">> Seq %d, departs %f, arrives %f\n", seq_no, departure_time, arrival_time);
1265 return len;
1266 }
1267 /*- End of function --------------------------------------------------------*/
1268
1269 SPAN_DECLARE(int) g1050_get(g1050_state_t *s, uint8_t buf[], int max_len, double current_time, int *seq_no, double *departure_time, double *arrival_time)
1270 {
1271 int len;
1272 g1050_queue_element_t *element;
1273
1274 element = s->first;
1275 if (element == NULL)
1276 {
1277 if (seq_no)
1278 *seq_no = -1;
1279 if (departure_time)
1280 *departure_time = -1;
1281 if (arrival_time)
1282 *arrival_time = -1;
1283 return -1;
1284 }
1285 if (element->arrival_time > current_time)
1286 {
1287 if (seq_no)
1288 *seq_no = element->seq_no;
1289 if (departure_time)
1290 *departure_time = element->departure_time;
1291 if (arrival_time)
1292 *arrival_time = element->arrival_time;
1293 return -1;
1294 }
1295 /* Return the first packet in the queue */
1296 len = element->len;
1297 memcpy(buf, element->pkt, len);
1298 if (seq_no)
1299 *seq_no = element->seq_no;
1300 if (departure_time)
1301 *departure_time = element->departure_time;
1302 if (arrival_time)
1303 *arrival_time = element->arrival_time;
1304 //printf("<< Seq %d, arrives %f (%f)\n", element->seq_no, element->arrival_time, current_time);
1305
1306 /* Remove it from the queue */
1307 if (s->first == s->last)
1308 s->last = NULL;
1309 s->first = element->next;
1310 if (element->next)
1311 element->next->prev = NULL;
1312 free(element);
1313 return len;
1314 }
1315 /*- End of function --------------------------------------------------------*/
1316
1317 SPAN_DECLARE(void) g1050_queue_dump(g1050_state_t *s)
1318 {
1319 g1050_queue_element_t *e;
1320
1321 printf("Queue scanned forewards\n");
1322 for (e = s->first; e; e = e->next)
1323 printf("Seq %5d, arrival %10.4f, len %3d\n", e->seq_no, e->arrival_time, e->len);
1324 printf("Queue scanned backwards\n");
1325 for (e = s->last; e; e = e->prev)
1326 printf("Seq %5d, arrival %10.4f, len %3d\n", e->seq_no, e->arrival_time, e->len);
1327 }
1328 /*- End of function --------------------------------------------------------*/
1329 /*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.