A Discrete-Event Network Simulator
API
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 
26 namespace ns3
27 {
28 
29 NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcData);
30 NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcRts);
31 NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcCtsGlobal);
32 NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcCts);
33 NS_OBJECT_ENSURE_REGISTERED(UanHeaderRcAck);
34 
36  : Header(),
37  m_frameNo(0),
38  m_propDelay(Seconds(0))
39 {
40 }
41 
42 UanHeaderRcData::UanHeaderRcData(uint8_t frameNo, Time propDelay)
43  : Header(),
44  m_frameNo(frameNo),
45  m_propDelay(propDelay)
46 {
47 }
48 
50 {
51 }
52 
53 TypeId
55 {
56  static TypeId tid = TypeId("ns3::UanHeaderRcData")
57  .SetParent<Header>()
58  .SetGroupName("Uan")
59  .AddConstructor<UanHeaderRcData>();
60  return tid;
61 }
62 
63 void
65 {
66  m_frameNo = no;
67 }
68 
69 void
71 {
72  m_propDelay = propDelay;
73 }
74 
75 uint8_t
77 {
78  return m_frameNo;
79 }
80 
81 Time
83 {
84  return m_propDelay;
85 }
86 
87 uint32_t
89 {
90  return 1 + 2;
91 }
92 
93 void
95 {
96  start.WriteU8(m_frameNo);
97  start.WriteU16((uint16_t)m_propDelay.RoundTo(Time::MS).GetMilliSeconds());
98 }
99 
100 uint32_t
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 
111 void
112 UanHeaderRcData::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 
117 void
118 UanHeaderRcData::Print(std::ostream& os) const
119 {
120  Print(os, Time::S);
121 }
122 
123 TypeId
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 
157 TypeId
159 {
160  static TypeId tid = TypeId("ns3::UanHeaderRcRts")
161  .SetParent<Header>()
162  .SetGroupName("Uan")
163  .AddConstructor<UanHeaderRcRts>();
164  return tid;
165 }
166 
167 void
169 {
170  m_frameNo = no;
171 }
172 
173 void
175 {
176  m_noFrames = no;
177 }
178 
179 void
181 {
182  m_length = length;
183 }
184 
185 void
187 {
188  m_timeStamp = timeStamp;
189 }
190 
191 void
193 {
194  m_retryNo = no;
195 }
196 
197 uint8_t
199 {
200  return m_noFrames;
201 }
202 
203 uint16_t
205 {
206  return m_length;
207 }
208 
209 Time
211 {
212  return m_timeStamp;
213 }
214 
215 uint8_t
217 {
218  return m_retryNo;
219 }
220 
221 uint8_t
223 {
224  return m_frameNo;
225 }
226 
227 uint32_t
229 {
230  return 1 + 1 + 1 + 4 + 2;
231 }
232 
233 void
235 {
236  start.WriteU8(m_frameNo);
237  start.WriteU8(m_retryNo);
238  start.WriteU8(m_noFrames);
239  start.WriteU16(m_length);
240  start.WriteU32((uint32_t)(m_timeStamp.RoundTo(Time::MS).GetMilliSeconds()));
241 }
242 
243 uint32_t
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 
256 void
257 UanHeaderRcRts::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 
264 void
265 UanHeaderRcRts::Print(std::ostream& os) const
266 {
267  Print(os, Time::S);
268 }
269 
270 TypeId
272 {
273  return GetTypeId();
274 }
275 
277  : Header(),
278  m_retryRate(0),
279  m_rateNum(0)
280 {
281 }
282 
283 UanHeaderRcCtsGlobal::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 
296 TypeId
298 {
299  static TypeId tid = TypeId("ns3::UanHeaderRcCtsGlobal")
300  .SetParent<Header>()
301  .SetGroupName("Uan")
302  .AddConstructor<UanHeaderRcCtsGlobal>();
303  return tid;
304 }
305 
306 void
308 {
309  m_rateNum = rate;
310 }
311 
312 void
314 {
315  m_retryRate = rate;
316 }
317 
318 void
320 {
321  m_winTime = t;
322 }
323 
324 void
326 {
327  m_timeStampTx = t;
328 }
329 
330 Time
332 {
333  return m_winTime;
334 }
335 
336 Time
338 {
339  return m_timeStampTx;
340 }
341 
342 uint16_t
344 {
345  return m_retryRate;
346 }
347 
348 uint16_t
350 {
351  return m_rateNum;
352 }
353 
354 uint32_t
356 {
357  return 4 + 4 + 2 + 2;
358 }
359 
360 void
362 {
363  start.WriteU16(m_rateNum);
364  start.WriteU16(m_retryRate);
365  start.WriteU32((uint32_t)(m_timeStampTx.RoundTo(Time::MS).GetMilliSeconds()));
366  start.WriteU32((uint32_t)(m_winTime.RoundTo(Time::MS).GetMilliSeconds()));
367 }
368 
369 uint32_t
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 
380 void
381 UanHeaderRcCtsGlobal::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 
388 void
389 UanHeaderRcCtsGlobal::Print(std::ostream& os) const
390 {
391  Print(os, Time::S);
392 }
393 
394 TypeId
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 
428 TypeId
430 {
431  static TypeId tid = TypeId("ns3::UanHeaderRcCts")
432  .SetParent<Header>()
433  .SetGroupName("Uan")
434  .AddConstructor<UanHeaderRcCts>();
435  return tid;
436 }
437 
438 void
440 {
441  m_frameNo = frameNo;
442 }
443 
444 void
446 {
447  m_timeStampRts = timeStamp;
448 }
449 
450 void
452 {
453  m_delay = delay;
454 }
455 
456 void
458 {
459  m_retryNo = no;
460 }
461 
462 void
464 {
465  m_address = addr;
466 }
467 
468 uint8_t
470 {
471  return m_frameNo;
472 }
473 
474 Time
476 {
477  return m_timeStampRts;
478 }
479 
480 Time
482 {
483  return m_delay;
484 }
485 
486 uint8_t
488 {
489  return m_retryNo;
490 }
491 
494 {
495  return m_address;
496 }
497 
498 uint32_t
500 {
501  return 1 + 1 + 1 + 4 + 4;
502 }
503 
504 void
506 {
507  uint8_t address = 0;
509  start.WriteU8(address);
510  start.WriteU8(m_frameNo);
511  start.WriteU8(m_retryNo);
512  start.WriteU32((uint32_t)(m_timeStampRts.RoundTo(Time::MS).GetMilliSeconds()));
513  start.WriteU32((uint32_t)(m_delay.RoundTo(Time::MS).GetMilliSeconds()));
514 }
515 
516 uint32_t
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 
529 void
530 UanHeaderRcCts::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 
537 void
538 UanHeaderRcCts::Print(std::ostream& os) const
539 {
540  Print(os, Time::S);
541 }
542 
543 TypeId
545 {
546  return GetTypeId();
547 }
548 
550  : m_frameNo(0)
551 {
552 }
553 
555 {
556  m_nackedFrames.clear();
557 }
558 
559 TypeId
561 {
562  static TypeId tid = TypeId("ns3::UanHeaderRcAck")
563  .SetParent<Header>()
564  .SetGroupName("Uan")
565  .AddConstructor<UanHeaderRcAck>();
566  return tid;
567 }
568 
569 void
570 UanHeaderRcAck::SetFrameNo(uint8_t noFrames)
571 {
572  m_frameNo = noFrames;
573 }
574 
575 void
577 {
578  m_nackedFrames.insert(frame);
579 }
580 
581 const std::set<uint8_t>&
583 {
584  return m_nackedFrames;
585 }
586 
587 uint8_t
589 {
590  return m_frameNo;
591 }
592 
593 uint8_t
595 {
596  return static_cast<uint8_t>(m_nackedFrames.size());
597 }
598 
599 uint32_t
601 {
602  return 1 + 1 + GetNoNacks();
603 }
604 
605 void
607 {
608  start.WriteU8(m_frameNo);
609  start.WriteU8(GetNoNacks());
610  std::set<uint8_t>::iterator it = m_nackedFrames.begin();
611  for (; it != m_nackedFrames.end(); it++)
612  {
613  start.WriteU8(*it);
614  }
615 }
616 
617 uint32_t
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 
631 void
632 UanHeaderRcAck::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  std::set<uint8_t>::iterator 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 
648 TypeId
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:969
uint32_t GetDistanceFrom(const Iterator &o) const
Definition: buffer.cc:783
uint16_t ReadU16()
Definition: buffer.h:1035
Protocol header serialization and deserialization.
Definition: header.h:44
virtual uint32_t Deserialize(Buffer::Iterator start)=0
Deserialize the object from a buffer iterator.
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:87
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:407
TimeWithUnit As(const Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
Definition: time.cc:417
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:603
a unique identifier for an interface.
Definition: type-id.h:60
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:935
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
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.
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.
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.
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.
#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:1336
address
Definition: first.py:40
Every class exported by the ns3 library is enclosed in the ns3 namespace.