📄 finish.tcl
字号:
####################################################################### ## finish: Called at the end of the simulation, it produces the ## output file by calling others subroutines ## #######################################################################proc finish {} { global file line opt num_n num_udp num_tcp num_voip set qline "--------------------" set line $qline$qline$qline$qline$qline$qline$qline$qline$qline$qline dump_stat if {$opt(tcp) == 1} { TCP_stat } if {$opt(udp) == 1} { UDP_stat } if {$opt(voip) == 1} { UDP_voip_stat } LL_stat IFQ_stat flush $file(finish) MAC_stat NET_stat ERM_stat ERM_change if {$opt(tcp) == 1} { delay_stat "tcp" $num_tcp } if {$opt(udp) == 1} { delay_stat "udp" $num_udp } if {$opt(voip) == 1} { delay_voip_stat $num_voip }}####################################################################### ## TCP_stat: Writes on the output file the TCP statistics ## #######################################################################proc TCP_stat {} { global file line num_tcp fl stat opt nd set tcp_temp [list 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] set tcp_dim [list 8 12 12 12 12 12 12 10 9 12.0 12.0 8.3 8 10.4 8] set tcp_dim_tit [list 8 12 12 12 12 12 12 10 9 12 12 8 8 10 8] set tcp_tip [list s s d d d d d d d f f f f f d] set tcp_val "" set tcp_tit "" foreach k $tcp_temp { append tcp_val "%[lindex $tcp_dim $k][lindex $tcp_tip $k] " append tcp_tit "%[lindex $tcp_dim_tit $k]s " } puts $file(finish) "#$line\n#" puts $file(finish) "#\t\t\t\tTCP Statistics\n#" puts $file(finish) "# [format $tcp_tit flow_id direction pkt_to_send pkt_tx pkt_rcv ack_tx ack_rcv \ fast_rec timeout throughput goodput avg_wnd max_wnd idle_time n_flow]\n#" foreach fid [range 1 $num_tcp] { puts $file(finish) " [format $tcp_val tcp_$fid $fl($fid) [expr $stat(tcp,pkt_to_send,$fid) + 1] $stat(tcp,pkt_tx,$fid) \ $stat(tcp,pkt_rcv,$fid) $stat(tcp,ack_tx,$fid) $stat(tcp,ack_rcv,$fid) \ $stat(tcp,fast_rec,$fid) $stat(tcp,timeout,$fid) \ [expr $stat(tcp,pkt_tx,$fid) * 8 * $opt(tcp_size) / [expr $opt(stop).0 - $opt(start) - $stat(tcp,idle_time,$fid)]] \ [expr [expr $stat(tcp,pkt_to_send,$fid) + 1] * 8.0 * $opt(tcp_size) / [expr $opt(stop).0 - $opt(start) - $stat(tcp,idle_time,$fid)]] \ [expr $stat(tcp,win_avg,$fid) / $stat(tcp,win_count,$fid)] \ [expr $stat(tcp,win_max,$fid).0 / $stat(tcp,win_count,$fid)] $stat(tcp,idle_time,$fid) $stat(tcp,n_flow,$fid)]" } if {$opt(onoff) == 2} { foreach fid [range [expr -$num_tcp] -1] { puts $file(finish) " [format $tcp_val tcp_$fid $fl($fid) [expr $stat(tcp,pkt_to_send,$fid) + 1] $stat(tcp,pkt_tx,$fid) \ $stat(tcp,pkt_rcv,$fid) $stat(tcp,ack_tx,$fid) $stat(tcp,ack_rcv,$fid) \ $stat(tcp,fast_rec,$fid) $stat(tcp,timeout,$fid) \ [expr $stat(tcp,pkt_tx,$fid) * 8 * $opt(tcp_size) / [expr $opt(stop).0 - $opt(start) - $stat(tcp,idle_time,$fid)]] \ [expr [expr $stat(tcp,pkt_to_send,$fid) + 1] * 8.0 * $opt(tcp_size) / [expr $opt(stop).0 - $opt(start) - $stat(tcp,idle_time,$fid)]] \ [expr $stat(tcp,win_avg,$fid) / $stat(tcp,win_count,$fid)] \ [expr $stat(tcp,win_max,$fid).0 / $stat(tcp,win_count,$fid)] $stat(tcp,idle_time,$fid) $stat(tcp,n_flow,$fid)]" } }}####################################################################### ## UDP_stat: Writes on the output file the UDP statistics ## #######################################################################proc UDP_stat {} { global file line num_udp udp_fl stat opt nd set udp_temp [list 0 1 2 3 4] set udp_dim [list 8 12 12 12 12] set udp_dim_tit [list 8 12 12 12 12] set udp_tip [list s s d d f] set udp_val "" set udp_tit "" foreach k $udp_temp { append udp_val "%[lindex $udp_dim $k][lindex $udp_tip $k] " append udp_tit "%[lindex $udp_dim_tit $k]s " } puts $file(finish) "#$line\n#" puts $file(finish) "#\t\t\t\tUDP Statistics\n#" puts $file(finish) "# [format $udp_tit flow_id direction pkt_tx pkt_rcv throughput]\n#" foreach fid [range 1 $num_udp] { puts $file(finish) " [format $udp_val udp_$fid $udp_fl($fid) $stat(udp,pkt_tx,$fid) $stat(udp,pkt_rcv,$fid) \ [expr $stat(udp,pkt_rcv,$fid) * 8 * $opt(udp_size) / [expr $opt(stop).0 - $opt(start)]]]" }}proc UDP_voip_stat {} { global file line num_voip voip_fl stat opt nd set voip_temp [list 0 1 2 3 4 5 6 7] set voip_dim [list 8 12 12 12 12 12 12 12] set voip_dim_tit [list 8 12 12 12 12 12 12 12] set voip_tip [list s s d d f d d f] set voip_val "" set voip_tit "" foreach k $voip_temp { append voip_val "%[lindex $voip_dim $k][lindex $voip_tip $k] " append voip_tit "%[lindex $voip_dim_tit $k]s " } puts $file(finish) "#$line\n#" puts $file(finish) "#\t\t\t\tVoIP Statistics\n#" puts $file(finish) "# [format $voip_tit flow_id direction pkt_tx_S pkt_rcv_S throughput_S pkt_tx_D pkt_rcv_D throughput_D]\n#" foreach fid [range 1 $num_voip] { puts $file(finish) " [format $voip_val voip_$fid $voip_fl($fid) $stat(voipc,pkt_tx,$fid) $stat(voipc,pkt_rcv,$fid) \ [expr $stat(voipc,byte_rcv,$fid) * 8 / [expr $opt(stop).0 - $opt(start)]] \ $stat(voips,pkt_tx,$fid) $stat(voips,pkt_rcv,$fid) \ [expr $stat(voips,byte_rcv,$fid) * 8 / [expr $opt(stop).0 - $opt(start)]]]" }}####################################################################### ## LL_stat: Writes on the output file the LLC statistics ## #######################################################################proc LL_stat {} { global file line stat num_n nd set ll_temp [list 0 1 2 3 4 5 6 7 8] set ll_dim [list 8 12 12 12 10 12 12 10 10] set ll_dim_tit [list 8 12 12 12 10 12 12 10 10] set ll_tip [list s s d d d d d d d] set ll_val "" set ll_tit "" foreach k $ll_temp { append ll_val "%[lindex $ll_dim $k][lindex $ll_tip $k] " append ll_tit "%[lindex $ll_dim_tit $k]s " } puts $file(finish) "#\n#$line\n#" puts $file(finish) "#\t\t\t\tLL Statistics\n#" puts $file(finish) "# [format $ll_tit node_id pkt_type rcv_appl tx_ifq tx_arp_down rcv_mac \ tx_appl tx_arp_up arp_tx_ifq]\n#" foreach fid [lessof $num_n] { foreach tip {message ARP tcp ack udp voip} { puts $file(finish) " [format $ll_val ll_$nd($fid) $tip $stat(ll,rcv_appl,$fid,$tip) \ $stat(ll,tx_ifq,$fid,$tip) $stat(ll,tx_arp_down,$fid,$tip) $stat(ll,rcv_mac,$fid,$tip) $stat(ll,tx_appl,$fid,$tip) \ $stat(ll,tx_arp_up,$fid,$tip) $stat(ll,arp_tx_ifq,$fid,$tip)]" } puts $file(finish) "#" }}####################################################################### ## IFQ_stat: Writes on the output file the Interface Queue statistics ## #######################################################################proc IFQ_stat {} { global file line stat obj num_bs_queue nd num_n opt set bs_ifq_temp [list 0 1 2 3 4 5 6] set bs_ifq_dim [list 10 12 12 12 12 12.3 12] set bs_ifq_dim_tit [list 10 12 12 12 12 12 12] set bs_ifq_tip [list s s d d d f d] set bs_ifq_val "" set bs_ifq_tit "" foreach k $bs_ifq_temp { append bs_ifq_val "%[lindex $bs_ifq_dim $k][lindex $bs_ifq_tip $k] " append bs_ifq_tit "%[lindex $bs_ifq_dim_tit $k]s " } puts $file(finish) "#$line\n#" puts $file(finish) "#\t\t\t\tIFQ Statistics\n#" puts $file(finish) "# [format $bs_ifq_tit queue_id pkt_type rcv drop timeout avg_size limit]\n#" foreach num [lessof $num_n] { $obj(ifq,$num) dump_queue set stat(bs_q_limit,$num) [$obj(ifq,$num) set limit_] foreach fid [lessof $num_bs_queue] { foreach tip {message ARP tcp ack udp voip} { puts $file(finish) " [format $bs_ifq_val ifq_$nd($num)_$fid $tip $stat(bs_ifq,rcv,$fid,$tip) \ $stat(bs_ifq,drop,$fid,$tip) $stat(bs_ifq,tout,$fid,$tip) [expr $stat(bs_q_size,$fid) / [expr $stat(bs_q_arrv,$fid) + 0.00000000000000001]] \ $stat(bs_q_limit,$num)]" } puts $file(finish) "#" } set num_bs_queue 0 }}####################################################################### ## MAC_stat: Writes on the output file the MAC statistics ## #######################################################################proc MAC_stat {} { global file line num_tcp stat num_n nd num_mac_tc obj set mac_temp [list 0 1 2 3 4 5 6 7 8 9 10 11 12 13] set mac_dim [list 10 10 10 10 10 10 10 12 12 12 12 12 10 10] set mac_dim_tit [list 10 10 10 10 10 10 10 12 12 12 12 12 10 10] set mac_tip [list s s d d d d d d d d d d d d] set mac_val "" set mac_tit "" set cfb_TCP_tot 0 set cfb_VoIP_tot 0 foreach k $mac_temp { append mac_val "%[lindex $mac_dim $k][lindex $mac_tip $k] " append mac_tit "%[lindex $mac_dim_tit $k]s " } puts $file(finish) "#$line\n#" puts $file(finish) "#\t\t\t\tMAC Statistics\n#" puts $file(finish) [format "# %12s %12s %12s %12s %12s %12s %12s %12s\n#" marker cap_% cap_avg_dur cap_num cfp_%_max cfp_%_tot cfp_avg_dur cfp_num] $obj(mac,0) dump_tc puts $file(finish) [format " %12s %12f %12f %12d %12f %12f %12f %12d" hcf_stats $stat(mac,cap_percent_tot) $stat(mac,cap_avg_time) $stat(mac,cap_num) \ $stat(mac,cfp_percent_max) $stat(mac,cfp_percent_tot) $stat(mac,cfp_avg_time) \ $stat(mac,cfp_num)] set num_mac_tc 0 puts $file(finish) [format "#\n# %12s %12s %12s %12s %12s %12s %12s %12s %12s %12s %12s\n#" node_id real_coll virt_coll virtcoll \ cfb_avg_dur cfb_num cfb_bad_end TCP_fast TCP_slow VoIP_fast VoIP_slow] foreach num [lessof $num_n] { if {$num == 0} { $obj(mac,$num) dump_tc foreach fid [lessof $num_mac_tc] { puts $file(finish) [format " %12s %12f %12d %12d %12f %12d %12d %12d %12d %12d %12d" col_$nd($num)_$fid $stat(mac,col,$fid) \ $stat(mac,virt_col,$fid) \ $stat(mac,virtcoll) $stat(mac,$fid,cfb_avg_time) $stat(mac,$fid,cfb_num) \ $stat(mac,$fid,cfb_num_bad_end) \ $stat(mac,$fid,cfb_data_fast_recv) $stat(mac,$fid,cfb_data_slow_recv) \ $stat(mac,$fid,cfb_voice_fast_recv) $stat(mac,$fid,cfb_voice_slow_recv)] } } else { if {$num == 1} { puts $file(finish) [format "#\n# %12s %12s %12s %12s %12s %12s %12s %12s %12s %12s\n#" node_id real_coll virt_coll virtcoll \ cfb_avg_dur cfb_num cfb_bad_end TCP VoIP noData] } $obj(mac,$num) dump_tc foreach fid [lessof $num_mac_tc] { set cfb_TCP_tot [expr $cfb_TCP_tot + $stat(mac,$fid,cfb_data_fast_recv)] set cfb_VoIP_tot [expr $cfb_VoIP_tot + $stat(mac,$fid,cfb_voice_fast_recv)] puts $file(finish) [format " %12s %12f %12d %12d %12f %12d %12d %12d %12d %12d" col_$nd($num)_$fid $stat(mac,col,$fid) \ $stat(mac,virt_col,$fid) \ $stat(mac,virtcoll) $stat(mac,$fid,cfb_avg_time) $stat(mac,$fid,cfb_num) \ $stat(mac,$fid,cfb_num_bad_end) \ $stat(mac,$fid,cfb_data_fast_recv) $stat(mac,$fid,cfb_voice_fast_recv) \ $stat(mac,$fid,cfb_noDataToSend)] } } set num_mac_tc 0 } puts $file(finish) [format "\n %12s %90d %12d" totals $cfb_TCP_tot $cfb_VoIP_tot] puts $file(finish) "#\n# [format $mac_tit node_id pkt_type rcv_ifq mac_busy rtx max_rtx send_net rcv_net rcv_net_col rcv_net_err \ rcv_net_oth rcv_net_my dupl send_ll]\n#" foreach num [lessof $num_n] { $obj(mac,$num) dump_tc foreach fid [lessof $num_mac_tc] { foreach tip {message ARP tcp ack udp voip mac_rts mac_cts mac_ack} { puts $file(finish) " [format $mac_val mac_$nd($num)_$fid $tip $stat(mac,rcv_ifq,$fid,$tip) \ $stat(mac,busy,$fid,$tip) $stat(mac,rtx,$fid,$tip) $stat(mac,max_rtx,$fid,$tip) $stat(mac,send_erm,$fid,$tip) \ $stat(mac,rcv_chn,$fid,$tip) $stat(mac,rcv_chn_col,$fid,$tip) $stat(mac,rcv_chn_err,$fid,$tip) \ $stat(mac,rcv_chn_other,$fid,$tip) $stat(mac,rcv_chn_my,$fid,$tip) $stat(mac,dupl,$fid,$tip) $stat(mac,send_ll,$fid,$tip)]" } puts $file(finish) "#" } set num_mac_tc 0 }}####################################################################### ## ERM_stat: Writes on the output file the Error Model statistics ## #######################################################################proc ERM_stat {} { global file line stat num_n nd opt macadd $opt(timer_list) dump_chn set erm_temp [list 0 1 2 3 4 5 6 7 8 9 10] set erm_dim [list 8 12 12 12 12 12 14.10 12 12 14.10 12] set erm_dim_tit [list 8 12 12 12 12 12 14 12 12 14 12]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -