ns-packet.tcl
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:9k
源码类别:

网络

开发平台:

C/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: /nfs/jade/vint/CVSROOT/ns-2/tcl/lib/ns-packet.tcl,v 1.55 2005/06/17 17:41:16 sfloyd 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. # Wireless:
  147. ARP  # Address Resolution Protocol, network wireless stack
  148. GAF  # Geographic Adaptive Delity, for ad-hoc networks
  149. LL  # network wireless stack
  150.         LRWPAN  # zheng, wpan/p802_15_4mac.cc
  151. Mac  # network wireless stack
  152. # Mobility, Ad-Hoc Networks, Sensor Nets:
  153. AODV  # routing protocol for ad-hoc networks
  154. Diffusion  # diffusion/diffusion.cc
  155. IMEP  # Internet MANET Encapsulation Protocol, for ad-hoc networks
  156.         MIP  # Mobile IP, mobile/mip-reg.cc
  157. Smac  # Sensor-MAC
  158. TORA  # routing protocol for ad-hoc networks
  159. # Other:
  160. Encap  # common/encap.cc
  161.         IPinIP  # IP encapsulation 
  162. HDLC  # High Level Data Link Control
  163. # WIMAX:
  164.         802_16  # Mac IEEE 802.16
  165. } {
  166. add-packet-header $prot
  167. }
  168. proc PktHdr_offset { hdrName {field ""} } {
  169. set offset [$hdrName offset]
  170. if { $field != "" } {
  171. # This requires that fields inside the packet header must
  172. # be exported via PacketHeaderClass::export_offsets(), which
  173. # should use PacketHeaderClass::field_offset() to export 
  174. # field offsets into otcl space.
  175. incr offset [$hdrName set offset_($field)]
  176. }
  177. return $offset
  178. }
  179. Simulator instproc create_packetformat { } {
  180. PacketHeaderManager instvar tab_
  181. set pm [new PacketHeaderManager]
  182. foreach cl [PacketHeader info subclass] {
  183. if [info exists tab_($cl)] {
  184. set off [$pm allochdr $cl]
  185. $cl offset $off
  186. }
  187. }
  188. $self set packetManager_ $pm
  189. }
  190. PacketHeaderManager instproc allochdr cl {
  191. set size [$cl set hdrlen_]
  192. $self instvar hdrlen_
  193. set NS_ALIGN 8
  194. # round up to nearest NS_ALIGN bytes
  195. # (needed on sparc/solaris)
  196. set incr [expr ($size + ($NS_ALIGN-1)) & ~($NS_ALIGN-1)]
  197. set base $hdrlen_
  198. incr hdrlen_ $incr
  199. return $base
  200. }
  201. # XXX Old code. Do NOT delete for now. - Aug 30, 2000
  202. # Initialization
  203. #  foreach cl [PacketHeader info subclass] {
  204. #   PacketHeaderManager set vartab_($cl) ""
  205. #  }
  206. # So that not all packet headers should be initialized here.
  207. # E.g., the link state routing header is initialized using this proc in 
  208. # ns-rtProtoLS.tcl; because link state may be turned off when STL is not 
  209. # available, this saves us a ns-packet.tcl.in
  210. #  proc create-packet-header { cl var } {
  211. #   PacketHeaderManager set vartab_(PacketHeader/$cl) $var
  212. #  }
  213. # If you need to save some memory, you can disable unneeded packet headers
  214. # by commenting them out from the list below
  215. #  foreach pair {
  216. #   { Common off_cmn_ }
  217. #   { Mac off_mac_ }
  218. #   { LL off_ll_ }
  219. #   { ARP off_arp_ }
  220. #   { Snoop off_snoop_ }
  221. #   { SR off_SR_ }
  222. #   { IP off_ip_ }
  223. #   { TCP off_tcp_ }
  224. #   { TCPA off_tcpasym_ }
  225. #   { Flags off_flags_ }
  226. #   { TORA off_TORA_ }
  227. #   { AODV off_AODV_ }
  228. #   { IMEP off_IMEP_ }
  229. #   { RTP off_rtp_ } 
  230. #   { Message off_msg_ }
  231. #   { IVS off_ivs_ }
  232. #   { rtProtoDV off_DV_ }
  233. #   { CtrMcast off_CtrMcast_ }
  234. #   { mcastCtrl off_mcast_ctrl_ }
  235. #     { aSRM off_asrm_ }
  236. #     { SRM off_srm_ }
  237. #     { SRMEXT off_srm_ext_}
  238. #   { Resv off_resv_}
  239. #   { HttpInval off_inv_}
  240. #          { IPinIP off_ipinip_} 
  241. #          { MIP off_mip_}
  242. #   { MFTP off_mftp_ }
  243. #   { Encap off_encap_ }
  244. #   { RAP off_rap_ }
  245. #   { UMP off_ump_  }
  246. #   { TFRC off_tfrm_ }
  247. #   { Ping off_ping_ }
  248. #   { rtProtoLS off_LS_ }
  249. #   { MPLS off_mpls_ }
  250. # { GAF off_gaf_ } 
  251. #   { LDP off_ldp_ }
  252. #  } {
  253. #   create-packet-header [lindex $pair 0] [lindex $pair 1]
  254. #  }
  255. #  proc PktHdr_offset {hdrName {field ""}} {
  256. #   set var [PacketHeaderManager set vartab_($hdrName)]
  257. #   set offset [TclObject set $var]
  258. #   if {$field != ""} {
  259. #   incr offset [$hdrName set offset_($field)]
  260. #   }
  261. #   return $offset
  262. #  }
  263. #  Simulator instproc create_packetformat { } {
  264. #   PacketHeaderManager instvar vartab_
  265. #   set pm [new PacketHeaderManager]
  266. #   foreach cl [PacketHeader info subclass] {
  267. #   if {[info exists vartab_($cl)] && $vartab_($cl) != ""} {
  268. #   set off [$pm allochdr [lindex [split $cl /] 1]]
  269. #   set var [PacketHeaderManager set vartab_($cl)]
  270. #   TclObject set $var $off
  271. #   $cl offset $off
  272. #   }
  273. #   }
  274. #   $self set packetManager_ $pm
  275. #  }