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/log.h"
22 #include "ns3/assert.h"
23 #include "ns3/uinteger.h"
24 #include "ipv6-option.h"
25 #include "ipv6-option-header.h"
26
27 namespace ns3
28 {
29
30 NS_LOG_COMPONENT_DEFINE ("Ipv6Option");
31
32 NS_OBJECT_ENSURE_REGISTERED (Ipv6Option);
33
GetTypeId()34 TypeId Ipv6Option::GetTypeId ()
35 {
36 static TypeId tid = TypeId ("ns3::Ipv6Option")
37 .SetParent<Object> ()
38 .SetGroupName ("Internet")
39 .AddAttribute ("OptionNumber", "The IPv6 option number.",
40 UintegerValue (0),
41 MakeUintegerAccessor (&Ipv6Option::GetOptionNumber),
42 MakeUintegerChecker<uint8_t> ())
43 ;
44 return tid;
45 }
46
~Ipv6Option()47 Ipv6Option::~Ipv6Option ()
48 {
49 NS_LOG_FUNCTION (this);
50 }
51
SetNode(Ptr<Node> node)52 void Ipv6Option::SetNode (Ptr<Node> node)
53 {
54 NS_LOG_FUNCTION (this << node);
55 m_node = node;
56 }
57
58
59 NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPad1);
60
GetTypeId()61 TypeId Ipv6OptionPad1::GetTypeId ()
62 {
63 static TypeId tid = TypeId ("ns3::Ipv6OptionPad1")
64 .SetParent<Ipv6Option> ()
65 .SetGroupName ("Internet")
66 .AddConstructor<Ipv6OptionPad1> ()
67 ;
68 return tid;
69 }
70
Ipv6OptionPad1()71 Ipv6OptionPad1::Ipv6OptionPad1 ()
72 {
73 NS_LOG_FUNCTION (this);
74 }
75
~Ipv6OptionPad1()76 Ipv6OptionPad1::~Ipv6OptionPad1 ()
77 {
78 NS_LOG_FUNCTION (this);
79 }
80
GetOptionNumber() const81 uint8_t Ipv6OptionPad1::GetOptionNumber () const
82 {
83 NS_LOG_FUNCTION (this);
84
85 return OPT_NUMBER;
86 }
87
Process(Ptr<Packet> packet,uint8_t offset,Ipv6Header const & ipv6Header,bool & isDropped)88 uint8_t Ipv6OptionPad1::Process (Ptr<Packet> packet, uint8_t offset, Ipv6Header const& ipv6Header, bool& isDropped)
89 {
90 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << isDropped);
91
92 Ptr<Packet> p = packet->Copy ();
93 p->RemoveAtStart (offset);
94
95 Ipv6OptionPad1Header pad1Header;
96 p->RemoveHeader (pad1Header);
97
98 isDropped = false;
99
100 return pad1Header.GetSerializedSize ();
101 }
102
103
104 NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionPadn);
105
GetTypeId()106 TypeId Ipv6OptionPadn::GetTypeId ()
107 {
108 static TypeId tid = TypeId ("ns3::Ipv6OptionPadn")
109 .SetParent<Ipv6Option> ()
110 .SetGroupName ("Internet")
111 .AddConstructor<Ipv6OptionPadn> ()
112 ;
113 return tid;
114 }
115
Ipv6OptionPadn()116 Ipv6OptionPadn::Ipv6OptionPadn ()
117 {
118 NS_LOG_FUNCTION (this);
119 }
120
~Ipv6OptionPadn()121 Ipv6OptionPadn::~Ipv6OptionPadn ()
122 {
123 NS_LOG_FUNCTION (this);
124 }
125
GetOptionNumber() const126 uint8_t Ipv6OptionPadn::GetOptionNumber () const
127 {
128 NS_LOG_FUNCTION (this);
129
130 return OPT_NUMBER;
131 }
132
Process(Ptr<Packet> packet,uint8_t offset,Ipv6Header const & ipv6Header,bool & isDropped)133 uint8_t Ipv6OptionPadn::Process (Ptr<Packet> packet, uint8_t offset, Ipv6Header const& ipv6Header, bool& isDropped)
134 {
135 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << isDropped);
136
137 Ptr<Packet> p = packet->Copy ();
138 p->RemoveAtStart (offset);
139
140 Ipv6OptionPadnHeader padnHeader;
141 p->RemoveHeader (padnHeader);
142
143 isDropped = false;
144
145 return padnHeader.GetSerializedSize ();
146 }
147
148
149 NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionJumbogram);
150
GetTypeId()151 TypeId Ipv6OptionJumbogram::GetTypeId ()
152 {
153 static TypeId tid = TypeId ("ns3::Ipv6OptionJumbogram")
154 .SetParent<Ipv6Option> ()
155 .SetGroupName ("Internet")
156 .AddConstructor<Ipv6OptionJumbogram> ()
157 ;
158 return tid;
159 }
160
Ipv6OptionJumbogram()161 Ipv6OptionJumbogram::Ipv6OptionJumbogram ()
162 {
163 NS_LOG_FUNCTION (this);
164 }
165
~Ipv6OptionJumbogram()166 Ipv6OptionJumbogram::~Ipv6OptionJumbogram ()
167 {
168 NS_LOG_FUNCTION (this);
169 }
170
GetOptionNumber() const171 uint8_t Ipv6OptionJumbogram::GetOptionNumber () const
172 {
173 NS_LOG_FUNCTION (this);
174
175 return OPT_NUMBER;
176 }
177
Process(Ptr<Packet> packet,uint8_t offset,Ipv6Header const & ipv6Header,bool & isDropped)178 uint8_t Ipv6OptionJumbogram::Process (Ptr<Packet> packet, uint8_t offset, Ipv6Header const& ipv6Header, bool& isDropped)
179 {
180 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << isDropped);
181
182 Ptr<Packet> p = packet->Copy ();
183 p->RemoveAtStart (offset);
184
185 Ipv6OptionJumbogramHeader jumbogramHeader;
186 p->RemoveHeader (jumbogramHeader);
187
188 isDropped = false;
189
190 return jumbogramHeader.GetSerializedSize ();
191 }
192
193
194 NS_OBJECT_ENSURE_REGISTERED (Ipv6OptionRouterAlert);
195
GetTypeId()196 TypeId Ipv6OptionRouterAlert::GetTypeId ()
197 {
198 static TypeId tid = TypeId ("ns3::Ipv6OptionRouterAlert")
199 .SetParent<Ipv6Option> ()
200 .SetGroupName ("Internet")
201 .AddConstructor<Ipv6OptionRouterAlert> ()
202 ;
203 return tid;
204 }
205
Ipv6OptionRouterAlert()206 Ipv6OptionRouterAlert::Ipv6OptionRouterAlert ()
207 {
208 NS_LOG_FUNCTION (this);
209 }
210
~Ipv6OptionRouterAlert()211 Ipv6OptionRouterAlert::~Ipv6OptionRouterAlert ()
212 {
213 NS_LOG_FUNCTION (this);
214 }
215
GetOptionNumber() const216 uint8_t Ipv6OptionRouterAlert::GetOptionNumber () const
217 {
218 NS_LOG_FUNCTION (this);
219
220 return OPT_NUMBER;
221 }
222
Process(Ptr<Packet> packet,uint8_t offset,Ipv6Header const & ipv6Header,bool & isDropped)223 uint8_t Ipv6OptionRouterAlert::Process (Ptr<Packet> packet, uint8_t offset, Ipv6Header const& ipv6Header, bool& isDropped)
224 {
225 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << isDropped);
226
227 Ptr<Packet> p = packet->Copy ();
228 p->RemoveAtStart (offset);
229
230 Ipv6OptionRouterAlertHeader routerAlertHeader;
231 p->RemoveHeader (routerAlertHeader);
232
233 isDropped = false;
234
235 return routerAlertHeader.GetSerializedSize ();
236 }
237
238 } /* namespace ns3 */
239
240