⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mftp_snd.tcl

📁 跑leach需要的
💻 TCL
字号:
## (c) 1997-98 StarBurst Communications Inc.## THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE# ARE DISCLAIMED.  IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF# SUCH DAMAGE.## Author: Christoph Haenle, chris@cs.vu.nl# File: mftp_snd.tcl# Last change: Nov. 17, 1998## This software may freely be used only for non-commercial purposes#Agent/MFTP/Snd set dtuSize_ 1424            ;# default size of DTUs (in bytes)Agent/MFTP/Snd set dtusPerBlock_ 1472       ;# default number of DTUs per blockAgent/MFTP/Snd set dtusPerGroup_ 8          ;# default group sizeAgent/MFTP/Snd set fileSize_ 1000000        ;# default file size in bytesAgent/MFTP/Snd set readAheadBufsize_ 2097152;# default size of read-ahead buffer in bytesAgent/MFTP/Snd set interval_ 512000         ;# default transmission rate is 512kbpsAgent/MFTP/Snd set txStatusLimit_ 100       ;# default max. number of consecutive status requests without NAKAgent/MFTP/Snd set txStatusDelay_ 2         ;# default time to wait for status responses after a request before polling againAgent/MFTP/Snd set rspBackoffWindow_ 1      ;# default max. time for receivers to wait before replying with nak(s) after a requestAgent/MFTP/Snd set reply_addr_ undefined    ; # application _must_ specify the sender address (i.e. the one                                            ;# to which NAKs are unicast to). Default is "undefined"Agent/MFTP/Snd set reply_port_ undefinedAgent/MFTP/Snd set nakCount_ 0Agent/MFTP/Snd set seekCount_ 0             ;# number of disk seeks performedAgent/MFTP/Snd instproc init {} {    $self next    $self instvar ns_ dtuSize_ dtusPerBlock_ dtusPerGroup_ fileSize_     $self instvar reply_addr_ reply_port_ readAheadBufsize_ interval_     $self instvar txStatusLimit_ txStatusDelay_ rspBackoffWindow_ nakCount_     $self instvar seekCount_    set ns_ [Simulator instance]    foreach var { dtuSize_ dtusPerBlock_ dtusPerGroup_ fileSize_ \                      readAheadBufsize_ interval_ txStatusLimit_ \                      txStatusDelay_ rspBackoffWindow_ nakCount_ seekCount_ } {        $self init-instvar $var    }}# send-data does not get logged here. Rather, we get a callback-call "send-notify" from# the C++ function se_dataAgent/MFTP/Snd instproc send-data { } {    $self instvar ns_ interval_    if { [$self cmd send data] != -1 } {        # if not end-of-pass, re-schedule new "send-data" event        $ns_ at [expr [$ns_ now] + $interval_] "$self send-data"    }}Agent/MFTP/Snd instproc start {} {    $self instvar node_ dst_addr_    set dst_addr_ [expr $dst_addr_]           ;# get rid of possibly leading 0x etc.    $self cmd start    $node_ join-group $self $dst_addr_    $self send-data}Agent/MFTP/Snd instproc pass-finished { CurrentPass NbBlocks } {    $self instvar ns_ dtusPerGroup_ interval_ tx_status_requests_ rspBackoffWindow_    set tx_status_requests_ 0       ;# number of consecutively sent status requests    if { $CurrentPass >= $dtusPerGroup_ - 1 } {        $self send status-req $CurrentPass 0 [expr $NbBlocks-1] $rspBackoffWindow_    } else {        # the first dtusPerGroup_ passes are sent without waiting for NAKs:        # re-schedule new "send-data" event        $ns_ at [expr [$ns_ now] + $interval_] "$self send-data"    }}# send-status-req is called at end-of-pass, but only after the dtusPerGroup-th pass.Agent/MFTP/Snd instproc send-status-req { CurrentPass blockLo blockHi rspBackoffWindow } {    $self instvar ns_ tx_status_requests_ txStatusDelay_    $self cmd send statreq $CurrentPass $blockLo $blockHi $rspBackoffWindow    incr tx_status_requests_    $ns_ at [expr [$ns_ now] + $txStatusDelay_] \        "$self status-rsp-pending $CurrentPass $blockLo $blockHi"}# status-rsp-pending is called after the status-request packet is sent and# if the status-rsp-pending-timer expires.Agent/MFTP/Snd instproc status-rsp-pending { CurrentPass blockLo blockHi } {    $self instvar nakCount_ tx_status_requests_ txStatusLimit_ rspBackoffWindow_    # see if we have at least received 1 NAK    # if yes, then start over with new pass, i.e. $self send-data    # if no, send another status request, i.e. $self send status-req    if { $nakCount_ > 0 } {        # start over with next pass:        set nakCount_ 0        $self send-data    } elseif { $tx_status_requests_ < $txStatusLimit_ } {        # if we have not reached the maximum number of status-requests:        $self send status-req $CurrentPass $blockLo $blockHi $rspBackoffWindow_    } else {        # Reached the maximum number of status requests        $self done    }}Agent/MFTP/Snd instproc recv { type args } {    eval $self evTrace $proc $type $args    eval $self $proc-$type $args}Agent/MFTP/Snd instproc send { type args } {    eval $self evTrace $proc $type $args    eval $self $proc-$type $args}# we get here whenever the sender sends a new data packet (callback from send_data)Agent/MFTP/Snd instproc send-notify { args } {}Agent/MFTP/Snd instproc recv-nak { passNb block_nb nak_count} {}Agent/MFTP/Snd instproc done {} {    # no further registering of events => end of transmission}Agent/MFTP/Snd instproc trace fd {    $self instvar trace_    set trace_ $fd}Agent/MFTP/Snd instproc delete {} {}Agent/MFTP/Snd instproc evTrace { op type args } {    $self instvar trace_ ns_    if [info exists trace_] {	puts $trace_ [format "%7.4f [[$self set node_] id] $op-$type $args" [$ns_ now]]    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -