A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
ipv6-extension-header.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007-2009 Strasbourg University
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: David Gross <gdavid.devel@gmail.com>
19  */
20 
21 #include "ns3/assert.h"
22 #include "ns3/log.h"
23 #include "ns3/header.h"
24 #include "ipv6-extension-header.h"
25 
26 namespace ns3
27 {
28 
29 NS_LOG_COMPONENT_DEFINE ("Ipv6ExtensionHeader");
30 
31 NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionHeader);
32 
34 {
35  static TypeId tid = TypeId ("ns3::Ipv6ExtensionHeader")
37  .SetParent<Header> ()
38  ;
39  return tid;
40 }
41 
43 {
44  return GetTypeId ();
45 }
46 
48  : m_nextHeader (0),
49  m_length (0),
50  m_data (0)
51 {
52 }
53 
55 {
56 }
57 
58 void Ipv6ExtensionHeader::SetNextHeader (uint8_t nextHeader)
59 {
60  m_nextHeader = nextHeader;
61 }
62 
64 {
65  return m_nextHeader;
66 }
67 
68 void Ipv6ExtensionHeader::SetLength (uint16_t length)
69 {
70  m_length = (length >> 3) - 1;
71 }
72 
74 {
75  return (m_length + 1) << 3;
76 }
77 
78 void Ipv6ExtensionHeader::Print (std::ostream &os) const
79 {
80  os << "( nextHeader = " << (uint32_t)GetNextHeader () << " length = " << (uint32_t)GetLength () << " )";
81 }
82 
84 {
85  return 2;
86 }
87 
89 {
91 
93  i.WriteU8 (m_length);
94  i.Write (m_data.PeekData (), m_data.GetSize ());
95 }
96 
98 {
100 
101  m_nextHeader = i.ReadU8 ();
102  m_length = i.ReadU8 ();
103 
104  uint32_t dataLength = GetLength () - 2;
105  uint8_t* data = new uint8_t[dataLength];
106  i.Read (data, dataLength);
107 
108  if (dataLength > m_data.GetSize ())
109  {
110  m_data.AddAtEnd (dataLength - m_data.GetSize ());
111  }
112  else
113  {
114  m_data.RemoveAtEnd (m_data.GetSize () - dataLength);
115  }
116 
117  i = m_data.Begin ();
118  i.Write (data, dataLength);
119 
120  delete[] data;
121  return GetSerializedSize ();
122 }
123 
124 OptionField::OptionField (uint32_t optionsOffset)
125  : m_optionData (0),
126  m_optionsOffset (optionsOffset)
127 {
128 }
129 
131 {
132 }
133 
135 {
137 }
138 
140 {
141  start.Write (m_optionData.Begin (), m_optionData.End ());
142  uint32_t fill = CalculatePad ((Ipv6OptionHeader::Alignment) { 8,0});
143  NS_LOG_LOGIC ("fill with " << fill << " bytes padding");
144  switch (fill)
145  {
146  case 0: return;
147  case 1: Ipv6OptionPad1Header ().Serialize (start);
148  return;
149  default: Ipv6OptionPadnHeader (fill).Serialize (start);
150  return;
151  }
152 }
153 
155 {
156  uint8_t* buf = new uint8_t[length];
157  start.Read (buf, length);
158  m_optionData = Buffer ();
159  m_optionData.AddAtEnd (length);
160  m_optionData.Begin ().Write (buf, length);
161  delete[] buf;
162  return length;
163 }
164 
166 {
168 
169  uint32_t pad = CalculatePad (option.GetAlignment ());
170  NS_LOG_LOGIC ("need " << pad << " bytes padding");
171  switch (pad)
172  {
173  case 0: break; //no padding needed
174  case 1: AddOption (Ipv6OptionPad1Header ());
175  break;
176  default: AddOption (Ipv6OptionPadnHeader (pad));
177  break;
178  }
179 
182  it.Prev (option.GetSerializedSize ());
183  option.Serialize (it);
184 }
185 
187 {
188  return (alignment.offset - (m_optionData.GetSize () + m_optionsOffset)) % alignment.factor;
189 }
190 
192 {
193  return m_optionsOffset;
194 }
195 
197 {
198  return m_optionData;
199 }
200 
201 
203 
205 {
206  static TypeId tid = TypeId ("ns3::Ipv6ExtensionHopByHopHeader")
208  .SetParent<Ipv6ExtensionHeader> ()
209  ;
210  return tid;
211 }
212 
214 {
215  return GetTypeId ();
216 }
217 
219  : OptionField (2)
220 {
221 }
222 
224 {
225 }
226 
227 void Ipv6ExtensionHopByHopHeader::Print (std::ostream &os) const
228 {
229  os << "( nextHeader = " << (uint32_t)GetNextHeader () << " length = " << (uint32_t)GetLength () << " )";
230 }
231 
233 {
234  return 2 + OptionField::GetSerializedSize ();
235 }
236 
238 {
240 
241  i.WriteU8 (GetNextHeader ());
242  i.WriteU8 ((GetSerializedSize () >> 3) - 1);
244 }
245 
247 {
249 
250  SetNextHeader (i.ReadU8 ());
251  SetLength ((i.ReadU8 () + 1) << 3);
253 
254  return GetSerializedSize ();
255 }
256 
258 
260 {
261  static TypeId tid = TypeId ("ns3::Ipv6ExtensionDestinationHeader")
263  .SetParent<Ipv6ExtensionHeader> ()
264  ;
265  return tid;
266 }
267 
269 {
270  return GetTypeId ();
271 }
272 
274  : OptionField (2)
275 {
276 }
277 
279 {
280 }
281 
282 void Ipv6ExtensionDestinationHeader::Print (std::ostream &os) const
283 {
284  os << "( nextHeader = " << (uint32_t)GetNextHeader () << " length = " << (uint32_t)GetLength () << " )";
285 }
286 
288 {
289  return 2 + OptionField::GetSerializedSize ();
290 }
291 
293 {
295 
296  i.WriteU8 (GetNextHeader ());
297  i.WriteU8 ((GetSerializedSize () >> 3) - 1);
299 }
300 
302 {
304 
305  SetNextHeader (i.ReadU8 ());
306  SetLength ((i.ReadU8 () + 1) << 3);
308 
309  return GetSerializedSize ();
310 }
311 
313 
315 {
316  static TypeId tid = TypeId ("ns3::Ipv6ExtensionFragmentHeader")
318  .SetParent<Ipv6ExtensionHeader> ()
319  ;
320  return tid;
321 }
322 
324 {
325  return GetTypeId ();
326 }
327 
329  : m_offset (0),
330  m_identification (0)
331 {
332  SetLength (0);
333 }
334 
336 {
337 }
338 
340 {
341  // Clear the offset, and save the MF bit
342  m_offset &= 1;
343  m_offset |= offset & (~7);
344 }
345 
347 {
348  return m_offset & (~1);
349 }
350 
352 {
353  m_offset = moreFragment ? m_offset | 1 : m_offset & (~1);
354 }
355 
357 {
358  return m_offset & 1;
359 }
360 
362 {
363  m_identification = identification;
364 }
365 
367 {
368  return m_identification;
369 }
370 
371 void Ipv6ExtensionFragmentHeader::Print (std::ostream &os) const
372 {
373  os << "( nextHeader = " << (uint32_t)GetNextHeader () << " length = " << (uint32_t)GetLength ()
374  << " offset = " << (uint32_t)GetOffset () << " MF = " << (uint32_t)GetMoreFragment () << " identification = " << (uint32_t)m_identification << " )";
375 }
376 
378 {
379  return 8;
380 }
381 
383 {
385 
386  i.WriteU8 (GetNextHeader ());
387  i.WriteU8 (0);
390 }
391 
393 {
395 
396  SetNextHeader (i.ReadU8 ());
397  i.ReadU8();
398  SetLength (0);
399  m_offset = i.ReadNtohU16 ();
401 
402  return GetSerializedSize ();
403 }
404 
406 
408 {
409  static TypeId tid = TypeId ("ns3::Ipv6ExtensionRoutingHeader")
411  .SetParent<Ipv6ExtensionHeader> ()
412  ;
413  return tid;
414 }
415 
417 {
418  return GetTypeId ();
419 }
420 
422  : m_typeRouting (0),
423  m_segmentsLeft (0)
424 {
425 }
426 
428 {
429 }
430 
432 {
433  m_typeRouting = typeRouting;
434 }
435 
437 {
438  return m_typeRouting;
439 }
440 
442 {
443  m_segmentsLeft = segmentsLeft;
444 }
445 
447 {
448  return m_segmentsLeft;
449 }
450 
451 void Ipv6ExtensionRoutingHeader::Print (std::ostream &os) const
452 {
453  os << "( nextHeader = " << (uint32_t)GetNextHeader () << " length = " << (uint32_t)GetLength ()
454  << " typeRouting = " << (uint32_t)m_typeRouting << " segmentsLeft = " << (uint32_t)m_segmentsLeft << " )";
455 }
456 
458 {
459  return 4;
460 }
461 
463 {
465 
466  i.WriteU8 (GetNextHeader ());
467  i.WriteU8 ((GetLength () >> 3) - 1);
470 }
471 
473 {
475 
476  SetNextHeader (i.ReadU8 ());
477  SetLength ((i.ReadU8 () + 1) << 3);
478  m_typeRouting = i.ReadU8 ();
479  m_segmentsLeft = i.ReadU8 ();
480 
481  return GetSerializedSize ();
482 }
483 
485 
487 {
488  static TypeId tid = TypeId ("ns3::Ipv6ExtensionLooseRoutingHeader")
490  .SetParent<Ipv6ExtensionRoutingHeader> ()
491  ;
492  return tid;
493 }
494 
496 {
497  return GetTypeId ();
498 }
499 
501  : m_routersAddress (0)
502 {
503 }
504 
506 {
507 }
508 
510 {
511  m_routersAddress.clear ();
512  m_routersAddress.assign (n, Ipv6Address (""));
513 }
514 
515 void Ipv6ExtensionLooseRoutingHeader::SetRoutersAddress (std::vector<Ipv6Address> routersAddress)
516 {
517  m_routersAddress = routersAddress;
518 }
519 
520 std::vector<Ipv6Address> Ipv6ExtensionLooseRoutingHeader::GetRoutersAddress () const
521 {
522  return m_routersAddress;
523 }
524 
526 {
527  m_routersAddress.at (index) = addr;
528 }
529 
531 {
532  return m_routersAddress.at (index);
533 }
534 
535 void Ipv6ExtensionLooseRoutingHeader::Print (std::ostream &os) const
536 {
537  os << "( nextHeader = " << (uint32_t)GetNextHeader () << " length = " << (uint32_t)GetLength ()
538  << " typeRouting = " << (uint32_t)GetTypeRouting () << " segmentsLeft = " << (uint32_t)GetSegmentsLeft () << " ";
539 
540  for (std::vector<Ipv6Address>::const_iterator it = m_routersAddress.begin (); it != m_routersAddress.end (); it++)
541  {
542  os << *it << " ";
543  }
544 
545  os << " )";
546 }
547 
549 {
550  return 8 + m_routersAddress.size () * 16;
551 }
552 
554 {
556  uint8_t buff[16];
557 
558  i.WriteU8 (GetNextHeader ());
559  i.WriteU8 ((GetLength () >> 3) - 1);
560  i.WriteU8 (GetTypeRouting ());
561  i.WriteU8 (GetSegmentsLeft ());
562  i.WriteU32 (0);
563 
564  for (VectorIpv6Address_t::const_iterator it = m_routersAddress.begin (); it != m_routersAddress.end (); it++)
565  {
566  it->Serialize (buff);
567  i.Write (buff, 16);
568  }
569 }
570 
572 {
574  uint8_t buff[16];
575 
576  SetNextHeader (i.ReadU8 ());
577  SetLength ((i.ReadU8 () + 1) << 3);
578  SetTypeRouting (i.ReadU8 ());
579  SetSegmentsLeft (i.ReadU8 ());
580  i.ReadU32 ();
581 
582  for (std::vector<Ipv6Address>::iterator it = m_routersAddress.begin (); it != m_routersAddress.end (); it++)
583  {
584  i.Read (buff, 16);
585  it->Set (buff);
586  }
587 
588  return GetSerializedSize ();
589 }
590 
592 
594 {
595  static TypeId tid = TypeId ("ns3::Ipv6ExtensionESPHeader")
597  .SetParent<Ipv6ExtensionHeader> ()
598  ;
599  return tid;
600 }
601 
603 {
604  return GetTypeId ();
605 }
606 
608 {
609 }
610 
612 {
613 }
614 
615 void Ipv6ExtensionESPHeader::Print (std::ostream &os) const
616 {
618 }
619 
621 {
623  return 0;
624 }
625 
627 {
629 }
630 
632 {
634  return 0;
635 }
636 
638 
640 {
641  static TypeId tid = TypeId ("ns3::Ipv6ExtensionAHHeader")
643  .SetParent<Ipv6ExtensionHeader> ()
644  ;
645  return tid;
646 }
647 
649 {
650  return GetTypeId ();
651 }
652 
654 {
655 }
656 
658 {
659 }
660 
661 void Ipv6ExtensionAHHeader::Print (std::ostream &os) const
662 {
664 }
665 
667 {
669  return 0;
670 }
671 
673 {
675 }
676 
678 {
680  return 0;
681 }
682 
683 } /* namespace ns3 */
684 
virtual TypeId GetInstanceTypeId() const
Get the instance type ID.
virtual TypeId GetInstanceTypeId() const
Get the instance type ID.
uint8_t m_length
The "length" field.
static TypeId GetTypeId()
Get the type identificator.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
uint32_t ReadU32(void)
Definition: buffer.cc:1001
TypeId AddConstructor(void)
Definition: type-id.h:418
void RemoveAtEnd(uint32_t end)
Definition: buffer.cc:501
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register the class in the ns-3 factory.
Definition: object-base.h:38
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
Doxygen introspection did not find any typical Config paths.
virtual TypeId GetInstanceTypeId() const
Get the instance type ID.
Doxygen introspection did not find any typical Config paths.
virtual Alignment GetAlignment() const
Get the Alignment requirement of this option header.
uint32_t CalculatePad(Ipv6OptionHeader::Alignment alignment) const
Calculate padding.
Doxygen introspection did not find any typical Config paths.
void SetTypeRouting(uint8_t typeRouting)
Set the "Type of Routing" field.
uint16_t m_offset
Offset of the fragment and More Fragment bit.
automatically resized byte buffer
Definition: buffer.h:92
virtual ~Ipv6ExtensionRoutingHeader()
Destructor.
static TypeId GetTypeId()
Get the type identificator.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
virtual void Print(std::ostream &os) const
Print some informations about the packet.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:170
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
Doxygen introspection did not find any typical Config paths.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
Buffer m_optionData
Data payload.
OptionField(uint32_t optionsOffset)
Constructor.
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
void SetOffset(uint16_t offset)
Set the "Offset" field.
static TypeId GetTypeId()
Get the type identificator.
uint32_t ReadNtohU32(void)
Definition: buffer.h:977
static TypeId GetTypeId()
Get the type identificator.
virtual void Print(std::ostream &os) const
Print some informations about the packet.
represents the alignment requirements of an option header
Doxygen introspection did not find any typical Config paths.
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
iterator in a Buffer instance
Definition: buffer.h:98
uint32_t GetSerializedSize() const
Get the serialized size of the packet.
static TypeId GetTypeId()
Get the type identificator.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
virtual ~Ipv6ExtensionDestinationHeader()
Destructor.
uint8_t m_nextHeader
The "next header" field.
Doxygen introspection did not find any typical Config paths.
Option field for an IPv6ExtensionHeader Enables adding options to an IPv6ExtensionHeader.
static TypeId GetTypeId()
Get the type identificator.
void Prev(void)
go backward by one byte
Definition: buffer.h:858
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
Doxygen introspection did not find any typical Config paths.
uint8_t data[writeSize]
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
virtual ~Ipv6ExtensionESPHeader()
Destructor.
void WriteHtonU16(uint16_t data)
Definition: buffer.h:912
Buffer::Iterator End(void) const
Definition: buffer.h:1082
uint8_t const * PeekData(void) const
Definition: buffer.cc:733
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
VectorIpv6Address_t m_routersAddress
The vector of Routers' IPv6 Address.
void SetMoreFragment(bool moreFragment)
Set the status of "More Fragment" bit.
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
void SetIdentification(uint32_t identification)
Set the "Identification" field.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:233
Buffer::Iterator Begin(void) const
Definition: buffer.h:1076
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
uint32_t m_optionsOffset
Offset.
virtual ~Ipv6ExtensionFragmentHeader()
Destructor.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
virtual TypeId GetInstanceTypeId() const
Get the instance type ID.
virtual void Print(std::ostream &os) const
Print some informations about the packet.
void SetNextHeader(uint8_t nextHeader)
Set the "Next header" field.
virtual ~Ipv6ExtensionAHHeader()
Destructor.
Buffer m_data
The data of the extension.
uint32_t GetOptionsOffset()
Get the offset where the options begin, measured from the start of the extension header.
virtual ~Ipv6ExtensionHeader()
Destructor.
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
void Read(uint8_t *buffer, uint32_t size)
Definition: buffer.cc:1152
Ipv6Address GetRouterAddress(uint8_t index) const
Get a Router IPv6 Address.
uint8_t GetTypeRouting() const
Get the field "Type of Routing".
virtual void Print(std::ostream &os) const
Print some informations about the packet.
virtual TypeId GetInstanceTypeId() const
Get the instance type ID.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
void WriteHtonU32(uint32_t data)
Definition: buffer.h:931
uint32_t GetSize(void) const
Definition: buffer.h:1070
bool GetMoreFragment() const
Get the status of "More Fragment" bit.
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
uint32_t m_identification
Identifier of the packet.
uint8_t GetSegmentsLeft() const
Get the field "Segments left".
bool AddAtEnd(uint32_t end)
Definition: buffer.cc:360
uint8_t GetNextHeader() const
Get the next header.
Describes an IPv6 address.
Definition: ipv6-address.h:46
void SetRoutersAddress(std::vector< Ipv6Address > routersAddress)
Set the vector of routers' address.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
virtual void Print(std::ostream &os) const
Print some informations about the packet.
void WriteU8(uint8_t data)
Definition: buffer.h:876
void AddOption(Ipv6OptionHeader const &option)
Serialize the option, prepending pad1 or padn option as necessary.
uint32_t GetIdentification() const
Get the field "Identification".
Doxygen introspection did not find any typical Config paths.
uint32_t Deserialize(Buffer::Iterator start, uint32_t length)
Deserialize the packet.
Buffer GetOptionBuffer()
Get the buffer.
Doxygen introspection did not find any typical Config paths.
std::vector< Ipv6Address > GetRoutersAddress() const
Get the vector of routers' address.
uint8_t m_typeRouting
Type of routing.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
Doxygen introspection did not find any typical Config paths.
uint8_t ReadU8(void)
Definition: buffer.h:1028
void Write(uint8_t const *buffer, uint32_t size)
Definition: buffer.cc:982
void SetLength(uint16_t length)
brief Set the length of the extension.
virtual ~Ipv6ExtensionHopByHopHeader()
Destructor.
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
virtual TypeId GetInstanceTypeId() const
Get the instance type ID.
static TypeId GetTypeId()
Get the type identificator.
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
virtual TypeId GetInstanceTypeId() const
Get the instance type ID.
uint8_t m_segmentsLeft
Number of left segments.
void Serialize(Buffer::Iterator start) const
Serialize all added options.
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
uint16_t GetOffset() const
Get the field "Offset".
uint16_t GetLength() const
Get the length of the extension.
virtual TypeId GetInstanceTypeId() const
Get the instance type ID.
uint16_t ReadNtohU16(void)
Definition: buffer.h:953
virtual void Print(std::ostream &os) const
Print some informations about the packet.
void WriteU32(uint32_t data)
Definition: buffer.cc:907
void SetRouterAddress(uint8_t index, Ipv6Address addr)
Set a Router IPv6 Address.
virtual uint32_t GetSerializedSize() const
Get the serialized size of the packet.
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
void SetNumberAddress(uint8_t n)
Set the number of routers' address.
a unique identifier for an interface.
Definition: type-id.h:49
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
virtual void Print(std::ostream &os) const
Print some informations about the packet.
Doxygen introspection did not find any typical Config paths.
virtual ~Ipv6ExtensionLooseRoutingHeader()
Destructor.
virtual void Print(std::ostream &os) const
Print some informations about the packet.
static TypeId GetTypeId()
Get the type identificator.
void SetSegmentsLeft(uint8_t segmentsLeft)
Set the "Segments left" field.