[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ns] Failure in applying the patch in Greis's tutorial in chapter VI



Hello

I am a newbie in ns and I learn ns through Marc Greis's tutorial.
When I come to chapter VI Network Dynamics, I found that there
wasn't any traffic for DV routing. So I applied the patch from

http://www-mash.cs.berkeley.edu/dist/archive/ns-users/0002/0274.html

to the source route-proto.tcl and rtProtoDV.cc
Afterwards I "make" and "./validate" then run ./ns example3.tcl
There were errors and couldn't start the simulation. The following
is the error :

;------------------------ error
-------------------------------------------

no value given for parameter "agentPort" to "_o198"
   (Agent/rtProto/DV add-peer line 1)
   invoked from within
"$proto($node) add-peer $nbr [$rtproto set agent_addr_][$rtproto set
agent_port_]"
   (procedure "Agent/rtProto/DV" line 18)
   (Agent/rtProto/DV init_all line 18)
   invoked from within
"Agent/rtProto/DV init-all"
   ("eval" body line 1)
   invoked from within
"eval Agent/rtProto/$proto init-all $rtprotos_($proto)"
   (procedure "_o10" line 5)
   (RouteLogic configure line 5)
   invoked from within
"[$self get-routelogic] configure"
   (procedure "_03" line 5)
   (Simulator run line 5)
   invoked from within
"$ns run"

;------------------------ error
-------------------------------------------

Could anyone please tell me what might be wrong ?

Thank you very much.
Bye.



Here is the source files:

;-------------------------route-proto.tcl
---------------------------------

#
#  Copyright (c) 1997 by the University of Southern California
#  All rights reserved.
#
#  Permission to use, copy, modify, and distribute this software and its

#  documentation in source and binary forms for non-commercial purposes
#  and without fee is hereby granted, provided that the above copyright
#  notice appear in all copies and that both the copyright notice and
#  this permission notice appear in supporting documentation. and that
#  any documentation, advertising materials, and other materials related

#  to such distribution and use acknowledge that the software was
#  developed by the University of Southern California, Information
#  Sciences Institute.  The name of the University may not be used to
#  endorse or promote products derived from this software without
#  specific prior written permission.
#
#  THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations about
#  the suitability of this software for any purpose.  THIS SOFTWARE IS
#  PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
#  INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
#  Other copyrights might apply to parts of this software and are so
#  noted when applicable.
#

#
# Maintainer: <[email protected]>.
#

# This file only contains the methods for dynamic routing
# Check ../lib/ns-route.tcl for the Simulator routing support
#

set rtglibRNG [new RNG]
$rtglibRNG seed 1

Class rtObject

rtObject set unreach_ -1
rtObject set maxpref_   255

rtObject proc init-all args {
    foreach node $args {
 if { [$node rtObject?] == "" } {
     set rtobj($node) [new rtObject $node]
 }
    }
    foreach node $args { ;# XXX
        $rtobj($node) compute-routes
    }
}

rtObject instproc init node {
    $self next
    $self instvar ns_ nullAgent_
    $self instvar nextHop_ rtpref_ metric_ node_ rtVia_ rtProtos_

    set ns_ [Simulator instance]
    set nullAgent_ [$ns_ set nullAgent_]

    $node init-routing $self
    set node_ $node
    foreach dest [$ns_ all-nodes-list] {
 set nextHop_($dest) ""
 if {$node == $dest} {
     set rtpref_($dest) 0
     set metric_($dest) 0
     set rtVia_($dest) "Agent/rtProto/Local" ;# make dump happy
 } else {
     set rtpref_($dest) [$class set maxpref_]
     set metric_($dest) [$class set unreach_]
     set rtVia_($dest)    ""
     $node add-route [$dest id] $nullAgent_
 }
    }
    $self add-proto Direct $node
    $rtProtos_(Direct) compute-routes
#    $self compute-routes
}

rtObject instproc add-proto {proto node} {
    $self instvar ns_ rtProtos_
    set rtProtos_($proto) [new Agent/rtProto/$proto $node]
    $ns_ attach-agent $node $rtProtos_($proto)
    set rtProtos_($proto)
}

rtObject instproc lookup dest {
    $self instvar nextHop_ node_
    if {![info exists nextHop_($dest)] || $nextHop_($dest) == ""} {
 return -1
    } else {
 return [[$nextHop_($dest) set toNode_] id]
    }
}

rtObject instproc compute-routes {} {
    # choose the best route to each destination from all protocols
    $self instvar ns_ node_ rtProtos_ nullAgent_
    $self instvar nextHop_ rtpref_ metric_ rtVia_
    set protos ""
    set changes 0
    foreach p [array names rtProtos_] {
 if [$rtProtos_($p) set rtsChanged_] {
     incr changes
     $rtProtos_($p) set rtsChanged_ 0
 }
 lappend protos $rtProtos_($p)
    }
    if !$changes return

    set changes 0
    foreach dst [$ns_ all-nodes-list] {
 if {$dst == $node_} continue
 set nh ""
 set pf [$class set maxpref_]
 set mt [$class set unreach_]
 set rv ""
 foreach p $protos {
     set pnh [$p set nextHop_($dst)]
     if { $pnh == "" } continue

     set ppf [$p set rtpref_($dst)]
     set pmt [$p set metric_($dst)]
     if {$ppf < $pf || ($ppf == $pf && $pmt < $mt) || $mt < 0} {
  set nh  $pnh
  set pf  $ppf
  set mt  $pmt
  set rv  $p
     }
 }
 if { $nh == "" } {
     # no route...  delete any existing routes
     if { $nextHop_($dst) != "" } {
  $node_ delete-routes [$dst id] $nextHop_($dst) $nullAgent_
  set nextHop_($dst) $nh
  set rtpref_($dst)  $pf
  set metric_($dst)  $mt
  set rtVia_($dst)   $rv
  incr changes
     }
 } else {
     if { $rv == $rtVia_($dst) } {
  # Current protocol still has best route.
  # See if changed
  if { $nh != $nextHop_($dst) } {
      $node_ delete-routes [$dst id] $nextHop_($dst) $nullAgent_
      set nextHop_($dst) $nh
      $node_ add-routes [$dst id] $nextHop_($dst)
      incr changes
  }
  if { $mt != $metric_($dst) } {
      set metric_($dst) $mt
      incr changes
  }
  if { $pf != $rtpref_($dst) } {
      set rtpref_($dst) $pf
  }
     } else {
  if { $rtVia_($dst) != "" } {
      set nextHop_($dst) [$rtVia_($dst) set nextHop_($dst)]
      set rtpref_($dst)  [$rtVia_($dst) set rtpref_($dst)]
      set metric_($dst)  [$rtVia_($dst) set metric_($dst)]
  }
  if {$rtpref_($dst) != $pf || $metric_($dst) != $mt} {
      # Then new prefs must be better, or
      # new prefs are equal, and new metrics are lower
      $node_ delete-routes [$dst id] $nextHop_($dst) $nullAgent_
      set nextHop_($dst) $nh
      set rtpref_($dst)  $pf
      set metric_($dst)  $mt
      set rtVia_($dst)   $rv
      $node_ add-routes [$dst id] $nextHop_($dst)
      incr changes
  }
     }
 }
    }
    foreach proto [array names rtProtos_] {
 $rtProtos_($proto) send-updates $changes
    }
    #
    # XXX
    # detailed multicast routing hooks must come here.
    # My idea for the hook will be something like:
    # set mrtObject [$node_ mrtObject?]
    # if {$mrtObject != ""} {
    #    $mrtObject recompute-mroutes $changes
    # }
    # $changes == 0 if only interfaces changed state.  Look at how
    #   Agent/rtProto/DV handles ifsUp_
    # $changes > 0 if new unicast routes were installed.
    #
    $self flag-multicast $changes
}

rtObject instproc flag-multicast changes {
    $self instvar node_
    $node_ notify-mcast $changes
}

rtObject instproc intf-changed {} {
    $self instvar ns_ node_ rtProtos_ rtVia_ nextHop_ rtpref_ metric_
    foreach p [array names rtProtos_] {
 $rtProtos_($p) intf-changed
 $rtProtos_($p) compute-routes
    }
    $self compute-routes
}

rtObject instproc dump-routes chan {
    $self instvar ns_ node_ nextHop_ rtpref_ metric_ rtVia_

#    if {[info proc SplitObjectCompare] == ""} {
#        # XXX: in tcl8 we need to find this in the global namespace
#        if {[info proc ::SplitObjectCompare] == {}} {
#            puts stderr "${class}::${proc} failed.  Update your TclCL
library"
#            return
#        }
#    }

    if {$ns_ != ""} {
 set time [$ns_ now]
    } else {
 set time 0.0
    }
    puts $chan [concat "Node:\t${node_}([$node_ id])\tat t ="  \
     [format "%4.2f" $time]]
    puts $chan "  Dest\t\t nextHop\tPref\tMetric\tProto"
    foreach dest [lsort -command SplitObjectCompare [$ns_
all-nodes-list]] {
 if {[llength $nextHop_($dest)] > 1} {
     set p [split [$rtVia_($dest) info class] /]
     set proto [lindex $p [expr [llength $p] - 1]]
     foreach rt $nextHop_($dest) {
  puts $chan [format "%-5s(%d)\t%-5s(%d)\t%3d\t%4d\t %s"  \
   $dest [$dest id] $rt [[$rt set toNode_] id]  \
   $rtpref_($dest) $metric_($dest) $proto]
     }
 } elseif {$nextHop_($dest) != ""} {
     set p [split [$rtVia_($dest) info class] /]
     set proto [lindex $p [expr [llength $p] - 1]]
     puts $chan [format "%-5s(%d)\t%-5s(%d)\t%3d\t%4d\t %s"  \
      $dest [$dest id]      \
      $nextHop_($dest) [[$nextHop_($dest) set toNode_] id] \
      $rtpref_($dest) $metric_($dest) $proto]
 } elseif {$dest == $node_} {
     puts $chan [format "%-5s(%d)\t%-5s(%d)\t%03d\t%4d\t %s" \
      $dest [$dest id] $dest [$dest id] 0 0 "Local"]
 } else {
     puts $chan [format "%-5s(%d)\t%-5s(%s)\t%03d\t%4d\t %s" \
      $dest [$dest id] "" "-" 255 32 "Unknown"]
 }
    }
}

rtObject instproc rtProto? proto {
    $self instvar rtProtos_
    if [info exists rtProtos_($proto)] {
 return $rtProtos_($proto)
    } else {
 return ""
    }
}

rtObject instproc nextHop? dest {
    $self instvar nextHop_
    $self set nextHop_($dest)
}

rtObject instproc rtpref? dest {
    $self instvar rtpref_
    $self set rtpref_($dest)
}

rtObject instproc metric? dest {
    $self instvar metric_
    $self set metric_($dest)
}

#
Class rtPeer

rtPeer instproc init {addr port cls} {
    $self next
    $self instvar addr_ port_ metric_ rtpref_
    set port_ $port
    set addr_ $addr
    foreach dest [[Simulator instance] all-nodes-list] {
 set metric_($dest) [$cls set INFINITY]
 set rtpref_($dest) [$cls set preference_]
    }
}

rtPeer instproc addr? {} {
    $self instvar addr_
    return $addr_
}

rtPeer instproc port? {} {
    $self instvar port_
    return $port_
}

rtPeer instproc metric {dest val} {
    $self instvar metric_
    set metric_($dest) $val
}

rtPeer instproc metric? dest {
    $self instvar metric_
    return $metric_($dest)
}

rtPeer instproc preference {dest val} {
    $self instvar rtpref_
    set rtpref_($dest) $val
}

rtPeer instproc preference? dest {
    $self instvar rtpref_
    return $rtpref_($dest)
}

#
#Class Agent/rtProto -superclass Agent

Agent/rtProto proc pre-init-all args {
    # By default, do nothing when a person does $ns rtproto foo.
}

Agent/rtProto proc init-all args {
    error "No initialization defined"
}

Agent/rtProto instproc init node {
    $self next

    $self instvar ns_ node_ rtObject_ preference_ ifs_ ifstat_
    set ns_ [Simulator instance]

    catch "set preference_ [[$self info class] set preference_]" ret
    if { $ret == "" } {
 set preference_ [$class set preference_]
    }
    foreach nbr [$node set neighbor_] {
 set link [$ns_ link $node $nbr]
 set ifs_($nbr) $link
 set ifstat_($nbr) [$link up?]
    }
    set rtObject_ [$node rtObject?]
}

Agent/rtProto instproc compute-routes {} {
    error "No route computation defined"
}

Agent/rtProto instproc intf-changed {} {
    #NOTHING
}

Agent/rtProto instproc send-updates args {
    #NOTHING
}

Agent/rtProto proc compute-all {} {
    #NOTHING
}

#
# Static routing, the default
#
Class Agent/rtProto/Static -superclass Agent/rtProto

Agent/rtProto/Static proc init-all args {
    # The Simulator knows the entire topology.
    # Hence, the current compute-routes method in the Simulator class is

    # well suited.  We use it as is.

    [Simulator instance] compute-routes

}

#
# Session based unicast routing
#
Class Agent/rtProto/Session -superclass Agent/rtProto

Agent/rtProto/Session proc init-all args {
    [Simulator instance] compute-routes
}

Agent/rtProto/Session proc compute-all {} {
    [Simulator instance] compute-routes

}

#
#########################################################################

#
# Code below this line is experimental, and should be considered work
# in progress.  None of this code is used in production test-suites, or
# in the release yet, and hence should not be a problem to anyone.
#
Class Agent/rtProto/Direct -superclass Agent/rtProto
Agent/rtProto/Direct instproc init node {
    $self next $node
    $self instvar ns_ rtpref_ nextHop_ metric_ ifs_

    foreach node [$ns_ all-nodes-list] {
 set rtpref_($node) 255
 set nextHop_($node) ""
 set metric_($node) -1
    }
    foreach node [array names ifs_] {
 set rtpref_($node) [$class set preference_]
    }
}

Agent/rtProto/Direct instproc compute-routes {} {
    $self instvar ifs_ ifstat_ nextHop_ metric_ rtsChanged_
    set rtsChanged_ 0
    foreach nbr [array names ifs_] {
 if {$nextHop_($nbr) == "" && [$ifs_($nbr) up?] == "up"} {
     set ifstat_($nbr) 1
     set nextHop_($nbr) $ifs_($nbr)
     set metric_($nbr) [$ifs_($nbr) cost?]
     incr rtsChanged_
 } elseif {$nextHop_($nbr) != "" && [$ifs_($nbr) up?] != "up"} {
     set ifstat_($nbr) 0
     set nextHop_($nbr) ""
     set metric_($nbr) -1
     incr rtsChanged_
 }
    }
}

#
# Distance Vector Route Computation
#
# Class Agent/rtProto/DV -superclass Agent/rtProto
Agent/rtProto/DV set UNREACHABLE [rtObject set unreach_]
Agent/rtProto/DV set mid_    0

Agent/rtProto/DV proc init-all args {
    if { [llength $args] == 0 } {
 set nodeslist [[Simulator instance] all-nodes-list]
    } else {
 eval "set nodeslist $args"
    }
    Agent set-maxttl Agent/rtProto/DV INFINITY
    eval rtObject init-all $nodeslist
    foreach node $nodeslist {
 set proto($node) [[$node rtObject?] add-proto DV $node]
    }
    foreach node $nodeslist {
 foreach nbr [$node neighbors] {
     set rtobj [$nbr rtObject?]
     if { $rtobj != "" } {
  set rtproto [$rtobj rtProto? DV]
  if { $rtproto != "" } {
      $proto($node) add-peer $nbr [$rtproto set agent_addr_][$rtproto
set agent_port_]
  }
     }
 }
    }
}

Agent/rtProto/DV instproc init node {
    global rtglibRNG

    $self next $node
    $self instvar ns_ rtObject_ ifsUp_
    $self instvar preference_ rtpref_ nextHop_ nextHopPeer_ metric_
multiPath_

    set UNREACHABLE [$class set UNREACHABLE]
    foreach dest [$ns_ all-nodes-list] {
 set rtpref_($dest) $preference_
 set nextHop_($dest) ""
 set nextHopPeer_($dest) ""
 set metric_($dest)  $UNREACHABLE
    }
    set ifsUp_ ""
    set multiPath_ [[$rtObject_ set node_] set multiPath_]
    set updateTime [$rtglibRNG uniform 0.0 0.5]
    $ns_ at $updateTime "$self send-periodic-update"
}

Agent/rtProto/DV instproc add-peer {nbr agentAddr agentPort} {
    $self instvar peers_
    $self set peers_($nbr) [new rtPeer $agentAddr $agentPort $class]
}

Agent/rtProto/DV instproc send-periodic-update {} {
    global rtglibRNG

    $self instvar ns_
    $self send-updates 1 ;# Anything but 0
    set updateTime [expr [$ns_ now] + \
     ([$class set advertInterval] * [$rtglibRNG uniform 0.9 1.1])]
    $ns_ at $updateTime "$self send-periodic-update"
}

Agent/rtProto/DV instproc compute-routes {} {
    $self instvar ns_ ifs_ rtpref_ metric_ nextHop_ nextHopPeer_
    $self instvar peers_ rtsChanged_ multiPath_

    set INFINITY [$class set INFINITY]
    set MAXPREF  [rtObject set maxpref_]
    set UNREACH  [rtObject set unreach_]
    set rtsChanged_ 0
    foreach dst [$ns_ all-nodes-list] {
 set p [lindex $nextHopPeer_($dst) 0]
 if {$p != ""} {
     set metric_($dst) [$p metric? $dst]
     set rtpref_($dst) [$p preference? $dst]
 }

 set pf $MAXPREF
 set mt $INFINITY
 set nh(0) 0
 foreach nbr [array names peers_] {
     set pmt [$peers_($nbr) metric? $dst]
     set ppf [$peers_($nbr) preference? $dst]

     # if peer metric not valid continue
     # if peer pref higher  continue
     # if peer pref lower  set to latest values
     # else peer pref equal
     # if peer metric higher continue
     # if peer metric lower set to latest values
     # else peer metrics equal append latest values

     if { $pmt < 0 || $pmt >= $INFINITY || $ppf > $pf || $pmt > $mt } \
      continue
     if { $ppf < $pf || $pmt < $mt } {
  set pf $ppf
  set mt $pmt
  unset nh ;# because we must compute *new* next hops
     }
     set nh($ifs_($nbr)) $peers_($nbr)
 }
 catch "unset nh(0)"
 if { $pf == $MAXPREF && $mt == $INFINITY } continue
 if { $pf > $rtpref_($dst) ||    \
  ($metric_($dst) >= 0 && $mt > $metric_($dst)) } \
  continue
 if {$mt >= $INFINITY} {
     set mt $UNREACH
 }

 incr rtsChanged_
 if { $pf < $rtpref_($dst) || $mt < $metric_($dst) } {
     set rtpref_($dst) $pf
     set metric_($dst) $mt
     set nextHop_($dst) ""
     set nextHopPeer_($dst) ""
     foreach n [array names nh] {
  lappend nextHop_($dst) $n
  lappend nextHopPeer_($dst) $nh($n)
  if !$multiPath_ break;
     }
     continue
 }

 set rtpref_($dst) $pf
 set metric_($dst) $mt
 set newNextHop ""
 set newNextHopPeer ""
 foreach rt $nextHop_($dst) {
     if [info exists nh($rt)] {
  lappend newNextHop $rt
  lappend newNextHopPeer $nh($rt)
  unset nh($rt)
     }
 }
 set nextHop_($dst) $newNextHop
 set nextHopPeer_($dst) $newNextHopPeer
 if { $multiPath_ || $nextHop_($dst) == "" } {
     foreach rt [array names nh] {
  lappend nextHop_($dst) $rt
  lappend nextHopPeer_($dst) $nh($rt)
  if !$multiPath_ break
     }
 }
    }
    set rtsChanged_
}

Agent/rtProto/DV instproc intf-changed {} {
    $self instvar ns_ peers_ ifs_ ifstat_ ifsUp_ nextHop_ nextHopPeer_
metric_
    set INFINITY [$class set INFINITY]
    set ifsUp_ ""
    foreach nbr [array names peers_] {
 set state [$ifs_($nbr) up?]
 if {$state != $ifstat_($nbr)} {
     set ifstat_($nbr) $state
     if {$state != "up"} {
  if ![info exists all-nodes] {
      set all-nodes [$ns_ all-nodes-list]
  }
  foreach dest ${all-nodes} {
      $peers_($nbr) metric $dest $INFINITY
  }
     } else {
  lappend ifsUp_ $nbr
     }
 }
    }
}

Agent/rtProto/DV proc get-next-mid {} {
    set ret [Agent/rtProto/DV set mid_]
    Agent/rtProto/DV set mid_ [expr $ret + 1]
    set ret
}

Agent/rtProto/DV proc retrieve-msg id {
    set ret [Agent/rtProto/DV set msg_($id)]
    Agent/rtProto/DV unset msg_($id)
    set ret
}

Agent/rtProto/DV instproc send-updates changes {
    $self instvar peers_ ifs_ ifsUp_

    if $changes {
 set to-send-to [array names peers_]
    } else {
 set to-send-to $ifsUp_
    }
    set ifsUp_ ""
    foreach nbr ${to-send-to} {
 if { [$ifs_($nbr) up?] == "up" } {
     $self send-to-peer $nbr
 }
    }
}

Agent/rtProto/DV instproc send-to-peer nbr {
    $self instvar ns_ rtObject_ ifs_ peers_
    set INFINITY [$class set INFINITY]
    foreach dest [$ns_ all-nodes-list] {
 set metric [$rtObject_ metric? $dest]
 if {$metric < 0} {
     set update($dest) $INFINITY
 } else {
     set update($dest) [$rtObject_ metric? $dest]
     foreach nh [$rtObject_ nextHop? $dest] {
  if {$nh == $ifs_($nbr)} {
      set update($dest) $INFINITY
  }
     }
 }
    }
    set id [$class get-next-mid]
    $class set msg_($id) [array get update]
#    set n [$rtObject_ set node_];     \
    puts stderr [concat [format ">>> %7.5f" [$ns_ now]]   \
     "${n}([$n id]/[$self set addr_]) send update"  \
     "to ${nbr}([$nbr id]/[$peers_($nbr) addr?]) id = $id"]; \
    set j 0;        \
    foreach i [lsort -command TclObjectCompare [array names update]] { \

 puts -nonewline "\t${i}([$i id]) $update($i)";   \
        if {$j == 3} {       \
     puts "";       \
 };        \
 set j [expr ($j + 1) % 4];     \
    };         \
    if $j { puts ""; }

    # XXX Note the singularity below...
    $self send-update [$peers_($nbr) addr?] [$peers_($nbr) port?] $id
[array size update]
}

Agent/rtProto/DV instproc recv-update {peerAddr id} {
    $self instvar peers_ ifs_ nextHopPeer_ metric_
    $self instvar rtsChanged_ rtObject_

    set INFINITY [$class set INFINITY]
    set UNREACHABLE  [$class set UNREACHABLE]
    set msg [$class retrieve-msg $id]
    array set metrics $msg
#    set n [$rtObject_ set node_];     \
    puts stderr [concat [format "<<< %7.5f" [[Simulator instance] now]]
\
     "${n}([$n id]) recv update from peer $peerAddr id = $id"]
    foreach nbr [array names peers_] {
 if {[$peers_($nbr) addr?] == $peerAddr} {
     set peer $peers_($nbr)
     if { [array size metrics] > [Node set nn_] } {
  error "$class::$proc update $peerAddr:$msg:$count is larger than the
simulation topology"
     }
     set metricsChanged 0
     foreach dest [array names metrics] {
                set metric [expr $metrics($dest) + [$ifs_($nbr) cost?]]
  if {$metric > $INFINITY} {
      set metric $INFINITY
  }
  if {$metric != [$peer metric? $dest]} {
      $peer metric $dest $metric
      incr metricsChanged
  }
     }
     if $metricsChanged {
  $self compute-routes
  incr rtsChanged_ $metricsChanged
  $rtObject_ compute-routes
     } else {
  # dynamicDM multicast hack.
  # If we get a message from a neighbour, then something
  # at that neighbour has changed.  While this may not
  # cause any unicast changes on our end, dynamicDM
  # looks at neighbour's routing tables to compute
  # parent-child relationships, and has to do them
  # again.
  #
  $rtObject_ flag-multicast -1
     }
     return
 }
    }
    error "$class::$proc update $peerAddr:$msg:$count from unknown peer"

}

Agent/rtProto/DV proc compute-all {} {
    # Because proc methods are not inherited from the parent class.
}

#
# Manual routing
#
Class Agent/rtProto/Manual -superclass Agent/rtProto

Agent/rtProto/Manual proc pre-init-all args {
    Simulator set node_factory_ ManualRtNode
}

Agent/rtProto/Manual proc init-all args {
    # The user will do all routing.
}

### Local Variables:
### mode: tcl
### tcl-indent-level: 4
### tcl-default-application: ns
### End:

;-------------------------route-proto.tcl
---------------------------------


;-------------------------  rtProtoDV.cc
---------------------------------


/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*-
*/
/*
 * rtProtoDV.cc
 *
 * Copyright (C) 1997 by USC/ISI
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation, advertising
 * materials, and other materials related to such distribution and use
 * acknowledge that the software was developed by the University of
 * Southern California, Information Sciences Institute.  The name of the

 * University may not be used to endorse or promote products derived
from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

#ifndef lint
static const char rcsid[] =
    "@(#) $Header: /usr/src/mash/repository/vint/ns-2/rtProtoDV.cc,v 1.6
1999/09/09 03:22:44
salehi Exp $ (USC/ISI)";
#endif

#include "agent.h"
#include "rtProtoDV.h"

int hdr_DV::offset_;

static class rtDVHeaderClass : public PacketHeaderClass {
public:
 rtDVHeaderClass() : PacketHeaderClass("PacketHeader/rtProtoDV",
           sizeof(hdr_DV)) {
  bind_offset(&hdr_DV::offset_);
 }
} class_rtProtoDV_hdr;

static class rtProtoDVclass : public TclClass {
public:
 rtProtoDVclass() : TclClass("Agent/rtProto/DV") {}
 TclObject* create(int, const char*const*) {
  return (new rtProtoDV);
 }
} class_rtProtoDV;


int rtProtoDV::command(int argc, const char*const* argv)
{
 if (strcmp(argv[1], "send-update") == 0) {
  ns_addr_t dst;
  dst.addr_ = atoi(argv[2]);
  dst.port_ = atoi(argv[3]);
  u_int32_t mtvar = atoi(argv[4]);
  u_int32_t size  = atoi(argv[5]);
  sendpkt(dst, mtvar, size);
  return TCL_OK;
 }
 return Agent::command(argc, argv);
}

void rtProtoDV::sendpkt(ns_addr_t dst, u_int32_t mtvar, u_int32_t size)
{
 daddr() = dst.addr_;
 dport() = dst.port_;
 size_ = size;

 Packet* p = Agent::allocpkt();
 hdr_DV *rh = (hdr_DV*)p->access(off_DV_);
 rh->metricsVar() = mtvar;

 target_->recv(p);
}

void rtProtoDV::recv(Packet* p, Handler*)
{
 hdr_DV* rh = (hdr_DV*)p->access(off_DV_);
 hdr_ip* ih = (hdr_ip*)p->access(off_ip_);
 Tcl::instance().evalf("%s recv-update %d %d", name(),
         ih->saddr(), rh->metricsVar());
 Packet::free(p);
}

;-------------------------  rtProtoDV.cc
---------------------------------