Thursday 12 May 2016

NS PACKET TCL


#
# set up the packet format for the simulation
# (initial version)
#

#
# XXX Packet Header Usage Guide
#
# By default, ns includes ALL packet headers of ALL protocols in ns in
# EVERY packet in your simulation. This is a LOT, and will increase as more
# protocols are added into ns. For "packet-intensive" simulations, this could
# be a huge overhead.
#
# To include only the packet headers that are of interest to you in your
# specific simulation, follow this pattern (e.g., you want to remove AODV,
# and ARP headers from your simulation):
#
#   remove-packet-header AODV ARP
#   ...
#   set ns [new Simulator]
#
# NOTICE THAT ADD-PACKET-HEADER{} MUST GO BEFORE THE SIMULATOR IS CREATED.
#
# To include only a specific set of headers in your simulation, e.g., AODV
# and ARP, follow this pattern:
#
#   remove-all-packet-headers
#   add-packet-header AODV ARP
#   ...
#   set ns [new Simulator]
#
# IMPORTANT: You MUST never remove common header from your simulation.
# As you can see, this is also enforced by these header manipulation procs.
#

PacketHeaderManager set hdrlen_ 0

# XXX Common header should ALWAYS be present
PacketHeaderManager set tab_(Common) 1

proc add-packet-header args {
    foreach cl $args {
        PacketHeaderManager set tab_(PacketHeader/$cl) 1
    }
}

proc add-all-packet-headers {} {
    PacketHeaderManager instvar tab_
    foreach cl [PacketHeader info subclass] {
        if [info exists tab_($cl)] {
            PacketHeaderManager set tab_($cl) 1
        }
    }
}

proc remove-packet-header args {
    foreach cl $args {
        if { $cl == "Common" } {
            warn "Cannot exclude common packet header."
            continue
        }
        PacketHeaderManager unset tab_(PacketHeader/$cl)
    }
}

proc remove-all-packet-headers {} {
    PacketHeaderManager instvar tab_
    foreach cl [PacketHeader info subclass] {
        if { $cl != "PacketHeader/Common" } {
            if [info exists tab_($cl)] {
                PacketHeaderManager unset tab_($cl)
            }
        }
    }
}

set protolist {
# Common:
    Common
    Flags
    IP     # IP
# Routing Protocols:
    NV     # NixVector classifier for stateless routing
    rtProtoDV     # distance vector routing protocol
    rtProtoLS     # link state routing protocol
    SR     # source routing, dsr/hdr_sr.cc
    Src_rt     # source routing, src_rtg/hdr_src.cc
# Routers:
    LDP     # mpls/ldp.cc
    MPLS     # MPLS, MultiProtocol Label Switching
    Resv     # Token buckets, for reservations.
    UMP     # Admission control, adc/ump.cc
    Pushback     # Pushback, router-to-router
# Multicast:
      aSRM     # mcast/srm.cc
    CtrMcast     # Centralized Multicast routing
    mcastCtrl     # mcast/mcast_ctrl.cc
    MFTP     # Multicast File Transfer Protocol
    PGM     # PGM multicast
    PGM_SPM # PGM multicast
    PGM_NAK # PGM multicast
      SRM     # SRM, multicast
      SRMEXT     # SRM, multicast
# Transport Protocols and related protocols:
    HttpInval     # HTTP
    IVS     # Inria video conferencing system
    QS     # Quick-Start
    RAP     # Rate Adaption Protocol, transport protocol.
    RTP     # RTP.  Also used for UPD traffic.
    SCTP     # SCTP, transport protocol
    Snoop     # tcp/snoop.cc
    TCP     # TCP, transport protocol
    TCPA     # Asymmetric TCP, transport protocol
    TFRC     # TFRC, transport protocol
    TFRC_ACK     # TFRC, transport protocol
    XCP     # XCP, transport protocol
        DCCP            # DCCP, transport protocol
        DCCP_ACK        # DCCP, transport protocol
        DCCP_RESET      # DCCP, transport protocol
        DCCP_REQ        # DCCP, transport protocol
        DCCP_RESP       # DCCP, transport protocol
        DCCP_DATA       # DCCP, transport protocol
        DCCP_DATAACK    # DCCP, transport protocol
        DCCP_CLOSE      # DCCP, transport protocol
        DCCP_CLOSEREQ   # DCCP, transport protocol
# Application-Layer Protocols:
    Message # a protocol to carry text messages
    Ping     # Ping
    PBC     # PBC
# Wireless:
    ARP     # Address Resolution Protocol, network wireless stack
    GAF     # Geographic Adaptive Delity, for ad-hoc networks
    LL     # network wireless stack
        LRWPAN  # zheng, wpan/p802_15_4mac.cc
    Mac     # network wireless stack
# Mobility, Ad-Hoc Networks, Sensor Nets:
    AODV     # routing protocol for ad-hoc networks
    Diffusion     # diffusion/diffusion.cc
    IMEP     # Internet MANET Encapsulation Protocol, for ad-hoc networks
        MIP     # Mobile IP, mobile/mip-reg.cc
    Smac     # Sensor-MAC
    TORA     # routing protocol for ad-hoc networks
    MDART     # routing protocol for ad-hoc networks
    # AOMDV patch
    AOMDV
    OLSR    # routing protocol for ad-hoc networks

# Other:
    Encap     # common/encap.cc
        IPinIP     # IP encapsulation
    HDLC     # High Level Data Link Control
}
set allhdrs [regsub -all {#.*?\n} $protolist \n]; # strip comments from above
foreach prot $allhdrs {
    add-packet-header $prot
}

proc PktHdr_offset { hdrName {field ""} } {
    set offset [$hdrName offset]
    if { $field != "" } {
        # This requires that fields inside the packet header must
        # be exported via PacketHeaderClass::export_offsets(), which
        # should use PacketHeaderClass::field_offset() to export
        # field offsets into otcl space.
        incr offset [$hdrName set offset_($field)]
    }
    return $offset
}

Simulator instproc create_packetformat { } {
    PacketHeaderManager instvar tab_
    set pm [new PacketHeaderManager]
    foreach cl [PacketHeader info subclass] {
        if [info exists tab_($cl)] {
            set off [$pm allochdr $cl]
            $cl offset $off
        }
    }
    $self set packetManager_ $pm
}

PacketHeaderManager instproc allochdr cl {
    set size [$cl set hdrlen_]

    $self instvar hdrlen_
    set NS_ALIGN 8
    # round up to nearest NS_ALIGN bytes
    # (needed on sparc/solaris)
    set incr [expr ($size + ($NS_ALIGN-1)) & ~($NS_ALIGN-1)]
    set base $hdrlen_
    incr hdrlen_ $incr

    return $base
}

# XXX Old code. Do NOT delete for now. - Aug 30, 2000

# Initialization
#  foreach cl [PacketHeader info subclass] {
#      PacketHeaderManager set vartab_($cl) ""
#  }

# So that not all packet headers should be initialized here.
# E.g., the link state routing header is initialized using this proc in
# ns-rtProtoLS.tcl; because link state may be turned off when STL is not
# available, this saves us a ns-packet.tcl.in
#  proc create-packet-header { cl var } {
#      PacketHeaderManager set vartab_(PacketHeader/$cl) $var
#  }

# If you need to save some memory, you can disable unneeded packet headers
# by commenting them out from the list below
#  foreach pair {
#      { Common off_cmn_ }
#      { Mac off_mac_ }
#      { LL off_ll_ }
#      { ARP off_arp_ }
#      { Snoop off_snoop_ }
#      { SR off_SR_ }
#      { IP off_ip_ }
#      { TCP off_tcp_ }
#      { TCPA off_tcpasym_ }
#      { Flags off_flags_ }
#      { TORA off_TORA_ }
#      { AODV off_AODV_ }
#      { IMEP off_IMEP_ }
#      { RTP off_rtp_ }
#      { Message off_msg_ }
#      { IVS off_ivs_ }
#      { rtProtoDV off_DV_ }
#      { CtrMcast off_CtrMcast_ }
#      { mcastCtrl off_mcast_ctrl_ }
#        { aSRM off_asrm_ }
#        { SRM off_srm_ }
#        { SRMEXT off_srm_ext_}
#      { Resv off_resv_}
#      { HttpInval off_inv_}
#          { IPinIP off_ipinip_}
#          { MIP off_mip_}
#      { MFTP off_mftp_ }
#      { Encap off_encap_ }
#      { RAP off_rap_ }
#      { UMP off_ump_  }
#      { TFRC off_tfrm_ }
#      { Ping off_ping_ }
#      { rtProtoLS off_LS_ }
#      { MPLS off_mpls_ }
#    { GAF off_gaf_ }
#      { LDP off_ldp_ }
#  } {
#      create-packet-header [lindex $pair 0] [lindex $pair 1]
#  }

#  proc PktHdr_offset {hdrName {field ""}} {
#      set var [PacketHeaderManager set vartab_($hdrName)]
#      set offset [TclObject set $var]
#      if {$field != ""} {
#          incr offset [$hdrName set offset_($field)]
#      }
#      return $offset
#  }

#  Simulator instproc create_packetformat { } {
#      PacketHeaderManager instvar vartab_
#      set pm [new PacketHeaderManager]
#      foreach cl [PacketHeader info subclass] {
#          if {[info exists vartab_($cl)] && $vartab_($cl) != ""} {
#              set off [$pm allochdr [lindex [split $cl /] 1]]
#              set var [PacketHeaderManager set vartab_($cl)]
#              TclObject set $var $off
#              $cl offset $off
#          }
#      }
#      $self set packetManager_ $pm
#  }

No comments:

Post a Comment