diff options
Diffstat (limited to 'src/seqWindow.cpp')
-rw-r--r-- | src/seqWindow.cpp | 71 |
1 files changed, 39 insertions, 32 deletions
diff --git a/src/seqWindow.cpp b/src/seqWindow.cpp index 359ba63..e860464 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 <satp@wirdorange.org> * * 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); + 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; } |