mtp.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:20k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # Simulation scenarios for modeling wireless links for transport protocols
  2. # Andrei Gurtov
  3. # ICSI/University of Helsinki
  4. #####################################################################
  5. # General Parameters
  6. #####################################################################
  7. set opt(title) zero ;
  8. set opt(seed) -1 ;
  9. set opt(stop) 100 ;# Stop time.
  10. set opt(ecn) 0 ;
  11. #####################################################################
  12. # Topology
  13. #####################################################################
  14. set opt(type) gprs ;#type of link: 
  15. #gsm gprs umts geo wlan_duplex wlan_ether wlan_complex
  16. set opt(bwUL) 0 ;# speed of congested link in kbps
  17. set opt(bwDL) 0 ;# speed of congested link in kbps
  18. set opt(propUL) 0 ;# uplink delay of congested link in s
  19. set opt(propDL) 0 ;# downlink delay of congested link in s
  20. set opt(secondDelay) 55 ;# average delay of access links in ms
  21. set opt(rtts) 1 ;# 1 for a range of delays for the access links.
  22. set opt(numWebNodes) 10 ;# number of access links for web traffic 
  23. set opt(accessLink) 1   ;# 1 for a range of bandwidth for the access links.
  24.                          # NOT IMPLEMENTED YET
  25. #####################################################################
  26. # AQM parameters
  27. #####################################################################
  28. set opt(minth) 30 ;
  29. set opt(maxth) 0 ;
  30. set opt(adaptive) 1 ;# 1 for Adaptive RED, 0 for plain RED 
  31. set opt(queue) DT       ;# 0 for DropTail
  32. ;# 1 for RED
  33. set opt(qsize) 0 ;# Queue size in packets.
  34. #####################################################################
  35. # Traffic generation.
  36. #####################################################################
  37. set opt(pingInt) 0  ;# ping interval, 0 = off
  38. set opt(flows) 1  ;# number of long-lived TCP flows
  39. set opt(shortflows) 0   ;# two short flows in the beginning
  40. set opt(flowsRev) 0  ;# number of reverse long-lived TCP flows
  41. set opt(flowsTfrc) 0  ;# number of long-lived TFRC flows
  42. set opt(webers) 0       ;# number of web users
  43. set opt(window) 30 ;# window for long-lived traffic
  44. set opt(smallpkt) 10    ;# inverse of fraction of TCP connections 
  45.                          #    with smaller packets
  46. set opt(reverse) 1 ;# reverse-path traffic
  47. set opt(web) 2 ;# number of web sessions
  48. set opt(numPage) 10     ;# number of pages per session
  49. set opt(pagesize) 10 ;# number of objects per page 
  50. set opt(objSize) 60 ;# average size of web object in pkts. 
  51. set opt(shape) 1.05 ;# shape parameter for Pareto distribution of web size
  52.  # a larger parameter means more small objects
  53. set opt(interpage) 1 ;# interpage parameter for web traffic generator.
  54. #####################################################################
  55. # Plotting statistics.
  56. #####################################################################
  57. set opt(printRTTs) 0    ;# 1 to print link delays
  58. set opt(quiet)   0  ;# popup anything?
  59. set opt(wrap)    90 ;# wrap plots?
  60. set opt(srcTrace) is ;# where to plot traffic
  61. set opt(dstTrace) bs ;# where to plot traffic
  62. #####################################################################
  63. # Link characteristics.
  64. #####################################################################
  65. set opt(delayInt) ""   ; # interval of delays
  66. set opt(delayLen) "" ; # length of delays
  67. set opt(allocLenUL) "" ; # delay of allocating a channel in sec in uplink
  68. set opt(allocHoldUL) "" ; # idle time after channel is released in uplink
  69. set opt(allocLenDL) "" ; #
  70. set opt(allocHoldDL) "" ; #
  71. # currently only in downlink
  72. set opt(bwLowLen) 0 ; # length of period of low bandwidth in sec
  73. set opt(bwHighLen) 0 ; # length of period of high bandwidth in sec
  74. set opt(bwScale) 0 ; # factor by which bandwidth is decreased
  75. # currently only in downlink
  76. set opt(reorderLen) 0 ; # reordering delay in sec
  77. set opt(reorderRate) 0 ; # per-packet reordering rate
  78. set opt(errUnit) packet ; # unit of errors, per packet or per bit
  79. set opt(errRateUL) 0 ; # the rate of errors in uplink 
  80. set opt(errBurstUL) 0 ; # coefficient 0..1 of how bursty errors are
  81. set opt(errSlotUL)  0 ; # time in sec of low error period
  82. set opt(errRateDL) 0 ; # 
  83. set opt(errBurstDL) 0 ; # 
  84. set opt(errSlotDL)  0
  85. set opt(vhoTarget) none ; # to which network handover occurs
  86. set opt(vhoTime) 30 ; # when handover occurs
  87. set opt(vhoLoss) 0 ; # fraction of packets lost during handover
  88. set opt(vhoDelay) 0 ; # delay in sec caused by handover
  89. set opt(gprsbuf) 10 ; # buffer size for gprs
  90. set opt(wlan_duplex_buf) 10 ; # buffer size for wlan_duplex
  91. set opt(nodeDist) 2 ; # distance in meters between WLAN nodes
  92. #####################################################################
  93. set opt(tfrcFB) 1 ; #number of feedback reports in TFRC per RTT
  94. proc getopt {argc argv} {
  95.         global opt
  96.         for {set i 0} {$i < $argc} {incr i} {
  97.                 set arg [lindex $argv $i]
  98.                 if {[string range $arg 0 0] != "-"} continue
  99.                 set name [string range $arg 1 end]
  100.                 set opt($name) [lindex $argv [expr $i+1]]
  101.                 puts "opt($name): $opt($name)" 
  102.         }
  103. }
  104. getopt $argc $argv
  105. if {$opt(seed) > -1} {
  106.         puts "Seeding Random number generator with $opt(seed)n"
  107.         ns-random $opt(seed)
  108. }
  109. Agent/TFRCSink set NumFeedback_ $opt(tfrcFB)
  110. #default downlink bandwidth in bps
  111. set bwDL(gsm)  9600
  112. set bwDL(gprs) 30000
  113. set bwDL(umts) 384000
  114. set bwDL(geo)  2000000
  115. set bwDL(wlan_duplex) 650000 ;# 650000
  116. set bwDL(wlan_ether) 1000000
  117. set bwDL(wlan_complex) 1000000
  118. #default uplink bandwidth in bps
  119. set bwUL(gsm)  9600
  120. set bwUL(gprs) 10000
  121. set bwUL(umts) 64000
  122. set bwUL(geo)  200000
  123. set bwUL(wlan_duplex) 650000
  124. #default downlink propagation delay in seconds
  125. set propDL(gsm)  .500
  126. set propDL(gprs) .100
  127. set propDL(umts) .150
  128. set propDL(geo)  .250
  129. set propDL(wlan_duplex) .01
  130. set propDL(wlan_ether) .01  ;#0.01
  131. #default uplink propagation delay in seconds
  132. set propUL(gsm)  .500
  133. set propUL(gprs) .100
  134. set propUL(umts) .150
  135. set propUL(geo)  .250
  136. set propUL(wlan_duplex) .01  ;#0.01 0.003
  137. #default buffer size in packets
  138. set buf(gsm) 10
  139. set buf(gprs) $opt(gprsbuf)
  140. set buf(umts) 20
  141. set buf(geo) 20
  142. set buf(wlan_duplex) $opt(wlan_duplex_buf)
  143. set buf(wlan_ether) 10
  144. set buf(wlan_complex) 10
  145. #topology cellular "access link"
  146. #                           is
  147. #                           /
  148. #   3Mb,10ms    xMb,yms    / 3Mb,50ms
  149. # lp--------ms --------- bs
  150. #                           3Mb,50ms
  151. #                           
  152. #                           x
  153. #
  154. proc cell_topo {} {
  155.   global ns nodes qm
  156.   $ns duplex-link $nodes(bs) $nodes(ms) 1 1 $qm
  157.   $ns duplex-link $nodes(lp) $nodes(ms) 3Mbps 10ms DropTail 
  158.   $ns duplex-link $nodes(bs) $nodes(is) 3Mbps 50ms DropTail
  159.   puts "cell topology"
  160. }
  161. #topology satellite "ISP link"
  162. #
  163. #        lp                 is
  164. #                          /
  165. # 10Mb,2ms    30Mb,250ms  / 10Mb,50ms
  166. #           ms --------- bs
  167. # 1Mb,100ms/                10Mb,50ms
  168. #         /                 
  169. #        y                   x
  170. #
  171. proc sat_topo {} {
  172.   global ns nodes qm
  173.   $ns duplex-link $nodes(bs) $nodes(ms) 1 1 $qm
  174.   $ns duplex-link $nodes(lp) $nodes(ms) 3Mbps 10ms DropTail 
  175.   $ns duplex-link $nodes(bs) $nodes(is) 3Mbps 50ms DropTail
  176.   puts "sat topology"
  177. }
  178. #topology wlan "ether"
  179. #
  180. #                              is
  181. #                             /
  182. #    100Mb,1ms      adsl     / 3Mb,50ms
  183. #  lp --------- ms -------- bs
  184. #                             3Mb,50ms
  185. #                             
  186. #                              x
  187. #
  188. proc wlan_topo_simple {} {
  189.   global qm ns nodes opt bwDL propDL buf
  190.   switch $opt(type) {
  191. wlan_duplex {
  192. puts "duplex wlan topology"
  193.   $ns duplex-link $nodes(ms) $nodes(bs) 1 1 $qm
  194. }
  195. wlan_ether {
  196. puts "ethernet wlan topology"
  197. # Mac/Csma/Ca Mac/802_3
  198. set lan [$ns make-lan "$nodes(bs) $nodes(ms)" $bwDL(wlan_ether) $propDL(wlan_ether) LL Queue/$qm Mac/802_3 Channel "Phy/WiredPhy" $buf(wlan_ether)] 
  199. # [$nodes(bs) queue] set limit_ $buf(wlan_duplex)
  200. }
  201.   }
  202.   $ns duplex-link $nodes(lp) $nodes(ms) 100Mbps 1ms $qm 
  203.   $ns duplex-link $nodes(bs) $nodes(is) 10Mbps 50ms DropTail
  204. }
  205. #
  206. proc wlan_topo_complex {} {
  207.   global ns nodes qm opt buf bwDL
  208.   puts "complex wlan topology"
  209. #Configuration for Orinoco 802.11b 11Mbps PC card with ->22.5m range
  210. #Phy/WirelessPhy set Pt_ 0.031622777
  211. #Phy/WirelessPhy set bandwidth_ 11Mb
  212. #Mac/802_11 set dataRate_ 11Mb
  213. #Mac/802_11 set basicRate_ 1Mb #for broadcast packets
  214. #Phy/WirelessPhy set freq_ 2.472e9 #channel-13.2.472GHz
  215. #Phy/WirelessPhy set CPThresh_ 10.0
  216. #Phy/WirelessPhy set CSThresh_ 5.011872e-12
  217. #Phy/WirelessPhy set L_ 1.0               
  218. #Phy/WirelessPhy set RXThresh_ 5.82587e-09
  219.   Mac/802_11 set dataRate_ $bwDL(wlan_complex)
  220.   $ns node-config -addressType hierarchical
  221.   AddrParams set domain_num_ 2
  222.   lappend cluster_num 1 1             
  223.   AddrParams set cluster_num_ $cluster_num
  224.   lappend eilastlevel 2 2              
  225.   AddrParams set nodes_num_ $eilastlevel 
  226.   set topo   [new Topography]
  227.   $topo load_flatgrid 1000 1000
  228.   # god needs to know the number of all wireless interfaces MN+BS
  229.   create-god 2
  230.   set nodes(bs) [$ns node {0.0.0}]
  231.   set nodes(is) [$ns node {0.0.1}]
  232.   
  233.   # DSDV DSR TORA AODV
  234.   $ns node-config -adhocRouting DSDV 
  235.                  -llType LL 
  236.                  -macType Mac/802_11 
  237.                  -ifqType Queue/$qm 
  238.                  -ifqLen $buf(wlan_complex) 
  239.                  -propType "Propagation/TwoRayGround" 
  240.                  -antType "Antenna/OmniAntenna" 
  241.                  -phyType "Phy/WirelessPhy" 
  242.                  -wiredRouting ON 
  243.                  -channel [new "Channel/WirelessChannel"] 
  244.                  -agentTrace ON 
  245.                  -routerTrace OFF 
  246.                  -topoInstance $topo 
  247.                  -macTrace OFF 
  248.  -movementTrace OFF
  249.   #create base station
  250.   set nodes(ms) [$ns node {1.0.0}]
  251.   $nodes(ms) random-motion 0 
  252.   $nodes(ms) set X_ $opt(nodeDist)
  253.   $nodes(ms) set Y_ 0.0
  254.   $nodes(ms) set Z_ 0.0
  255.   
  256.   #configure for mobilenodes
  257.   $ns node-config -wiredRouting OFF
  258.   set nodes(lp) [$ns node {1.0.1}]
  259.   $nodes(lp) random-motion 0 
  260.   $nodes(lp) set X_ 2.0
  261.   $nodes(lp) set Y_ 2.0
  262.   $nodes(lp) set Z_ 0.0
  263.   $nodes(lp) base-station [AddrParams addr2id [$nodes(ms) node-addr]]
  264.   $ns duplex-link $nodes(ms) $nodes(bs) 10Mbps 30ms DropTail
  265.   $ns duplex-link $nodes(bs) $nodes(is) 10Mbps 50ms DropTail
  266.   # establish route
  267.   set ping9 [$ns create-connection Ping $nodes(is) Ping $nodes(lp) 9]
  268.   $ping9 oneway
  269. #  $ns after 0.001 "$ping9 send"
  270. }
  271. #
  272. proc set_link_params {t} {
  273.   global ns nodes bwUL bwDL propUL propDL buf
  274.   $ns bandwidth $nodes(bs) $nodes(ms) $bwDL($t) simplex
  275.   $ns bandwidth $nodes(ms) $nodes(bs) $bwUL($t) simplex
  276.   $ns delay $nodes(bs) $nodes(ms) $propDL($t) simplex
  277.   $ns delay $nodes(ms) $nodes(bs) $propDL($t) simplex
  278.   $ns queue-limit $nodes(bs) $nodes(ms) $buf($t)
  279.   $ns queue-limit $nodes(ms) $nodes(bs) $buf($t)
  280. }
  281. #remove-all-packet-headers       ; # removes all except common
  282. #add-packet-header Flags IP TCP  ; # hdrs reqd for TCP
  283. if {$opt(queue) == "DT"} {
  284.   set qm DropTail
  285. }
  286. if {$opt(queue) == "RED"} {
  287.   set qm RED
  288. }
  289. set tcpTick_ 0.01
  290. set pktsize 1460
  291. Agent/TCP set tcpTick_ $tcpTick_
  292. set out $opt(title)
  293. proc stop {} {
  294. global nodes opt
  295. set wrap $opt(wrap)
  296. set sid [$nodes($opt(srcTrace)) id]
  297. set did [$nodes($opt(dstTrace)) id]
  298. if {$opt(srcTrace) == "bs"} {
  299. set a "-a out.tr"
  300. } else {
  301. set a "out.tr"
  302. }
  303. set GETRC "../../../bin/getrc"
  304.         set RAW2XG "../../../bin/raw2xg"
  305.         exec $GETRC -s $sid -d $did -f 0 out.tr | 
  306.           $RAW2XG -s 0.01  -m $wrap -r > plot.xgr
  307.         exec $GETRC -s $did -d $sid -f 0 out.tr | 
  308.           $RAW2XG -a -s 0.01 -m $wrap  >> plot.xgr
  309.         exec $GETRC -s $sid -d $did -f 1 out.tr | 
  310.           $RAW2XG -s 0.01 -m $wrap -r >> plot.xgr
  311.         exec $GETRC -s $did -d $sid -f 1 out.tr  | 
  312.           $RAW2XG -s 0.01 -m $wrap -a  >> plot.xgr
  313. exec ./xg2gp.awk plot.xgr
  314.         if {!$opt(quiet)} {
  315.                 exec xgraph -bb -tk -nl -m -x time -y packets plot.xgr &
  316.         }
  317.   exit 0
  318. }
  319. #
  320. proc pingSend {ag int} {
  321.  global ns 
  322.  $ag send
  323.  $ns after $int "pingSend $ag $int"
  324. }
  325. #Define a 'recv' function for the class 'Agent/Ping'
  326. Agent/Ping instproc recv {from seq ff bf} {
  327.         $self instvar node_ 
  328. global rttf
  329. #        puts "node [$node_ id] received ping answer from 
  330.               $from seq $seq with forward delay $ff and backward $bf ms."
  331. puts $rttf "$seq [expr $ff/1000] [expr $bf/1000]" 
  332. }
  333. #
  334. source web.tcl
  335. #
  336. proc insertDelay {} {
  337.         global ns dl_dist di_dist delayerUL delayerDL
  338. $delayerUL block
  339. $delayerDL block
  340.         set len [$dl_dist value]
  341.         $ns after $len "$delayerUL unblock"
  342.         $ns after $len "$delayerDL unblock"
  343. set next [expr $len + [$di_dist value]]
  344.         $ns after $next "insertDelay"
  345. #        puts "[$ns now]: delay for $len, next after $next"; flush stdout
  346. }
  347. #
  348. proc bwOscilate {bw_up} {
  349.         global ns opt nodes
  350. set dl_link [[$ns link $nodes(bs) $nodes(ms)] link]
  351. set bw [$dl_link set bandwidth_]
  352. if {$bw_up} {
  353. set bw [expr $bw / $opt(bwScale)]
  354. set bw_up 0
  355. set next $opt(bwLowLen)
  356. } else {
  357. set bw [expr $bw * $opt(bwScale)]
  358. set next $opt(bwHighLen)
  359. set bw_up 1
  360. }
  361. $dl_link set bandwidth_ $bw
  362.         $ns after $next "bwOscilate $bw_up"
  363.         puts "[$ns now]: new bandwidth $bw, next after $next"; flush stdout
  364. }
  365. #
  366. proc setError {low errmodel rate slot burst} {
  367.   if {$low} {
  368. set newrate [expr $rate / $burst ]
  369. set next [expr $slot * $burst]
  370.   } else {
  371. set newrate $rate
  372. set next $slot
  373.   }
  374.   puts "setError: newrate $newrate slot $slot low $low"
  375.   $errmodel set rate_ $newrate 
  376.   ns after $next "setError [expr !$low] $errmodel $rate $slot $burst]"
  377. }
  378. # perform vertical handover
  379. proc makeVho {} {
  380. global ns opt nodes delayerUL delayerDL buf
  381. if {$opt(vhoLoss)} {
  382.   $ns queue-limit $nodes(bs) $nodes(ms) [expr $buf($opt(type))*(1-$opt(vhoLoss))]
  383. $ns queue-limit $nodes(ms) $nodes(bs) [expr $buf($opt(type))*(1-$opt(vhoLoss))]
  384.         [[$ns link $nodes(bs) $nodes(ms)] queue] shrink-queue
  385.         [[$ns link $nodes(ms) $nodes(bs)] queue] shrink-queue
  386. }
  387. set_link_params $opt(vhoTarget)
  388. $delayerUL block; $delayerDL block
  389.         $ns after $opt(vhoDelay) "$delayerUL unblock; $delayerDL unblock"
  390. }
  391. proc parseDist {s} {
  392. set d ""
  393. set k [scan $s "%c(%f,%f)" dist arg1 arg2]
  394. if { $k != 3 } {
  395. set k [scan $s "%c(%f)" dist arg1]
  396. if { $k != 2 } {
  397. puts "wrong distribution $s"
  398. exit 1
  399. }
  400. }
  401. switch $dist {
  402. 85 {
  403.      set d [new RandomVariable/Uniform]
  404. $d set min_ $arg1
  405. $d set max_ $arg2
  406. }
  407. 69 {
  408.      set d [new RandomVariable/Exponential]
  409. $d set avg_ $arg1
  410. }
  411. default {
  412. puts "unkown distribution"
  413. exit 1
  414. }
  415. }
  416. # puts "$arg1 $arg2"
  417. return $d
  418. }
  419. #************************************* MAIN ******************************************
  420. set ns [new Simulator]
  421. variable delayerUL 
  422. variable delayerDL
  423. #
  424. # RED and TCP parameters
  425. #
  426. if {$opt(ecn) == 1} {
  427.    Queue/RED set setbit_ true
  428. }
  429. Queue/RED set summarystats_ true
  430. Queue/DropTail set summarystats_ true
  431. Queue/RED set adaptive_ $opt(adaptive)
  432. Queue/RED set q_weight_ 0.0
  433. Queue/RED set thresh_ $opt(minth)
  434. Queue/RED set maxthresh_ $opt(maxth)
  435. Queue/DropTail set shrink_drops_ true
  436. Agent/TCP set ecn_ $opt(ecn) 
  437. Agent/TCP set packetSize_ $pktsize
  438. Agent/TCP set window_ $opt(window)
  439. DelayLink set avoidReordering_ true
  440. # Create trace, rttf is for latency measured with ping
  441. set tf [open out.tr w]
  442. set rttf [open rtt.tr w]
  443. $ns trace-all $tf
  444. # Complex WLAN needs nodes with hierarhical routing and has no params
  445. if {$opt(type) != "wlan_complex"} {
  446. set nodes(lp) [$ns node]
  447. set nodes(ms) [$ns node]
  448. set nodes(bs) [$ns node]
  449. set nodes(is) [$ns node]
  450. # Overwrite defaults from command line params
  451. if {$opt(bwUL)} {set bwUL($opt(type)) $opt(bwUL)}
  452. if {$opt(bwDL)} {set bwDL($opt(type)) $opt(bwDL)}
  453. if {$opt(propUL)} {set propUL($opt(type)) $opt(propUL)}
  454. if {$opt(propDL)} {set propDL($opt(type)) $opt(propDL)}
  455. }
  456. if {$opt(qsize)} {set buf($opt(type)) $opt(qsize)}
  457. # Create topology 
  458. switch $opt(type) {
  459.  gsm -
  460.  gprs -
  461.  umts {cell_topo}
  462.  geo  {sat_topo}
  463.  wlan_complex {wlan_topo_complex}
  464.  wlan_duplex -
  465.  wlan_ether {wlan_topo_simple}
  466. }
  467. if {$opt(type) != "wlan_complex" && $opt(type) != "wlan_ether"} {
  468.   set_link_params $opt(type)
  469.   set delayerDL [new Delayer]
  470.   set delayerUL [new Delayer]
  471. #  $delayerDL set debug_ true
  472. #  $delayerUL set debug_ true
  473.   $ns insert-delayer $nodes(ms) $nodes(bs) $delayerUL
  474.   $ns insert-delayer $nodes(bs) $nodes(ms) $delayerDL
  475. }
  476. #$ns trace-queue $nodes(is) $nodes(bs) $tf
  477. #$ns trace-queue $nodes(bs) $nodes(is) $tf
  478. #
  479. # Set up forward TCP connection
  480. #
  481. if {$opt(flows) > 0} {
  482. set tcp1 [$ns create-connection TCP/Sack1 $nodes(is) TCPSink/Sack1 $nodes(lp) 0]
  483. set ftp1 [[set tcp1] attach-app FTP]
  484. $ns at 0.8 "[set ftp1] start"
  485. }
  486. if {$opt(shortflows) > 0} {
  487.     set tcp1 [$ns create-connection TCP/Sack1 $nodes(is) TCPSink/Sack1 $nodes(lp) 0]
  488.     set ftp1 [[set tcp1] attach-app FTP]
  489.     $tcp1 set window_ 100
  490.     $ns at 0.0  "[set ftp1] start"
  491.     $ns at 3.5  "[set ftp1] stop"
  492.     set tcp2 [$ns create-connection TCP/Sack1 $nodes(is) TCPSink/Sack1 $nodes(lp) 0]
  493.     set ftp2 [[set tcp2] attach-app FTP]
  494.     $tcp2 set window_ 3
  495.     $ns at 1.0  "[set ftp2] start"
  496.     $ns at 8.0  "[set ftp2] stop"
  497. }
  498. #
  499. # Set up forward TFRC connection
  500. #
  501. if {$opt(flowsTfrc) > 0} {
  502. set tfrc1 [$ns create-connection TFRC $nodes(is) TFRCSink $nodes(lp) 0]
  503. set ftp3 [[set tfrc1] attach-app FTP]
  504. $ns at 0.1 "[set ftp3] start"
  505. }
  506. #
  507. # Set up ping for delay measurement
  508. #
  509. if {$opt(pingInt)} {
  510. set ping1 [$ns create-connection Ping $nodes(is) Ping $nodes(lp) 0]
  511. $ping1 oneway  ; # enable ping extensions
  512. $ns after 1 "pingSend $ping1 $opt(pingInt)"
  513. }
  514. #
  515. # Traffic on the reverse path.
  516. #
  517. # Reverse-path traffic is half the number of flows as for the forward path.
  518. if {$opt(flowsRev) > 0} {
  519. set tcp2 [$ns create-connection TCP/Sack1 $nodes(lp) TCPSink/Sack1 $nodes(is) 1]
  520. set ftp2 [[set tcp2] attach-app FTP]
  521. $ns at 2 "[set ftp2] start"
  522. }
  523. #
  524. # Add forward web traffic.
  525. #
  526. set req_trace_ 0
  527. set count $opt(webers)
  528. if ($count) {
  529.   add_web_traffic $opt(secondDelay) $opt(web) $opt(interpage) $opt(pagesize) $opt(objSize) $opt(shape) 1
  530.   add_web_traffic $opt(secondDelay) [expr $opt(web)/2] $opt(interpage) $opt(pagesize) $opt(objSize) $opt(shape) 0
  531. }
  532. #
  533. # Set up channel allocation delay
  534. #
  535. # Downlink
  536. if {$opt(allocLenDL) != "" && $opt(allocHoldDL) != ""} {
  537. set al_dl [parseDist $opt(allocLenDL)]
  538. set ah_dl [parseDist $opt(allocHoldDL)]
  539. $delayerDL alloc $ah_dl $al_dl 
  540. }
  541. # Uplink
  542. if {$opt(allocLenUL) != "" && $opt(allocHoldUL) != ""} {
  543. set al_ul [parseDist $opt(allocLenUL)]
  544. set ah_ul [parseDist $opt(allocHoldUL)]
  545. $delayerUL alloc $ah_ul $al_ul 
  546. }
  547. #
  548. # Set up delay variation (due to ARQ or delay spikes)
  549. #
  550. if {$opt(delayInt) != "" && $opt(delayLen) != ""} {
  551. set di_dist [parseDist $opt(delayInt)]
  552. set dl_dist [parseDist $opt(delayLen)]
  553. $ns after [$di_dist value] "insertDelay"
  554. }
  555. #
  556. # Set up bandwidth oscillation
  557. #
  558. if {$opt(bwLowLen) && $opt(bwHighLen) && $opt(bwScale)} {
  559. $ns after $opt(bwHighLen) "bwOscilate 1"
  560. }
  561. #
  562. # Set up reordering
  563. #
  564. if {$opt(reorderLen) && $opt(reorderRate)} {
  565. ErrorModel set delay_pkt_ true
  566. ErrorModel set drop_ false
  567. ErrorModel set delay_ $opt(reorderLen)
  568. # set errmodelDL [new ErrorModel]
  569. #        $errmodelDL set rate_ $opt(errRateDL)
  570. #        $errmodelDL set unit_ $opt(errUnit)
  571. #        $ns lossmodel $errmodelDL $nodes(bs) $nodes(ms)
  572. set em [new ErrorModule Fid]
  573. [$ns link $nodes(bs) $nodes(ms)] errormodule $em
  574. set errmodel [new ErrorModel/Uniform $opt(reorderRate)]
  575. $errmodel unit pkt
  576. $em insert $errmodel
  577. $em bind $errmodel 0
  578. }
  579. #
  580. # Set up error losses (bursty or uniform)
  581. #
  582. if {$opt(errRateUL)} {
  583. set errmodelUL [new ErrorModel]
  584. $errmodelUL set rate_ $opt(errRateUL)
  585. $errmodelUL set unit_ $opt(errUnit)
  586. $ns lossmodel $errmodelUL $nodes(ms) $nodes(bs)
  587. $ns after $opt(errSlotUL) "setError 1 $errmodelUL $opt(errRateUL) $opt(errSlotUL) $opt(errBurstUL)"
  588. }
  589. if {$opt(errRateDL)} {
  590. set errmodelDL [new ErrorModel]
  591. $errmodelDL set rate_ $opt(errRateDL)
  592. $errmodelDL set unit_ $opt(errUnit)
  593. $ns lossmodel $errmodelDL $nodes(bs) $nodes(ms)
  594. $ns after $opt(errSlotDL) "setError 1 $errmodelDL $opt(errRateDL) $opt(errSlotDL) $opt(errBurstDL)"
  595. }
  596. ## set emL [new ErrorModule Fid]
  597. ## set linkL [$ns link $nodes(bs) $nodes(ms)] 
  598. ## set errmodelL [new ErrorModel/List]
  599. ## $errmodelL droplist {5} 
  600. ## $linkL errormodule $emL
  601. ## #$emL insert $errmodelL
  602. ## #$emL bind $errmodelL 1
  603. #
  604. # Set up vertical handover
  605. #
  606. if {$opt(vhoTarget) != "none"} {
  607. set hoTime $opt(vhoTime)
  608. $ns after $hoTime makeVho
  609. }
  610. $ns at $opt(stop) "stop"
  611. $ns run