A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
block-ack-cache.cc
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2010 MIRKO BANCHI
4
*
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License version 2 as
7
* published by the Free Software Foundation;
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
*
18
* Author: Mirko Banchi <mk.banchi@gmail.com>
19
*/
20
#include "
block-ack-cache.h
"
21
#include "
ctrl-headers.h
"
22
#include "
wifi-mac-header.h
"
23
#include "
qos-utils.h
"
24
#include "ns3/log.h"
25
26
#define WINSIZE_ASSERT NS_ASSERT ((m_winEnd - m_winStart + 4096) % 4096 == m_winSize - 1)
27
28
namespace
ns3
{
29
30
NS_LOG_COMPONENT_DEFINE
(
"BlockAckCache"
);
31
32
void
33
BlockAckCache::Init
(uint16_t winStart, uint16_t winSize)
34
{
35
NS_LOG_FUNCTION
(
this
<< winStart << winSize);
36
m_winStart
= winStart;
37
m_winSize
= winSize <= 64 ? winSize : 64;
38
m_winEnd
= (
m_winStart
+
m_winSize
- 1) % 4096;
39
memset (
m_bitmap
, 0,
sizeof
(
m_bitmap
));
40
}
41
42
uint16_t
43
BlockAckCache::GetWinStart
()
44
{
45
return
m_winStart
;
46
}
47
48
void
49
BlockAckCache::UpdateWithMpdu
(
const
WifiMacHeader
*hdr)
50
{
51
NS_LOG_FUNCTION
(
this
<< hdr);
52
uint16_t seqNumber = hdr->
GetSequenceNumber
();
53
if
(!
QosUtilsIsOldPacket
(
m_winStart
, seqNumber))
54
{
55
if
(!
IsInWindow
(seqNumber))
56
{
57
uint16_t delta = (seqNumber -
m_winEnd
+ 4096) % 4096;
58
if
(delta > 1)
59
{
60
ResetPortionOfBitmap
((
m_winEnd
+ 1) % 4096, ((seqNumber - 1) + 4096) % 4096);
61
}
62
m_winStart
= (
m_winStart
+ delta) % 4096;
63
m_winEnd
= seqNumber;
64
65
WINSIZE_ASSERT
;
66
}
67
m_bitmap
[seqNumber] |= (0x0001 << hdr->
GetFragmentNumber
());
68
}
69
}
70
71
void
72
BlockAckCache::UpdateWithBlockAckReq
(uint16_t startingSeq)
73
{
74
NS_LOG_FUNCTION
(
this
<< startingSeq);
75
if
(!
QosUtilsIsOldPacket
(
m_winStart
, startingSeq))
76
{
77
if
(
IsInWindow
(startingSeq))
78
{
79
if
(startingSeq !=
m_winStart
)
80
{
81
m_winStart
= startingSeq;
82
uint16_t newWinEnd = (
m_winStart
+
m_winSize
- 1) % 4096;
83
ResetPortionOfBitmap
((
m_winEnd
+ 1) % 4096, newWinEnd);
84
m_winEnd
= newWinEnd;
85
86
WINSIZE_ASSERT
;
87
}
88
}
89
else
90
{
91
m_winStart
= startingSeq;
92
m_winEnd
= (
m_winStart
+
m_winSize
- 1) % 4096;
93
ResetPortionOfBitmap
(
m_winStart
,
m_winEnd
);
94
95
WINSIZE_ASSERT
;
96
}
97
}
98
}
99
100
void
101
BlockAckCache::ResetPortionOfBitmap
(uint16_t
start
, uint16_t end)
102
{
103
NS_LOG_FUNCTION
(
this
<< start << end);
104
uint32_t i =
start
;
105
for
(; i != end; i = (i + 1) % 4096)
106
{
107
m_bitmap
[i] = 0;
108
}
109
m_bitmap
[i] = 0;
110
}
111
112
bool
113
BlockAckCache::IsInWindow
(uint16_t seq)
114
{
115
NS_LOG_FUNCTION
(
this
<< seq);
116
return
((seq -
m_winStart
+ 4096) % 4096) <
m_winSize
;
117
}
118
119
void
120
BlockAckCache::FillBlockAckBitmap
(
CtrlBAckResponseHeader
*blockAckHeader)
121
{
122
NS_LOG_FUNCTION
(
this
<< blockAckHeader);
123
if
(blockAckHeader->
IsBasic
())
124
{
125
NS_FATAL_ERROR
(
"Basic block ack is only partially implemented."
);
126
}
127
else
if
(blockAckHeader->
IsCompressed
())
128
{
129
uint32_t i = blockAckHeader->
GetStartingSequence
();
130
uint32_t end = (i +
m_winSize
- 1) % 4096;
131
for
(; i != end; i = (i + 1) % 4096)
132
{
133
if
(
m_bitmap
[i] == 1)
134
{
135
blockAckHeader->
SetReceivedPacket
(i);
136
}
137
}
138
if
(
m_bitmap
[i] == 1)
139
{
140
blockAckHeader->
SetReceivedPacket
(i);
141
}
142
}
143
else
if
(blockAckHeader->
IsMultiTid
())
144
{
145
NS_FATAL_ERROR
(
"Multi-tid block ack is not supported."
);
146
}
147
}
148
149
}
// namespace ns3
NS_LOG_FUNCTION
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Definition:
log-macros-enabled.h:207
ns3::WifiMacHeader::GetFragmentNumber
uint16_t GetFragmentNumber(void) const
Return the fragment number of the header.
Definition:
wifi-mac-header.cc:722
ns3::BlockAckCache::ResetPortionOfBitmap
void ResetPortionOfBitmap(uint16_t start, uint16_t end)
Definition:
block-ack-cache.cc:101
ns3::CtrlBAckResponseHeader::GetStartingSequence
uint16_t GetStartingSequence(void) const
Return the starting sequence number.
Definition:
ctrl-headers.cc:461
ns3::BlockAckCache::IsInWindow
bool IsInWindow(uint16_t seq)
Definition:
block-ack-cache.cc:113
visualizer.core.start
def start()
Definition:
core.py:1482
ns3::BlockAckCache::m_winStart
uint16_t m_winStart
Definition:
block-ack-cache.h:54
ns3::BlockAckCache::UpdateWithBlockAckReq
void UpdateWithBlockAckReq(uint16_t startingSeq)
Definition:
block-ack-cache.cc:72
ns3::BlockAckCache::Init
void Init(uint16_t winStart, uint16_t winSize)
Definition:
block-ack-cache.cc:33
NS_LOG_COMPONENT_DEFINE
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition:
log.h:201
ns3::CtrlBAckResponseHeader::IsCompressed
bool IsCompressed(void) const
Check if the current ACK policy is compressed ACK and not multiple TID.
Definition:
ctrl-headers.cc:475
ns3::BlockAckCache::UpdateWithMpdu
void UpdateWithMpdu(const WifiMacHeader *hdr)
Definition:
block-ack-cache.cc:49
NS_FATAL_ERROR
#define NS_FATAL_ERROR(msg)
Fatal error handling.
Definition:
fatal-error.h:100
ns3::QosUtilsIsOldPacket
bool QosUtilsIsOldPacket(uint16_t startingSeq, uint16_t seqNumber)
This function checks if packet with sequence number seqNumber is an "old" packet. ...
Definition:
qos-utils.cc:86
qos-utils.h
ctrl-headers.h
wifi-mac-header.h
ns3::CtrlBAckResponseHeader
Headers for Block ack response.
Definition:
ctrl-headers.h:183
block-ack-cache.h
WINSIZE_ASSERT
#define WINSIZE_ASSERT
Definition:
block-ack-cache.cc:26
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::CtrlBAckResponseHeader::IsBasic
bool IsBasic(void) const
Check if the current ACK policy is basic (i.e.
Definition:
ctrl-headers.cc:468
ns3::BlockAckCache::FillBlockAckBitmap
void FillBlockAckBitmap(CtrlBAckResponseHeader *blockAckHeader)
Definition:
block-ack-cache.cc:120
ns3::BlockAckCache::m_winSize
uint8_t m_winSize
Definition:
block-ack-cache.h:55
ns3::BlockAckCache::m_winEnd
uint16_t m_winEnd
Definition:
block-ack-cache.h:56
ns3::CtrlBAckResponseHeader::SetReceivedPacket
void SetReceivedPacket(uint16_t seq)
Set the bitmap that the packet with the given sequence number was received.
Definition:
ctrl-headers.cc:600
ns3::BlockAckCache::GetWinStart
uint16_t GetWinStart(void)
When an A-MPDU is received, the window start may change to a new value depending on the sequence numb...
Definition:
block-ack-cache.cc:43
ns3::BlockAckCache::m_bitmap
uint16_t m_bitmap[4096]
Definition:
block-ack-cache.h:58
ns3::CtrlBAckResponseHeader::IsMultiTid
bool IsMultiTid(void) const
Check if the current ACK policy has multiple TID.
Definition:
ctrl-headers.cc:482
ns3::WifiMacHeader
Implements the IEEE 802.11 MAC header.
Definition:
wifi-mac-header.h:80
ns3::WifiMacHeader::GetSequenceNumber
uint16_t GetSequenceNumber(void) const
Return the sequence number of the header.
Definition:
wifi-mac-header.cc:717
src
wifi
model
block-ack-cache.cc
Generated on Thu Feb 5 2015 18:33:56 for ns-3 by
1.8.9.1