#!/bin/sh # the next line finds ns \ nshome=`dirname $0`; [ ! -x $nshome/ns ] && [ -x ../../ns ] && nshome=../.. # the next line starts ns \ export nshome; exec $nshome/ns "$0" "$@" if [info exists env(nshome)] { set nshome $env(nshome) } elseif [file executable ../../ns] { set nshome ../.. } elseif {[file executable ./ns] || [file executable ./ns.exe]} { set nshome "[pwd]" } else { puts "$argv0 cannot find ns directory" exit 1 } set env(PATH) "$nshome/bin:$env(PATH)" puts "source /disk2/netsim/ns-2.1b/tcl/ex/timer.tcl...." source /netsim/ns/ns-2.1b5/tcl/ex/timer.tcl set opt(tr) "RMP.tr" set opt(namtr) "RMP.nam" set opt(seed) 0 set opt(stop) 20 set opt(node) 8 set opt(qsize) 100 set opt(bw) 10Mb set opt(delay) 1ms set opt(ll) LL set opt(ifq) Queue/DropTail set opt(mac) Mac/Csma/Cd set opt(chan) Channel set opt(tcp) TCP/Reno set opt(sink) TCPSink proc finish {} { global env nshome pwd global ns opt trfd $ns flush-trace close $trfd exec nam RMP.nam & exit 0 } proc create-trace {} { global ns opt if [file exists $opt(tr)] { catch "exec rm -f $opt(tr) $opt(tr)-bw [glob $opt(tr).*]" } set trfd [open $opt(tr) w] $ns trace-all $trfd if {$opt(namtr) != ""} { $ns namtrace-all [open $opt(namtr) w] } return $trfd } proc create-topology {} { global ns opt global lan node source node(0) set num $opt(node) for {set i 0} {$i < $num } {incr i} { set node($i) [$ns node] lappend nodelist $node($i) # puts node($i) = [$node($i) id] } set lan [$ns newLan $nodelist $opt(bw) $opt(delay) \ -llType $opt(ll) -ifqType $opt(ifq) \ -macType $opt(mac) -chanType $opt(chan)] #[$lan set mcl_] set bcast_ 1 # set node0 [$ns node] # $ns duplex-link $node0 $node(0) 2Mb 2ms DropTail # $ns duplex-link-op $node0 $node(0) orient right } Class Agent/Message/Sender -superclass {Agent/Message Timer} Class Agent/Message/Receiver -superclass Agent/Message Agent/Message/Sender instproc init {} { $self next $self reset $self set window_ 4 $self set incriment 0 } Agent/Message/Sender instproc reset {} { $self instvar seqno_ ack_ set seqno_ 0 set ack_ 0 } Agent/Message/Sender instproc start {} { $self transmit } Agent/Message/Sender instproc reset_timer {} { $self cancel #$self sched 0.05 } Agent/Message/Sender instproc timeout {} { $self instvar seqno_ ack_ set seqno_ $ack_ $self transmit } Agent/Message/Sender instproc cansend {} { $self instvar seqno_ window_ ack_ addr_ #puts "seqno($seqno_) ack($ack_) window($window_) addr($addr_)" return [expr $seqno_ < $ack_ + $window_] } Agent/Message/Sender instproc sendnext {} { $self instvar seqno_ addr_ lappend MSG [expr $seqno_] [expr $addr_] #puts "seqno($seqno_) addr($addr_)" $self send $MSG #$self send $seqno_ incr seqno_ $self reset_timer } Agent/Message/Sender instproc transmit {} { while [$self cansend] { $self sendnext } } Agent/Message/Sender instproc recv msg { #$self instvar incriment $self instvar ack_ #if { 2 == [ llength msg ] } { # set incriment [incr incriment] # puts "$incriment" set ack_ $msg $self transmit #} } Agent/Message/Sender set packetSize_ 400 Agent/Message/Receiver set packetSize_ 40 Agent/Message/Receiver instproc init {} { $self set mlist { 0 0 0 0 } $self next $self reset } Agent/Message/Receiver instproc reset {} { $self instvar ack_ set ack_ 0 } Agent/Message/Receiver instproc recv msg { $self instvar ack_ dst_ mlist set temp1 0 set temp2 0 set temp3 0 set seqno [ lindex $msg 0 ] #puts "Sequence Numer : $seqno Address : [lindex $msg 1]" #$self instvar MSGack_ if { [lindex $msg 1] == 0 } { $self set ack_ [ lindex $mlist 0 ] set temp1 [ lindex $mlist 1 ] set temp2 [ lindex $mlist 2 ] set temp3 [ lindex $mlist 3 ] if { $seqno == $ack_ } { #puts "==================" #puts "Ack List : $mlist " #puts "First Node Receive" incr ack_ set mlist [ lreplace mlist 0 3 $ack_ $temp1 $temp2 $temp3] #puts "ACK NUM : $ack_" #puts "Ack List : $mlist " #puts "==================" $self set dst_ [lindex $msg 1] } $self send $ack_ } if { [lindex $msg 1] == 256 } { $self set ack_ [ lindex $mlist 1 ] set temp1 [ lindex $mlist 0 ] set temp2 [ lindex $mlist 2 ] set temp3 [ lindex $mlist 3 ] if { $seqno == $ack_ } { #puts "==================" #puts "Second Node Receive" incr ack_ set mlist [ lreplace mlist 0 3 $temp1 $ack_ $temp2 $temp3] #puts "ACK NUM : $ack_" #puts "Ack List : $mlist " #puts "==================" $self set dst_ [lindex $msg 1] } $self send $ack_ } if { [lindex $msg 1] == 512 } { $self set ack_ [ lindex $mlist 2 ] set temp1 [ lindex $mlist 0 ] set temp2 [ lindex $mlist 1 ] set temp3 [ lindex $mlist 3 ] if { $seqno == $ack_ } { #puts "==================" #puts "Third Node Receive" incr ack_ set mlist [ lreplace mlist 0 3 $temp1 $temp2 $ack_ $temp3] #puts "ACK NUM : $ack_" #puts "Ack List : $mlist " #puts "==================" $self set dst_ [lindex $msg 1] } $self send $ack_ } if { [lindex $msg 1] == 768 } { $self set ack_ [ lindex $mlist 3 ] set temp1 [ lindex $mlist 0 ] set temp2 [ lindex $mlist 1 ] set temp3 [ lindex $mlist 2 ] if { $seqno == $ack_ } { #puts "==================" #puts "Third Node Receive" incr ack_ set mlist [ lreplace mlist 0 3 $temp1 $temp2 $temp3 $ack_ ] #puts "ACK NUM : $ack_" #puts "Ack List : $mlist " #puts "==================" $self set dst_ [lindex $msg 1] } $self send $ack_ } } set ns [new Simulator] set trfd [create-trace] create-topology # Sender Setting set sndr0 [$ns create-connection Message/Sender $node(0) Message/Receiver $node(7) 0] #$ns attach-agent $node0 $sndr0 $sndr0 set fid_ 0 $sndr0 set window_ 15 # start up - stop-and-wait $ns at 0.1 "$sndr0 start" $ns at 1.$opt(stop) "finish" $ns run