A Discrete-Event Network Simulator
API
uan-header-rc.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2009 University of Washington
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: Leonard Tracy <lentracy@gmail.com>
19 */
20
21
22#include "uan-header-rc.h"
23#include "ns3/mac8-address.h"
24
25#include <set>
26
27namespace ns3 {
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}
49
51{
52}
53
56{
57 static TypeId tid = TypeId ("ns3::UanHeaderRcData")
58 .SetParent<Header> ()
59 .SetGroupName ("Uan")
60 .AddConstructor<UanHeaderRcData> ()
61 ;
62 return tid;
63}
64
65void
67{
68 m_frameNo = no;
69}
70
71void
73{
74 m_propDelay = propDelay;
75}
76
77uint8_t
79{
80 return m_frameNo;
81}
82
83Time
85{
86 return m_propDelay;
87}
88
91{
92 return 1 + 2;
93}
94
95void
97{
98 start.WriteU8 (m_frameNo);
99 start.WriteU16 ( (uint16_t) m_propDelay.RoundTo (Time::MS).GetMilliSeconds ());
100}
103{
104 Buffer::Iterator rbuf = start;
105
106 m_frameNo = start.ReadU8 ();
107 m_propDelay = Seconds ( ((double) start.ReadU16 ()) / 1000.0 );
108
109 return rbuf.GetDistanceFrom (start);
110}
111
112void
113UanHeaderRcData::Print (std::ostream &os, Time::Unit unit) const
114{
115 os << "Frame No=" << (uint32_t) m_frameNo << " Prop Delay=" << m_propDelay.As (unit);
116}
117
118void
119UanHeaderRcData::Print (std::ostream &os) const
120{
121 Print (os, Time::S);
122}
123
124TypeId
126{
127 return GetTypeId ();
128}
129
130
132 : Header (),
133 m_frameNo (0),
134 m_noFrames (0),
135 m_length (0),
136 m_timeStamp (Seconds (0)),
137 m_retryNo (0)
138{
139
140}
141
142UanHeaderRcRts::UanHeaderRcRts (uint8_t frameNo, uint8_t retryNo, uint8_t noFrames, uint16_t length, Time timeStamp)
143 : Header (),
144 m_frameNo (frameNo),
145 m_noFrames (noFrames),
146 m_length (length),
147 m_timeStamp (timeStamp),
148 m_retryNo (retryNo)
149{
150
151}
152
154{
155
156}
157
158TypeId
160{
161 static TypeId tid = TypeId ("ns3::UanHeaderRcRts")
162 .SetParent<Header> ()
163 .SetGroupName ("Uan")
164 .AddConstructor<UanHeaderRcRts> ()
165 ;
166 return tid;
167
168}
169
170void
172{
173 m_frameNo = no;
174}
175
176void
178{
179 m_noFrames = no;
180}
181
182void
184{
185 m_length = length;
186}
187void
189{
190 m_timeStamp = timeStamp;
191}
192
193void
195{
196 m_retryNo = no;
197}
198uint8_t
200{
201 return m_noFrames;
202}
203
204uint16_t
206{
207 return m_length;
208}
209
210Time
212{
213 return m_timeStamp;
214}
215
216uint8_t
218{
219 return m_retryNo;
220}
221
222uint8_t
224{
225 return m_frameNo;
226}
227
230{
231 return 1 + 1 + 1 + 4 + 2;
232}
233
234void
236{
237 start.WriteU8 (m_frameNo);
238 start.WriteU8 (m_retryNo);
239 start.WriteU8 (m_noFrames);
240 start.WriteU16 (m_length);
242}
243
246{
247 Buffer::Iterator rbuf = start;
248 m_frameNo = rbuf.ReadU8 ();
249 m_retryNo = rbuf.ReadU8 ();
250 m_noFrames = rbuf.ReadU8 ();
251 m_length = rbuf.ReadU16 ();
252 m_timeStamp = Seconds ( ((double) rbuf.ReadU32 ()) / 1000.0 );
253 // m_timeStamp = Seconds ( rbuf.ReadU16 ()/1000 );
254 return rbuf.GetDistanceFrom (start);
255}
256
257void
258UanHeaderRcRts::Print (std::ostream &os, Time::Unit unit) const
259{
260 os << "Frame #=" << (uint32_t) m_frameNo << " Retry #=" << (uint32_t) m_retryNo << " Num Frames=" << (uint32_t) m_noFrames << "Length=" << m_length << " Time Stamp=" << m_timeStamp.As (unit);
261}
262
263void
264UanHeaderRcRts::Print (std::ostream &os) const
265{
266 Print(os, Time::S);
267}
268
269TypeId
271{
272 return GetTypeId ();
273}
274
275
276
277
279 : Header (),
280 m_retryRate (0),
281 m_rateNum (0)
282{
283
284}
285
286UanHeaderRcCtsGlobal::UanHeaderRcCtsGlobal (Time wt, Time ts, uint16_t rate, uint16_t retryRate)
287 : Header (),
288 m_timeStampTx (ts),
289 m_winTime (wt),
290 m_retryRate (retryRate),
291 m_rateNum (rate)
292{
293
294}
295
297{
298
299}
300
301TypeId
303{
304 static TypeId tid = TypeId ("ns3::UanHeaderRcCtsGlobal")
305 .SetParent<Header> ()
306 .SetGroupName ("Uan")
307 .AddConstructor<UanHeaderRcCtsGlobal> ()
308 ;
309 return tid;
310
311}
312
313
314void
316{
317 m_rateNum = rate;
318}
319
320void
322{
323 m_retryRate = rate;
324}
325
326void
328{
329 m_winTime = t;
330}
331
332void
334{
335 m_timeStampTx = t;
336}
337
338Time
340{
341 return m_winTime;
342}
343
344Time
346{
347 return m_timeStampTx;
348}
349
350uint16_t
352{
353 return m_retryRate;
354}
355
356uint16_t
358{
359 return m_rateNum;
360}
363{
364 return 4 + 4 + 2 + 2;
365}
366
367void
369{
370 start.WriteU16 (m_rateNum);
371 start.WriteU16 (m_retryRate);
374}
375
378{
379 Buffer::Iterator rbuf = start;
380 m_rateNum = rbuf.ReadU16 ();
381 m_retryRate = rbuf.ReadU16 ();
382 m_timeStampTx = Seconds ( ( (double) rbuf.ReadU32 ()) / 1000.0 );
383 m_winTime = Seconds ( ( (double) rbuf.ReadU32 ()) / 1000.0 );
384 return rbuf.GetDistanceFrom (start);
385
386}
387
388void
389UanHeaderRcCtsGlobal::Print (std::ostream &os, Time::Unit unit) const
390{
391 os << "CTS Global (Rate #=" << m_rateNum << ", Retry Rate=" << m_retryRate << ", TX Time=" << m_timeStampTx.As (Time::S) << ", Win Time=" << m_winTime.As (Time::S) << ")";
392}
393
394void
395UanHeaderRcCtsGlobal::Print (std::ostream &os) const
396{
397 Print(os, Time::S);
398}
399
400TypeId
402{
403 return GetTypeId ();
404}
405
407 : Header (),
408 m_frameNo (0),
409 m_timeStampRts (Seconds (0)),
410 m_retryNo (0),
411 m_delay (Seconds (0)),
412 m_address (Mac8Address::GetBroadcast ())
413{
414
415}
416
417UanHeaderRcCts::UanHeaderRcCts (uint8_t frameNo, uint8_t retryNo, Time ts, Time delay, Mac8Address addr)
418 : Header (),
419 m_frameNo (frameNo),
420 m_timeStampRts (ts),
421 m_retryNo (retryNo),
422 m_delay (delay),
423 m_address (addr)
424{
425
426}
427
429{
430
431}
432
433TypeId
435{
436 static TypeId tid = TypeId ("ns3::UanHeaderRcCts")
437 .SetParent<Header> ()
438 .SetGroupName ("Uan")
439 .AddConstructor<UanHeaderRcCts> ()
440 ;
441 return tid;
442
443}
444
445void
447{
448 m_frameNo = frameNo;
449}
450
451void
453{
454 m_timeStampRts = timeStamp;
455}
456
457
458void
460{
461 m_delay = delay;
462}
463
464void
466{
467 m_retryNo = no;
468}
469
470void
472{
473 m_address = addr;
474}
475uint8_t
477{
478 return m_frameNo;
479}
480
481Time
483{
484 return m_timeStampRts;
485}
486
487Time
489{
490 return m_delay;
491}
492
493uint8_t
495{
496 return m_retryNo;
497}
498
501{
502 return m_address;
503}
504
507{
508 return 1 + 1 + 1 + 4 + 4;
509}
510
511
512void
514{
515 uint8_t address = 0;
517 start.WriteU8 (address);
518 start.WriteU8 (m_frameNo);
519 start.WriteU8 (m_retryNo);
522}
523
526{
527 Buffer::Iterator rbuf = start;
528 m_address = Mac8Address (rbuf.ReadU8 ());
529 m_frameNo = rbuf.ReadU8 ();
530 m_retryNo = rbuf.ReadU8 ();
531 m_timeStampRts = Seconds ( ( (double) rbuf.ReadU32 ()) / 1000.0 );
532 m_delay = Seconds ( ( (double) rbuf.ReadU32 ()) / 1000.0 );
533
534 return rbuf.GetDistanceFrom (start);
535}
536
537void
538UanHeaderRcCts::Print (std::ostream &os, Time::Unit unit) const
539{
540 os << "CTS (Addr=" << m_address << " Frame #=" << (uint32_t) m_frameNo << " Retry #=" << (uint32_t) m_retryNo << " RTS Rx Timestamp=" << m_timeStampRts.As (unit) << " Delay until TX=" << m_delay.As (unit) << ")";
541}
542
543void
544UanHeaderRcCts::Print (std::ostream &os) const
545{
546 Print (os, Time::S);
547}
548
549TypeId
551{
552 return GetTypeId ();
553}
554
556 : m_frameNo (0)
557{
558}
559
561{
562 m_nackedFrames.clear ();
563}
564
565TypeId
567{
568 static TypeId tid = TypeId ("ns3::UanHeaderRcAck")
569 .SetParent<Header> ()
570 .SetGroupName ("Uan")
571 .AddConstructor<UanHeaderRcAck> ()
572 ;
573 return tid;
574}
575
576void
578{
579 m_frameNo = noFrames;
580}
581
582void
584{
585 m_nackedFrames.insert (frame);
586}
587
588const std::set<uint8_t> &
590{
591 return m_nackedFrames;
592}
593
594uint8_t
596{
597 return m_frameNo;
598}
599
600uint8_t
602{
603 return static_cast<uint8_t> (m_nackedFrames.size ());
604}
605
608{
609 return 1 + 1 + GetNoNacks ();
610}
611
612void
614{
615 start.WriteU8 (m_frameNo);
616 start.WriteU8 (GetNoNacks ());
617 std::set<uint8_t>::iterator it = m_nackedFrames.begin ();
618 for (; it != m_nackedFrames.end (); it++)
619 {
620 start.WriteU8 (*it);
621 }
622}
623
626{
627 Buffer::Iterator rbuf = start;
628 m_frameNo = rbuf.ReadU8 ();
629 uint8_t noAcks = rbuf.ReadU8 ();
630 m_nackedFrames.clear ();
631 for (uint32_t i = 0; i < noAcks; i++)
632 {
633 m_nackedFrames.insert (rbuf.ReadU8 ());
634 }
635 return rbuf.GetDistanceFrom (start);
636}
637
638void
639UanHeaderRcAck::Print (std::ostream &os) const
640{
641 os << "# Frames=" << (uint32_t) m_frameNo << " # nacked=" << (uint32_t) GetNoNacks () << " Nacked: ";
642 if (GetNoNacks () > 0)
643 {
644 std::set<uint8_t>::iterator it = m_nackedFrames.begin ();
645 os << (uint32_t) *it;
646 it++;
647 for (; it != m_nackedFrames.end (); it++)
648 {
649 os << ", " << (uint32_t) *it;
650 }
651 }
652}
653
654TypeId
656{
657 return GetTypeId ();
658}
659
660} // namespace ns3
iterator in a Buffer instance
Definition: buffer.h:99
uint16_t ReadU16(void)
Definition: buffer.h:1029
uint8_t ReadU8(void)
Definition: buffer.h:1021
uint32_t GetDistanceFrom(Iterator const &o) const
Definition: buffer.cc:788
uint32_t ReadU32(void)
Definition: buffer.cc:973
Protocol header serialization and deserialization.
Definition: header.h:43
A class used for addressing MAC8 MAC's.
Definition: mac8-address.h:43
void CopyTo(uint8_t *pBuffer) const
Writes address to buffer parameter.
Definition: mac8-address.cc:80
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
Time RoundTo(enum Unit unit) const
Round a Time to a specific unit.
Definition: nstime.h:555
Unit
The unit to use to interpret a number representing time.
Definition: nstime.h:109
@ MS
millisecond
Definition: nstime.h:115
@ S
second
Definition: nstime.h:114
int64_t GetMilliSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:383
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
Definition: time.cc:432
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
Header used for ACK packets by protocol UanMacRc.
virtual void Serialize(Buffer::Iterator start) const
uint8_t m_frameNo
Next frame number.
static TypeId GetTypeId(void)
Register this type.
std::set< uint8_t > m_nackedFrames
Marker for nacked frames.
virtual uint32_t GetSerializedSize(void) const
uint8_t GetFrameNo(void) const
Get the reservation frame number being ACKed.
UanHeaderRcAck()
Default constructor.
virtual ~UanHeaderRcAck()
Destructor.
const std::set< uint8_t > & GetNackedFrames(void) const
Get the set of NACK'ed frames.
void AddNackedFrame(uint8_t frame)
NACK a frame.
virtual void Print(std::ostream &os) const
virtual uint32_t Deserialize(Buffer::Iterator start)
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
uint8_t GetNoNacks(void) 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.
UanHeaderRcCtsGlobal()
Default constructor.
static TypeId GetTypeId(void)
Register this type.
uint16_t GetRetryRate(void) const
Get the retry rate number.
virtual void Serialize(Buffer::Iterator start) const
void SetRateNum(uint16_t rate)
Set the rate number corresponding to data rate of current cycle.
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.
Time GetTxTimeStamp(void) const
Get the CTS transmit timestamp.
uint16_t m_retryRate
Retry rate.
uint16_t m_rateNum
Rate number.
uint16_t GetRateNum(void) const
Get the data rate number.
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
virtual uint32_t GetSerializedSize(void) const
void SetWindowTime(Time t)
Set the window time (time duration following blocking time to allow RTS transmissions).
Time GetWindowTime(void) const
Get the window time (time duration following blocking time to allow RTS transmissions).
virtual uint32_t Deserialize(Buffer::Iterator start)
~UanHeaderRcCtsGlobal()
Destructor.
virtual void Serialize(Buffer::Iterator start) const
virtual ~UanHeaderRcCts()
Destructor.
void SetRtsTimeStamp(Time timeStamp)
Set the timestamp for RTS reception.
Mac8Address GetAddress(void) const
Get the destination address, for scheduling info.
UanHeaderRcCts()
Default constructor.
void SetFrameNo(uint8_t frameNo)
Set the RTS frame number being cleared.
virtual uint32_t GetSerializedSize(void) const
void SetDelayToTx(Time delay)
Set the time delay from CTS transmission to first data frame arrival.
virtual uint32_t Deserialize(Buffer::Iterator start)
Mac8Address m_address
Destination of CTS packet.
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 GetFrameNo(void) const
Get the frame number of the RTS being cleared.
Time GetRtsTimeStamp(void) const
Get the receive time of the RTS being cleared.
uint8_t GetRetryNo(void) const
Get the retry number of the RTS packet being cleared.
uint8_t m_frameNo
Reservation frame number being cleared.
static TypeId GetTypeId(void)
Register this type.
void SetRetryNo(uint8_t no)
Set the retry number of the RTS frame being cleared.
Time GetDelayToTx(void) const
Get the time delay from TX time of CTS packet until arrival of first data frame.
void SetAddress(Mac8Address addr)
Set the destination address, for scheduling info.
uint8_t m_retryNo
Retry number of received RTS packet.
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
Extra data header information.
Definition: uan-header-rc.h:42
Time m_propDelay
Propagation delay.
virtual uint32_t GetSerializedSize(void) const
uint8_t m_frameNo
Data frame number.
static TypeId GetTypeId(void)
Register this type.
void SetFrameNo(uint8_t frameNum)
Set the frame number of the reservation being transmitted.
UanHeaderRcData()
Default constructor.
virtual void Serialize(Buffer::Iterator start) const
Time GetPropDelay(void) const
Get the propagation delay found in handshaking.
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
virtual ~UanHeaderRcData()
Destructor.
void SetPropDelay(Time propDelay)
Set the propagation delay as found in handshaking.
uint8_t GetFrameNo(void) const
Get the frame number of the reservation being transmitted.
virtual uint32_t Deserialize(Buffer::Iterator start)
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.
Time GetTimeStamp(void) const
Get the transmit timestamp of this RTS packet.
void Print(std::ostream &os, Time::Unit unit) const
Specialized Print with Time::Unit declared.
uint8_t GetFrameNo(void) const
Get the frame number.
UanHeaderRcRts()
Default constructor.
static TypeId GetTypeId(void)
Register this type.
uint8_t m_retryNo
Retry number of RTS packet.
void SetFrameNo(uint8_t fno)
Set the frame number.
virtual ~UanHeaderRcRts()
Destructor.
virtual void Serialize(Buffer::Iterator start) const
uint8_t GetNoFrames(void) const
Get the number of data frames in the reservation.
void SetTimeStamp(Time timeStamp)
Set RTS transmission time.
virtual TypeId GetInstanceTypeId(void) const
Get the most derived TypeId for this Object.
uint8_t GetRetryNo(void) const
Get the retry number of this RTS packet.
uint8_t m_noFrames
Number of data frames in reservation.
virtual uint32_t Deserialize(Buffer::Iterator start)
uint16_t GetLength(void) const
Get the total number of bytes in the reservation, including headers.
void SetRetryNo(uint8_t no)
Set the retry number of this RTS packet.
uint8_t m_frameNo
Reservation frame number.
virtual uint32_t GetSerializedSize(void) const
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.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
address
Definition: first.py:44
Every class exported by the ns3 library is enclosed in the ns3 namespace.
def start()
Definition: core.py:1853