proc print-util {} { 
	global qmon ns 
	set now [$ns now]
	puts "at $now, bdep=[$qmon set bdepartures_]"
	puts "at $now, lossrate=[expr ("[$qmon set pdrops_].0")/[$qmon set parrivals_]]"
}

proc print-fstats {fid starttime finishtime} { 
        global ns 
 	set ffp [open "flow$fid.out" w]      
 
        for {set i 0} {[expr $starttime + ($i*0.1)] < $finishtime} {incr i} { 
                set printtime [expr $i*0.1]
                $ns at [expr $starttime + $printtime] "printflow $ffp $fid"
        }
        $ns at $finishtime "printflow $ffp $fid"
}

proc print-qstats {starttime finishtime} { 
        global ns qflag    
 	set qfp [open "q.out" w]      
 
        for {set i 0} {[expr $starttime + ($i*0.1)] < $finishtime} {incr i} { 
                set printtime [expr $i*0.1]
                $ns at [expr $starttime + $printtime] "printq $qfp"
        }
        $ns at $finishtime "printq $qfp"
}

proc print-stats {flow starttime finishtime} { 
        global ns 
        set fp [open "cwnd$flow.out" w]
 
        for {set i 0} {[expr $starttime + ($i*0.1)] < $finishtime} {incr i} { 
                set printtime [expr $i*0.1]
                $ns at [expr $starttime + $printtime] "print $fp $flow"
        }
	$ns at $finishtime "print $fp $flow"
}

proc printq {fp} { 
	global qmon ns 
	set now [$ns now]
	puts $fp "[format %.2f [$ns now]] [$qmon set pkts_] [$qmon set parrivals_] [$qmon set pdrops_] [$qmon set bdepartures_] [$qmon set pmarks_]"
}

proc printflow {fp fid} {
	global ns fmon 
	set now [$ns now]
	set flow [[$fmon classifier] lookup auto 0 0 $fid]
	puts $fp "[format %.2f [$ns now]] [$flow set parrivals_] [$flow set pdrops_] [$flow set barrivals_] [$flow set bdrops_] [$flow set pmarks_]"
}

proc print {fp tcp} {
        global ns 
        set now [format "%.1f" [$ns now]]
        set now [$ns now]
       	puts $fp "[format %.2f [$ns now]] [$tcp set cwnd_] [$tcp set maxseq_] [$tcp set nrexmitpack_] [$tcp set necnresponses_] [$tcp set ncwndcuts_] [$tcp set ack_] [$tcp set nackpack_] [$tcp set ndatapack_]"
}

# flush all trace data when finish
proc finish {} {
        global ns tf
        $ns flush-trace
	print-util 
        close $tf
        exit 0
}

####################################################################
# New procedures added by Sally in March, 2002: ####################
####################################################################

proc tcpDumpAll { tcpSrc interval label } {
        global ns
        $ns at [expr [$ns now]+$interval] "tcpDumpAll $tcpSrc $interval $label"
        puts $label/time=[$ns now]/ack=[$tcpSrc set ack_]
}

proc printdrops { fid fmon } {
        set fcl [$fmon classifier]; # flow classifier
        set flow [$fcl lookup auto 0 0 $fid]
        if {$flow != "" } {
                set bytes [$flow set bdepartures_]
                puts "class: $fid per-link pkts [$flow set pdepartures_] Kbytes [expr $bytes / 1000] drops [$flow set pdrops_] marks [$flow set pmarks_]"
        }
}

proc printall { fmon time } {
        global bandwidth endtime
        puts "time: [format %.2f $time] aggregate per-link drops [$fmon set pdrops_]"
        puts "time: [format %.2f $time] aggregate per-link marks [$fmon set pmarks_]"
        puts "time: [format %.2f $time] aggregate per-link pkts [$fmon set pdepartures_]"
        set bytes [$fmon set bdepartures_]
        set bytesDbl [ns-int64todbl $bytes]
        set Kbytes [expr $bytesDbl / 1000 ]
        set bandwidthToKBytes  [expr 1000 * $endtime / 8 ]
        set possibleKBytes [expr $bandwidth * $bandwidthToKBytes ]
        puts "time: [format %.2f $time] aggregate per-link Kbytes [format %.2f $Kbytes] utilization(%) [format %.2f [expr $Kbytes * 100 / $possibleKBytes ]]"
}





