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

通讯编程

开发平台:

Visual C++

  1. # -*- Mode:tcl; tcl-indent-level:8; tab-width:8; indent-tabs-mode:t -*-
  2. #
  3. # Time-stamp: <2000-08-31 19:01:26 haoboy>
  4. #
  5. # Copyright (c) 1997 Regents of the University of California.
  6. # All rights reserved.
  7. # Redistribution and use in source and binary forms, with or without
  8. # modification, are permitted provided that the following conditions
  9. # are met:
  10. # 1. Redistributions of source code must retain the above copyright
  11. #    notice, this list of conditions and the following disclaimer.
  12. # 2. Redistributions in binary form must reproduce the above copyright
  13. #    notice, this list of conditions and the following disclaimer in the
  14. #    documentation and/or other materials provided with the distribution.
  15. # 3. All advertising materials mentioning features or use of this software
  16. #    must display the following acknowledgement:
  17. #  This product includes software developed by the MASH Research
  18. #  Group at the University of California Berkeley.
  19. # 4. Neither the name of the University nor of the Research Group may be
  20. #    used to endorse or promote products derived from this software without
  21. #    specific prior written permission.
  22. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32. # SUCH DAMAGE.
  33. #
  34. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/lib/ns-packet.tcl,v 1.56 2008/02/01 21:39:42 tom_henderson Exp $
  35. #
  36. # set up the packet format for the simulation
  37. # (initial version)
  38. #
  39. #
  40. # XXX Packet Header Usage Guide
  41. #
  42. # By default, ns includes ALL packet headers of ALL protocols in ns in 
  43. # EVERY packet in your simulation. This is a LOT, and will increase as more
  44. # protocols are added into ns. For "packet-intensive" simulations, this could
  45. # be a huge overhead.
  46. #
  47. # To include only the packet headers that are of interest to you in your 
  48. # specific simulation, follow this pattern (e.g., you want to remove AODV,
  49. # and ARP headers from your simulation):
  50. #
  51. #   remove-packet-header AODV ARP
  52. #   ...
  53. #   set ns [new Simulator]
  54. #
  55. # NOTICE THAT ADD-PACKET-HEADER{} MUST GO BEFORE THE SIMULATOR IS CREATED.
  56. #
  57. # To include only a specific set of headers in your simulation, e.g., AODV
  58. # and ARP, follow this pattern:
  59. #
  60. #   remove-all-packet-headers
  61. #   add-packet-header AODV ARP
  62. #   ... 
  63. #   set ns [new Simulator]
  64. #
  65. # IMPORTANT: You MUST never remove common header from your simulation. 
  66. # As you can see, this is also enforced by these header manipulation procs.
  67. #
  68. PacketHeaderManager set hdrlen_ 0
  69. # XXX Common header should ALWAYS be present
  70. PacketHeaderManager set tab_(Common) 1
  71. proc add-packet-header args {
  72. foreach cl $args {
  73. PacketHeaderManager set tab_(PacketHeader/$cl) 1
  74. }
  75. }
  76. proc add-all-packet-headers {} {
  77. PacketHeaderManager instvar tab_
  78. foreach cl [PacketHeader info subclass] {
  79. if [info exists tab_($cl)] { 
  80. PacketHeaderManager set tab_($cl) 1
  81. }
  82. }
  83. }
  84. proc remove-packet-header args {
  85. foreach cl $args {
  86. if { $cl == "Common" } {
  87. warn "Cannot exclude common packet header."
  88. continue
  89. }
  90. PacketHeaderManager unset tab_(PacketHeader/$cl)
  91. }
  92. }
  93. proc remove-all-packet-headers {} {
  94. PacketHeaderManager instvar tab_
  95. foreach cl [PacketHeader info subclass] {
  96. if { $cl != "PacketHeader/Common" } {
  97. if [info exists tab_($cl)] { 
  98. PacketHeaderManager unset tab_($cl)
  99. }
  100. }
  101. }
  102. }
  103. foreach prot {
  104. # Common:
  105. Common 
  106. Flags
  107. IP  # IP
  108. # Routing Protocols:
  109. NV  # NixVector classifier for stateless routing 
  110. rtProtoDV  # distance vector routing protocol
  111. rtProtoLS  # link state routing protocol
  112. SR  # source routing, dsr/hdr_sr.cc
  113. Src_rt  # source routing, src_rtg/hdr_src.cc
  114. # Routers:
  115. LDP  # mpls/ldp.cc
  116. MPLS  # MPLS, MultiProtocol Label Switching
  117. Resv  # Token buckets, for reservations.
  118. UMP  # Admission control, adc/ump.cc
  119. Pushback  # Pushback, router-to-router
  120. # Multicast:
  121.    aSRM  # mcast/srm.cc
  122. CtrMcast  # Centralized Multicast routing
  123. mcastCtrl  # mcast/mcast_ctrl.cc
  124. MFTP  # Multicast File Transfer Protocol
  125. PGM  # PGM multicast
  126. PGM_SPM # PGM multicast
  127. PGM_NAK # PGM multicast
  128.    SRM  # SRM, multicast
  129.    SRMEXT  # SRM, multicast
  130. # Transport Protocols and related protocols:
  131. HttpInval  # HTTP
  132. IVS  # Inria video conferencing system 
  133. QS  # Quick-Start
  134. RAP  # Rate Adaption Protocol, transport protocol.
  135. RTP  # RTP.  Also used for UPD traffic.
  136. SCTP  # SCTP, transport protocol
  137. Snoop  # tcp/snoop.cc
  138. TCP  # TCP, transport protocol
  139. TCPA  # Asymmetric TCP, transport protocol
  140. TFRC  # TFRC, transport protocol
  141. TFRC_ACK  # TFRC, transport protocol
  142. XCP  # XCP, transport protocol
  143. # Application-Layer Protocols:
  144. Message # a protocol to carry text messages
  145. Ping  # Ping
  146.     PBC     # PBC
  147. # Wireless:
  148. ARP  # Address Resolution Protocol, network wireless stack
  149. GAF  # Geographic Adaptive Delity, for ad-hoc networks
  150. LL  # network wireless stack
  151.         LRWPAN  # zheng, wpan/p802_15_4mac.cc
  152. Mac  # network wireless stack
  153. # Mobility, Ad-Hoc Networks, Sensor Nets:
  154. AODV  # routing protocol for ad-hoc networks
  155. Diffusion  # diffusion/diffusion.cc
  156. IMEP  # Internet MANET Encapsulation Protocol, for ad-hoc networks
  157.         MIP  # Mobile IP, mobile/mip-reg.cc
  158. Smac  # Sensor-MAC
  159. TORA  # routing protocol for ad-hoc networks
  160. # Other:
  161. Encap  # common/encap.cc
  162.         IPinIP  # IP encapsulation 
  163. HDLC  # High Level Data Link Control
  164. } {
  165. add-packet-header $prot
  166. }
  167. proc PktHdr_offset { hdrName {field ""} } {
  168. set offset [$hdrName offset]
  169. if { $field != "" } {
  170. # This requires that fields inside the packet header must
  171. # be exported via PacketHeaderClass::export_offsets(), which
  172. # should use PacketHeaderClass::field_offset() to export 
  173. # field offsets into otcl space.
  174. incr offset [$hdrName set offset_($field)]
  175. }
  176. return $offset
  177. }
  178. Simulator instproc create_packetformat { } {
  179. PacketHeaderManager instvar tab_
  180. set pm [new PacketHeaderManager]
  181. foreach cl [PacketHeader info subclass] {
  182. if [info exists tab_($cl)] {
  183. set off [$pm allochdr $cl]
  184. $cl offset $off
  185. }
  186. }
  187. $self set packetManager_ $pm
  188. }
  189. PacketHeaderManager instproc allochdr cl {
  190. set size [$cl set hdrlen_]
  191. $self instvar hdrlen_
  192. set NS_ALIGN 8
  193. # round up to nearest NS_ALIGN bytes
  194. # (needed on sparc/solaris)
  195. set incr [expr ($size + ($NS_ALIGN-1)) & ~($NS_ALIGN-1)]
  196. set base $hdrlen_
  197. incr hdrlen_ $incr
  198. return $base
  199. }
  200. # XXX Old code. Do NOT delete for now. - Aug 30, 2000
  201. # Initialization
  202. #  foreach cl [PacketHeader info subclass] {
  203. #   PacketHeaderManager set vartab_($cl) ""
  204. #  }
  205. # So that not all packet headers should be initialized here.
  206. # E.g., the link state routing header is initialized using this proc in 
  207. # ns-rtProtoLS.tcl; because link state may be turned off when STL is not 
  208. # available, this saves us a ns-packet.tcl.in
  209. #  proc create-packet-header { cl var } {
  210. #   PacketHeaderManager set vartab_(PacketHeader/$cl) $var
  211. #  }
  212. # If you need to save some memory, you can disable unneeded packet headers
  213. # by commenting them out from the list below
  214. #  foreach pair {
  215. #   { Common off_cmn_ }
  216. #   { Mac off_mac_ }
  217. #   { LL off_ll_ }
  218. #   { ARP off_arp_ }
  219. #   { Snoop off_snoop_ }
  220. #   { SR off_SR_ }
  221. #   { IP off_ip_ }
  222. #   { TCP off_tcp_ }
  223. #   { TCPA off_tcpasym_ }
  224. #   { Flags off_flags_ }
  225. #   { TORA off_TORA_ }
  226. #   { AODV off_AODV_ }
  227. #   { IMEP off_IMEP_ }
  228. #   { RTP off_rtp_ } 
  229. #   { Message off_msg_ }
  230. #   { IVS off_ivs_ }
  231. #   { rtProtoDV off_DV_ }
  232. #   { CtrMcast off_CtrMcast_ }
  233. #   { mcastCtrl off_mcast_ctrl_ }
  234. #     { aSRM off_asrm_ }
  235. #     { SRM off_srm_ }
  236. #     { SRMEXT off_srm_ext_}
  237. #   { Resv off_resv_}
  238. #   { HttpInval off_inv_}
  239. #          { IPinIP off_ipinip_} 
  240. #          { MIP off_mip_}
  241. #   { MFTP off_mftp_ }
  242. #   { Encap off_encap_ }
  243. #   { RAP off_rap_ }
  244. #   { UMP off_ump_  }
  245. #   { TFRC off_tfrm_ }
  246. #   { Ping off_ping_ }
  247. #   { rtProtoLS off_LS_ }
  248. #   { MPLS off_mpls_ }
  249. # { GAF off_gaf_ } 
  250. #   { LDP off_ldp_ }
  251. #  } {
  252. #   create-packet-header [lindex $pair 0] [lindex $pair 1]
  253. #  }
  254. #  proc PktHdr_offset {hdrName {field ""}} {
  255. #   set var [PacketHeaderManager set vartab_($hdrName)]
  256. #   set offset [TclObject set $var]
  257. #   if {$field != ""} {
  258. #   incr offset [$hdrName set offset_($field)]
  259. #   }
  260. #   return $offset
  261. #  }
  262. #  Simulator instproc create_packetformat { } {
  263. #   PacketHeaderManager instvar vartab_
  264. #   set pm [new PacketHeaderManager]
  265. #   foreach cl [PacketHeader info subclass] {
  266. #   if {[info exists vartab_($cl)] && $vartab_($cl) != ""} {
  267. #   set off [$pm allochdr [lindex [split $cl /] 1]]
  268. #   set var [PacketHeaderManager set vartab_($cl)]
  269. #   TclObject set $var $off
  270. #   $cl offset $off
  271. #   }
  272. #   }
  273. #   $self set packetManager_ $pm
  274. #  }