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