A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
uan-header-rc.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2009 University of Washington
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Leonard Tracy <lentracy@gmail.com>
18 */
19
20#include "uan-header-rc.h"
21
22#include "ns3/mac8-address.h"
23
24#include <set>
25
26namespace ns3
27{
28
29NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcData);
30NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcRts);
31NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcCtsGlobal);
32NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcCts);
33NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcAck);
34
36 : Header(),
37 m_frameNo(0),
38 m_propDelay(Seconds(0))
39{
40}
41
42UanHeaderRcData::UanHeaderRcData(uint8_t frameNo, Time propDelay)
43 : Header(),
44 m_frameNo(frameNo),
45 m_propDelay(propDelay)
46{
47}
48
50{
51}
52
55{
56 static TypeId tid = TypeId("ns3::UanHeaderRcData")
58 .SetGroupName("Uan")
59 .AddConstructor<UanHeaderRcData>();
60 return tid;
61}
62
63void
65{
66 m_frameNo = no;
67}
68
69void
71{
72 m_propDelay = propDelay;
73}
74
75uint8_t
77{
78 return m_frameNo;
79}
80
81Time
83{
84 return m_propDelay;
85}
86
89{
90 return 1 + 2;
91}
92
93void
95{
96 start.WriteU8(m_frameNo);
97 start.WriteU16((uint16_t)m_propDelay.RoundTo(Time::MS).GetMilliSeconds());
98}
99
102{
103 Buffer::Iterator rbuf = start;
104
105 m_frameNo = start.ReadU8();
106 m_propDelay = Seconds(((double)start.ReadU16()) / 1000.0);
107
108 return rbuf.GetDistanceFrom(start);
109}
110
111void
112UanHeaderRcData::Print(std::ostream& os, Time::Unit unit) const
113{
114 os << "Frame No=" << (uint32_t)m_frameNo << " Prop Delay=" << m_propDelay.As(unit);
115}
116
117void
118UanHeaderRcData::Print(std::ostream& os) const
119{
120 Print(os, Time::S);
121}
122
123TypeId
125{
126 return GetTypeId();
127}
128
130 : Header(),
131 m_frameNo(0),
132 m_noFrames(0),
133 m_length(0),
134 m_timeStamp(Seconds(0)),
135 m_retryNo(0)
136{
137}
138
140 uint8_t retryNo,
141 uint8_t noFrames,
142 uint16_t length,
143 Time timeStamp)
144 : Header(),
145 m_frameNo(frameNo),
146 m_noFrames(noFrames),
147 m_length(length),
148 m_timeStamp(timeStamp),
149 m_retryNo(retryNo)
150{
151}
152
154{
155}
156
157TypeId
159{
160 static TypeId tid = TypeId("ns3::UanHeaderRcRts")
161 .SetParent<Header>()
162 .SetGroupName("Uan")
163 .AddConstructor<UanHeaderRcRts>();
164 return tid;
165}
166
167void
169{
170 m_frameNo = no;
171}
172
173void
175{
176 m_noFrames = no;
177}
178
179void
181{
182 m_length = length;
183}
184
185void
187{
188 m_timeStamp = timeStamp;
189}
190
191void
193{
194 m_retryNo = no;
195}
196
197uint8_t
199{
200 return m_noFrames;
201}
202
203uint16_t
205{
206 return m_length;
207}
208
209Time
211{
212 return m_timeStamp;
213}
214
215uint8_t
217{
218 return m_retryNo;
219}
220
221uint8_t
223{
224 return m_frameNo;
225}
226
229{
230 return 1 + 1 + 1 + 4 + 2;
231}
232
233void
235{
236 start.WriteU8(m_frameNo);
237 start.WriteU8(m_retryNo);
238 start.WriteU8(m_noFrames);
239 start.WriteU16(m_length);
241}
242
245{
246 Buffer::Iterator rbuf = start;
247 m_frameNo = rbuf.ReadU8();
248 m_retryNo = rbuf.ReadU8();
249 m_noFrames = rbuf.ReadU8();
250 m_length = rbuf.ReadU16();
251 m_timeStamp = Seconds(((double)rbuf.ReadU32()) / 1000.0);
252 // m_timeStamp = Seconds ( rbuf.ReadU16 ()/1000 );
253 return rbuf.GetDistanceFrom(start);
254}
255
256void
257UanHeaderRcRts::Print(std::ostream& os, Time::Unit unit) const
258{
259 os << "Frame #=" << (uint32_t)m_frameNo << " Retry #=" << (uint32_t)m_retryNo
260 << " Num Frames=" << (uint32_t)m_noFrames << "Length=" << m_length
261 << " Time Stamp=" << m_timeStamp.As(unit);
262}
263
264void
265UanHeaderRcRts::Print(std::ostream& os) const
266{
267 Print(os, Time::S);
268}
269
270TypeId
272{
273 return GetTypeId();
274}
275
277 : Header(),
278 m_retryRate(0),
279 m_rateNum(0)
280{
281}
282
283UanHeaderRcCtsGlobal::UanHeaderRcCtsGlobal(Time wt, Time ts, uint16_t rate, uint16_t retryRate)
284 : Header(),
285 m_timeStampTx(ts),
286 m_winTime(wt),
287 m_retryRate(retryRate),
288 m_rateNum(rate)
289{
290}
291
293{
294}
295
296TypeId
298{
299 static TypeId tid = TypeId("ns3::UanHeaderRcCtsGlobal")
300 .SetParent<Header>()
301 .SetGroupName("Uan")
302 .AddConstructor<UanHeaderRcCtsGlobal>();
303 return tid;
304}
305
306void
308{
309 m_rateNum = rate;
310}
311
312void
314{
315 m_retryRate = rate;
316}
317
318void
320{
321 m_winTime = t;
322}
323
324void
326{
327 m_timeStampTx = t;
328}
329
330Time
332{
333 return m_winTime;
334}
335
336Time
338{
339 return m_timeStampTx;
340}
341
342uint16_t
344{
345 return m_retryRate;
346}
347
348uint16_t
350{
351 return m_rateNum;
352}
353
356{
357 return 4 + 4 + 2 + 2;
358}
359
360void
362{
363 start.WriteU16(m_rateNum);
364 start.WriteU16(m_retryRate);
366 start.WriteU32((uint32_t)(m_winTime.RoundTo(Time::MS).GetMilliSeconds()));
367}
368
371{
372 Buffer::Iterator rbuf = start;
373 m_rateNum = rbuf.ReadU16();
374 m_retryRate = rbuf.ReadU16();
375 m_timeStampTx = Seconds(((double)rbuf.ReadU32()) / 1000.0);
376 m_winTime = Seconds(((double)rbuf.ReadU32()) / 1000.0);
377 return rbuf.GetDistanceFrom(start);
378}
379
380void
381UanHeaderRcCtsGlobal::Print(std::ostream& os, Time::Unit unit) const
382{
383 os << "CTS Global (Rate #=" << m_rateNum << ", Retry Rate=" << m_retryRate
384 << ", TX Time=" << m_timeStampTx.As(Time::S) << ", Win Time=" << m_winTime.As(Time::S)
385 << ")";
386}
387
388void
389UanHeaderRcCtsGlobal::Print(std::ostream& os) const
390{
391 Print(os, Time::S);
392}
393
394TypeId
396{
397 return GetTypeId();
398}
399
401 : Header(),
402 m_frameNo(0),
403 m_timeStampRts(Seconds(0)),
404 m_retryNo(0),
405 m_delay(Seconds(0)),
406 m_address(Mac8Address::GetBroadcast())
407{
408}
409
411 uint8_t retryNo,
412 Time ts,
413 Time delay,
414 Mac8Address addr)
415 : Header(),
416 m_frameNo(frameNo),
417 m_timeStampRts(ts),
418 m_retryNo(retryNo),
419 m_delay(delay),
420 m_address(addr)
421{
422}
423
425{
426}
427
428TypeId
430{
431 static TypeId tid = TypeId("ns3::UanHeaderRcCts")
432 .SetParent<Header>()
433 .SetGroupName("Uan")
434 .AddConstructor<UanHeaderRcCts>();
435 return tid;
436}
437
438void
440{
441 m_frameNo = frameNo;
442}
443
444void
446{
447 m_timeStampRts = timeStamp;
448}
449
450void
452{
453 m_delay = delay;
454}
455
456void
458{
459 m_retryNo = no;
460}
461
462void
464{
465 m_address = addr;
466}
467
468uint8_t
470{
471 return m_frameNo;
472}
473
474Time
476{
477 return m_timeStampRts;
478}
479
480Time
482{
483 return m_delay;
484}
485
486uint8_t
488{
489 return m_retryNo;
490}
491
494{
495 return m_address;
496}
497
500{
501 return 1 + 1 + 1 + 4 + 4;
502}
503
504void
506{
507 uint8_t address = 0;
508 m_address.CopyTo(&address);
509 start.WriteU8(address);
510 start.WriteU8(m_frameNo);
511 start.WriteU8(m_retryNo);
513 start.WriteU32((uint32_t)(m_delay.RoundTo(Time::MS).GetMilliSeconds()));
514}
515
518{
519 Buffer::Iterator rbuf = start;
520 m_address = Mac8Address(rbuf.ReadU8());
521 m_frameNo = rbuf.ReadU8();
522 m_retryNo = rbuf.ReadU8();
523 m_timeStampRts = Seconds(((double)rbuf.ReadU32()) / 1000.0);
524 m_delay = Seconds(((double)rbuf.ReadU32()) / 1000.0);
525
526 return rbuf.GetDistanceFrom(start);
527}
528
529void
530UanHeaderRcCts::Print(std::ostream& os, Time::Unit unit) const
531{
532 os << "CTS (Addr=" << m_address << " Frame #=" << (uint32_t)m_frameNo
533 << " Retry #=" << (uint32_t)m_retryNo << " RTS Rx Timestamp=" << m_timeStampRts.As(unit)
534 << " Delay until TX=" << m_delay.As(unit) << ")";
535}
536
537void
538UanHeaderRcCts::Print(std::ostream& os) const
539{
540 Print(os, Time::S);
541}
542
543TypeId
545{
546 return GetTypeId();
547}
548
550 : m_frameNo(0)
551{
552}
553
555{
556 m_nackedFrames.clear();
557}
558
559TypeId
561{
562 static TypeId tid = TypeId("ns3::UanHeaderRcAck")
563 .SetParent<Header>()
564 .SetGroupName("Uan")
565 .AddConstructor<UanHeaderRcAck>();
566 return tid;
567}
568
569void
571{
572 m_frameNo = noFrames;
573}
574
575void
577{
578 m_nackedFrames.insert(frame);
579}
580
581const std::set<uint8_t>&
583{
584 return m_nackedFrames;
585}
586
587uint8_t
589{
590 return m_frameNo;
591}
592
593uint8_t
595{
596 return static_cast<uint8_t>(m_nackedFrames.size());
597}
598
601{
602 return 1 + 1 + GetNoNacks();
603}
604
605void
607{
608 start.WriteU8(m_frameNo);
609 start.WriteU8(GetNoNacks());
610 auto it = m_nackedFrames.begin();
611 for (; it != m_nackedFrames.end(); it++)
612 {
613 start.WriteU8(*it);
614 }
615}
616
619{
620 Buffer::Iterator rbuf = start;
621 m_frameNo = rbuf.ReadU8();
622 uint8_t noAcks = rbuf.ReadU8();
623 m_nackedFrames.clear();
624 for (uint32_t i = 0; i < noAcks; i++)
625 {
626 m_nackedFrames.insert(rbuf.ReadU8());
627 }
628 return rbuf.GetDistanceFrom(start);
629}
630
631void
632UanHeaderRcAck::Print(std::ostream& os) const
633{
634 os << "# Frames=" << (uint32_t)m_frameNo << " # nacked=" << (uint32_t)GetNoNacks()
635 << " Nacked: ";
636 if (GetNoNacks() > 0)
637 {
638 auto it = m_nackedFrames.begin();
639 os << (uint32_t)*it;
640 it++;
641 for (; it != m_nackedFrames.end(); it++)
642 {
643 os << ", " << (uint32_t)*it;
644 }
645 }
646}
647
648TypeId
650{
651 return GetTypeId();
652}
653
654} // namespace ns3
iterator in a Buffer instance
Definition: buffer.h:100
uint8_t ReadU8()
Definition: buffer.h:1027
uint32_t ReadU32()
Definition: buffer.cc:966
uint32_t GetDistanceFrom(const Iterator &o) const
Definition: buffer.cc:780
uint16_t ReadU16()
Definition: buffer.h:1035
Protocol header serialization and deserialization.
Definition: header.h:44
A class used for addressing MAC8 MAC's.
Definition: mac8-address.h:44
void CopyTo(uint8_t *pBuffer) const
Writes address to buffer parameter.
Definition: mac8-address.cc:82
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
int64_t GetMilliSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:408
TimeWithUnit As(const Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
Definition: time.cc:415
Unit
The unit to use to interpret a number representing time.
Definition: nstime.h:111
@ MS
millisecond
Definition: nstime.h:117
@ S
second
Definition: nstime.h:116
Time RoundTo(Unit unit) const
Round a Time to a specific unit.
Definition: nstime.h:604
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:932
Header used for ACK packets by protocol UanMacRc.
static TypeId GetTypeId()
Register this type.
uint8_t m_frameNo
Next frame number.
uint32_t GetSerializedSize() const override
uint32_t Deserialize(Buffer::Iterator start) override
std::set< uint8_t > m_nackedFrames
Marker for nacked frames.
const std::set< uint8_t > & GetNackedFrames() const
Get the set of NACK'ed frames.
~UanHeaderRcAck() override
Destructor.
void Serialize(Buffer::Iterator start) const override
UanHeaderRcAck()
Default constructor.
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
uint8_t GetFrameNo() const
Get the reservation frame number being ACKed.
void AddNackedFrame(uint8_t frame)
NACK a frame.
void Print(std::ostream &os) const override
uint8_t GetNoNacks() const
Get the number of data frames being NACKed.
void SetFrameNo(uint8_t frameNo)
Set the frame number of the reservation being acknowledged.
Cycle broadcast information.
void Print(std::ostream &os, Time::Unit unit) const
Specialized Print with Time::Unit declared.
uint32_t Deserialize(Buffer::Iterator start) override
UanHeaderRcCtsGlobal()
Default constructor.
static TypeId GetTypeId()
Register this type.
void Serialize(Buffer::Iterator start) const override
void SetRateNum(uint16_t rate)
Set the rate number corresponding to data rate of current cycle.
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
~UanHeaderRcCtsGlobal() override
Destructor.
void SetRetryRate(uint16_t rate)
Set the retry rate number for the current cycle.
Time m_timeStampTx
Timestamp.
void SetTxTimeStamp(Time timeStamp)
Set the CTS timestamp.
Time m_winTime
Window time.
uint16_t GetRetryRate() const
Get the retry rate number.
uint16_t m_retryRate
Retry rate.
Time GetTxTimeStamp() const
Get the CTS transmit timestamp.
uint16_t m_rateNum
Rate number.
Time GetWindowTime() const
Get the window time (time duration following blocking time to allow RTS transmissions).
void SetWindowTime(Time t)
Set the window time (time duration following blocking time to allow RTS transmissions).
uint16_t GetRateNum() const
Get the data rate number.
uint32_t GetSerializedSize() const override
Time GetDelayToTx() const
Get the time delay from TX time of CTS packet until arrival of first data frame.
uint8_t GetFrameNo() const
Get the frame number of the RTS being cleared.
uint32_t Deserialize(Buffer::Iterator start) override
void SetRtsTimeStamp(Time timeStamp)
Set the timestamp for RTS reception.
UanHeaderRcCts()
Default constructor.
void SetFrameNo(uint8_t frameNo)
Set the RTS frame number being cleared.
uint32_t GetSerializedSize() const override
~UanHeaderRcCts() override
Destructor.
void SetDelayToTx(Time delay)
Set the time delay from CTS transmission to first data frame arrival.
void Serialize(Buffer::Iterator start) const override
Mac8Address m_address
Destination of CTS packet.
uint8_t GetRetryNo() const
Get the retry number of the RTS packet being cleared.
Mac8Address GetAddress() const
Get the destination address, for scheduling info.
Time m_delay
Delay until transmission.
Time m_timeStampRts
RX time of RTS packet at gateway.
void Print(std::ostream &os, Time::Unit unit) const
Specialized Print with Time::Unit declared.
uint8_t m_frameNo
Reservation frame number being cleared.
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
void SetRetryNo(uint8_t no)
Set the retry number of the RTS frame being cleared.
static TypeId GetTypeId()
Register this type.
Time GetRtsTimeStamp() const
Get the receive time of the RTS being cleared.
void SetAddress(Mac8Address addr)
Set the destination address, for scheduling info.
uint8_t m_retryNo
Retry number of received RTS packet.
Extra data header information.
Definition: uan-header-rc.h:41
Time m_propDelay
Propagation delay.
~UanHeaderRcData() override
Destructor.
uint8_t m_frameNo
Data frame number.
void SetFrameNo(uint8_t frameNum)
Set the frame number of the reservation being transmitted.
UanHeaderRcData()
Default constructor.
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
uint8_t GetFrameNo() const
Get the frame number of the reservation being transmitted.
static TypeId GetTypeId()
Register this type.
uint32_t GetSerializedSize() const override
void Serialize(Buffer::Iterator start) const override
void SetPropDelay(Time propDelay)
Set the propagation delay as found in handshaking.
Time GetPropDelay() const
Get the propagation delay found in handshaking.
uint32_t Deserialize(Buffer::Iterator start) override
void Print(std::ostream &os, Time::Unit unit) const
Specialized Print with Time::Unit declared.
uint16_t m_length
Number of bytes (including headers) in data.
void Print(std::ostream &os, Time::Unit unit) const
Specialized Print with Time::Unit declared.
UanHeaderRcRts()
Default constructor.
uint8_t GetFrameNo() const
Get the frame number.
uint16_t GetLength() const
Get the total number of bytes in the reservation, including headers.
uint8_t m_retryNo
Retry number of RTS packet.
uint8_t GetNoFrames() const
Get the number of data frames in the reservation.
void SetFrameNo(uint8_t fno)
Set the frame number.
void SetTimeStamp(Time timeStamp)
Set RTS transmission time.
static TypeId GetTypeId()
Register this type.
uint8_t m_noFrames
Number of data frames in reservation.
Time GetTimeStamp() const
Get the transmit timestamp of this RTS packet.
~UanHeaderRcRts() override
Destructor.
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
void SetRetryNo(uint8_t no)
Set the retry number of this RTS packet.
uint32_t GetSerializedSize() const override
uint8_t m_frameNo
Reservation frame number.
void Serialize(Buffer::Iterator start) const override
uint8_t GetRetryNo() const
Get the retry number of this RTS packet.
void SetNoFrames(uint8_t no)
Set the number of data frames included in this reservation request.
void SetLength(uint16_t length)
Set the number of data bytes in the reservation.
Time m_timeStamp
RTS TX timestamp.
uint32_t Deserialize(Buffer::Iterator start) override
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:46
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
Every class exported by the ns3 library is enclosed in the ns3 namespace.