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 
27 namespace ns3 {
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 }
49 
51 {
52 }
53 
54 TypeId
56 {
57  static TypeId tid = TypeId ("ns3::UanHeaderRcData")
58  .SetParent<Header> ()
59  .SetGroupName ("Uan")
60  .AddConstructor<UanHeaderRcData> ()
61  ;
62  return tid;
63 }
64 
65 void
67 {
68  m_frameNo = no;
69 }
70 
71 void
73 {
74  m_propDelay = propDelay;
75 }
76 
77 uint8_t
79 {
80  return m_frameNo;
81 }
82 
83 Time
85 {
86  return m_propDelay;
87 }
88 
89 uint32_t
91 {
92  return 1 + 2;
93 }
94 
95 void
97 {
98  start.WriteU8 (m_frameNo);
99  start.WriteU16 ( (uint16_t) m_propDelay.RoundTo (Time::MS).GetMilliSeconds ());
100 }
101 uint32_t
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 
112 void
113 UanHeaderRcData::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 
118 void
119 UanHeaderRcData::Print (std::ostream &os) const
120 {
121  Print (os, Time::S);
122 }
123 
124 TypeId
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 
142 UanHeaderRcRts::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 
158 TypeId
160 {
161  static TypeId tid = TypeId ("ns3::UanHeaderRcRts")
162  .SetParent<Header> ()
163  .SetGroupName ("Uan")
164  .AddConstructor<UanHeaderRcRts> ()
165  ;
166  return tid;
167 
168 }
169 
170 void
172 {
173  m_frameNo = no;
174 }
175 
176 void
178 {
179  m_noFrames = no;
180 }
181 
182 void
183 UanHeaderRcRts::SetLength (uint16_t length)
184 {
185  m_length = length;
186 }
187 void
189 {
190  m_timeStamp = timeStamp;
191 }
192 
193 void
195 {
196  m_retryNo = no;
197 }
198 uint8_t
200 {
201  return m_noFrames;
202 }
203 
204 uint16_t
206 {
207  return m_length;
208 }
209 
210 Time
212 {
213  return m_timeStamp;
214 }
215 
216 uint8_t
218 {
219  return m_retryNo;
220 }
221 
222 uint8_t
224 {
225  return m_frameNo;
226 }
227 
228 uint32_t
230 {
231  return 1 + 1 + 1 + 4 + 2;
232 }
233 
234 void
236 {
237  start.WriteU8 (m_frameNo);
238  start.WriteU8 (m_retryNo);
239  start.WriteU8 (m_noFrames);
240  start.WriteU16 (m_length);
241  start.WriteU32 ((uint32_t) (m_timeStamp.RoundTo (Time::MS).GetMilliSeconds ()));
242 }
243 
244 uint32_t
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 
257 void
258 UanHeaderRcRts::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 
263 void
264 UanHeaderRcRts::Print (std::ostream &os) const
265 {
266  Print(os, Time::S);
267 }
268 
269 TypeId
271 {
272  return GetTypeId ();
273 }
274 
275 
276 
277 
279  : Header (),
280  m_retryRate (0),
281  m_rateNum (0)
282 {
283 
284 }
285 
286 UanHeaderRcCtsGlobal::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 
301 TypeId
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 
314 void
316 {
317  m_rateNum = rate;
318 }
319 
320 void
322 {
323  m_retryRate = rate;
324 }
325 
326 void
328 {
329  m_winTime = t;
330 }
331 
332 void
334 {
335  m_timeStampTx = t;
336 }
337 
338 Time
340 {
341  return m_winTime;
342 }
343 
344 Time
346 {
347  return m_timeStampTx;
348 }
349 
350 uint16_t
352 {
353  return m_retryRate;
354 }
355 
356 uint16_t
358 {
359  return m_rateNum;
360 }
361 uint32_t
363 {
364  return 4 + 4 + 2 + 2;
365 }
366 
367 void
369 {
370  start.WriteU16 (m_rateNum);
371  start.WriteU16 (m_retryRate);
372  start.WriteU32 ( (uint32_t) (m_timeStampTx.RoundTo (Time::MS).GetMilliSeconds ()));
373  start.WriteU32 ( (uint32_t) (m_winTime.RoundTo (Time::MS).GetMilliSeconds ()));
374 }
375 
376 uint32_t
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 
388 void
389 UanHeaderRcCtsGlobal::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 
394 void
395 UanHeaderRcCtsGlobal::Print (std::ostream &os) const
396 {
397  Print(os, Time::S);
398 }
399 
400 TypeId
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 
417 UanHeaderRcCts::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 
433 TypeId
435 {
436  static TypeId tid = TypeId ("ns3::UanHeaderRcCts")
437  .SetParent<Header> ()
438  .SetGroupName ("Uan")
439  .AddConstructor<UanHeaderRcCts> ()
440  ;
441  return tid;
442 
443 }
444 
445 void
446 UanHeaderRcCts::SetFrameNo (uint8_t frameNo)
447 {
448  m_frameNo = frameNo;
449 }
450 
451 void
453 {
454  m_timeStampRts = timeStamp;
455 }
456 
457 
458 void
460 {
461  m_delay = delay;
462 }
463 
464 void
466 {
467  m_retryNo = no;
468 }
469 
470 void
472 {
473  m_address = addr;
474 }
475 uint8_t
477 {
478  return m_frameNo;
479 }
480 
481 Time
483 {
484  return m_timeStampRts;
485 }
486 
487 Time
489 {
490  return m_delay;
491 }
492 
493 uint8_t
495 {
496  return m_retryNo;
497 }
498 
501 {
502  return m_address;
503 }
504 
505 uint32_t
507 {
508  return 1 + 1 + 1 + 4 + 4;
509 }
510 
511 
512 void
514 {
515  uint8_t address = 0;
517  start.WriteU8 (address);
518  start.WriteU8 (m_frameNo);
519  start.WriteU8 (m_retryNo);
520  start.WriteU32 ((uint32_t) (m_timeStampRts.RoundTo (Time::MS).GetMilliSeconds ()));
521  start.WriteU32 ((uint32_t) (m_delay.RoundTo (Time::MS).GetMilliSeconds ()));
522 }
523 
524 uint32_t
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 
537 void
538 UanHeaderRcCts::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 
543 void
544 UanHeaderRcCts::Print (std::ostream &os) const
545 {
546  Print (os, Time::S);
547 }
548 
549 TypeId
551 {
552  return GetTypeId ();
553 }
554 
556  : m_frameNo (0)
557 {
558 }
559 
561 {
562  m_nackedFrames.clear ();
563 }
564 
565 TypeId
567 {
568  static TypeId tid = TypeId ("ns3::UanHeaderRcAck")
569  .SetParent<Header> ()
570  .SetGroupName ("Uan")
571  .AddConstructor<UanHeaderRcAck> ()
572  ;
573  return tid;
574 }
575 
576 void
577 UanHeaderRcAck::SetFrameNo (uint8_t noFrames)
578 {
579  m_frameNo = noFrames;
580 }
581 
582 void
584 {
585  m_nackedFrames.insert (frame);
586 }
587 
588 const std::set<uint8_t> &
590 {
591  return m_nackedFrames;
592 }
593 
594 uint8_t
596 {
597  return m_frameNo;
598 }
599 
600 uint8_t
602 {
603  return static_cast<uint8_t> (m_nackedFrames.size ());
604 }
605 
606 uint32_t
608 {
609  return 1 + 1 + GetNoNacks ();
610 }
611 
612 void
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 
624 uint32_t
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 
638 void
639 UanHeaderRcAck::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 
654 TypeId
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
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: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:418
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 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).
~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.
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.
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.
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