4 * The secure anycast tunneling protocol (satp) defines a protocol used
5 * for communication between any combination of unicast and anycast
6 * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
7 * mode and allows tunneling of every ETHER TYPE protocol (e.g.
8 * ethernet, ip, arp ...). satp directly includes cryptography and
9 * message authentication based on the methodes used by SRTP. It is
10 * intended to deliver a generic, scaleable and secure solution for
11 * tunneling and relaying of packets of any protocol.
14 * Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl,
15 * Christian Pointner <satp@wirdorange.org>
17 * This file is part of Anytun.
19 * Anytun is free software: you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License version 3 as
21 * published by the Free Software Foundation.
23 * Anytun is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with anytun. If not, see <http://www.gnu.org/licenses/>.
32 #include "threadUtils.hpp"
33 #include "datatypes.h"
35 #include "seqWindow.h"
37 SeqWindowElement::SeqWindowElement()
44 SeqWindowElement::~SeqWindowElement()
50 void SeqWindowElement::init(window_size_t w
, seq_nr_t m
)
54 window_
= new u_int8_t
[w
];
55 memset(window_
, 0, w
);
61 SeqWindow::SeqWindow(window_size_t w
) : window_size_(w
)
65 SeqWindow::~SeqWindow()
69 bool SeqWindow::checkAndAdd(sender_id_t sender
, seq_nr_t seq_nr
)
75 SenderMap::iterator s
= sender_
.find(sender
);
76 if(s
== sender_
.end()) {
77 sender_
[sender
].init(window_size_
, seq_nr
);
82 if(s
->second
.max_
< window_size_
) {
83 s
->second
.max_
+= SEQ_NR_MAX
/2;
84 seq_nr
+= SEQ_NR_MAX
/2;
87 else if(s
->second
.max_
> (SEQ_NR_MAX
- window_size_
)) {
88 s
->second
.max_
-= SEQ_NR_MAX
/2;
89 seq_nr
-= SEQ_NR_MAX
/2;
93 seq_nr_t min
= s
->second
.max_
- window_size_
+ 1;
94 if(seq_nr
< min
|| seq_nr
== s
->second
.max_
) {
96 s
->second
.max_
-= SEQ_NR_MAX
/2;
98 s
->second
.max_
+= SEQ_NR_MAX
/2;
102 if(seq_nr
> s
->second
.max_
) {
103 seq_nr_t diff
= seq_nr
- s
->second
.max_
;
104 if(diff
>= window_size_
)
107 window_size_t new_pos
= s
->second
.pos_
+ diff
;
109 if(new_pos
>= window_size_
) {
110 new_pos
-= window_size_
;
112 if(s
->second
.pos_
< window_size_
- 1)
113 memset(&(s
->second
.window_
[s
->second
.pos_
+ 1]), 0, window_size_
- s
->second
.pos_
- 1);
115 memset(s
->second
.window_
, 0, new_pos
);
118 memset(&(s
->second
.window_
[s
->second
.pos_
+ 1]), 0, diff
);
120 s
->second
.pos_
= new_pos
;
121 s
->second
.window_
[s
->second
.pos_
] = 1;
122 s
->second
.max_
= seq_nr
;
125 s
->second
.max_
-= SEQ_NR_MAX
/2;
126 else if(shifted
== 2)
127 s
->second
.max_
+= SEQ_NR_MAX
/2;
132 seq_nr_t diff
= s
->second
.max_
- seq_nr
;
133 window_size_t pos
= diff
> s
->second
.pos_
? s
->second
.pos_
+ window_size_
: s
->second
.pos_
;
137 s
->second
.max_
-= SEQ_NR_MAX
/2;
138 else if(shifted
== 2)
139 s
->second
.max_
+= SEQ_NR_MAX
/2;
141 int ret
= s
->second
.window_
[pos
];
142 s
->second
.window_
[pos
] = 1;
150 void SeqWindow::clear(sender_id_t sender
)
153 sender_
.erase(sender
);
156 void SeqWindow::clear()