4 require
"yats.graphics"
6 local fmt
= string.format
9 local ms
, us
, ns
= 1e-3, 1e-6, 1e-9
10 local Gbps
, Mbps
, kbps
= 1e9
, 1e6
, 1e3
12 -- Fequently used functions
13 local t2s
, r2s
, s2t
= yats
.t2s
, yats
.r2s
, yats
.s2t
15 -- Init Simulation time
17 yats
.sim
:SetSlotLength(1*ns
)
20 yats
.log:setLevel("INFO")
21 yats
.kernel_log
:setLevel("INFO")
26 local SOURCETYPE
="cbr"
34 local srate
= 4 * Gbps
46 0.95, 0.95, 0.95, 0.95, 0.95, 0.95, 0.95, 0.95
47 -- 1, 1, 1, 1, 1, 1, 1, 1
48 -- 1.1, 1,1, 1,1, 1,1, 1, 1, 1, 1
51 -- Graphic output configuration
52 local x
,y
,dx
,dy
= 0,0,200,100
55 local ddelta
= t2s(1*us
)
57 local dupdate
= ddelta
/40
63 ----------------------------------------------------------------
65 ----------------------------------------------------------------
66 -- Demux PtP to receivers
69 dout
[i
] = {"receiver-"..i
, "in"}
71 local demux
= yats
.demux
{"demux", maxvci
= N
, nout
= N
, out
= dout
}
73 -- PtP LINK => PHY(demux)
74 dnline
= yats
.line
{"dnline",delay
= t2s(TLINEDN
), out
= {"demux", "demux"}}
77 local mux
= yats
.muxDF
{"mux", ninp
= N
, active
= r2s(1.2 * Gbps
, SEGSIZE
),
78 maxvci
= N
, buff
= 100, out
= {"dnline", "line"}}
80 -- Sources, Senders, Receivers
81 local src
, d2f
, msrc
, mrx
, mbf
, snk
, mln
= {}, {}, {}, {}, {}, {}, {}
87 if SOURCETYPE
== "cbr" then
89 "src-"..i
, delta
= r2s(rates
[i
]*1.001, SEGSIZE
), vci
=i
,
90 out
= {"d2f-"..i
, "dat2fram"}
93 src
[i
] = yats
.geosrc
{"src-"..i
, ed
= r2s(rates
[i
]*loads
[i
], FLEN
), vci
= i
,
94 out
= {"d2f-"..i
, "dat2fram"}}
97 d2f
[i
] = yats
.dat2fram
{"d2f-"..i
, flen
= FLEN
, connid
= i
,
98 out
= {"scheduler-"..i
, "in"}}
100 snk
[i
] = yats
.sink
{"snk-"..i
}
102 local n2
= 10*us
* rates
[i
] / 8
105 senders
[i
] = yats
.scheduler
{"scheduler-"..i
, cycle
= r2s(1.2 * Gbps
, SEGSIZE
),
106 n2
= n2
, n3
= RTT
* rates
[i
] / 8, segsize
= SEGSIZE
, out
= {"mux", "in"..i
}}
109 receivers
[i
] = yats
.receiver
{"receiver-"..i
, rtt
= RTT
, rate
= rates
[i
], n2
= n2
,
110 meantime
= 100*us
, watermark
= SEGSIZE
*1,
111 chunksize
= CHUNKSIZE
, out
= {{"upline-"..i
, "line"}, {"snk-"..i
, "sink"}}}
114 msrc
[i
] = yats
.meter
{
115 "msrc-"..i
, title
= "SRCRATE-"..i
,
116 val
= {senders
[i
], "Count"},
118 mode
= yats
.DiffMode
,
127 "mrx-"..i
, title
= "CHNRATE-"..i
,
128 val
= {receivers
[i
], "Count"},
130 mode
= yats
.DiffMode
,
138 mrxmean
[i
] = yats
.meter
{
139 "mrxmean-"..i
, title
= "MEANRATE-"..i
,
140 val
= {receivers
[i
], "ival4"},
152 "mln-"..i
, title
= "LINRATE-"..i
,
153 val
= {snk
[i
], "Count"},
155 mode
= yats
.DiffMode
,
164 "mbf-"..i
, title
= "BF-"..i
,
165 val
= {receivers
[i
], "ival0"},
169 maxval
= N2
+ RTT
* 800*Mbps
/ 8,
170 delta
= ddelta
, update
= dupdate
,
173 -- PtP PHY => LINK(sender)
174 uplines
[i
] = yats
.line
{
176 delay
= t2s(TLINEUP
),
177 out
= {"scheduler-"..i
, "credit"}
183 ----------------------------------------------------------
185 ----------------------------------------------------------
188 table.insert(instr
, {msrc
[i
], mrx
[i
], mrxmean
[i
], mbf
[i
], mln
[i
]})
190 local disp
= yats
.bigdisplay
{
191 "disp", title
="TN PtP", nrow
= N
, ncol
= 5, width
= 200, height
= 100,
196 ----------------------------------------------------------
198 ----------------------------------------------------------
199 printf("Connecting ...\n")
202 local T1
, T2
, T3
, T4
, T5
= 500, 100, 567, 100, 500
204 yats
.sim
:run(t2s(T1
*us
))
206 local rec
= receivers
[1]
207 local snd
= senders
[1]
209 -- 1. Change rate DOWN - no hold-off time !!!
210 iup
.Message("info", "Change down")
212 -- 1.1 Change and recalc n1 + n2 for scheduler rate adoptions
213 log:info(fmt("Changing linerate down"))
214 rec
:setlinerate(rates
[1]/3)
216 yats
.sim
:run(t2s(T2
*us
))
218 -- 2.1 Adopt max. buffer for min. delay after rate change
219 --local n2, n3 = rec:align(rates[1]/3)
221 -- 2.2 Adopting scheduler rate
222 --snd:setn2n3(n2, n3)
224 -- 3. Run a while at lowered rate
225 yats
.sim
:run(t2s(T3
*us
))
229 iup
.Message("info", "change up")
231 -- 4.1 Prepare receiver to new higher rate
232 --n2, n3 = rec:align(rates[1])
234 -- 4.3 Prepare sender to new higher rate
235 --snd:setn2n3(n2, n3)
237 -- 5. Run a while at low rate but old parameters Wait to Restore
238 yats
.sim
:run(t2s(T4
*us
))
240 -- 6. Now change the rate => no recalc, because everything has been set.
241 log:info(fmt("Changing linerate up"))
242 n2
, n3
= rec
:setlinerate(rates
[1])
244 yats
.sim
:run(t2s(T5
*us
))
246 ----------------------------------------------------------
248 ----------------------------------------------------------
250 local src
, rx
, tx
, snk
= src
[i
], receivers
[i
], senders
[i
], snk
[i
]
251 local cr
= tx
:getcreditcount()*(4+2+1)*8/yats
.SimTimeReal
252 printf("ch-%d: src=%d rx=%d rx-loss=%d ur=%s sk=%d ra=%.1f Mbps cc=%d cr=%.1g Mbps %.1f %% bfmax=%d\n",
253 i
, src
.counter
, rx
.counter
, rx
.lost
, rx
.underrun
, snk
.counter
, rates
[i
]/Mbps
, tx
:getcreditcount(),
254 cr
/Mbps
, cr
/rates
[i
]*100, rx
.maxbuf
)