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

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1996 Regents of the University of California.
  3. # All rights reserved.
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions
  6. # are met:
  7. # 1. Redistributions of source code must retain the above copyright
  8. #    notice, this list of conditions and the following disclaimer.
  9. # 2. Redistributions in binary form must reproduce the above copyright
  10. #    notice, this list of conditions and the following disclaimer in the
  11. #    documentation and/or other materials provided with the distribution.
  12. # 3. All advertising materials mentioning features or use of this software
  13. #    must display the following acknowledgement:
  14. #  This product includes software developed by the MASH Research
  15. #  Group at the University of California Berkeley.
  16. # 4. Neither the name of the University nor of the Research Group may be
  17. #    used to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. # SUCH DAMAGE.
  30. #
  31. #####################################################################################
  32. # API's for allocating bits to ns addressing structure
  33. # These routines should be used for setting bits for portid (agent), for nodeid 
  34. # (flat or hierarchical).
  35. # DEFADDRSIZE_ and MAXADDRSIZE_ defined in ns-default.tcl
  36. # Name :        set-address-format ()
  37. # Options :     default, expanded, hierarchical (default) and hierarchical
  38. # (with specific allocations) 
  39. # Synopsis :    set-address-format <option> <additional info, if required
  40. #  by option> 
  41. #
  42. # Option:1      def (default settings)
  43. # Synopsis :    set-address-format def
  44. # Currently 32 bit address space is the default feature in ns 
  45. # (OLD) Description:  This allows default settings in the following manner:
  46. #               * 8bits portid
  47. #               * 1 bit for mcast and 7 bits nodeid (mcast should be enabled
  48. #               before Simulator is inited (new Simulator is called)--> leads 
  49. #  to unnecessary wasting of 1 bit even if mcast is not set.
  50. # [This is obsoleted by default 32 bit address space]
  51. # Option 2:     expanded 
  52. # Synopsis :    set-address-format expanded
  53. # Description:  This allows to expand the address space from default size 16 
  54. #  to 32 with bit allocated to the field in the foll manner:
  55. #               * 8bits portid
  56. #               * 1 bit for mcast and 21 bits nodeid (and same comments 
  57. #  regarding setting mcast as for default option above)
  58. #
  59. # Option :3     hierarchical (default)
  60. # Synopsis :    set-address-format hierarchical
  61. # Description:  This allows setting of hierarchical address as follows:
  62. #                   * Sets 8bits portid
  63. #                   * Sets mcast bit (if specified)
  64. #                   * Sets default hierchical levels with:
  65. #                      * 3 levels of hierarchy and
  66. #                      * (10 11 11) by default 
  67. #                      * (9 11 11) if mcast is enabled.
  68. #
  69. # Option 4:     hierarchical (specified)
  70. # Synopsis:     set-address-format hierarchical <#n hierarchy levels> 
  71. # <#bits for level1> <#bits for level 2> ....
  72. # <#bits for nth level>
  73. #               e.g  
  74. #                   set-address-format hierarchical 4 2 2 2 10
  75. # Description:  This allows setting of hierarchical address as specified for 
  76. # each level.
  77. #                 * Sets 8bits portid
  78. #                 * Sets mcast bit (if specified)
  79. #                 * Sets hierchical levels with bits specified for each level.
  80. # Name:         expand-port-field-bits ()
  81. # Synopsis:     expand-port-field-bits <#bits for portid> 
  82. # Status: Obsolete.  It is no longer needed in the 32-bit addressing
  83. # scheme
  84. # Description : This should be used incase of need to extend portid. 
  85. #               This commnad may be used in conjuction with 
  86. #               set-address-format command explained above.
  87. #               expand-port-field-bits checks and raises error in the foll. 
  88. # cases
  89. #                 * if the requested portsize cannot be accomodated (i.e  
  90. #                   if sufficient num.of free bits are not available)
  91. #                 * if requested portsize is less than equal to existing 
  92. #     portsize, and incase of no errors sets port field with 
  93. #      bits as specified.
  94. #
  95. # Errors:  * if # of bits specified less than 0.
  96. #               * if bit positions clash (contiguous # of requested free bits 
  97. #   not found)
  98. #               * if total # of bits exceed MAXADDRSIZE_
  99. #               * if expand-port-field-bits is attempted with portbits less or
  100. #   equal to the existing portsize.
  101. #               * if # hierarchy levels donot match with #bits specified (for
  102. #                 each level). 
  103. Class AllocAddrBits
  104. Simulator proc address-format {} {
  105. return [Simulator set AddressFormat_]
  106. }
  107. Simulator proc default-addr? {} {
  108. if { [Simulator set AddressFormat_] == "DEF" } {
  109. return 1
  110. } else { 
  111. return 0
  112. }
  113. }
  114. Simulator proc hier-addr? {} {
  115. if { [Simulator set AddressFormat_] == "HIER" } {
  116. return 1
  117. } else {
  118. return 0
  119. }
  120. }
  121. Simulator instproc set-address-format {opt args} {
  122. set len [llength $args]
  123. if {[string compare $opt "def"] == 0} {
  124. $self set-address 32
  125. set mcastshift [AddrParams McastShift]
  126. Simulator set McastAddr_ [expr 1 << $mcastshift]
  127. mrtObject expandaddr
  128. Simulator set AddressFormat_ DEF
  129. } elseif {[string compare $opt "expanded"] == 0} {
  130. puts "set-address-format expanded is obsoleted by 32-bit addressing."
  131. } elseif {[string compare $opt "hierarchical"] == 0 && $len == 0} {
  132. if [$self multicast?] {
  133. $self set-hieraddress 3 9 11 11
  134. } else {
  135. $self set-hieraddress 3 10 11 11
  136. }
  137. } elseif {[string compare $opt "hierarchical"] == 0 && $len > 0} {
  138. eval $self set-hieraddress [lindex $args 0] 
  139. [lrange $args 1 [expr $len - 1]]
  140. } else {
  141. error "ns-address.tcl:set-address-format: Unknown address format $opt"
  142. }
  143. }
  144. Simulator instproc set-hieraddress {hlevel args} {
  145. set a [$self get-AllocAddrBits "new"]
  146. $a set size_ [AllocAddrBits set MAXADDRSIZE_]
  147. # By default, setting hierarchical addressing turns on hier rtg
  148. Simulator set AddressFormat_ HIER
  149. Node enable-module "Hier"
  150. if [$self multicast?] {
  151. $a set-mcastbits 1
  152. }
  153. eval $a set-idbits $hlevel $args
  154. }
  155. # Sets address for nodeid and port fields
  156. # The order of setting bits for different fields does matter and should 
  157. # be as follows:
  158. #   mcast
  159. #   idbits
  160. #   portbits
  161. # this is true for both set-address and set-hieraddress
  162. Simulator instproc set-address {node} {
  163. set a [$self get-AllocAddrBits "new"]
  164. $a set size_ [AllocAddrBits set DEFADDRSIZE_]
  165. if {[expr $node] > [$a set size_]} {
  166. $a set size_ [AllocAddrBits set MAXADDRSIZE_]
  167. }
  168. # One bit is set aside for mcast as default :: this waste of 1 bit 
  169. # may be avoided, if mcast option is enabled before the initialization
  170. # of Simulator.
  171. $a set-mcastbits 1
  172. set lastbit [expr $node - [$a set mcastsize_]]
  173. $a set-idbits 1 $lastbit
  174. }
  175. Simulator instproc get-AllocAddrBits {prog} {
  176. $self instvar allocAddr_
  177. if ![info exists allocAddr_] {
  178. set allocAddr_ [new AllocAddrBits]
  179. } elseif ![string compare $prog "new"] {
  180. set allocAddr_ [new AllocAddrBits]
  181. }
  182. return $allocAddr_
  183. }
  184. Simulator instproc expand-port-field-bits nbits {
  185. # The function is obsolete, given that ports are now 32 bits wide
  186. puts "Warning: Simulator::expand-port-field-bits is obsolete.  Ports are 32 bits wide"
  187. return
  188. }
  189. Simulator instproc expand-address {} {
  190. puts "Warning: Simulator::expand-address is obsolete.  The node address is 32 bits wide"
  191. return
  192. }
  193. AllocAddrBits instproc init {} {
  194. eval $self next
  195. $self instvar size_ portsize_ idsize_ mcastsize_
  196. set size_ 0
  197. set portsize_ 0
  198. set idsize_ 0
  199. set mcastsize_ 0
  200. }
  201. AllocAddrBits instproc get-AllocAddr {} {
  202. $self instvar addrStruct_
  203. if ![info exists addrStruct_] {
  204. set addrStruct_ [new AllocAddr]
  205. }
  206. return $addrStruct_
  207. }
  208. AllocAddrBits instproc get-Address {} {
  209. $self instvar address_
  210. if ![info exists address_] {
  211. set address_ [new Address]
  212. }
  213. return $address_
  214. }
  215. AllocAddrBits instproc chksize {bit_num prog} {
  216. $self instvar size_ portsize_ idsize_ mcastsize_  
  217. if {$bit_num <= 0 } {
  218. error "$prog : # bits less than 1"
  219. }
  220. set totsize [expr $portsize_ + $idsize_ + $mcastsize_]
  221. if {$totsize > [AllocAddrBits set MAXADDRSIZE_]} {
  222. error "$prog : Total # bits exceed MAXADDRSIZE"
  223. }
  224. if { $size_ < [AllocAddrBits set MAXADDRSIZE_]} {
  225. if {$totsize > [AllocAddrBits set DEFADDRSIZE_]} {
  226. set size_ [AllocAddrBits set MAXADDRSIZE_]
  227. return 1
  228. }
  229. return 0
  230. }
  231. AllocAddrBits instproc set-portbits {bit_num} {
  232. # The function is obsolete, given that ports are now 32 bits wide
  233. puts "Warning: AllocAddrBits::set-portbits is obsolete.  Ports are 32 bits wide."
  234. return
  235. }
  236. AllocAddrBits instproc expand-portbits nbits {
  237. # The function is obsolete, given that ports are now 32 bits wide
  238. puts "Warning: AllocAddrBits::expand-portbits is obsolete.  Ports are 32 bits wide."
  239. return
  240. }
  241. AllocAddrBits instproc set-mcastbits {bit_num} {
  242. $self instvar size_ mcastsize_
  243. if {$bit_num != 1} {
  244. error "setmcast : mcastbit > 1"
  245. }
  246. set mcastsize_ $bit_num
  247. #chk to ensure there;s no change in size
  248. if [$self chksize mcastsize_ "setmcast"] {
  249. # assert {$chk == 0} --> assert doesn't seem to work
  250. error "set-mcastbits: size_ has been changed."
  251. }
  252. set a [$self get-AllocAddr] 
  253. set v [$a setbit $bit_num $size_]
  254. AddrParams McastMask [lindex $v 0]
  255. AddrParams McastShift [lindex $v 1]
  256. ### TESTING
  257. # set mask [lindex $v 0]
  258. # set shift [lindex $v 1]
  259. # puts "Mcastshift = $shift n McastMask = $maskn"
  260. set ad [$self get-Address]
  261. $ad mcastbits-are [AddrParams McastShift] [AddrParams McastMask]
  262. }
  263. AllocAddrBits instproc set-idbits {nlevel args} {
  264. $self instvar size_ portsize_ idsize_ hlevel_ hbits_
  265. if {$nlevel != [llength $args]} {
  266. error "setid: hlevel < 1 OR nlevel and # args donot match"
  267. }
  268. set a [$self get-AllocAddr] 
  269. set old 0
  270. set idsize_ 0
  271. set nodebits 0
  272. # Set two global variables
  273. AddrParams hlevel $nlevel
  274. set hlevel_ $nlevel
  275. for {set i 0} {$i < $nlevel} {incr i} {
  276. set bpl($i) [lindex $args $i]
  277. set idsize_ [expr $idsize_ + $bpl($i)]
  278. # check to ensure there's no change in size
  279. set chk [$self chksize $bpl($i) "setid"]
  280. # assert {$chk ==0}
  281. if {$chk > 0} {
  282. error "set-idbits: size_ has been changed."
  283. }
  284. set v [$a setbit $bpl($i) $size_]
  285. AddrParams NodeMask [expr $i+1] [lindex $v 0]
  286. set m([expr $i+1]) [lindex $v 0]
  287. AddrParams NodeShift [expr $i+1] [lindex $v 1]
  288. set s([expr $i+1]) [lindex $v 1]
  289. lappend hbits_ $bpl($i)
  290. }
  291. AddrParams nodebits $idsize_
  292. set ad [$self get-Address]
  293. eval $ad idsbits-are [array get s]
  294. eval $ad idmbits-are [array get m]
  295. eval $ad bpl-are $hbits_
  296. ### TESTING
  297. # set mask [lindex $v 0]
  298. # set shift [lindex $v 1]
  299. # puts "Nodeshift = $shift n NodeMask = $maskn"
  300. }
  301. # Create an integer address from addr string 
  302. AddrParams proc addr2id addrstr {
  303. if [Simulator hier-addr?] {
  304. set addressObj [[[Simulator instance] get-AllocAddrBits ""] 
  305. get-Address]
  306. return [$addressObj str2addr $addrstr]
  307. } else {
  308. return [expr $addrstr & [AddrParams NodeMask 1] << 
  309. [AddrParams NodeShift 1]]
  310. }
  311. }
  312. # Returns address string from an integer address: reverse of set-hieraddr.
  313. AddrParams proc id2addr addr {
  314. for {set i 1} {$i <= [AddrParams hlevel]} {incr i} {
  315. set a [expr ($addr >> [AddrParams NodeShift $i]) & 
  316. [AddrParams NodeMask $i]]
  317. lappend str $a
  318. }
  319. return $str
  320. }
  321. # Splitting up address string
  322. AddrParams proc split-addrstr addrstr {
  323. return [split $addrstr .]
  324. }
  325. # Returns number of elements at a given hierarchical level, that is visible to 
  326. # a node.
  327. AddrParams proc elements-in-level? {nodeaddr level} {
  328. AddrParams instvar domain_num_ cluster_num_ nodes_num_ 
  329. set L [AddrParams split-addrstr $nodeaddr]
  330. set level [expr $level + 1]
  331. #
  332. # if no topology info found for last level, set default values
  333. #
  334. # For now, assuming only 3 levels of hierarchy 
  335. if { $level == 1} {
  336. return $domain_num_
  337. }
  338. if { $level == 2} {
  339. return [lindex $cluster_num_ [lindex $L 0]]
  340. }
  341. if { $level == 3} {
  342. set C 0
  343. set index 0
  344. while {$C < [lindex $L 0]} {
  345. set index [expr $index + [lindex $cluster_num_ $C]]
  346. incr C
  347. }
  348. return [lindex $nodes_num_ [expr $index + [lindex $L 1]]]
  349. }
  350. }