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

通讯编程

开发平台:

Visual C++

  1. # jobs-cn2002.tcl
  2. #
  3. # Topology is as follows:
  4. #
  5. #                  cross_source(1...10) cross_source(11...20) cross_source(21...30)
  6. #                          |/               |/                  |/
  7. # user_source(1)  ___       |                 |                    |                             __ user_sink(1)
  8. # user_source(2)  ---  core_node(1) ==== core_node(2) ====    core_node(3)  ====  core_node(4) /-- user_sink(2)
  9. # user_source(3)  ---/                        |                    |                   |        -- user_sink(3)
  10. # user_source(4)  __/                        /|                  /|                 /|        _ user_sink(4)
  11. #                                       cross_sink(1...10)   cross_sink(11...20)  cross_sink(21...30)
  12. #
  13. # Links:
  14. # = : 45 MBps, 3 ms
  15. # - : 100 MBps, 1 ms
  16. #
  17. # Classes:
  18. # 1: ADC=2 ms, ALC=0.5%, no ARC, no RDC, no RLC
  19. # 2, 3, 4: no ADC, no ALC, no ARC, RDC = 4, RLC = 2
  20. #
  21. # Traffic mix:
  22. # user_source(1) -> user_sink(1) : Class 1, TCP, greedy
  23. # user_source(2) -> user_sink(2) : Class 2, TCP, greedy
  24. # user_source(3) -> user_sink(3) : Class 3, TCP, greedy
  25. # user_source(4) -> user_sink(4) : Class 4, UDP, greedy
  26. # cross_sources: 6 TCP flows, 4 UDP flows, 10% class 1, 20% class 2, 30% class 3, 40% class 4
  27. #
  28. # This simulation is very similar to what was used in 
  29. # "Rate Allocation and Buffer Management for Differentiated Services,"
  30. # by J. Liebeherr and N. Christin, Computer Networks, May 2002.
  31. #
  32. # Auxiliary functions
  33. # topology primitives
  34. Simulator instproc get-link { node1 node2 } {
  35.      $self instvar link_
  36.      set id1 [$node1 id]
  37.      set id2 [$node2 id]
  38.      return $link_($id1:$id2)
  39. }
  40. Simulator instproc get-queue { node1 node2 } {
  41.      global ns
  42.      set l [$ns get-link $node1 $node2]
  43.      set q [$l queue]
  44.      return $q
  45. }
  46. # JoBS duplex link: rate in kbps, delay in ms, buff_sz in packets
  47. proc build-jobs-link {src dst rate delay buff_sz} {
  48.      global ns
  49.      $ns duplex-link $src $dst [expr $rate*1000.0] [expr $delay/1000.0] JoBS
  50.      $ns queue-limit $src $dst $buff_sz
  51.      $ns queue-limit $dst $src $buff_sz
  52. }
  53. # FCFS-marker duplex link: rate in kbps, delay in ms, buff_sz in packets
  54. proc build-marker-link {src dst rate delay buff_sz} {
  55.      global ns
  56.      $ns simplex-link $src $dst [expr $rate*1000.0] [expr $delay/1000.0] Marker
  57.      $ns simplex-link $dst $src [expr $rate*1000.0] [expr $delay/1000.0] Demarker
  58.      $ns queue-limit $src $dst $buff_sz
  59.      $ns queue-limit $dst $src $buff_sz
  60. }
  61. # FCFS-demarker duplex link: rate in kbps, delay in ms, buff_sz in packets
  62. proc build-demarker-link {src dst rate delay buff_sz} {
  63. global ns
  64. $ns simplex-link $src $dst [expr $rate*1000.0] [expr $delay/1000.0] Demarker
  65. $ns simplex-link $dst $src [expr $rate*1000.0] [expr $delay/1000.0] Marker
  66. $ns queue-limit $src $dst $buff_sz
  67. $ns queue-limit $dst $src $buff_sz
  68. }
  69. # Traffic models primitives
  70. # Basic procedure for connecting agents, etc.
  71. proc flow_setup {id src src_agent dst dst_agent app_flow pksize} {
  72. global ns
  73. $ns attach-agent $src $src_agent
  74. $ns attach-agent $dst $dst_agent
  75. $ns connect $src_agent $dst_agent
  76. $src_agent set packetSize_  $pksize
  77. $src_agent set fid_ $id
  78. $app_flow set flowid_ $id
  79. $app_flow attach-agent $src_agent
  80. return $src_agent    
  81. }
  82. # TCP flows
  83. # Create "infinite-duration" FTP connection
  84. proc inf_ftp {id src src_agent dst dst_agent app_flow maxwin pksize starttm} {
  85. global ns 
  86. flow_setup $id $src $src_agent $dst $dst_agent $app_flow $pksize
  87. $src_agent set window_ $maxwin
  88. $src_agent set ecn_ 1
  89. puts [format "tFTP-$id starts at %.4fsec" $starttm]
  90. $ns at $starttm "$app_flow start"
  91. return $src_agent
  92. }
  93. # Web-like flows: Create successive short transfers within single TCP connection 
  94. proc init_mouse {id src src_agent dst dst_agent app_flow maxwin pksize starttm sleeptm minpkts maxpkts} {
  95. global ns 
  96. flow_setup $id $src $src_agent $dst $dst_agent $app_flow $pksize
  97. $src_agent set window_  $maxwin
  98. $src_agent set ecn_ 1
  99. puts [format "tMouse-$id starts at %.4fs - avg-sleep-time %.3fs - packets %d to %d " $starttm $sleeptm $minpkts $maxpkts]
  100. $ns at $starttm "actv_mouse $src_agent $app_flow $id $sleeptm $minpkts $maxpkts"
  101. return $src_agent
  102. }
  103. proc actv_mouse {tcp ftp id sleeptm minpkts maxpkts} {
  104. global ns rnd 
  105. set numpkts [expr round([$rnd uniform $minpkts $maxpkts+1])]
  106. set prd_time [expr [$rnd exponential] * $sleeptm + [$ns now]]
  107. $ns at $prd_time "$ftp producemore $numpkts"
  108. $ns at $prd_time "actv_mouse $tcp $ftp $id $sleeptm $minpkts $maxpkts" 
  109. }
  110. # UDP flows
  111. # Build a Pareto On-Off source 
  112. #
  113. # packet trains with both on and off durations being pareto distributed
  114. # Packet size: bytes, Burst and Idle time: ms, Peak rate: kbps, Start time: seconds
  115. proc build-pareto-on-off {id src src_agent dst dst_agent app_flow peak_rate pksize shape_par start_tm idle_tm burst_tm} {
  116. global ns
  117. flow_setup $id $src $src_agent $dst $dst_agent $app_flow $pksize
  118. $app_flow set burst-time_  [expr $burst_tm  / 1000.]
  119. $app_flow set idle-time_   [expr $idle_tm  / 1000.]
  120. $app_flow set rate_        [expr $peak_rate * 1000.0]
  121. $app_flow set shape_       $shape_par
  122. $ns at $start_tm "$app_flow start"
  123. puts [format "tPareto-$id starts at %.4fsec" $start_tm]
  124. }
  125. # statistics primitives
  126. # Dump the statistics of a (unidirectional) link periodically 
  127. proc linkDump {link binteg pinteg qmon interval name} {
  128. global ns
  129. set now_time [$ns now]
  130. $ns at [expr $now_time + $interval] "linkDump $link $binteg $pinteg $qmon $interval $name"
  131. set bandw [[$link link] set bandwidth_]
  132. set queue_bd [$binteg set sum_]
  133. set abd_queue [expr $queue_bd/[expr 1.*$interval]]
  134. set queue_pd [$pinteg set sum_]
  135. set apd_queue [expr $queue_pd/[expr 1.*$interval]]
  136. set utilz [expr 8*[$qmon set bdepartures_]/[expr 1.*$interval*$bandw]]
  137. if {[$qmon set parrivals_] != 0} {
  138. set drprt [expr [$qmon set pdrops_]/[expr 1.*[$qmon set parrivals_]]]
  139. } else {
  140. set drprt 0
  141. }
  142. if {$utilz != 0} {
  143. set a_delay [expr ($abd_queue*8*1000)/($utilz*$bandw)]
  144. } else {
  145. set a_delay 0.
  146. }
  147. puts [format "Link %s: Util=%.3ftDrRt=%.3ftADel=%.1fmstAQuP=%.0ftAQuB=%.0f" $name $utilz $drprt $a_delay $apd_queue $abd_queue]
  148. puts -nonewline [format "%.3ft" $utilz]
  149. $binteg reset
  150. $pinteg reset
  151. $qmon reset
  152. }
  153. proc printFlow {f outfile fm interval} {
  154. global ns tot_drop tot_arv
  155. puts $outfile [format "%d %.2f %d %d %d %d %.0f %.3f" [$f set flowid_] [$ns now] [expr 8*[$f set barrivals_]] [$f set parrivals_] [expr 8*[$f set bdrops_]] [$f set pdrops_] [expr [$f set barrivals_]*8/($interval*1000.)] [expr [$f set bdrops_]/double([$f set barrivals_])] ]
  156. }
  157. proc flowDump {link fm file_p interval} {
  158. global ns tot_drop 
  159. $ns at [expr [$ns now] + $interval]  "flowDump $link $fm $file_p $interval"
  160. set theflows [$fm flows]
  161. if {[llength $theflows] == 0} {
  162. return
  163. } else {
  164. set total_arr [expr double([$fm set barrivals_])]
  165. if {$total_arr > 0} {
  166. foreach f $theflows {
  167. set arr [expr [expr double([$f set barrivals_])] / $total_arr]
  168. if {$arr >= 0.0001} {
  169. printFlow $f $file_p $fm $interval
  170. set z [$f set flowid_] 
  171. if {$z <= 4} {
  172. set tot_drop($z) [expr $tot_drop([$f set flowid_])+[$f set pdrops_]]
  173. }
  174. }       
  175.     $f reset
  176. }       
  177.     $fm reset
  178. }
  179. }
  180. }
  181. proc totalDrops {id interval} {
  182. global ns total_drops_file tot_drop N_USERS user_source core_node
  183. set q [$ns get-queue $user_source(1) $core_node(1)]
  184. set tot_arv(1) [$q set marker_arrvs1_]
  185. set q [$ns get-queue $user_source(2) $core_node(1)]
  186. set tot_arv(2) [$q set marker_arrvs2_]
  187. set q [$ns get-queue $user_source(3) $core_node(1)]
  188. set tot_arv(3) [$q set marker_arrvs3_]
  189.     
  190. set q [$ns get-queue $user_source(4) $core_node(1)]
  191. set tot_arv(4) [$q set marker_arrvs4_]
  192.     
  193. if {$tot_arv($id) > 0} {
  194. puts $total_drops_file($id) [format "%.2f %.2f %d %d" [$ns now] [expr 100.*$tot_drop($id)/double($tot_arv($id))] $tot_drop($id) $tot_arv($id)]
  195. } else {
  196. puts $total_drops_file($id) [format "%.2f 0.00" [$ns now]]
  197. }
  198. set tot_arv($id) 0
  199. $ns at [expr [$ns now] + $interval] "totalDrops $id $interval"
  200. }
  201. proc record_cwnd {} {
  202. global ns N_CL N_USERS_TCP user_source_agent cwnd_file
  203. set time 0.5
  204. set now [$ns now]
  205. for {set i 1} {$i <= $N_USERS_TCP} {incr i} {
  206. set window($i) [$user_source_agent($i) set cwnd_]
  207. puts $cwnd_file($i) [format "%.2f %.2f" $now $window($i)]
  208. }
  209. $ns at [expr $now+$time] "record_cwnd"
  210. }
  211. proc record_thru {} {
  212. global ns N_CL user_sink_agent thru_file
  213. set time 0.5
  214. set tot_recv 0
  215. set now [$ns now]
  216. for {set i 1} {$i <= $N_CL} {incr i} {
  217. set recv($i) [$user_sink_agent($i) set bytes_]
  218. set tot_recv [expr $tot_recv + [$user_sink_agent($i) set bytes_]]
  219. puts $thru_file($i) [format "%.2f %.2f" $now [expr 8.*$recv($i)/$time]]
  220. $user_sink_agent($i) set bytes_ 0
  221. }
  222. puts $thru_file([expr $N_CL+1]) [format "%.2f %.2f" $now [expr 8.*$tot_recv/$time]]
  223. $ns at [expr $now+$time] "record_thru"
  224. }
  225. puts " "
  226. puts "JoBS multi-hop simulation."
  227. puts "(c) Multimedia Networks Group, University of Virginia, 2000-2"
  228. set ns [new Simulator]
  229. set rnd [new RNG]
  230. set seed 16
  231. puts "Random seed: $seed"
  232. $rnd seed $seed 
  233. Queue/JoBS set drop_front_ false
  234. Queue/JoBS set trace_hop_ true
  235. Queue/JoBS set adc_resolution_type_ 0
  236. Queue/JoBS set shared_buffer_ 1
  237. Queue/JoBS set mean_pkt_size_ 4000
  238. Queue/Demarker set demarker_arrvs1_ 0
  239. Queue/Demarker set demarker_arrvs2_ 0
  240. Queue/Demarker set demarker_arrvs3_ 0
  241. Queue/Demarker set demarker_arrvs4_ 0
  242. Queue/Marker set marker_arrvs1_ 0
  243. Queue/Marker set marker_arrvs2_ 0
  244. Queue/Marker set marker_arrvs3_ 0
  245. Queue/Marker set marker_arrvs4_ 0
  246. # need to patch tcp-sink.h tcp-sink.cc for this
  247. Agent/TCPSink/DelAck set bytes_ 0 
  248. #
  249. puts "nTOPOLOGY SETUP"
  250. # Number of hops (=k)
  251. set hops 4
  252. puts "Number of hops: $hops"
  253. # Link  latency (ms)
  254. # note: an east coast-west coast 
  255. # connection w/ 4 hops has a per-hop prop. del. roughly equal to 4.4ms
  256. set EDGE_DEL   1.0
  257. set CORE_DEL    3.0 
  258. puts "Edge link latency: $EDGE_DEL (ms)"
  259. puts "Core link latency: $CORE_DEL (ms)"
  260. # links: bandwidth (kbps) 
  261. set CORE_BW 45000.0
  262. set EDGE_BW 100000.0
  263. puts "Core bandwidth: $CORE_BW (kbps)"
  264. puts "Edge bandwidth: $EDGE_BW (kbps)"
  265. # Buffer size in gateways (in packets)
  266. set GW_BUFF 800
  267. puts "Gateway Buffer Size: $GW_BUFF (packs)"
  268. # Utilization factor for all core links
  269. set utilz 0.0005
  270. puts "Per source utilization (cross-traffic): $utilz"
  271. # Packet Size (in bytes); assume common for all sources
  272. set PKTSZ      500
  273. set MAXWIN     50
  274. puts "Packet Size: $PKTSZ (bytes)"
  275. # Number of monitored flows (equal to # of classes)
  276. set N_CL 4
  277. puts "Number of classes: $N_CL"
  278. set N_USERS_TCP 3
  279. set N_USERS 4
  280. puts "Number of flows: $N_USERS"
  281. # Number of cross-traffic sources 
  282. set N_C_TCP 6
  283. set N_CT 10
  284. puts "Number of cross-traffic sources (per hop) $N_CT"
  285. # Peak Rate of a cross-traffic source (set to link bandwidth, 
  286. # because a cross-traffic source models an incoming link's aggregate traffic)
  287. set PEAK_RT_C $EDGE_BW
  288. puts "Peak rate of cross-traffic sources: $PEAK_RT_C (kbps)"
  289. # Average Rate of a cross-traffic source (kbps); there is some algebra here 
  290. set AVG_RT_C [expr $utilz * $EDGE_BW / ($N_CT*1.)] 
  291. puts "Average cross-traffic rate (per source): $AVG_RT_C (kbps)"
  292. # Average idle duration for cross-traffic sources (msec)
  293. set IDLE_TM_C  [expr ($PEAK_RT_C-$AVG_RT_C)/($PEAK_RT_C*$AVG_RT_C) * $PKTSZ*8] 
  294. puts "Average cross-traffic idle time: $IDLE_TM_C (ms)"
  295. # Alpha parameter of the Pareto distribution for cross-traffic sources
  296. set PARETO_ALPHA_C 1.9
  297. puts "Alpha pareto parameter of cross-traffic sources: $PARETO_ALPHA_C"
  298. set START_TM  10.0
  299. puts "Monitored flows start at: $START_TM"
  300. set max_time  70.0
  301. puts "Max time: $max_time (sec)"
  302. # Statistics-related parameters
  303. set STATS_INTR  2; # interval between reporting statistics 
  304. set START_STATS 0; # start-time for reporting statistics 
  305. # Marker Types
  306. # Deterministic (for user traffic)
  307. set DETERM 1
  308. # Statistical (for cross-traffic)
  309. set STATIS 2
  310. # Demarker Types
  311. # Create a trace file for each class (for user traffic)
  312. set VERBOSE 1
  313. # Do not create trace files 
  314. set QUIET 2
  315. # 1. Core nodes ($hops nodes)
  316. for {set i 1} {$i <= $hops} {incr i} {
  317. set core_node($i) [$ns node]
  318. }
  319. puts "Core nodes: OK"
  320. # 2. User traffic nodes and sinks (N_USERS sources and sinks)
  321. for {set i 1} {$i <= $N_USERS} {incr i} {
  322. set user_source($i) [$ns node]
  323. set user_sink($i) [$ns node]
  324. if {$i <= $N_USERS_TCP} {
  325. set user_source_agent($i) [new Agent/TCP/Newreno]
  326.      set user_sink_agent($i) [new Agent/TCPSink/DelAck]
  327. } else {
  328. set user_source_agent($i) [new Agent/UDP]
  329. set user_sink_agent($i) [new Agent/LossMonitor]
  330. }
  331. }
  332. puts "User traffic nodes and sinks: OK"
  333. # 3. Cross traffic nodes and sinks ($hops-1 sources, $hops-1 sinks)
  334. for {set i 1} {$i < $hops} {incr i} {
  335. for {set j 1} {$j <= $N_CT} {incr j} {
  336. set cross_source([expr ($i-1)*$N_CT+$j]) [$ns node]
  337. set cross_sink([expr ($i-1)*$N_CT+$j]) [$ns node]
  338. if {$j > $N_C_TCP} {
  339. set cross_source_agent([expr ($i-1)*$N_CT+$j]) [new Agent/UDP]
  340. set cross_sink_agent([expr ($i-1)*$N_CT+$j]) [new Agent/LossMonitor]
  341. } else { 
  342. set cross_source_agent([expr ($i-1)*$N_CT+$j]) [new Agent/TCP/Newreno]
  343. set cross_sink_agent([expr ($i-1)*$N_CT+$j]) [new Agent/TCPSink/DelAck]
  344. }
  345. puts "Creating cross_source/sink_agent [expr ($i-1)*$N_CT+$j] ($i,$j)"
  346. }
  347. }
  348. puts "Cross traffic nodes and sink: OK"
  349. # 4. Core links (JoBS)
  350. for {set i 1} {$i < $hops} {incr i} {
  351. build-jobs-link $core_node($i) $core_node([expr $i+1]) $CORE_BW $CORE_DEL $GW_BUFF
  352.      set q [$ns get-queue $core_node($i) $core_node([expr $i+1])]
  353. set l [$ns get-link $core_node($i) $core_node([expr $i+1])]
  354.      if {$i == 1} {
  355. $q copyright-info
  356.      }    
  357.      $q init-rdcs -1 4 4 4
  358.      $q init-rlcs 2 2 2 2 
  359.      $q init-alcs 0.005 -1 -1 -1
  360.      $q init-adcs 0.002 -1 -1 -1
  361.      $q trace-file jobs-cn2002/hoptrace.$i
  362. $q link [$l link]
  363. $q sampling-period 1
  364.      $q id $i
  365.      $q initialize
  366.      # It's a duplex link
  367.      set q [$ns get-queue $core_node([expr $i+1]) $core_node($i)]
  368.      set l [$ns get-link $core_node([expr $i+1]) $core_node($i)]
  369.      $q init-rdcs -1 4 4 4
  370.      $q init-rlcs 2 2 2 2 
  371.      $q init-alcs 0.005 -1 -1 -1 
  372.      $q init-adcs 0.002 -1 -1 -1
  373. $q trace-file null
  374.      $q link [$l link]
  375. $q sampling-period 1
  376.      $q id [expr $i+$hops]
  377. $q initialize
  378. }
  379. puts "Core links: OK"
  380. # 5. Cross-traffic links (marker)
  381. for {set i 1} {$i < $hops} {incr i} {
  382. for {set j 1} {$j <= $N_CT} {incr j} {
  383. build-marker-link $cross_source([expr ($i-1)*$N_CT+$j]) $core_node($i) [expr $EDGE_BW/(1.*$N_CT)] $EDGE_DEL [expr $GW_BUFF*100]
  384. set q [$ns get-queue $cross_source([expr ($i-1)*$N_CT+$j]) $core_node($i)]
  385. if {$j == 1} {
  386. $q marker_type $DETERM
  387. $q marker_class 1
  388. } elseif {($j >=2) && ($j <= 3)} {
  389. $q marker_type $DETERM
  390. $q marker_class 2
  391. } elseif {($j >= 4) && ($j <= 6)} {
  392. $q marker_type $DETERM
  393. $q marker_class 3
  394. } else {
  395. $q marker_type $DETERM
  396. $q marker_class 4
  397. }
  398. set q [$ns get-queue $core_node($i) $cross_source([expr ($i-1)*$N_CT+$j])]
  399. $q id 99
  400. $q trace-file null
  401. build-marker-link  $cross_sink([expr ($i-1)*$N_CT+$j]) $core_node([expr $i+1]) [expr $EDGE_BW/(1.*$N_CT)] $EDGE_DEL [expr $GW_BUFF*100]
  402. set q [$ns get-queue $cross_sink([expr ($i-1)*$N_CT+$j]) $core_node([expr $i+1])]
  403. if {$j == 1} {
  404. $q marker_type $DETERM
  405. $q marker_class 1
  406. } elseif {($j >=2) && ($j <= 3)} {
  407. $q marker_type $DETERM
  408. $q marker_class 2
  409.   } elseif {($j >= 4) && ($j <= 6)} {
  410. $q marker_type $DETERM
  411. $q marker_class 3
  412. } else {
  413. $q marker_type $DETERM
  414. $q marker_class 4
  415. }
  416. set q [$ns get-queue $core_node([expr $i+1]) $cross_sink([expr ($i-1)*$N_CT+$j])]
  417. $q id 99
  418. $q trace-file null
  419. }
  420. }   
  421. puts "Cross traffic links: OK"
  422. # 6. Edge links (marker)
  423. for {set i 1} {$i <= $N_USERS} {incr i} {
  424. build-marker-link    $user_source($i) $core_node(1) $EDGE_BW $EDGE_DEL $GW_BUFF
  425.      set q [$ns get-queue $user_source($i) $core_node(1)]
  426.     $q marker_type $DETERM
  427. $q marker_class $i
  428.      set q [$ns get-queue $core_node(1) $user_source($i)]
  429. # assign a bogus id
  430.      $q id 99
  431.      build-demarker-link  $core_node($hops) $user_sink($i) $EDGE_BW $EDGE_DEL $GW_BUFF
  432.      set q [$ns get-queue $core_node($hops) $user_sink($i)]
  433.      $q id $i
  434. $q trace-file jobs-cn2002/e2edelay
  435.      set q [$ns get-queue $user_sink($i) $core_node($hops)]
  436.      $q marker_type $DETERM
  437. $q marker_class $i
  438. }
  439. puts "Edge marker/demarker links: OK" 
  440. #
  441. # Create traffic
  442. #
  443. # Cross-traffic (UDP, on/off Pareto)
  444. for {set i 1} {$i < $hops} {incr i} {
  445. for {set j 1} {$j <= $N_CT} {incr j} {
  446. if {$j > $N_C_TCP} {
  447. set cross_flow([expr ($i-1)*$N_CT+$j]) [new Application/Traffic/Pareto]
  448. build-pareto-on-off [expr ($i-1)*$N_CT+$j+$N_USERS] $cross_source([expr ($i-1)*$N_CT+$j]) $cross_source_agent([expr ($i-1)*$N_CT+$j]) $cross_sink([expr ($i-1)*$N_CT+$j]) $cross_sink_agent([expr ($i-1)*$N_CT+$j]) $cross_flow([expr ($i-1)*$N_CT+$j]) 2200.0 $PKTSZ $PARETO_ALPHA_C 0.0 100.0 120.0
  449. } else {
  450. set cross_flow([expr ($i-1)*$N_CT+$j]) [new Application/FTP]
  451. init_mouse [expr ($i-1)*$N_CT+$j+$N_USERS] $cross_source([expr ($i-1)*$N_CT+$j]) $cross_source_agent([expr ($i-1)*$N_CT+$j]) $cross_sink([expr ($i-1)*$N_CT+$j]) $cross_sink_agent([expr ($i-1)*$N_CT+$j]) $cross_flow([expr ($i-1)*$N_CT+$j]) $MAXWIN $PKTSZ 0.0 0.2 300 1000
  452. }
  453. puts "Connecting cross_source/sink_agent [expr ($i-1)*$N_CT+$j] ($i,$j) - via flow [expr ($i-1)*$N_CT+$j+$N_USERS]"
  454. }
  455. }   
  456. puts "Cross-traffic sources: OK"
  457. # User traffic (TCP/FTP and UDP)
  458. for {set i 1} {$i <= $N_USERS} {incr i} {
  459. if {$i <= $N_USERS_TCP} {
  460. set user_flow($i) [new Application/FTP]
  461. inf_ftp $i $user_source($i) $user_source_agent($i) $user_sink($i) $user_sink_agent($i) $user_flow($i) $MAXWIN $PKTSZ $START_TM
  462.     } else {
  463. set user_flow($i) [new Application/Traffic/Pareto]
  464. build-pareto-on-off $i $user_source($i) $user_source_agent($i) $user_sink($i) $user_sink_agent($i) $user_flow($i) 5000.0 $PKTSZ $PARETO_ALPHA_C $START_TM 10.0 10.0
  465. }
  466. }
  467. puts "TCP flows: OK"
  468. for {set i 1} {$i <= $N_USERS} {incr i} {
  469. if {$i <= $N_USERS_TCP} {
  470.      set cwnd_file($i) [open jobs-cn2002/cwnd$i.tr w]
  471. }
  472. set thru_file($i) [open jobs-cn2002/thru$i.tr w]
  473. }
  474. set thru_file([expr $N_USERS + 1]) [open jobs-cn2002/thru_sum.tr w]
  475. #
  476. # Queue Monitors
  477. #
  478. for {set i 1} {$i < $hops} {incr i} {
  479. set qmon_xy($i) [$ns monitor-queue $core_node($i) $core_node([expr $i+1]) ""]
  480. $ns at $START_STATS  "$qmon_xy($i) reset"
  481.      set bing_xy($i) [$qmon_xy($i) get-bytes-integrator]
  482.      set ping_xy($i) [$qmon_xy($i) get-pkts-integrator]
  483.      $ns at $START_STATS  "$bing_xy($i) reset"
  484.      $ns at $START_STATS  "$ping_xy($i) reset"
  485.      $ns at [expr $START_STATS+$STATS_INTR] "linkDump [$ns link $core_node($i) $core_node([expr $i+1])] $bing_xy($i) $ping_xy($i) $qmon_xy($i) $STATS_INTR N($i)-N([expr $i+1])"   
  486. }
  487. # Stats dump
  488. for {set i 1} {$i < $hops} {incr i} {
  489. set flow_file($i) [open jobs-cn2002/flows-hop$i.tr w]
  490.      set fm [$ns makeflowmon Fid]
  491.      $ns attach-fmon [$ns get-link $core_node($i) $core_node([expr $i+1])] $fm
  492.      $ns at $START_TM "flowDump [$ns get-link $core_node($i) $core_node([expr $i+1])] $fm $flow_file($i) 0.5"
  493. }
  494. for {set i 1} {$i <= $N_USERS} {incr i} {
  495.      set tot_drop($i) 0
  496.      set old_arv($i) 0
  497.      set total_drops_file($i) [open jobs-cn2002/totaldrops-flow$i.tr w]
  498.      $ns at $START_TM "totalDrops $i 0.5"
  499. }
  500. $ns at $START_TM "record_thru"
  501. $ns at $START_TM "record_cwnd"
  502. $ns at $max_time "finish"
  503. proc finish {} {
  504.         puts "nSimulation End"
  505. global N_CT N_USERS user_source core_node cross_source cross_sink user_sink ns hops
  506. puts "nMonitored Flows (send):"
  507. for {set i 1} {$i <= $N_USERS} {incr i} {
  508. set q [$ns get-queue $user_source($i) $core_node(1)]
  509. puts "$i:   arrivals class-1 = [$q set marker_arrvs1_]" 
  510. puts "$i:   arrivals class-2 = [$q set marker_arrvs2_]" 
  511. puts "$i:   arrivals class-3 = [$q set marker_arrvs3_]" 
  512. puts "$i:   arrivals class-4 = [$q set marker_arrvs4_]" 
  513. }
  514. puts "nMonitored Flows (receive):"
  515. for {set i 1} {$i <= $N_USERS} {incr i} {
  516. set q [$ns get-queue $core_node($hops) $user_sink($i)]
  517. puts "$i:   arrivals class-1 = [$q set demarker_arrvs1_]" 
  518. puts "$i:   arrivals class-2 = [$q set demarker_arrvs2_]" 
  519. puts "$i:   arrivals class-3 = [$q set demarker_arrvs3_]" 
  520. puts "$i:   arrivals class-4 = [$q set demarker_arrvs4_]" 
  521. }
  522. for {set i 1} {$i < $hops} {incr i} {
  523. for {set j 1} {$j <= $N_CT} {incr j} {
  524. set q [$ns get-queue $cross_source([expr ($i-1)*$N_CT+$j]) $core_node($i)]
  525. puts "nCore Input Link ($i,$j):"
  526. puts "    cross-arrivals class-1 = [$q set marker_arrvs1_]" 
  527. puts "    cross-arrivals class-2 = [$q set marker_arrvs2_]" 
  528. puts "    cross-arrivals class-3 = [$q set marker_arrvs3_]" 
  529. puts "    cross-arrivals class-4 = [$q set marker_arrvs4_]" 
  530. set q [$ns get-queue $core_node([expr $i+1]) $cross_sink([expr ($i-1)*$N_CT+$j])]
  531. puts "nCore Output Link ($i,$j):"
  532. puts "    cross-arrivals class-1 = [$q set demarker_arrvs1_]" 
  533. puts "    cross-arrivals class-2 = [$q set demarker_arrvs2_]" 
  534. puts "    cross-arrivals class-3 = [$q set demarker_arrvs3_]" 
  535. puts "    cross-arrivals class-4 = [$q set demarker_arrvs4_]" 
  536. }
  537. }
  538. exit 0
  539. }
  540. puts "ngo!n"
  541. $ns run