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

通讯编程

开发平台:

Visual C++

  1. # Created May 98 by Ahmed Helmy; updated June 98
  2. # routing generator class
  3. Class RouteGen
  4. proc route-usage { } {
  5. puts {usage: routing [-<key 1> <value 1> ... -<key n> <value n>]
  6. example options: 
  7. -outfile f -unicast DV -multicast detailedDM -expand_address off
  8. keys and corresponding values:
  9. -outfile [the output file that will contain the ns script 
  10.  describing the routing. This must be given.]
  11. -unicast
  12.   possible values: 
  13. Session (default) [centralized Dijkstra's SPF algorithm]
  14. DV [detailed/distributed Bellman-Ford algorithm]
  15. -multicast [by default multicast is turned off, unless this
  16. option is given]
  17.   possible values: 
  18. CtrMcast [centralized sparse multicast]
  19. detailedDM [detailed/distributed dense-mode multicast,
  20. based on PIM-DM]
  21. PIM [an early version of detailed/distributed sparse mode
  22. multicast, based on PIM-SM.]
  23. -expand_address 
  24.   possible values: on (default) , off
  25.   }
  26. }
  27. proc routing { args } {
  28. set len [llength $args]
  29. if { $len } {
  30.     set key [lindex $args 0]
  31.             if {$key == "-?" || $key == "--help" || $key == "-help" 
  32. || $key == "-h" } {
  33. route-usage
  34. return
  35.                 }
  36. }
  37.         if { [expr $len % 2] } {
  38.                 # if number is odd => error !
  39.                 puts "fewer number of arguments than needed in "$args""
  40.                 route-usage
  41. return
  42.         }
  43. # check if the routeGen type exists
  44. if { [catch {set rg [RouteGen info instances]}] } {
  45. puts "no class RouteGen"
  46. route-usage
  47. return
  48. }
  49. if { $rg == "" } {
  50. set rg [new RouteGen]
  51. }
  52. if { ![llength $args] } {
  53. $rg create
  54. } else {
  55. $rg create $args
  56. }
  57. }
  58. RouteGen instproc init { } {
  59. $self next
  60. }
  61. RouteGen instproc default_options { } {
  62. $self instvar opt_info
  63. set opt_info {
  64. # init file to -1, must be supplied by input
  65. outfile -1
  66. # unicast default is centralized (i.e. rtproto
  67. # Session)
  68. unicast Session
  69. # multicast default is detailedDM ! is this a
  70. # good choice ?! or better centralized (i.e.
  71. # mproto CtrMcast
  72. # multicast centralized
  73. # default is multicast is turned off !!
  74. multicast -1
  75. # where does address assignment (e.g. expand, and
  76. # hierarchical) fit ?! XXX
  77. # by default turn them on
  78. expand_address on
  79. # hierarchical addressing is decided at topology
  80. # generation time... not here !
  81. # hierarchical-addressing on
  82. }
  83. $self parse_opts
  84. }
  85. # are the parsing functions general enuf... ! chk
  86. RouteGen instproc parse_opts { } {
  87. $self instvar opts opt_info
  88. while { $opt_info != ""} {
  89. # parse line by line
  90.                 if {![regexp "^[^n]*n" $opt_info line]} {
  91.                         break  
  92.                 }
  93. # remove the parsed line
  94.                 regsub "^[^n]*n" $opt_info {} opt_info
  95. # remove leading spaces and tabs using trim
  96.                 set line [string trim $line]
  97. # skip comment lines beginning with #
  98.                 if {[regexp "^[ t]*#" $line]} {
  99.                         continue
  100.                 }
  101. # skip empty lines
  102.                 if {$line == ""} {
  103.                         continue
  104.                 } elseif [regexp {^([^ ]+)[ ]+([^ ]+)$} $line dummy key value] {
  105.                         set opts($key) $value
  106.                 } 
  107. }
  108. }
  109. RouteGen instproc parse_input { args } {
  110. # remove the list brackets from the args list
  111.         set args [lindex $args 0]
  112.         set len [llength $args]
  113. $self instvar opts
  114. for { set i 0 } { $i < $len } { incr i } {
  115. set key [lindex $args $i]
  116. regsub {^-} $key {} key
  117.                 if {![info exists opts($key)]} {
  118. puts stderr "unrecognized option $key"
  119. route-usage
  120. return -1
  121. }
  122. incr i
  123. # puts "changing $key from $opts($key) to [lindex $args $i]"
  124. set opts($key) [lindex $args $i]
  125. }
  126. # puts "end of parsing... "
  127. return 0
  128. }
  129. RouteGen instproc create { args } {
  130.         # remove the list brackets from the args list
  131.         set args [lindex $args 0]
  132.         set len [llength $args]
  133.         # puts "calling create with args $args, len $len"
  134. $self default_options
  135. if { $len } {
  136. if { [$self parse_input $args] == -1 } {
  137. return 
  138. }
  139. }
  140. # check that the filename is provided
  141. $self instvar opts
  142. if { $opts(outfile) == -1 } {
  143.  puts {you must provide outfile name. use "routing -h" for help}
  144. return
  145. }
  146. $self create-routing
  147. }
  148. RouteGen instproc create-routing { } {
  149. # XXX leave out the checks to ns later.. !
  150. # this would allow extensibility to include other kinds of 
  151. # routing without having to modify the generator
  152. # if { [$self input-check] == -1 } {
  153. # puts "There's an input error !! aborting"
  154. # route-usage
  155. #  return
  156. # }
  157. $self instvar opts
  158. set file $opts(outfile)
  159. set unicast $opts(unicast)
  160. set mcast $opts(multicast)
  161. set add $opts(expand_address)
  162. $self generate-code $file $unicast $mcast $add
  163. }
  164. # later may add other options.. for unicast multipath.. etc
  165. RouteGen instproc generate-code { file unicast mcast add } {
  166. set f [open $file w]
  167. # puts "generate-code with $file $unicast $mcast $add"
  168. set aa "n proc setup-mcastNaddr { sim } { n"
  169. set ab "t upvar $sim nsn"
  170. set ac ""; set ad ""; set bd ""; set ae ""
  171. # add other params here later.. multipath..etc
  172. if { $mcast != -1 } {
  173.   set ac "t Simulator set EnableMcast_ 1n"
  174. set ad "t Simulator set NumberInterfaces_ 1n"
  175. # check if the following has to be done 
  176. # only after the nodes are created !! XXX
  177.  # get a handle to mcast that may be used later for
  178.  # ex. to switch treetype... etc
  179.  set bd "t set mrthandle [$ns mrtproto $mcast {}]n"
  180. if { $add == "on" } {
  181. set ae "t Node expandaddrn"
  182. set ba "n proc create-routing { sim } {n"
  183. set bb "t upvar $sim nsn"
  184. set bc "t $ns rtproto $unicast n"
  185. set c "} n"; # close the proc paren
  186. # XXX this is 
  187. # ns artifact that mcast enable should come before
  188. # topology generation and assigning uni/mcast
  189. # should come after !!!
  190. # generate the first procedure ... 
  191. set str1 "$aa $ab $ac $ad $ae $c"
  192. # generate the 2nd procedure
  193. set str2 "$ba $bb $bc $bd $c"
  194. puts $f "$str1 $str2"
  195. flush $f
  196. close $f
  197. }
  198. RouteGen instproc input-check { } {
  199. $self instvar check
  200. set check 1
  201. $self unicast-check
  202. $self multicast-check
  203. $self address-checks
  204. if { $check == -1 } {
  205. return -1
  206. }
  207. return 1
  208. }
  209. RouteGen instproc unicast-check { } {
  210. $self instvar opts
  211. # puts "unicast is $opts(unicast)"
  212. if { $opts(unicast) != "DV" && $opts(unicast) != "Session" } {
  213.  puts "unknown unicast "$opts(unicast)", use DV or Session"
  214.  $self instvar check 
  215.  set check -1
  216. }
  217. }
  218. RouteGen instproc multicast-check { } {
  219. $self instvar opts
  220. # puts "multicast is $opts(multicast)"
  221. if { $opts(multicast) == -1 } {
  222. puts "multicast will default to "off""
  223. } elseif { $opts(multicast) != "CtrMcast" && 
  224.  $opts(multicast) != "detailedDM" && $opts(multicast) != "PIM" } {
  225.  puts "unknown multicast "$opts(multicast)", use 
  226. CtrMcast, detailedDM, or PIM"
  227.  $self instvar check
  228.  set check -1
  229. }
  230. }
  231. RouteGen instproc address-checks { } {
  232. $self instvar opts
  233. # puts "expand_address is $opts(expand_address)"
  234. if { $opts(expand_address) != "on" && 
  235. $opts(expand_address) != "off" } {
  236.  puts "address option "$opts(expand_address)" unknown"
  237.  $self instvar check
  238.  set check -1
  239. }