A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
ipv6-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-2008 Louis Pasteur 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: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
19  */
20 
21 #include "ns3/assert.h"
22 #include "ns3/log.h"
23 #include "ns3/header.h"
24 
25 #include "ns3/address-utils.h"
26 #include "ipv6-header.h"
27 
28 NS_LOG_COMPONENT_DEFINE ("Ipv6Header");
29 
30 namespace ns3 {
31 
32 NS_OBJECT_ENSURE_REGISTERED (Ipv6Header)
33  ;
34 
36  : m_version (6),
37  m_trafficClass (0),
38  m_flowLabel (1),
39  m_payloadLength (0),
40  m_nextHeader (0),
41  m_hopLimit (0)
42 {
45 }
46 
47 void Ipv6Header::SetTrafficClass (uint8_t traffic)
48 {
49  m_trafficClass = traffic;
50 }
51 
53 {
54  return m_trafficClass;
55 }
56 
57 void Ipv6Header::SetFlowLabel (uint32_t flow)
58 {
59  m_flowLabel = flow;
60 }
61 
62 uint32_t Ipv6Header::GetFlowLabel () const
63 {
64  return m_flowLabel;
65 }
66 
67 void Ipv6Header::SetPayloadLength (uint16_t len)
68 {
69  m_payloadLength = len;
70 }
71 
73 {
74  return m_payloadLength;
75 }
76 
77 void Ipv6Header::SetNextHeader (uint8_t next)
78 {
79  m_nextHeader = next;
80 }
81 
82 uint8_t Ipv6Header::GetNextHeader () const
83 {
84  return m_nextHeader;
85 }
86 
87 void Ipv6Header::SetHopLimit (uint8_t limit)
88 {
89  m_hopLimit = limit;
90 }
91 
92 uint8_t Ipv6Header::GetHopLimit () const
93 {
94  return m_hopLimit;
95 }
96 
98 {
99  m_sourceAddress = src;
100 }
101 
103 {
104  return m_sourceAddress;
105 }
106 
108 {
109  m_destinationAddress = dst;
110 }
111 
113 {
114  return m_destinationAddress;
115 }
116 
118 {
119  static TypeId tid = TypeId ("ns3::Ipv6Header")
120  .SetParent<Header> ()
121  .AddConstructor<Ipv6Header> ()
122  ;
123  return tid;
124 }
125 
127 {
128  return GetTypeId ();
129 }
130 
131 void Ipv6Header::Print (std::ostream& os) const
132 {
133  os << "("
134  "Version " << m_version << " "
135  << "Traffic class 0x" << std::hex << m_trafficClass << std::dec << " "
136  << "Flow Label 0x" << std::hex << m_flowLabel << std::dec << " "
137  << "Payload Length " << m_payloadLength << " "
138  << "Next Header " << std::dec << (uint32_t) m_nextHeader << " "
139  << "Hop Limit " << std::dec << (uint32_t)m_hopLimit << " )"
141  ;
142 }
143 
145 {
146  return 10 * 4;
147 }
148 
150 {
152  uint32_t vTcFl = 0; /* version, Traffic Class and Flow Label fields */
153 
154  vTcFl= (6 << 28) | (m_trafficClass << 20) | (m_flowLabel);
155 
156  i.WriteHtonU32 (vTcFl);
158  i.WriteU8 (m_nextHeader);
159  i.WriteU8 (m_hopLimit);
160 
163 }
164 
166 {
168  uint32_t vTcFl = 0;
169 
170  vTcFl = i.ReadNtohU32 ();
171  m_version = vTcFl >> 28;
172 
173  NS_ASSERT ((m_version) == 6);
174 
175  m_trafficClass = (uint8_t)((vTcFl >> 20) & 0x000000ff);
176  m_flowLabel = vTcFl & 0xfff00000;
178  m_nextHeader = i.ReadU8 ();
179  m_hopLimit = i.ReadU8 ();
180 
183 
184  return GetSerializedSize ();
185 }
186 
187 } /* namespace ns3 */
188 
Protocol header serialization and deserialization.
Definition: header.h:42
uint8_t GetTrafficClass(void) const
Get the "Traffic class" field.
Definition: ipv6-header.cc:52
virtual uint32_t GetSerializedSize(void) const
Get the serialized size of the packet.
Definition: ipv6-header.cc:144
uint8_t GetNextHeader(void) const
Get the next header.
Definition: ipv6-header.cc:82
void SetPayloadLength(uint16_t len)
Set the "Payload length" field.
Definition: ipv6-header.cc:67
uint32_t m_flowLabel
The flow label.
Definition: ipv6-header.h:200
uint32_t m_version
The version (always equal to 6).
Definition: ipv6-header.h:190
void ReadFrom(Buffer::Iterator &i, Ipv4Address &ad)
Read an Ipv4Address from a Buffer.
uint32_t m_trafficClass
The traffic class.
Definition: ipv6-header.h:194
#define NS_ASSERT(condition)
Definition: assert.h:64
NS_OBJECT_ENSURE_REGISTERED(NullMessageSimulatorImpl)
void WriteTo(Buffer::Iterator &i, Ipv4Address ad)
Write an Ipv4Address to a Buffer.
void SetNextHeader(uint8_t next)
Set the "Next header" field.
Definition: ipv6-header.cc:77
Ipv6Address m_sourceAddress
The source address.
Definition: ipv6-header.h:220
virtual TypeId GetInstanceTypeId(void) const
Return the instance type identifier.
Definition: ipv6-header.cc:126
NS_LOG_COMPONENT_DEFINE("Ipv6Header")
uint32_t ReadNtohU32(void)
Definition: buffer.h:791
iterator in a Buffer instance
Definition: buffer.h:98
Ipv6Address m_destinationAddress
The destination address.
Definition: ipv6-header.h:225
void WriteHtonU16(uint16_t data)
Definition: buffer.h:726
uint32_t GetFlowLabel(void) const
Get the "Flow label" field.
Definition: ipv6-header.cc:62
virtual uint32_t Deserialize(Buffer::Iterator start)
Deserialize the packet.
Definition: ipv6-header.cc:165
uint8_t GetHopLimit(void) const
Get the "Hop limit" field (TTL).
Definition: ipv6-header.cc:92
virtual void Print(std::ostream &os) const
Print some informations about the packet.
Definition: ipv6-header.cc:131
uint16_t GetPayloadLength(void) const
Get the "Payload length" field.
Definition: ipv6-header.cc:72
void WriteHtonU32(uint32_t data)
Definition: buffer.h:745
Ipv6Header(void)
Constructor.
Definition: ipv6-header.cc:35
static TypeId GetTypeId(void)
Get the type identifier.
Definition: ipv6-header.cc:117
void SetSourceAddress(Ipv6Address src)
Set the "Source address" field.
Definition: ipv6-header.cc:97
Describes an IPv6 address.
Definition: ipv6-address.h:46
virtual void Serialize(Buffer::Iterator start) const
Serialize the packet.
Definition: ipv6-header.cc:149
void SetHopLimit(uint8_t limit)
Set the "Hop limit" field (TTL).
Definition: ipv6-header.cc:87
void WriteU8(uint8_t data)
Definition: buffer.h:690
Ipv6Address GetSourceAddress(void) const
Get the "Source address" field.
Definition: ipv6-header.cc:102
void SetFlowLabel(uint32_t flow)
Set the "Flow label" field.
Definition: ipv6-header.cc:57
uint16_t m_payloadLength
The payload length.
Definition: ipv6-header.h:205
uint8_t ReadU8(void)
Definition: buffer.h:819
void SetTrafficClass(uint8_t traffic)
Set the "Traffic class" field.
Definition: ipv6-header.cc:47
uint8_t m_hopLimit
The Hop limit value.
Definition: ipv6-header.h:215
uint8_t m_nextHeader
The Next header number.
Definition: ipv6-header.h:210
uint16_t ReadNtohU16(void)
Definition: buffer.h:767
a unique identifier for an interface.
Definition: type-id.h:49
void SetDestinationAddress(Ipv6Address dst)
Set the "Destination address" field.
Definition: ipv6-header.cc:107
TypeId SetParent(TypeId tid)
Definition: type-id.cc:611
Ipv6Address GetDestinationAddress(void) const
Get the "Destination address" field.
Definition: ipv6-header.cc:112