+=======+ New frag RuleID received | | ~~~~~~~~~~~~~ | INIT +-------+cur_W=0;clear([cur_W,Bmp_n]); +=======+ |sync=0 | Not All* & rcv_W==cur_W+---+ | +--+ ~~~~~~~~~~~~~~~~~~~~ | | | | (E) set[cur_W,Bmp_n(FCN)]| v v v | ++===+=+=+==+=+ +----------------------+ +--+ All-0&Full[cur_W,Bmp_n] | ABORT *<---+ Rcv Window | | ~~~~~~~~~~ | +-------------------+ +<-+ cur_W++;set Inact_timer; | | +->+=+=+=+=+=+===+ clear [cur_W,Bmp_n] | | All-0 empty(Wn)| | | | ^ ^ | | ~~~~~~~~~~~~~~ +----+ | | | |rcv_W==cur_W & sync==0; | | sendACK([Wn,Bmp_n]) | | | |& Full([cur_W,Bmp_n]) | | | | | |& All* || last_miss_frag | | | | | |~~~~~~~~~~~~~~~~~~~~~~ | | All* & rcv_W==cur_W|(C)| |sendACK([cur_W,Bmp_n]); | | & sync==0| | | |cur_W++; clear([cur_W,Bmp_n]) | |&no_full([cur_W,Bmp_n])| |(E)| | | ~~~~~~~~~~~~~~~~ | | | | +========+ | | sendACK([cur_W,Bmp_n])| | | | | Error/ | | | | | | | +----+ | Abort | | | v v | | | | +===+====+ | | +===+=+=+=+===+=+ (D) ^ | | +--+ Wait x | | | | | All-0 empty(Wn)+->| Missing Frags |<-+ | | | ~~~~~~~~~~~~~~ +=============+=+ | | | sendACK([Wn,Bmp_n]) +--------------+ | | *ABORT v v (A)(B) (D) All* || last_miss_frag (C) All* & sync>0 & rcv_W!=cur_W & sync>0 ~~~~~~~~~~~~ & Full([rcv_W,Bmp_n]) Wn=oldest[not full(W)]; ~~~~~~~~~~~~~~~~~~~~ sendACK([Wn,Bmp_n]) Wn=oldest[not full(W)]; sendACK([Wn,Bmp_n]);sync-- ABORT-->* Uplink Only & Inact_Timer expires (E) Not All* & rcv_W!=cur_W || Attempts > MAX_ACK_REQUESTS ~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ sync++; cur_W=rcv_W; send Abort set[cur_W,Bmp_n(FCN)]