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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (C) 1998 by USC/ISI
  3. # All rights reserved.                                            
  4. #                                                                
  5. # Redistribution and use in source and binary forms are permitted
  6. # provided that the above copyright notice and this paragraph are
  7. # duplicated in all such forms and that any documentation, advertising
  8. # materials, and other materials related to such distribution and use
  9. # acknowledge that the software was developed by the University of
  10. # Southern California, Information Sciences Institute.  The name of the
  11. # University may not be used to endorse or promote products derived from
  12. # this software without specific prior written permission.
  13. # THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
  14. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  15. # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  16. # $Header: /cvsroot/nsnam/nam-1/tcl/netModel.tcl,v 1.25 2003/01/28 03:22:39 buchheim Exp $
  17. NetworkModel set bcast_duration_ 0.01
  18. # 250 is pre-calculate by using fixed two-way ground reflection
  19. # model with fixed transmission power 3.652e-10
  20. NetworkModel set bcast_radius_ 250
  21. #-----------------------------------------------------------------------
  22. # NetworkModel instproc init {animator tracefile}
  23. #-----------------------------------------------------------------------
  24. NetworkModel instproc init {animator tracefile} {
  25.   $self instvar showenergy_
  26.   $self next $animator ;# create shadow, etc.
  27.   # Tracefile maybe a space which indicates that
  28.   # a new nam editor window is being created
  29.   if {$tracefile != " "} {
  30.     # We have a tracefile so it must be an animation to display
  31.     $self nam_addressing $tracefile
  32.     $self nam_layout $tracefile
  33.     $self layout
  34.     if [info exists showenergy_] {
  35.       if {$showenergy_ == 1} {
  36.         $animator show-energy
  37.       }
  38.     }
  39.   }
  40. }
  41. # Read events from the trace file and extract addressing information from them
  42. NetworkModel instproc nam_addressing { tracefile } {
  43.     set stream [new NamStream $tracefile]
  44.     set time "0"
  45.     # skip all beginning non "*" events
  46.     while {([$stream eof]==0)&&([string compare $time "*"]!=0)} {
  47. set line [$stream gets]
  48. set time [get_trace_item "-t" $line]
  49.     }
  50.     $self instvar netAddress
  51.     if ![info exists netAddress] {
  52.     set netAddress [new Address]
  53.     }
  54.     while {([$stream eof]==0)&&([string compare $time "*"]==0)} {
  55. set cmd [lindex $line 0]
  56. set time [get_trace_item "-t" $line]
  57. if {[string compare $time "*"]!=0} {break}
  58. switch $cmd {
  59. "A" {
  60. set hier [get_trace_item "-n" $line]
  61. if {$hier != ""} {
  62. # PortShift
  63. set ps [get_trace_item "-p" $line]
  64. # PortMask
  65. set pm [get_trace_item "-o" $line]
  66. # McastShift
  67. set ms [get_trace_item "-c" $line]
  68. # McastMask
  69. set mm [get_trace_item "-a" $line]
  70. $netAddress portbits-are $ps $pm
  71. $netAddress mcastbits-are $ms $mm
  72. } else {
  73. set hier [get_trace_item "-h" $line]
  74. # NodeShift
  75. set nh [get_trace_item "-m" $line]
  76. # NodeMask
  77. set nm [get_trace_item "-s" $line]
  78. $netAddress add-hier $hier $nh $nm
  79. }
  80. }
  81. }
  82. # XXX
  83. # assuming that every line end with End-OF-Line
  84. set line [$stream gets]
  85.     }
  86.     $stream close
  87. }
  88. #-----------------------------------------------------------------------
  89. # NetworkModel instproc nam_layout { tracefile } {
  90. #   - read events from the tracefile and parse them as 
  91. #     layout commands until we meet an event without -t * 
  92. #-----------------------------------------------------------------------
  93. NetworkModel instproc nam_layout { tracefile } {
  94.   set stream [new NamStream $tracefile]
  95.   set time "0"
  96.     # skip all beginning non "*" events
  97.   while {([$stream eof]==0)&&([string compare $time "*"] != 0)} {
  98.     set line [$stream gets]
  99.     set time [get_trace_item "-t" $line]
  100.   }
  101.   while {([$stream eof]==0)&&([string compare $time "*"] == 0)} {
  102.     set cmd [lindex $line 0]
  103.     set time [get_trace_item "-t" $line]
  104.     if {[string compare $time "*"] != 0} {
  105.       break
  106.     }
  107.     switch $cmd {
  108.       "n" {
  109. #        $self layout_node [lrange $line 1 end]
  110.         # goto netmodel.cc: command to add the node
  111.         $self node $line
  112.       }
  113.       "g" {
  114.         $self layout_agent [lrange $line 1 end]
  115.       }
  116.       "l" {
  117.         $self layout_link [lrange $line 1 end]
  118.       }
  119.       "L" {
  120.         $self layout_lanlink [lrange $line 1 end]
  121.       }
  122.       "X" {
  123.         $self layout_lan [lrange $line 1 end]
  124.       }
  125.       "q" {
  126.         $self layout_queue [lrange $line 1 end]
  127.       }
  128.       "c" {
  129.         $self layout_color [lrange $line 1 end]
  130.       }
  131.     }
  132.     # XXX
  133.     # assuming that every line end with End-OF-Line
  134.     set line [$stream gets]
  135.   }
  136.   $stream close
  137. }
  138. #-----------------------------------------------------------------------
  139. # This procedure is no longer in use
  140. #-----------------------------------------------------------------------
  141. NetworkModel instproc layout_node {line} {
  142.   $self instvar showenergy_
  143.   # Setup default values
  144.   set color black
  145.   set lcolor black
  146.   set shape circle
  147.   set dlabel ""
  148.   set src ""
  149.   set size 0
  150.   set addr 0
  151.   
  152.   for {set i 0} {$i < [llength $line]} {incr i} {
  153.     set item [string range [lindex $line $i] 1 end]
  154.     switch $item {
  155.       "s" {
  156.         set src [lindex $line [expr $i+1]]
  157.       }
  158.       "v" {
  159.         set shape [lindex $line [expr $i+1]]
  160.       }
  161.       "c" {
  162.         set color [lindex $line [expr $i+1]]
  163.         if {[string range $color 0 0] == "#"} {
  164.           set rgb [winfo rgb . $color]
  165.           set color "[$self lookupColorName [lindex $rgb 0] 
  166.                      [lindex $rgb 1] [lindex $rgb 2]]"
  167.         }
  168.         if [info exists showenergy_] {
  169.            if { $color == "green"} {
  170.              set showenergy_ 1
  171.            }
  172.         }
  173.       }
  174.       "z" {
  175.         set size [lindex $line [expr $i+1]]
  176.       }
  177.       "a" {
  178.         set addr [lindex $line [expr $i+1]]
  179.       }
  180.       "x" {
  181.         set xcor [lindex $line [expr $i+1]]
  182.         set showenergy_ 0
  183.       }
  184.       "y" {
  185.         set ycor [lindex $line [expr $i+1]]
  186.         set showenergy_ 0
  187.       }
  188.       "i" {
  189.         set lcolor [lindex $line [expr $i+1]]
  190.         if {[string range $lcolor 0 0] == "#"} {
  191.           set rgb [winfo rgb . $lcolor]
  192.           set lcolor "[$self lookupColorName [lindex $rgb 0] 
  193.                       [lindex $rgb 1] [lindex $rgb 2]]"
  194.         }
  195.       }
  196.       "b" {
  197.         set dlabel [lindex $line [expr $i+1]]
  198.       }
  199.     }
  200.     if {[string range $item 0 0]=="-"} {
  201.       incr i
  202.     }
  203.   }
  204.   if {$src==""} {
  205.     puts "Error in parsing tracefile line:n$linen"
  206.     puts "No -s <node id> was given."
  207.     exit
  208.   }
  209.   # XXX Make sure dlabel is the last argument. This stupid node creation 
  210.   # process should be changed and a node-config method should be used to
  211.   # add dlabels, etc., to nodes. 
  212.   # 
  213.   # XXX TO ALL WHO WILL ADD MORE ARGUMENTS:
  214.   # in netmodel.cc, NetModel::addNode() says: if there are more than 9 
  215.   # arguments (incl. 'cmd node'), this is a wireless node! 
  216.   # You be careful!!
  217.   if [info exists xcor] {
  218.     if {$dlabel != ""} {
  219.       $self node $src $shape $color $addr $size $lcolor 
  220.                  $xcor $ycor $dlabel 
  221.     } else {
  222.       $self node $src $shape $color $addr $size $lcolor 
  223.                  $xcor $ycor
  224.     }
  225.   } else {
  226.     if {$dlabel != ""} {
  227.       $self node $src $shape $color $addr $size $lcolor $dlabel
  228.     } else {
  229.       $self node $src $shape $color $addr $size $lcolor
  230.     }
  231.   }
  232. }
  233. #-----------------------------------------------------------------------
  234. #
  235. #-----------------------------------------------------------------------
  236. NetworkModel instproc layout_agent {line} {
  237.     set label ""
  238.     set role ""
  239.     set node ""
  240.     set flowcolor black
  241.     set winInit ""
  242.     set win ""
  243.     set maxcwnd ""
  244.     set tracevar ""
  245.     set start ""
  246.     set producemore ""
  247.     set stop  ""
  248.     set packetsize ""
  249.     set interval ""
  250.     set number ""
  251.     set partner ""
  252.     for {set i 0} {$i < [llength $line]} {incr i} {
  253. set item [string range [lindex $line $i] 1 end]
  254. switch $item {
  255.             "l" {
  256.                     set label [lindex $line [expr $i+1]]
  257.             }
  258.     "r" {
  259.     set role [lindex $line [expr $i+1]]
  260.     }
  261.     "s" {
  262. set node [lindex $line [expr $i+1]]
  263. }
  264. "c" {
  265. set flowcolor [lindex $line [expr $i+1]]
  266. }
  267. "i" {
  268. set winInit [lindex $line [expr $i+1]]
  269. }
  270. "w" {
  271. set win [lindex $line [expr $i+1]]
  272. }
  273. "m" {
  274. set maxcwnd [lindex $line [expr $i+1]]
  275. }
  276. "t" {
  277. set tracevar [lindex $line [expr $i+1]]
  278. }
  279. "b" {
  280. set start [lindex $line [expr $i+1]]
  281. }
  282.         "o" {
  283.                 set stop [lindex $line [expr $i+1]]
  284.         }
  285. "p" {
  286. set producemore [lindex $line [expr $i+1]]
  287. }
  288.         "k" {
  289.                 set packetsize [lindex $line [expr $i+1]]
  290.         }
  291.         "v" {
  292.                 set interval [lindex $line [expr $i+1]]
  293.         }
  294.         "n" {
  295.                 set number [lindex $line [expr $i+1]]
  296.         }
  297.         "u" {
  298.                 set partner [lindex $line [expr $i+1]]
  299.         }
  300. }
  301. if {[string range $item 0 0]=="-"} {incr i}
  302. }
  303. if {$label==""} {
  304. puts "Error in parsing tracefile line:n$linen"
  305. exit
  306. }
  307. if {[string compare $role "20"]==0} {
  308. $self agent $label $role $node $number $partner
  309. } elseif {[string compare $role "10"]==0 && [string compare $label "CBR"]==0} {
  310.     $self agent $label $role $node $flowcolor $packetsize $interval $start $stop $number $partner
  311. } else {
  312. $self agent $label $role $node $flowcolor $winInit $win $maxcwnd $tracevar $start $producemore $stop $number $partner
  313. }
  314. }
  315. #-----------------------------------------------------------------------
  316. # NetworkModel instproc layout_lan {line}
  317. #  - creates a virtual node to which other nodes are connect using a
  318. # shared lan via the 'L' event
  319. #-----------------------------------------------------------------------
  320. NetworkModel instproc layout_lan {line} {
  321.   set name ""
  322.   set rate ""
  323.   set delay ""
  324.   set orient down
  325.   for {set i 0} {$i < [llength $line]} {incr i} {
  326. set item [string range [lindex $line $i] 1 end]
  327. switch $item {
  328.   "n" {
  329.     set name [lindex $line [expr $i+1]]
  330.   }
  331.   "r" {
  332.     set rate [lindex $line [expr $i+1]]
  333.   }
  334.   "D" {
  335.     set delay [lindex $line [expr $i+1]]
  336.   }
  337.   "o" {
  338.     set orient [lindex $line [expr $i+1]]
  339.   }
  340. }
  341. if {[string range $item 0 0]=="-"} {
  342.   incr i
  343. }
  344.   }
  345.   if {$name==""} {
  346. puts "netModel.tcl found an Error in parsing tracefile line:n$linen"
  347. exit
  348.   }
  349.   set th [nam_angle $orient]
  350.   # Lan rates are shown in Mb/s and delay in ms
  351.   set rate [expr [bw2real $rate] / 1000000.0]
  352.   set delay [expr [time2real $delay] * 1000.0]
  353.   $self lan $name [bw2real $rate] [time2real $delay] [expr $th]
  354. }
  355. NetworkModel instproc layout_link {line} {
  356. #orient can default because pre-layout will have kicked us into 
  357. #autolayout mode by this point
  358. set orient right
  359. set src ""
  360. set dst ""
  361. set rate 10Mb
  362. set delay 10ms
  363. set color ""
  364. set dlabel ""
  365. set length 0
  366. for {set i 0} {$i < [llength $line]} {incr i} {
  367. set item [string range [lindex $line $i] 1 end]
  368. switch "$item" {
  369. "s" {
  370. set src [lindex $line [expr $i+1]]
  371. }
  372. "d" {
  373. set dst [lindex $line [expr $i+1]]
  374. }
  375. "r" {
  376. set rate [lindex $line [expr $i+1]]
  377. }
  378. "D" {
  379. set delay [lindex $line [expr $i+1]]
  380. }
  381. "h" {
  382. set length [lindex $line [expr $i+1]]
  383. }
  384. "O" {
  385. set orient [lindex $line [expr $i+1]]
  386. }
  387. "o" {
  388. set orient [lindex $line [expr $i+1]]
  389. }
  390. "c" {
  391. set color [lindex $line [expr $i+1]]
  392. }
  393. "b" {
  394. set dlabel [lindex $line [expr $i+1]]
  395. }
  396. }
  397. if {[string range $item 0 0]=="-"} {
  398. incr i
  399. }
  400. }
  401. if {($src=="")||($dst=="")} {
  402. puts "Error in parsing tracefile line:n$linen"
  403. exit
  404. }
  405. set th [nam_angle $orient]
  406. set rev [expr $th + 1]
  407. # This is easier than using mod arithmetic
  408. if { $rev > 2.0 } {
  409. set rev [expr $rev - 2.0]
  410. }
  411. # Lan rates are shown in Mb/s and delay in ms
  412. set rate [expr [bw2real $rate] / 1000000.0]
  413. set delay [expr [time2real $delay] * 1000.0]
  414. #build the reverse link
  415. $self link $dst $src $rate $delay $length $rev
  416. #and the forward one
  417. $self link $src $dst $rate $delay $length $th
  418. if { $color!="" } {
  419. $self ecolor $src $dst $color 
  420. $self ecolor $dst $src $color 
  421. }
  422. if { $dlabel!="" } {
  423. $self edlabel $src $dst $dlabel
  424. $self edlabel $dst $src $dlabel
  425. }
  426. }
  427. NetworkModel instproc layout_lanlink {line} {
  428.   #orient can default because pre-layout will have kicked us into 
  429.   #autolayout mode by this point
  430.   set orient right
  431.   set src ""
  432.   set dst ""
  433.   for {set i 0} {$i < [llength $line]} {incr i} {
  434.     set item [string range [lindex $line $i] 1 end]
  435.     switch "$item" {
  436.       "s" {
  437.         set src [lindex $line [expr $i+1]]
  438.       }
  439.       "d" {
  440.         set dst [lindex $line [expr $i+1]]
  441.       }
  442.       "O" {
  443.         set orient [lindex $line [expr $i+1]]
  444.       }
  445.       "o" {
  446.         set orient [lindex $line [expr $i+1]]
  447.       }
  448.     }
  449.     if {[string range $item 0 0]=="-"} {
  450.       incr i
  451.     }
  452.   }
  453.   if {($src=="")||($dst=="")} {
  454.     puts "Error in parsing tracefile line no source or destination in lanlink:n$linen"
  455.     exit
  456.   }
  457.   set th [nam_angle $orient] ;# global function
  458.   $self lanlink $dst $src $th
  459. }
  460. NetworkModel instproc layout_queue {line} {
  461. for {set i 0} {$i < [llength $line]} {incr i} {
  462. set item [string range [lindex $line $i] 1 end]
  463. switch $item {
  464. "s" {
  465. set src [lindex $line [expr $i+1]]
  466. }
  467. "d" {
  468. set dst [lindex $line [expr $i+1]]
  469. }
  470. "a" {
  471. set angle [lindex $line [expr $i+1]]
  472. }
  473. }
  474. if {[string range $item 0 0]=="-"} {incr i}
  475. }
  476. $self queue $src $dst $angle
  477. }
  478. NetworkModel instproc layout_color {line} {
  479.     for {set i 0} {$i < [llength $line]} {incr i} {
  480. set item [string range [lindex $line $i] 1 end]
  481. switch $item {
  482.     "i" {
  483. set ix [lindex $line [expr $i+1]]
  484.     }
  485.     "n" {
  486. set name [lindex $line [expr $i+1]]
  487. if {[string range $name 0 0] == "#"} {
  488.                     set rgb [winfo rgb . $name]
  489.                     set name "[$self lookupColorName [lindex $rgb 0] 
  490.                         [lindex $rgb 1] [lindex $rgb 2]]"
  491. }
  492.     }
  493. }
  494. if {[string range $item 0 0]=="-"} {incr i}
  495.     }
  496.     $self color $ix $name
  497. }
  498. NetworkModel instproc traffic_filter {type} {
  499. $self select-traffic $type
  500. }
  501. NetworkModel instproc src_filter {src} {
  502. $self select-src $src
  503. }
  504. NetworkModel instproc dst_filter {dst} {
  505. $self select-dst $dst
  506. }
  507. NetworkModel instproc fid_filter {fid} {
  508. $self select-fid $fid
  509. }