| | 1 | [wiki:WikiStart Orbit] > [wiki:Documentation/OtherApps Other Applications] > ITG Scripts |
| | 2 | |
| | 3 | = Application Definition Schema = |
| | 4 | The application definition schema for the ITG application is as follows |
| | 5 | {{{ |
| | 6 | <?xml version="1.0" encoding="UTF-8"?> |
| | 7 | <orbit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="H:\Orbit\Oml\docs\definitions\application\app_def.xsd"> |
| | 8 | <application id="orbit_winlab_itg"> |
| | 9 | <name>ITG</name> |
| | 10 | <id>ITG</id> |
| | 11 | <version major="0" minor="1" revision="0"/> |
| | 12 | <organization> |
| | 13 | <name>WINLAB, Rutgers University</name> |
| | 14 | <url>http://www.winlab.rutgers.edu/</url> |
| | 15 | </organization> |
| | 16 | <shortDescription>Receive network traffic</shortDescription> |
| | 17 | <description> |
| | 18 | Receive network traffic on the specified interface |
| | 19 | </description> |
| | 20 | <url>http://apps.orbit-lab.org/itg</url> |
| | 21 | <properties> |
| | 22 | <property> |
| | 23 | <name>network_interface</name> |
| | 24 | <mnemonic>i</mnemonic> |
| | 25 | <type>xsd:string</type> |
| | 26 | <dynamic>no</dynamic> |
| | 27 | <description>Device name for sending network traffic</description> |
| | 28 | </property> |
| | 29 | <property> |
| | 30 | <name>pipe name</name> |
| | 31 | <mnemonic>p</mnemonic> |
| | 32 | <type>xsd:string</type> |
| | 33 | <dynamic>no</dynamic> |
| | 34 | <description>iinterface for changing generator properties</description> |
| | 35 | </property> |
| | 36 | </properties> |
| | 37 | <measurement-points> |
| | 38 | <measurement-point id="decoderport"> |
| | 39 | <metric id="flow_no" type="int"> |
| | 40 | <description>id of the stream</description> |
| | 41 | </metric> |
| | 42 | <metric id="src_port" type="int"> |
| | 43 | <description>source port</description> |
| | 44 | </metric> |
| | 45 | <metric id="dst_port" type="int"> |
| | 46 | <description>Destination port</description> |
| | 47 | </metric> |
| | 48 | <metric id="throughput" type="float"> |
| | 49 | <description>Flow Throughput</description> |
| | 50 | </metric> |
| | 51 | <metric id="jitter" type ="float"> |
| | 52 | <description>Flow jitter</description> |
| | 53 | </metric> |
| | 54 | <metric id="delay" type="float"> |
| | 55 | <description>flow delay</description> |
| | 56 | </metric> |
| | 57 | <metric id="pkt_loss" type="float"> |
| | 58 | <description>Pkt loss for flow</description> |
| | 59 | </metric> |
| | 60 | </measurement-point> |
| | 61 | </measurement-points> |
| | 62 | <issueTrackingUrl> |
| | 63 | http://apps.orbit-lab.org/issues/winlab/renny |
| | 64 | </issueTrackingUrl> |
| | 65 | <repository> |
| | 66 | <development>scm:cvs:pserver:anoncvs@cvs.orbit-lab.org:/trafficgenerator/renny</development> |
| | 67 | <binary>apt:repository.orbit-lab.org/orbit/binary:???</binary> |
| | 68 | </repository> |
| | 69 | <mailingLists/> |
| | 70 | <developers> |
| | 71 | <developer> |
| | 72 | <name>John Doe</name> |
| | 73 | <id>jdoe</id> |
| | 74 | <email>jdoe@winlab.rutgers.edu</email> |
| | 75 | <organization> |
| | 76 | <name>WINLAB, Rutgers University</name> |
| | 77 | </organization> |
| | 78 | </developer> |
| | 79 | </developers> |
| | 80 | <dependencies> |
| | 81 | <dependency> |
| | 82 | <id>libmac</id> |
| | 83 | <version>>= 0.4</version> |
| | 84 | <url>apt:repository.orbit-lab.org/debian/binary:libmac</url> |
| | 85 | </dependency> |
| | 86 | </dependencies> |
| | 87 | </application> |
| | 88 | </orbit> |
| | 89 | |
| | 90 | |
| | 91 | }}} |
| | 92 | |
| | 93 | = Application definition script for Iperf sender and Receiver = |
| | 94 | |
| | 95 | == ITG Sender == |
| | 96 | {{{ |
| | 97 | |
| | 98 | # |
| | 99 | # Create an application representation from scratch |
| | 100 | # |
| | 101 | require 'appDefinition' |
| | 102 | |
| | 103 | a = AppDefinition.create('test:app:itgs') |
| | 104 | a.name = "itgs" |
| | 105 | a.version(0, 0, 1) |
| | 106 | a.shortDescription = "D-ITG Sender" |
| | 107 | a.description = <<TEXT |
| | 108 | ITGSend is a traffic generator for TCP and UDP traffic. It contains generators producing various forms of packet streams and port for sending these packets via various transports, such as TCP and UDP. |
| | 109 | TEXT |
| | 110 | |
| | 111 | # addProperty(name, description, mnemonic, type, isDynamic = false, constraints = nil) |
| | 112 | |
| | 113 | #Flow options |
| | 114 | a.addProperty('m', 'Measurement type: either onewaydelay or RTT', ?m, String, false) |
| | 115 | a.addProperty('a', 'Destination address', ?a, String, false) |
| | 116 | a.addProperty('r', 'Remote port', ?r, Integer, false) |
| | 117 | a.addProperty('T', 'Protocol type TCP or UDP', ?T, Integer, false) |
| | 118 | a.addProperty('f', 'TTL',?f, Integer, false) |
| | 119 | a.addProperty('d', 'Gen_Delay',?d, Integer, false) |
| | 120 | a.addProperty('t', "Duration of traffic generation(millisecs)", ?t, Integer, false) |
| | 121 | |
| | 122 | #Interdeparture time options |
| | 123 | a.addProperty('C', 'Constant interdeparture time b/w packets (pkts_per_s)', ?C, Integer, false) |
| | 124 | a.addProperty('E', '(Exponential) Average packets per sec', ?E, Integer, false) |
| | 125 | a.addProperty('O', '(Poisson) Average pkts per sec', ?O, Integer, false) |
| | 126 | |
| | 127 | #Note that Pareto, Cauchy, UNiform, Normal and Gamma distributions will # be added |
| | 128 | |
| | 129 | #Log file options |
| | 130 | a.addProperty('l', 'Log file', ?l, String, false) |
| | 131 | |
| | 132 | #Packet size options |
| | 133 | a.addProperty('c', 'Constant payload size', ?c, Integer, false) |
| | 134 | a.addProperty('e', "Average pkt size (exponential)", ?e, Integer, false) |
| | 135 | a.addProperty('o', "Poisson distributed avg. pkt size", ?o, Integer, false) |
| | 136 | |
| | 137 | #Note that Pareto, Cauchy, UNiform, Normal and Gamma distributions will # be added |
| | 138 | |
| | 139 | # Applications (note that no other interdeparture or packet size can be #chosen if an application is chosen |
| | 140 | a.addProperty('App', 'VoIP traffic', ?Z, Integer, false) |
| | 141 | a.addProperty('codec', 'VoIP codec: G.711.1, G.711.2, G.723.1, G.729.2, G.729.3', ?i, Integer, false) |
| | 142 | a.addProperty('voip_control', 'protocol_type RTP or CRTP',?h, String, false) |
| | 143 | |
| | 144 | a.addProperty('Telnet', 'Telnet traffic', nil, Integer, false) |
| | 145 | a.addProperty('DNS', 'DNS traffic', nil, Integer, false) |
| | 146 | |
| | 147 | a.path = "/usr/local/bin/ITGSend" |
| | 148 | |
| | 149 | if $0 == __FILE__ |
| | 150 | require 'stringio' |
| | 151 | require 'rexml/document' |
| | 152 | include REXML |
| | 153 | |
| | 154 | sio = StringIO.new() |
| | 155 | a.to_xml.write(sio, 2) |
| | 156 | sio.rewind |
| | 157 | puts sio.read |
| | 158 | |
| | 159 | sio.rewind |
| | 160 | doc = Document.new(sio) |
| | 161 | t = AppDefinition.from_xml(doc.root) |
| | 162 | |
| | 163 | puts |
| | 164 | puts "-------------------------" |
| | 165 | puts |
| | 166 | t.to_xml.write($stdout, 2) |
| | 167 | |
| | 168 | end |
| | 169 | |
| | 170 | |
| | 171 | }}} |
| | 172 | == ITG Receiver == |
| | 173 | {{{ |
| | 174 | # |
| | 175 | # Create an application representation from scratch |
| | 176 | # |
| | 177 | require 'appDefinition' |
| | 178 | |
| | 179 | a = AppDefinition.create('test:app:itgr') |
| | 180 | a.name = "itgr" |
| | 181 | a.version(0, 0, 1) |
| | 182 | a.shortDescription = "D-ITG Receiver" |
| | 183 | a.description = <<TEXT |
| | 184 | D-ITG is a traffic generator for TCP and UDP traffic. It contains generators |
| | 185 | producing various forms of packet streams and port for sending |
| | 186 | these packets via various transports, such as TCP and UDP. |
| | 187 | TEXT |
| | 188 | |
| | 189 | # addProperty(name, description, mnemonic, type, isDynamic = false, constraints = nil) |
| | 190 | #Flow options |
| | 191 | a.addProperty('l', 'Log file', ?l, String, false) |
| | 192 | |
| | 193 | a.path = "/usr/local/bin/ITGRecv" |
| | 194 | |
| | 195 | if $0 == __FILE__ |
| | 196 | require 'stringio' |
| | 197 | require 'rexml/document' |
| | 198 | include REXML |
| | 199 | |
| | 200 | sio = StringIO.new() |
| | 201 | a.to_xml.write(sio, 2) |
| | 202 | sio.rewind |
| | 203 | puts sio.read |
| | 204 | |
| | 205 | sio.rewind |
| | 206 | doc = Document.new(sio) |
| | 207 | t = AppDefinition.from_xml(doc.root) |
| | 208 | |
| | 209 | puts |
| | 210 | puts "-------------------------" |
| | 211 | puts |
| | 212 | t.to_xml.write($stdout, 2) |
| | 213 | |
| | 214 | end |
| | 215 | |
| | 216 | }}} |
| | 217 | |
| | 218 | == ITG Decoder == |
| | 219 | {{{ |
| | 220 | # |
| | 221 | # Create an application representation from scratch |
| | 222 | # |
| | 223 | require 'appDefinition' |
| | 224 | |
| | 225 | a = AppDefinition.create('test:app:itgdec') |
| | 226 | a.name = "itgdec" |
| | 227 | a.version(0, 0, 1) |
| | 228 | a.shortDescription = "D-ITG Decoder" |
| | 229 | a.description = <<TEXT |
| | 230 | This program decodes the output of the experiment |
| | 231 | TEXT |
| | 232 | |
| | 233 | # addProperty(name, description, mnemonic, type, isDynamic = false, constraints = nil) |
| | 234 | a.addProperty('logfile', 'Log file', ?x , String, false) |
| | 235 | a.addProperty('d', 'Delay interval size (msec)', ?d, Integer, false) |
| | 236 | a.addProperty('j', 'Jitter Interval size (msec)', ?j, Integer, false) |
| | 237 | a.addProperty('b', 'Bitrate interval size (msec)', ?b, Integer, false) |
| | 238 | a.addProperty('p', 'Packet loss interval size(msec)', ?p, Integer, false) |
| | 239 | |
| | 240 | a.addMeasurement("decoderport", nil, [ |
| | 241 | ['flow_no', 'int'], |
| | 242 | ['src_port', 'int'], |
| | 243 | ['dst_port', 'int'], |
| | 244 | ['throughput', Float], |
| | 245 | ['jitter', Float], |
| | 246 | ['delay', Float], |
| | 247 | ['pkt_loss', Float] |
| | 248 | ]) |
| | 249 | |
| | 250 | a.path = "/usr/local/bin/ITGDec" |
| | 251 | |
| | 252 | if $0 == __FILE__ |
| | 253 | require 'stringio' |
| | 254 | require 'rexml/document' |
| | 255 | include REXML |
| | 256 | |
| | 257 | sio = StringIO.new() |
| | 258 | a.to_xml.write(sio, 2) |
| | 259 | sio.rewind |
| | 260 | puts sio.read |
| | 261 | |
| | 262 | sio.rewind |
| | 263 | doc = Document.new(sio) |
| | 264 | t = AppDefinition.from_xml(doc.root) |
| | 265 | |
| | 266 | puts |
| | 267 | puts "-------------------------" |
| | 268 | puts |
| | 269 | t.to_xml.write($stdout, 2) |
| | 270 | |
| | 271 | end |
| | 272 | }}} |
| | 273 | = Sample prototype definitions script for ITG UDP CBR(sender and Receiver) = |
| | 274 | |
| | 275 | == ITG CBR UDP Sender == |
| | 276 | {{{ |
| | 277 | # |
| | 278 | # Define a prototype |
| | 279 | # |
| | 280 | require 'prototype' |
| | 281 | require 'filter' |
| | 282 | require 'appDefinition' |
| | 283 | |
| | 284 | p = Prototype.create("test:proto:itgcbrsender") |
| | 285 | p.name = "ITG Sender" |
| | 286 | p.description = "Nodes which send a stream of packets" |
| | 287 | p.defProperty('meter', 'one way delay or RTT', 'owdm') |
| | 288 | p.defProperty('protocol', 'Protocol to use', 'udp') |
| | 289 | p.defProperty('destinationHost', 'Host to send packets to') |
| | 290 | p.defProperty('constsize', 'Size of packets', 1000) |
| | 291 | p.defProperty('constrate', 'Number of bits per second', 1000) |
| | 292 | p.defProperty('duration', 'Time for sending (millisec)', 1000) |
| | 293 | p.defProperty('gen_delay', 'Generation delay (millisec)', 10000) |
| | 294 | p.defProperty('recv_port', 'Receiver_port', 8000) |
| | 295 | |
| | 296 | itgs = p.addApplication(:itgs, "test:app:itgs") |
| | 297 | itgs.bindProperty('m','meter') |
| | 298 | itgs.bindProperty('T','protocol') |
| | 299 | itgs.bindProperty('a', 'destinationHost') |
| | 300 | itgs.bindProperty('c', 'constsize') |
| | 301 | itgs.bindProperty('C', 'constrate') |
| | 302 | itgs.bindProperty('t', 'duration') |
| | 303 | itgs.bindProperty('d', 'gen_delay') |
| | 304 | itgs.bindProperty('r', 'recv_port') |
| | 305 | |
| | 306 | if $0 == __FILE__ |
| | 307 | p.to_xml.write($stdout, 2) |
| | 308 | puts |
| | 309 | end |
| | 310 | |
| | 311 | |
| | 312 | }}} |
| | 313 | == ITG CBR UDP Receiver == |
| | 314 | {{{ |
| | 315 | # |
| | 316 | # Define a prototype |
| | 317 | # |
| | 318 | |
| | 319 | require 'prototype' |
| | 320 | require 'filter' |
| | 321 | require 'appDefinition' |
| | 322 | |
| | 323 | p = Prototype.create("test:proto:itgreceiver") |
| | 324 | p.name = "ITG Receiver" |
| | 325 | p.description = "Nodes which receive packets" |
| | 326 | p.defProperty('logfile', 'Logfile') |
| | 327 | |
| | 328 | itgr = p.addApplication('itgr', "test:app:itgr") |
| | 329 | itgr.bindProperty('l','logfile') |
| | 330 | |
| | 331 | if $0 == __FILE__ |
| | 332 | p.to_xml.write($stdout, 2) |
| | 333 | puts |
| | 334 | end |
| | 335 | |
| | 336 | |
| | 337 | |
| | 338 | }}} |
| | 339 | == ITG CBR UDP Decoder == |
| | 340 | {{{ |
| | 341 | # |
| | 342 | # Define a prototype |
| | 343 | # |
| | 344 | |
| | 345 | require 'prototype' |
| | 346 | require 'filter' |
| | 347 | require 'appDefinition' |
| | 348 | |
| | 349 | p = Prototype.create("test:proto:itgdecoder") |
| | 350 | p.name = "ITG Decoder" |
| | 351 | p.description = "Decodes output and prints results" |
| | 352 | p.defProperty('logfile', 'Logfile') |
| | 353 | p.defProperty('tput_report_interval', 'Report interval for throughput') |
| | 354 | p.defProperty('delay_report_interval', 'Report interval for Delay') |
| | 355 | p.defProperty('jitter_report_interval', 'Report interval for Jitter') |
| | 356 | p.defProperty('loss_report_interval', 'Report interval for Packet loss') |
| | 357 | |
| | 358 | itgd = p.addApplication('itgdec', "test:app:itgdec") |
| | 359 | itgd.bindProperty('logfile') |
| | 360 | itgd.bindProperty('d', 'delay_report_interval') |
| | 361 | itgd.bindProperty('j', 'jitter_report_interval') |
| | 362 | itgd.bindProperty('b', 'tput_report_interval') |
| | 363 | itgd.bindProperty('p', 'loss_report_interval') |
| | 364 | |
| | 365 | itgd.addMeasurement('decoderport', Filter::SAMPLE, |
| | 366 | {Filter::SAMPLE_SIZE => 1}, |
| | 367 | [ |
| | 368 | ['flow_no'], |
| | 369 | ['src_port'], |
| | 370 | ['dst_port'], |
| | 371 | ['throughput'], |
| | 372 | ['jitter'], |
| | 373 | ['delay'], |
| | 374 | ['pkt_loss'] |
| | 375 | ] |
| | 376 | ) |
| | 377 | |
| | 378 | if $0 == __FILE__ |
| | 379 | p.to_xml.write($stdout, 2) |
| | 380 | puts |
| | 381 | end |
| | 382 | }}} |
| | 383 | |
| | 384 | |
| | 385 | = Experiment script for Iperf = |
| | 386 | |
| | 387 | == UDP CBR Experiment == |
| | 388 | {{{ |
| | 389 | ############# Tutorial1 ################################## |
| | 390 | # This script defines the experiment |
| | 391 | # that has two senders and one receiver using Iperf |
| | 392 | # 802.11b |
| | 393 | # UDP flow of 500 packet/sec of 1024 byte payload |
| | 394 | # Decoder reports throughput, delay, packet loss and jitter ############################################################ |
| | 395 | |
| | 396 | Experiment.name = "tutorial-itg" |
| | 397 | Experiment.project = "orbit:tutorial" |
| | 398 | |
| | 399 | ########################################### |
| | 400 | # Receiver definition and configuration |
| | 401 | ########################################## |
| | 402 | |
| | 403 | defNodes('receiver',[3,1]) {|node| |
| | 404 | node.image = nil # assume the right image to be on disk |
| | 405 | node.prototype("test:proto:itgreceiver", { |
| | 406 | 'logfile' => "/tmp/results.txt" |
| | 407 | } |
| | 408 | ) |
| | 409 | node.net.w0.ip = "%192.168.%x.%y" |
| | 410 | node.net.w0.mode = "master" |
| | 411 | node.net.w0.type = 'b' |
| | 412 | node.net.w0.essid = "helloworld" |
| | 413 | } |
| | 414 | ########################################### |
| | 415 | # Decoder definition and configuration |
| | 416 | ########################################## |
| | 417 | |
| | 418 | defNodes('decoder',[3,1]) {|node| |
| | 419 | node.image = nil # assume the right image to be on disk |
| | 420 | node.prototype("test:proto:itgdecoder", { |
| | 421 | 'logfile' => "/tmp/results.txt", |
| | 422 | 'tput_report_interval' => 1000, |
| | 423 | 'delay_report_interval' => 1000, |
| | 424 | 'loss_report_interval' => 1000, |
| | 425 | 'jitter_report_interval' => 1000 |
| | 426 | } |
| | 427 | ) |
| | 428 | } |
| | 429 | ########################################### |
| | 430 | # Sender definition and configuration |
| | 431 | ########################################### |
| | 432 | defNodes('sender',[1,2]) {|node| |
| | 433 | node.image = nil # assume the right image to be on disk |
| | 434 | node.prototype("test:proto:itgcbrsender", { |
| | 435 | 'destinationHost' => '192.168.3.1', |
| | 436 | 'meter' => 'owdm', #One way delay |
| | 437 | 'protocol' => 'udp', #UDP client |
| | 438 | 'constsize' => 1024, #Const payload size (bytes) |
| | 439 | 'constrate' => 500, #packets per second |
| | 440 | 'duration' => 60000, #Expt duration (msec) |
| | 441 | 'recv_port' => 8000 #Receiver port |
| | 442 | }) |
| | 443 | node.net.w0.ip = "%192.168.%x.%y" |
| | 444 | node.net.w0.mode = "managed" |
| | 445 | node.net.w0.type = 'b' |
| | 446 | node.net.w0.essid = "helloworld" |
| | 447 | } |
| | 448 | ########################################### |
| | 449 | # Sender definition and configuration |
| | 450 | ########################################### |
| | 451 | defNodes('sender',[2,2]) {|node| |
| | 452 | node.image = nil # assume the right image to be on disk |
| | 453 | # use prototype "sender" |
| | 454 | # and set it's property "destinationHost" to |
| | 455 | # the receiver node |
| | 456 | # and bind the remaining properties to the |
| | 457 | # experiment property space |
| | 458 | node.prototype("test:proto:itgcbrsender", { |
| | 459 | 'destinationHost' => '192.168.3.1', |
| | 460 | 'meter' => 'owdm', #One way delay |
| | 461 | 'protocol' => 'udp', #UDP client |
| | 462 | 'constsize' => 1024, #Const payload size (bytes) |
| | 463 | 'constrate' => 500, #packets per second |
| | 464 | 'duration' => 60000, #Expt duration (msec) |
| | 465 | 'recv_port' => 8001 #Receiver port |
| | 466 | }) |
| | 467 | node.net.w0.ip = "%192.168.%x.%y" |
| | 468 | node.net.w0.mode = "managed" |
| | 469 | node.net.w0.type = 'b' |
| | 470 | node.net.w0.essid = "helloworld" |
| | 471 | } |
| | 472 | |
| | 473 | ########################################### |
| | 474 | # When nodeAgents have reported "OK" to |
| | 475 | # the nodeHandler start the application |
| | 476 | ########################################### |
| | 477 | whenAllInstalled {|node| |
| | 478 | NodeSet['receiver'].startApplications |
| | 479 | ###Need to separate receiver and sender start |
| | 480 | wait 15 |
| | 481 | ### |
| | 482 | NodeSet['sender'].startApplications |
| | 483 | NodeSet['sender1'].startApplications |
| | 484 | |
| | 485 | wait 60 |
| | 486 | |
| | 487 | ############################################### |
| | 488 | Launch the decoder application to report results |
| | 489 | ################################################ |
| | 490 | NodeSet['decoder'].startApplications |
| | 491 | |
| | 492 | |
| | 493 | |
| | 494 | ########################################### |
| | 495 | # Shutdown nodes |
| | 496 | ########################################### |
| | 497 | Experiment.done |
| | 498 | |
| | 499 | } |
| | 500 | }}} |
| | 501 | == VoIP Experiment == |
| | 502 | {{{ |
| | 503 | ############# Tutorial2 ################################## |
| | 504 | # This script defines the experiment |
| | 505 | # that has one sender and one receiver and VoIP session |
| | 506 | # Sender, Receiver - 802.11a channel 36 |
| | 507 | # Receiver reports throughput, packet loss, avg. delay and jitter |
| | 508 | ############################################################ |
| | 509 | |
| | 510 | |
| | 511 | Experiment.name = "tutorial-itg" |
| | 512 | Experiment.project = "orbit:tutorial" |
| | 513 | |
| | 514 | # |
| | 515 | # Define nodes used in experiment |
| | 516 | ########################################### |
| | 517 | # Receiver definition and configuration |
| | 518 | ########################################## |
| | 519 | |
| | 520 | defNodes('receiver',[3,1]) {|node| |
| | 521 | node.image = nil # assume the right image to be on disk |
| | 522 | node.prototype("test:proto:itgreceiver", { |
| | 523 | 'logfile' => "/tmp/results.txt" |
| | 524 | } |
| | 525 | ) |
| | 526 | node.net.w0.ip = "%192.168.%x.%y" |
| | 527 | node.net.w0.mode = "master" |
| | 528 | node.net.w0.type = 'a' |
| | 529 | node.net.w0.essid = "helloworld" |
| | 530 | } |
| | 531 | ########################################### |
| | 532 | # Decoder definition and configuration |
| | 533 | ########################################## |
| | 534 | |
| | 535 | defNodes('decoder',[3,1]) {|node| |
| | 536 | node.image = nil # assume the right image to be on disk |
| | 537 | node.prototype("test:proto:itgdecoder", { |
| | 538 | 'logfile' => "/tmp/results.txt", |
| | 539 | 'tput_report_interval' => 1000, |
| | 540 | 'delay_report_interval' => 1000, |
| | 541 | 'loss_report_interval' => 1000, |
| | 542 | 'jitter_report_interval' => 1000 |
| | 543 | } |
| | 544 | )} |
| | 545 | ########################################### |
| | 546 | # Sender definition and configuration |
| | 547 | ########################################### |
| | 548 | defNodes('sender',[2,2]) {|node| |
| | 549 | node.image = nil # assume the right image to be on disk |
| | 550 | node.prototype("test:proto:itgvoipsender", { |
| | 551 | 'destinationHost' => '192.168.3.1', |
| | 552 | 'meter' => 'owdm', #One way delay |
| | 553 | 'duration' => 20000, #Run for 20 seconds |
| | 554 | 'recv_port' => 8000, #Recv port |
| | 555 | 'App' => 'VoIP', #Use VoIP |
| | 556 | 'codec' => 'G.711.1', #Codec type |
| | 557 | 'voip_control' => 'RTP' #VoIP control |
| | 558 | }) |
| | 559 | node.net.w0.ip = "%192.168.%x.%y" |
| | 560 | node.net.w0.mode = "managed" |
| | 561 | node.net.w0.type = 'a' |
| | 562 | node.net.w0.essid = "helloworld" |
| | 563 | |
| | 564 | } |
| | 565 | |
| | 566 | ########################################### |
| | 567 | # When nodeAgents have reported "OK" to |
| | 568 | # the nodeHandler start the application |
| | 569 | ########################################### |
| | 570 | whenAllInstalled {|node| |
| | 571 | NodeSet['receiver'].startApplications |
| | 572 | ###Need to separate receiver and sender start |
| | 573 | wait 15 |
| | 574 | ### |
| | 575 | NodeSet['sender'].startApplications |
| | 576 | |
| | 577 | |
| | 578 | |
| | 579 | wait 60 |
| | 580 | |
| | 581 | ############################################### |
| | 582 | Launch the decoder application to report results |
| | 583 | ################################################ |
| | 584 | |
| | 585 | NodeSet['decoder'].startApplications |
| | 586 | |
| | 587 | |
| | 588 | ########################################### |
| | 589 | # Shutdown nodes |
| | 590 | ########################################### |
| | 591 | Experiment.done |
| | 592 | |
| | 593 | } |
| | 594 | |
| | 595 | |
| | 596 | }}} |