INET Framework for OMNeT++/OMNEST
inet::IPv6Datagram Class Reference

Represents an IPv6 datagram. More...

#include <IPv6Datagram.h>

Inheritance diagram for inet::IPv6Datagram:
inet::IPv6Datagram_Base inet::INetworkDatagram

Public Member Functions

 IPv6Datagram (const char *name=nullptr, int kind=0)
 
 IPv6Datagram (const IPv6Datagram &other)
 
IPv6Datagramoperator= (const IPv6Datagram &other)
 
 ~IPv6Datagram ()
 
virtual IPv6Datagramdup () const override
 
virtual int getDiffServCodePoint () const override
 Returns bits 0-5 of the Traffic Class field, a value in the 0..63 range. More...
 
virtual void setDiffServCodePoint (int dscp) override
 Sets bits 0-5 of the Traffic Class field; expects a value in the 0..63 range. More...
 
virtual int getExplicitCongestionNotification () const override
 Returns bits 6-7 of the Traffic Class field, a value in the range 0..3. More...
 
virtual void setExplicitCongestionNotification (int ecn) override
 Sets bits 6-7 of the Traffic Class field; expects a value in the 0..3 range. More...
 
virtual void setExtensionHeaderArraySize (unsigned int size) override
 Generated but unused method, should not be called. More...
 
virtual void setExtensionHeader (unsigned int k, const IPv6ExtensionHeaderPtr &extensionHeader_var) override
 Generated but unused method, should not be called. More...
 
virtual unsigned int getExtensionHeaderArraySize () const override
 Returns the number of extension headers in this datagram. More...
 
virtual IPv6ExtensionHeaderPtrgetExtensionHeader (unsigned int k) override
 Returns the kth extension header in this datagram. More...
 
virtual const IPv6ExtensionHeaderPtrgetExtensionHeader (unsigned int k) const override
 
virtual IPv6ExtensionHeaderfindExtensionHeaderByType (IPProtocolId extensionType, int index=0) const
 Returns the extension header of the specified type, or nullptr. More...
 
virtual void addExtensionHeader (IPv6ExtensionHeader *eh, int atPos=-1)
 Adds an extension header to the datagram. More...
 
virtual int calculateHeaderByteLength () const
 Calculates the length of the IPv6 header plus the extension headers. More...
 
virtual int calculateUnfragmentableHeaderByteLength () const
 Calculates the length of the unfragmentable part of IPv6 header plus the extension headers. More...
 
virtual int calculateFragmentLength () const
 Calculates the length of the payload and extension headers after the Fragment Header. More...
 
virtual IPv6ExtensionHeaderremoveFirstExtensionHeader ()
 Removes and returns the first extension header of this datagram. More...
 
virtual IPv6ExtensionHeaderremoveExtensionHeader (IPProtocolId extensionType)
 Removes and returns the first extension header with the given type. More...
 
virtual L3Address getSourceAddress () const override
 
virtual void setSourceAddress (const L3Address &address) override
 
virtual L3Address getDestinationAddress () const override
 
virtual void setDestinationAddress (const L3Address &address) override
 
virtual int getTransportProtocol () const override
 
virtual void setTransportProtocol (int protocol) override
 
- Public Member Functions inherited from inet::IPv6Datagram_Base
virtual ~IPv6Datagram_Base ()
 
virtual void parsimPack (omnetpp::cCommBuffer *b) const override
 
virtual void parsimUnpack (omnetpp::cCommBuffer *b) override
 
virtual IPv6AddressgetSrcAddress ()
 
virtual const IPv6AddressgetSrcAddress () const
 
virtual void setSrcAddress (const IPv6Address &srcAddress)
 
virtual IPv6AddressgetDestAddress ()
 
virtual const IPv6AddressgetDestAddress () const
 
virtual void setDestAddress (const IPv6Address &destAddress)
 
virtual unsigned char getTrafficClass () const
 
virtual void setTrafficClass (unsigned char trafficClass)
 
virtual unsigned int getFlowLabel () const
 
virtual void setFlowLabel (unsigned int flowLabel)
 
virtual short getHopLimit () const
 
virtual void setHopLimit (short hopLimit)
 
- Public Member Functions inherited from inet::INetworkDatagram
virtual ~INetworkDatagram ()
 

Protected Types

typedef std::vector< IPv6ExtensionHeader * > ExtensionHeaders
 

Protected Attributes

ExtensionHeaders extensionHeaders
 
- Protected Attributes inherited from inet::IPv6Datagram_Base
IPv6Address srcAddress
 
IPv6Address destAddress
 
unsigned char trafficClass
 
unsigned int flowLabel
 
short hopLimit
 
int transportProtocol
 

Private Member Functions

void copy (const IPv6Datagram &other)
 
void clean ()
 
int getExtensionHeaderOrder (IPv6ExtensionHeader *eh)
 

Additional Inherited Members

- Protected Member Functions inherited from inet::IPv6Datagram_Base
bool operator== (const IPv6Datagram_Base &)
 
 IPv6Datagram_Base (const char *name=nullptr, short kind=0)
 
 IPv6Datagram_Base (const IPv6Datagram_Base &other)
 
IPv6Datagram_Baseoperator= (const IPv6Datagram_Base &other)
 

Detailed Description

Represents an IPv6 datagram.

More info in the IPv6Datagram.msg file (and the documentation generated from it).

Member Typedef Documentation

Constructor & Destructor Documentation

inet::IPv6Datagram::IPv6Datagram ( const char *  name = nullptr,
int  kind = 0 
)
inline
44 : IPv6Datagram_Base(name, kind) {}
IPv6Datagram_Base(const char *name=nullptr, short kind=0)
inet::IPv6Datagram::IPv6Datagram ( const IPv6Datagram other)
inline
45 : IPv6Datagram_Base(other) { copy(other); }
void copy(const IPv6Datagram &other)
Definition: IPv6Datagram.cc:40
IPv6Datagram_Base(const char *name=nullptr, short kind=0)
inet::IPv6Datagram::~IPv6Datagram ( )
206 {
207  clean();
208 }
void clean()
Definition: IPv6Datagram.cc:210

Member Function Documentation

void inet::IPv6Datagram::addExtensionHeader ( IPv6ExtensionHeader eh,
int  atPos = -1 
)
virtual

Adds an extension header to the datagram.

The atPos parameter should not be used, the extension headers are stored in the order specified in RFC 2460 4.1.

Referenced by copy(), inet::IPv6::encapsulate(), inet::IPv6::fragmentAndSend(), and inet::GPSR::setGpsrOptionOnNetworkDatagram().

82 {
83  if (atPos != -1)
84  throw cRuntimeError(this, "addExtensionHeader() does not support atPos parameter.");
85  ASSERT((eh->getByteLength() >= 1) && (eh->getByteLength() % 8 == 0));
86  int thisOrder = getExtensionHeaderOrder(eh);
87  unsigned int i;
88  for (i = 0; i < extensionHeaders.size(); i++) {
89  int thatOrder = getExtensionHeaderOrder(extensionHeaders[i]);
90  if (thisOrder != -1 && thatOrder > thisOrder)
91  break;
92  else if (thisOrder == thatOrder) {
93  if (thisOrder == 1)
94  thisOrder = 6;
95  else if (thisOrder != -1)
96  throw cRuntimeError(this, "addExtensionHeader() duplicate extension header: %d",
97  eh->getExtensionType());
98  }
99  }
100 
101  // insert at position atPos, shift up the rest of the array
102  extensionHeaders.insert(extensionHeaders.begin() + i, eh);
103 }
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
int getExtensionHeaderOrder(IPv6ExtensionHeader *eh)
Definition: IPv6Datagram.cc:110
int inet::IPv6Datagram::calculateFragmentLength ( ) const
virtual

Calculates the length of the payload and extension headers after the Fragment Header.

Note: it is assumed that headers are ordered as described in RFC 2460 4.1.

Referenced by inet::IPv6FragBuf::addFragment().

172 {
173  int len = getByteLength() - IPv6_HEADER_BYTES;
174  unsigned int i;
175  for (i = 0; i < extensionHeaders.size(); i++) {
176  len -= extensionHeaders[i]->getByteLength();
177  if (extensionHeaders[i]->getExtensionType() == IP_PROT_IPv6EXT_FRAGMENT)
178  break;
179  }
180  ASSERT2(i < extensionHeaders.size(), "IPv6Datagram::calculateFragmentLength() called on non-fragment datagram");
181  return len;
182 }
uint16_t len
Definition: TCP_NSC.cc:85
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
const int IPv6_HEADER_BYTES
Definition: IPv6Datagram_m.h:44
Definition: IPProtocolId_m.h:97
int inet::IPv6Datagram::calculateHeaderByteLength ( ) const
virtual

Calculates the length of the IPv6 header plus the extension headers.

Referenced by inet::IPv6::encapsulate(), and inet::GPSR::setGpsrOptionOnNetworkDatagram().

141 {
142  int len = 40;
143  for (auto & elem : extensionHeaders)
144  len += elem->getByteLength();
145  return len;
146 }
uint16_t len
Definition: TCP_NSC.cc:85
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
int inet::IPv6Datagram::calculateUnfragmentableHeaderByteLength ( ) const
virtual

Calculates the length of the unfragmentable part of IPv6 header plus the extension headers.

Note: it is assumed that headers are ordered as described in RFC 2460 4.1.

Referenced by inet::IPv6FragBuf::addFragment(), and inet::IPv6::fragmentAndSend().

152 {
153  int lastUnfragmentableExtensionIndex = -1;
154  for (int i = ((int)extensionHeaders.size()) - 1; i >= 0; i--) {
155  int type = extensionHeaders[i]->getExtensionType();
156  if (type == IP_PROT_IPv6EXT_ROUTING || type == IP_PROT_IPv6EXT_HOP) {
157  lastUnfragmentableExtensionIndex = i;
158  break;
159  }
160  }
161 
162  int len = 40;
163  for (int i = 0; i <= lastUnfragmentableExtensionIndex; i++)
164  len += extensionHeaders[i]->getByteLength();
165  return len;
166 }
uint16_t len
Definition: TCP_NSC.cc:85
Definition: IPProtocolId_m.h:94
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
Definition: IPProtocolId_m.h:96
void inet::IPv6Datagram::clean ( )
private

Referenced by operator=(), and ~IPv6Datagram().

211 {
213 
214  while (!extensionHeaders.empty()) {
215  eh = extensionHeaders.back();
216  extensionHeaders.pop_back(); // remove pointer element from container
217  delete eh; // delete the header
218  }
219 }
IPv6ExtensionHeader * IPv6ExtensionHeaderPtr
Definition: IPv6ControlInfo_m.h:39
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
void inet::IPv6Datagram::copy ( const IPv6Datagram other)
private

Referenced by operator=().

41 {
42  for (const auto & elem : other.extensionHeaders)
43  addExtensionHeader((elem)->dup());
44 }
virtual void addExtensionHeader(IPv6ExtensionHeader *eh, int atPos=-1)
Adds an extension header to the datagram.
Definition: IPv6Datagram.cc:81
virtual IPv6Datagram * dup() const override
Definition: IPv6Datagram.h:49
virtual IPv6Datagram* inet::IPv6Datagram::dup ( ) const
inlineoverridevirtual

Reimplemented from inet::IPv6Datagram_Base.

Referenced by copy(), inet::IPv6ControlInfo::copy(), inet::IPv6::fragmentAndSend(), and inet::IPv6::routeMulticastPacket().

49 { return new IPv6Datagram(*this); }
IPv6Datagram(const char *name=nullptr, int kind=0)
Definition: IPv6Datagram.h:44
IPv6ExtensionHeader * inet::IPv6Datagram::findExtensionHeaderByType ( IPProtocolId  extensionType,
int  index = 0 
) const
virtual

Returns the extension header of the specified type, or nullptr.

If index is 0, then the first, if 1 then the second extension is returned. (The datagram might contain two Destination Options extension.)

Referenced by inet::GPSR::findGpsrOptionInNetworkDatagram(), inet::IPv6::localDeliver(), inet::UDP::processICMPError(), and inet::GPSR::setGpsrOptionOnNetworkDatagram().

65 {
66  for (const auto & elem : extensionHeaders)
67  if ((elem)->getExtensionType() == extensionType) {
68  if (index == 0)
69  return elem;
70  else
71  index--;
72  }
73  return nullptr;
74 }
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
virtual L3Address inet::IPv6Datagram::getDestinationAddress ( ) const
inlineoverridevirtual

Implements inet::INetworkDatagram.

133 { return L3Address(getDestAddress()); }
virtual IPv6Address & getDestAddress()
virtual int inet::IPv6Datagram::getDiffServCodePoint ( ) const
inlineoverridevirtual

Returns bits 0-5 of the Traffic Class field, a value in the 0..63 range.

Implements inet::IPv6Datagram_Base.

Referenced by inet::BehaviorAggregateClassifier::getDscpFromPacket().

54 { return getTrafficClass() & 0x3f; }
virtual unsigned char getTrafficClass() const
virtual int inet::IPv6Datagram::getExplicitCongestionNotification ( ) const
inlineoverridevirtual

Returns bits 6-7 of the Traffic Class field, a value in the range 0..3.

Implements inet::IPv6Datagram_Base.

64 { return (getTrafficClass() >> 6) & 0x03; }
virtual unsigned char getTrafficClass() const
IPv6ExtensionHeaderPtr & inet::IPv6Datagram::getExtensionHeader ( unsigned int  k)
overridevirtual

Returns the kth extension header in this datagram.

Implements inet::IPv6Datagram_Base.

Referenced by inet::serializer::IPv6Serializer::serialize().

57 {
58  static IPv6ExtensionHeaderPtr null;
59  if (k >= extensionHeaders.size())
60  return null = nullptr;
61  return extensionHeaders[k];
62 }
IPv6ExtensionHeader * IPv6ExtensionHeaderPtr
Definition: IPv6ControlInfo_m.h:39
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
const double k
Definition: QAM16Modulation.cc:24
virtual const IPv6ExtensionHeaderPtr& inet::IPv6Datagram::getExtensionHeader ( unsigned int  k) const
inlineoverridevirtual

Reimplemented from inet::IPv6Datagram_Base.

Referenced by getExtensionHeader().

86 {return const_cast<IPv6Datagram*>(this)->getExtensionHeader(k);}
IPv6Datagram(const char *name=nullptr, int kind=0)
Definition: IPv6Datagram.h:44
virtual IPv6ExtensionHeaderPtr & getExtensionHeader(unsigned int k) override
Returns the kth extension header in this datagram.
Definition: IPv6Datagram.cc:56
const double k
Definition: QAM16Modulation.cc:24
unsigned int inet::IPv6Datagram::getExtensionHeaderArraySize ( ) const
overridevirtual

Returns the number of extension headers in this datagram.

Implements inet::IPv6Datagram_Base.

Referenced by inet::IPv6::processExtensionHeaders(), inet::IPv6::routePacket(), and inet::serializer::IPv6Serializer::serialize().

52 {
53  return extensionHeaders.size();
54 }
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
int inet::IPv6Datagram::getExtensionHeaderOrder ( IPv6ExtensionHeader eh)
private

Referenced by addExtensionHeader().

111 {
112  switch (eh->getExtensionType()) {
113  case IP_PROT_IPv6EXT_HOP:
114  return 0;
115 
117  return 1;
118 
120  return 2;
121 
123  return 3;
124 
126  return 4;
127 
128  case IP_PROT_IPv6EXT_ESP:
129  return 5;
130 
131  // second IP_PROT_IPv6EXT_DEST has order 6
132  case IP_PROT_IPv6EXT_MOB:
133  return 7;
134 
135  default:
136  return -1;
137  }
138 }
Definition: IPProtocolId_m.h:94
Definition: IPProtocolId_m.h:95
Definition: IPProtocolId_m.h:98
Definition: IPProtocolId_m.h:100
Definition: IPProtocolId_m.h:97
Definition: IPProtocolId_m.h:99
Definition: IPProtocolId_m.h:96
virtual L3Address inet::IPv6Datagram::getSourceAddress ( ) const
inlineoverridevirtual

Implements inet::INetworkDatagram.

131 { return L3Address(getSrcAddress()); }
virtual IPv6Address & getSrcAddress()
IPv6Datagram & inet::IPv6Datagram::operator= ( const IPv6Datagram other)
31 {
32  if (this == &other)
33  return *this;
34  clean();
36  copy(other);
37  return *this;
38 }
void copy(const IPv6Datagram &other)
Definition: IPv6Datagram.cc:40
void clean()
Definition: IPv6Datagram.cc:210
IPv6Datagram_Base & operator=(const IPv6Datagram_Base &other)
IPv6ExtensionHeader * inet::IPv6Datagram::removeExtensionHeader ( IPProtocolId  extensionType)
virtual

Removes and returns the first extension header with the given type.

Referenced by inet::IPv6FragBuf::addFragment().

194 {
195  for (unsigned int i = 0; i < extensionHeaders.size(); i++) {
196  if (extensionHeaders[i]->getExtensionType() == extensionType) {
197  IPv6ExtensionHeader *eh = extensionHeaders[i];
198  extensionHeaders.erase(extensionHeaders.begin() + i);
199  return eh;
200  }
201  }
202  return nullptr;
203 }
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
IPv6ExtensionHeader * inet::IPv6Datagram::removeFirstExtensionHeader ( )
virtual

Removes and returns the first extension header of this datagram.

Referenced by inet::IPv6::processExtensionHeaders().

185 {
186  if (extensionHeaders.empty())
187  return nullptr;
188  IPv6ExtensionHeader *eh = extensionHeaders.front();
189  extensionHeaders.erase(extensionHeaders.begin());
190  return eh;
191 }
ExtensionHeaders extensionHeaders
Definition: IPv6Datagram.h:36
virtual void inet::IPv6Datagram::setDestinationAddress ( const L3Address address)
inlineoverridevirtual

Implements inet::INetworkDatagram.

134 { setDestAddress(address.toIPv6()); }
virtual void setDestAddress(const IPv6Address &destAddress)
virtual void inet::IPv6Datagram::setDiffServCodePoint ( int  dscp)
inlineoverridevirtual

Sets bits 0-5 of the Traffic Class field; expects a value in the 0..63 range.

Implements inet::IPv6Datagram_Base.

Referenced by inet::DSCPMarker::markPacket().

59 { setTrafficClass((getTrafficClass() & 0xc0) | (dscp & 0x3f)); }
virtual unsigned char getTrafficClass() const
virtual void setTrafficClass(unsigned char trafficClass)
virtual void inet::IPv6Datagram::setExplicitCongestionNotification ( int  ecn)
inlineoverridevirtual

Sets bits 6-7 of the Traffic Class field; expects a value in the 0..3 range.

Implements inet::IPv6Datagram_Base.

69 { setTrafficClass((getTrafficClass() & 0x3f) | ((ecn & 0x3) << 6)); }
virtual unsigned char getTrafficClass() const
virtual void setTrafficClass(unsigned char trafficClass)
void inet::IPv6Datagram::setExtensionHeader ( unsigned int  k,
const IPv6ExtensionHeaderPtr extensionHeader_var 
)
overridevirtual

Generated but unused method, should not be called.

Implements inet::IPv6Datagram_Base.

77 {
78  throw cRuntimeError(this, "setExtensionHeader() not supported, use addExtensionHeader()");
79 }
void inet::IPv6Datagram::setExtensionHeaderArraySize ( unsigned int  size)
overridevirtual

Generated but unused method, should not be called.

Implements inet::IPv6Datagram_Base.

47 {
48  throw cRuntimeError(this, "setExtensionHeaderArraySize() not supported, use addExtensionHeader()");
49 }
virtual void inet::IPv6Datagram::setSourceAddress ( const L3Address address)
inlineoverridevirtual

Implements inet::INetworkDatagram.

132 { setSrcAddress(address.toIPv6()); }
virtual void setSrcAddress(const IPv6Address &srcAddress)
virtual void inet::IPv6Datagram::setTransportProtocol ( int  protocol)
inlineoverridevirtual

Implements inet::INetworkDatagram.

Referenced by inet::IPv6::encapsulate().

uint8_t protocol
Definition: TCP_NSC.cc:88
virtual void setTransportProtocol(int transportProtocol)

Member Data Documentation


The documentation for this class was generated from the following files: