X-Git-Url: https://git.syn-net.org/debian/?p=anytun.git;a=blobdiff_plain;f=src%2FseqWindow.cpp;h=992a71c2118cc281551d2642a21092a8858b4c19;hp=359ba63667db6653cbfd100e196441f6c852fe17;hb=ef0cacf2508418915d3f64b04003be3c13fed3cc;hpb=ece844834d2cecc028ce81ca283f5d441088580e diff --git a/src/seqWindow.cpp b/src/seqWindow.cpp index 359ba63..992a71c 100644 --- a/src/seqWindow.cpp +++ b/src/seqWindow.cpp @@ -11,7 +11,7 @@ * tunneling and relaying of packets of any protocol. * * - * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, + * Copyright (C) 2007-2009 Othmar Gsenger, Erwin Nindl, * Christian Pointner * * This file is part of Anytun. @@ -44,16 +44,18 @@ SeqWindowElement::SeqWindowElement() SeqWindowElement::~SeqWindowElement() { - if(window_) + if(window_) { delete[] window_; + } } void SeqWindowElement::init(window_size_t w, seq_nr_t m) { - if(window_) + if(window_) { delete[] window_; - window_ = new u_int8_t[w]; - memset(window_, 0, w); + } + window_ = new uint8_t[w]; + memset(window_, 0, w); pos_ = 0; max_ = m; window_[pos_] = 1; @@ -70,8 +72,9 @@ SeqWindow::~SeqWindow() bool SeqWindow::checkAndAdd(sender_id_t sender, seq_nr_t seq_nr) { Lock lock(mutex_); - if (!window_size_) + if(!window_size_) { return false; + } SenderMap::iterator s = sender_.find(sender); if(s == sender_.end()) { @@ -84,67 +87,71 @@ bool SeqWindow::checkAndAdd(sender_id_t sender, seq_nr_t seq_nr) s->second.max_ += SEQ_NR_MAX/2; seq_nr += SEQ_NR_MAX/2; shifted = 1; - } - else if(s->second.max_ > (SEQ_NR_MAX - window_size_)) { + } else if(s->second.max_ > (SEQ_NR_MAX - window_size_)) { s->second.max_ -= SEQ_NR_MAX/2; seq_nr -= SEQ_NR_MAX/2; shifted = 2; } - + seq_nr_t min = s->second.max_ - window_size_ + 1; if(seq_nr < min || seq_nr == s->second.max_) { - if(shifted == 1) + if(shifted == 1) { s->second.max_ -= SEQ_NR_MAX/2; - else if(shifted == 2) + } else if(shifted == 2) { s->second.max_ += SEQ_NR_MAX/2; + } return true; } - + if(seq_nr > s->second.max_) { seq_nr_t diff = seq_nr - s->second.max_; - if(diff >= window_size_) + if(diff >= window_size_) { diff = window_size_; - + } + window_size_t new_pos = s->second.pos_ + diff; - + if(new_pos >= window_size_) { new_pos -= window_size_; - - if(s->second.pos_ < window_size_ - 1) + + if(s->second.pos_ < window_size_ - 1) { memset(&(s->second.window_[s->second.pos_ + 1]), 0, window_size_ - s->second.pos_ - 1); - + } + memset(s->second.window_, 0, new_pos); - } - else { + } else { memset(&(s->second.window_[s->second.pos_ + 1]), 0, diff); } s->second.pos_ = new_pos; s->second.window_[s->second.pos_] = 1; s->second.max_ = seq_nr; - - if(shifted == 1) + + if(shifted == 1) { s->second.max_ -= SEQ_NR_MAX/2; - else if(shifted == 2) + } else if(shifted == 2) { s->second.max_ += SEQ_NR_MAX/2; - + } + return false; } - + seq_nr_t diff = s->second.max_ - seq_nr; - window_size_t pos = diff > s->second.pos_ ? s->second.pos_ + window_size_ : s->second.pos_; + window_size_t pos = diff > s->second.pos_ ? s->second.pos_ + window_size_ : s->second.pos_; pos -= diff; - - if(shifted == 1) + + if(shifted == 1) { s->second.max_ -= SEQ_NR_MAX/2; - else if(shifted == 2) + } else if(shifted == 2) { s->second.max_ += SEQ_NR_MAX/2; - + } + int ret = s->second.window_[pos]; s->second.window_[pos] = 1; - - if(ret) + + if(ret) { return true; - + } + return false; }