#source /home/cchhabra/ns-allinone-2.1b6/ns-2.1b6/tcl/mcast/srm-debug.tcl;# to #trace delay compute fcn. details #source /home/cchhabra/ns-allinone-2.1b6/ns-2.1b6/tcl/mcast/srm.tcl set ns [new Simulator] $ns multicast set nmax 100 # cause no packet or ack drops Queue set limit_ 100000 foreach k "0 1 2 3 4 5" { set node($k) [$ns node] } $node(0) shape "other" set f [open out.tr w] $ns trace-all $f set nf [open out.nam w] $ns namtrace-all $nf $ns color 1 red $ns color 2 green $ns color 3 blue $ns color 4 yellow $ns color 5 LightBlue proc makelinks { bw delay pairs } { global ns node foreach p $pairs { set src $node([lindex $p 0]) set dst $node([lindex $p 1]) $ns duplex-link $src $dst $bw $delay DropTail $ns duplex-link-op $src $dst orient [lindex $p 2] } } makelinks 5.5Mb 10ms { { 0 1 left-up } { 0 2 left-down } { 0 3 right-down } { 0 4 right-up } { 0 5 down } } $ns duplex-link-op $node(0) $node(1) queuePos 0.5 $ns duplex-link-op $node(0) $node(2) queuePos 0.5 $ns duplex-link-op $node(0) $node(3) queuePos 0.5 $ns duplex-link-op $node(0) $node(4) queuePos 0.5 $ns duplex-link-op $node(0) $node(5) queuePos 0.5 set mproto DM set mrthandle [$ns mrtproto $mproto {}] Class Agent/Message/MC_Sender -superclass Agent/Message #Agent/Message/MC_Sender instproc recv msg { #$self instvar addr_ sent_ #set type [lindex $msg 0] #if { $type == "ack" } { # puts "Success" # else puts "Error" #} #} # Nack not needed --- Agent/Message/MC_Sender instproc recv msg { $self instvar addr_ sent_ set type [lindex $msg 0] if { $type == "nack" } { set seqno [lindex $msg 2] if ![info exists sent_($seqno)] { $self send "data $addr_ $seqno" set sent_($seqno) 1 } } } Agent/Message/MC_Sender instproc init {} { $self next $self set seqno_ 1 } Agent/Message/MC_Sender instproc send-pkt {} { $self instvar seqno_ agent_addr_ agent_port_ $self send "data $agent_addr_ $agent_port_ $seqno_" puts "$agent_addr_ $agent_port_ $seqno_" incr seqno_ } set grp [Node allocaddr] set sndr [new Agent/Message/MC_Sender] $sndr set packetSize_ 800 $sndr set dst_ $grp $sndr set class_ 1 $ns attach-agent $node(1) $sndr ; #?? Class Agent/Message/MC_Acker -superclass Agent/Message Agent/Message/MC_Acker set packetSize_ 100 # This is where the problem is ???? Agent/Message/MC_Acker instproc recv msg { #global grp set type [lindex $msg 0] set from [lindex $msg 1] # set unknown [lindex $msg 2]; # Port no ?? set seqno [lindex $msg 3] puts "Agent/Message/MC_Acker::recv $msg, $from" #$self set dst_ $grp # $self set dst_port 0 ; # Not quite sure check puts "$type $from $seqno" $self send "ack_ $seqno" #puts "Agent/Message/MC_Acker::send $msg, $from, $dst_addr" } $ns at 1.0 { global rcvr node foreach k "1 2 3 4 5" { set rcvr($k) [new Agent/Message/MC_Acker] $ns attach-agent $node($k) $rcvr($k) $rcvr($k) set class_ 2 $node($k) join-group $rcvr($k) $grp } $node(1) join-group $sndr $grp } Class Agent/Message/MC_Nacker -superclass Agent/Message Agent/Message/MC_Nacker set packetSize_ 800 Agent/Message/MC_Nacker instproc recv msg { set type [lindex $msg 0] set from [lindex $msg 1] set seqno [lindex $msg 2] puts "Agent/Message/MC_Nacker::recv $msg" $self instvar dst_ ack_ if [info exists ack_] { set expected [expr $ack_ + 1] if { $seqno > $expected } { set dst_ $from $self send "nack $from $seqno" } } set ack_ $seqno } Class Agent/Message/MC_SRM -superclass Agent/Message Agent/Message/MC_SRM set packetSize_ 800 Agent/Message/MC_SRM instproc recv msg { $self instvar dst_ ack_ nacked_ random_ global grp set type [lindex $msg 0] set from [lindex $msg 1] set unknown [lindex $msg 2] ; # Port no ?? set seqno [lindex $msg 3] if { $type == "nack" } { set nacked_($seqno) 1 return } if [info exists ack_] { set expected [expr $ack_ + 1] if { $seqno > $expected } { set dst_ $grp if [info exists random_] { global ns set r [expr ([ns-random] / double(0x7fffffff) + 0.1) * $random_] set r [expr [$ns now] + $r] $ns at $r "$self send-nack $from $seqno" } else { $self send "nack $from $seqno" } } } set ack_ $seqno } Agent/Message/MC_SRM instproc send-nack { from seqno } { $self instvar nacked_ dst_ global grp if ![info exists nacked_($seqno)] { set dst_ $grp $self send "nack $from $seqno" } } foreach t { 1.05 1.08 1.11 1.14 1.55 1.58 1.61 1.64 1.85 1.88 1.91 1.94 2.35 2.38 2.41 2.44 3.05 3.08 3.11 3.14 3.65 3.68 3.71 3.74 } { $ns at $t "$sndr send-pkt" } $ns at 5.0 "finish" proc finish {} { global ns f $ns flush-trace close $f puts "running nam..." exec nam out.nam & exit 0 } $ns run