author | Pavel Boyko <boyko@iitp.ru> |
Tue, 16 Jun 2009 17:58:16 +0400 | |
changeset 5074 | 355de6af8ea9 |
parent 4079 | 210d64d11998 |
child 4602 | 36adfa546b04 |
permissions | -rw-r--r-- |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
1 |
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
2 |
/* |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
3 |
* Copyright (c) 2005 INRIA |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
4 |
* |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
5 |
* This program is free software; you can redistribute it and/or modify |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
6 |
* it under the terms of the GNU General Public License version 2 as |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
8 |
* |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
9 |
* This program is distributed in the hope that it will be useful, |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
12 |
* GNU General Public License for more details. |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
13 |
* |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
14 |
* You should have received a copy of the GNU General Public License |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
15 |
* along with this program; if not, write to the Free Software |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
16 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
17 |
* |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
18 |
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
19 |
*/ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
20 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
21 |
#include "mac-rx-middle.h" |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
22 |
#include "wifi-mac-header.h" |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
23 |
|
1974
0d6b3bead74a
replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1927
diff
changeset
|
24 |
#include "ns3/assert.h" |
2014
c1bc06ac5152
add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1974
diff
changeset
|
25 |
#include "ns3/log.h" |
c1bc06ac5152
add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1974
diff
changeset
|
26 |
#include "ns3/packet.h" |
c1bc06ac5152
add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1974
diff
changeset
|
27 |
#include "ns3/simulator.h" |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
28 |
#include <list> |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
29 |
|
2014
c1bc06ac5152
add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1974
diff
changeset
|
30 |
NS_LOG_COMPONENT_DEFINE ("MacRxMiddle"); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
31 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
32 |
namespace ns3 { |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
33 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
34 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
35 |
class OriginatorRxStatus { |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
36 |
private: |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
37 |
typedef std::list<Ptr<const Packet> > Fragments; |
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
38 |
typedef std::list<Ptr<const Packet> >::const_iterator FragmentsCI; |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
39 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
40 |
bool m_defragmenting; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
41 |
uint16_t m_lastSequenceControl; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
42 |
Fragments m_fragments; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
43 |
public: |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
44 |
OriginatorRxStatus () { |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
45 |
/* this is a magic value necessary. */ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
46 |
m_lastSequenceControl = 0xffff; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
47 |
m_defragmenting = false; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
48 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
49 |
~OriginatorRxStatus () { |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
50 |
m_fragments.clear (); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
51 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
52 |
bool IsDeFragmenting (void) { |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
53 |
return m_defragmenting; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
54 |
} |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
55 |
void AccumulateFirstFragment (Ptr<const Packet> packet) { |
1974
0d6b3bead74a
replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1927
diff
changeset
|
56 |
NS_ASSERT (!m_defragmenting); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
57 |
m_defragmenting = true; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
58 |
m_fragments.push_back (packet); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
59 |
} |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
60 |
Ptr<Packet> AccumulateLastFragment (Ptr<const Packet> packet) { |
1974
0d6b3bead74a
replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1927
diff
changeset
|
61 |
NS_ASSERT (m_defragmenting); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
62 |
m_fragments.push_back (packet); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
63 |
m_defragmenting = false; |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
64 |
Ptr<Packet> full = Create<Packet> (); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
65 |
for (FragmentsCI i = m_fragments.begin (); i != m_fragments.end (); i++) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
66 |
{ |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
67 |
full->AddAtEnd (*i); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
68 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
69 |
m_fragments.erase (m_fragments.begin (), m_fragments.end ()); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
70 |
return full; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
71 |
} |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
72 |
void AccumulateFragment (Ptr<const Packet> packet) { |
1974
0d6b3bead74a
replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
1927
diff
changeset
|
73 |
NS_ASSERT (m_defragmenting); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
74 |
m_fragments.push_back (packet); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
75 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
76 |
bool IsNextFragment (uint16_t sequenceControl) { |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
77 |
if ((sequenceControl >> 4) == (m_lastSequenceControl >> 4) && |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
78 |
(sequenceControl & 0x0f) == ((m_lastSequenceControl & 0x0f)+1)) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
79 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
80 |
return true; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
81 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
82 |
else |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
83 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
84 |
return false; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
85 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
86 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
87 |
uint16_t GetLastSequenceControl (void) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
88 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
89 |
return m_lastSequenceControl; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
90 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
91 |
void SetSequenceControl (uint16_t sequenceControl) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
92 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
93 |
m_lastSequenceControl = sequenceControl; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
94 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
95 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
96 |
}; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
97 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
98 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
99 |
MacRxMiddle::MacRxMiddle () |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
100 |
{ |
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
101 |
NS_LOG_FUNCTION_NOARGS (); |
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
102 |
} |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
103 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
104 |
MacRxMiddle::~MacRxMiddle () |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
105 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
106 |
NS_LOG_FUNCTION_NOARGS (); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
107 |
for (OriginatorsI i = m_originatorStatus.begin (); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
108 |
i != m_originatorStatus.end (); i++) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
109 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
110 |
delete (*i).second; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
111 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
112 |
m_originatorStatus.erase (m_originatorStatus.begin (), |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
113 |
m_originatorStatus.end ()); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
114 |
for (QosOriginatorsI i = m_qosOriginatorStatus.begin (); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
115 |
i != m_qosOriginatorStatus.end (); i++) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
116 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
117 |
delete (*i).second; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
118 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
119 |
m_qosOriginatorStatus.erase (m_qosOriginatorStatus.begin (), |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
120 |
m_qosOriginatorStatus.end ()); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
121 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
122 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
123 |
void |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
124 |
MacRxMiddle::SetForwardCallback (ForwardUpCallback callback) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
125 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
126 |
NS_LOG_FUNCTION_NOARGS (); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
127 |
m_callback = callback; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
128 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
129 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
130 |
bool |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
131 |
MacRxMiddle::SequenceControlSmaller (int seqca, int seqcb) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
132 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
133 |
NS_LOG_FUNCTION (seqca << seqcb); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
134 |
int seqa = seqca >> 4; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
135 |
int seqb = seqcb >> 4; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
136 |
int delta = seqb - seqa; |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
137 |
NS_LOG_DEBUG ("seqb="<<seqb<<", seqa="<<seqa<<", delta="<<delta); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
138 |
if (delta <= 0 && delta < -2048) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
139 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
140 |
return true; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
141 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
142 |
else if (delta >= 0 && delta < 2048) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
143 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
144 |
return true; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
145 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
146 |
else |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
147 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
148 |
return false; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
149 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
150 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
151 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
152 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
153 |
OriginatorRxStatus * |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
154 |
MacRxMiddle::Lookup (WifiMacHeader const *hdr) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
155 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
156 |
NS_LOG_FUNCTION (hdr); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
157 |
OriginatorRxStatus *originator; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
158 |
Mac48Address source = hdr->GetAddr2 (); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
159 |
if (hdr->IsQosData () && |
4079
210d64d11998
add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3923
diff
changeset
|
160 |
!hdr->GetAddr2 ().IsGroup ()) |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
161 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
162 |
/* only for qos data non-broadcast frames */ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
163 |
originator = m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())]; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
164 |
if (originator == 0) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
165 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
166 |
originator = new OriginatorRxStatus (); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
167 |
m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())] = originator; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
168 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
169 |
} |
2093
a4211cfa45a7
update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2092
diff
changeset
|
170 |
else |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
171 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
172 |
/* - management frames |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
173 |
* - qos data broadcast frames |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
174 |
* - nqos data frames |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
175 |
* see section 7.1.3.4.1 |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
176 |
*/ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
177 |
originator = m_originatorStatus[source]; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
178 |
if (originator == 0) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
179 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
180 |
originator = new OriginatorRxStatus (); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
181 |
m_originatorStatus[source] = originator; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
182 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
183 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
184 |
return originator; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
185 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
186 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
187 |
bool |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
188 |
MacRxMiddle::IsDuplicate (WifiMacHeader const*hdr, |
2092
885ebd975e88
set the retry bit and use it to filter duplicates
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2014
diff
changeset
|
189 |
OriginatorRxStatus *originator) const |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
190 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
191 |
NS_LOG_FUNCTION (hdr << originator); |
2092
885ebd975e88
set the retry bit and use it to filter duplicates
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2014
diff
changeset
|
192 |
if (hdr->IsRetry () && |
885ebd975e88
set the retry bit and use it to filter duplicates
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2014
diff
changeset
|
193 |
originator->GetLastSequenceControl () == hdr->GetSequenceControl ()) |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
194 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
195 |
return true; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
196 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
197 |
return false; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
198 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
199 |
|
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
200 |
Ptr<Packet> |
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
201 |
MacRxMiddle::HandleFragments (Ptr<Packet> packet, WifiMacHeader const*hdr, |
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
202 |
OriginatorRxStatus *originator) |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
203 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
204 |
NS_LOG_FUNCTION (packet << hdr << originator); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
205 |
if (originator->IsDeFragmenting ()) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
206 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
207 |
if (hdr->IsMoreFragments ()) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
208 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
209 |
if (originator->IsNextFragment (hdr->GetSequenceControl ())) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
210 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
211 |
NS_LOG_DEBUG ("accumulate fragment seq="<<hdr->GetSequenceNumber ()<< |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
212 |
", frag="<<hdr->GetFragmentNumber ()<< |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
213 |
", size="<<packet->GetSize ()); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
214 |
originator->AccumulateFragment (packet); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
215 |
originator->SetSequenceControl (hdr->GetSequenceControl ()); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
216 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
217 |
else |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
218 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
219 |
NS_LOG_DEBUG ("non-ordered fragment"); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
220 |
} |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
221 |
return 0; |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
222 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
223 |
else |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
224 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
225 |
if (originator->IsNextFragment (hdr->GetSequenceControl ())) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
226 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
227 |
NS_LOG_DEBUG ("accumulate last fragment seq="<<hdr->GetSequenceNumber ()<< |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
228 |
", frag="<<hdr->GetFragmentNumber ()<< |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
229 |
", size="<<hdr->GetSize ()); |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
230 |
Ptr<Packet> p = originator->AccumulateLastFragment (packet); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
231 |
originator->SetSequenceControl (hdr->GetSequenceControl ()); |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
232 |
return p; |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
233 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
234 |
else |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
235 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
236 |
NS_LOG_DEBUG ("non-ordered fragment"); |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
237 |
return 0; |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
238 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
239 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
240 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
241 |
else |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
242 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
243 |
if (hdr->IsMoreFragments ()) |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
244 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
245 |
NS_LOG_DEBUG ("accumulate first fragment seq="<<hdr->GetSequenceNumber ()<< |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
246 |
", frag="<<hdr->GetFragmentNumber ()<< |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
247 |
", size="<<packet->GetSize ()); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
248 |
originator->AccumulateFirstFragment (packet); |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
249 |
originator->SetSequenceControl (hdr->GetSequenceControl ()); |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
250 |
return 0; |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
251 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
252 |
else |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
253 |
{ |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
254 |
return packet; |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
255 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
256 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
257 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
258 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
259 |
void |
2159
20f882e85b4a
port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2148
diff
changeset
|
260 |
MacRxMiddle::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr) |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
261 |
{ |
2985
fa0747c4ad5e
use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2159
diff
changeset
|
262 |
NS_LOG_FUNCTION (packet << hdr); |
3923
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
263 |
NS_ASSERT (hdr->IsData () || hdr->IsMgt ()); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
264 |
OriginatorRxStatus *originator = Lookup (hdr); |
3923
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
265 |
/** |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
266 |
* The check below is really uneeded because it can fail in a lot of |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
267 |
* normal cases. Specifically, it is possible for sequence numbers to |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
268 |
* loop back to zero once they reach 0xfff0 and to go up to 0xf7f0 in |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
269 |
* which case the check below will report the two sequence numbers to |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
270 |
* not have the correct order relationship. |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
271 |
* So, this check cannot be used to discard old duplicate frames. It is |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
272 |
* thus here only for documentation purposes. |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
273 |
*/ |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
274 |
if (!SequenceControlSmaller (originator->GetLastSequenceControl (), |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
275 |
hdr->GetSequenceControl ())) |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
276 |
{ |
3923
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
277 |
NS_LOG_DEBUG ("Sequence numbers have looped back. last recorded="<<originator->GetLastSequenceControl ()<< |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
278 |
" currently seen="<< hdr->GetSequenceControl ()); |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
279 |
} |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
280 |
// filter duplicates. |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
281 |
if (IsDuplicate (hdr, originator)) |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
282 |
{ |
3923
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
283 |
NS_LOG_DEBUG ("duplicate from="<<hdr->GetAddr2 ()<< |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
284 |
", seq="<<hdr->GetSequenceNumber ()<< |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
285 |
", frag="<<hdr->GetFragmentNumber ()); |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
286 |
return; |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
287 |
} |
3923
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
288 |
Ptr<Packet> agregate = HandleFragments (packet, hdr, originator); |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
289 |
if (agregate == 0) |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
290 |
{ |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
291 |
return; |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
292 |
} |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
293 |
NS_LOG_DEBUG ("forwarding data from="<<hdr->GetAddr2 ()<< |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
294 |
", seq="<<hdr->GetSequenceNumber ()<< |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
295 |
", frag="<<hdr->GetFragmentNumber ()); |
4079
210d64d11998
add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
3923
diff
changeset
|
296 |
if (!hdr->GetAddr1 ().IsGroup ()) |
3923
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
297 |
{ |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
298 |
originator->SetSequenceControl (hdr->GetSequenceControl ()); |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
299 |
} |
f38616f83c3b
bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
2985
diff
changeset
|
300 |
m_callback (agregate, hdr); |
1927
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
301 |
} |
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
302 |
|
7ef830068f1d
add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff
changeset
|
303 |
} // namespace ns3 |