Coding style.
This commit is contained in:
@@ -45,26 +45,25 @@ NS_LOG_COMPONENT_DEFINE ("FragmentationIpv6Example");
|
||||
*/
|
||||
class StackHelper
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* \brief Add an address to a IPv6 node.
|
||||
* \param n node
|
||||
* \param interface interface index
|
||||
* \param address IPv6 address to add
|
||||
*/
|
||||
inline void AddAddress (Ptr<Node>& n, uint32_t interface, Ipv6Address address)
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief Add an address to a IPv6 node.
|
||||
* \param n node
|
||||
* \param interface interface index
|
||||
* \param address IPv6 address to add
|
||||
*/
|
||||
inline void AddAddress (Ptr<Node>& n, uint32_t interface, Ipv6Address address)
|
||||
{
|
||||
Ptr<Ipv6> ipv6 = n->GetObject<Ipv6> ();
|
||||
ipv6->AddAddress (interface, address);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Print the routing table.
|
||||
* \param n the node
|
||||
*/
|
||||
inline void PrintRoutingTable (Ptr<Node>& n)
|
||||
{
|
||||
/**
|
||||
* \brief Print the routing table.
|
||||
* \param n the node
|
||||
*/
|
||||
inline void PrintRoutingTable (Ptr<Node>& n)
|
||||
{
|
||||
Ptr<Ipv6StaticRouting> routing = 0;
|
||||
Ipv6StaticRoutingHelper routingHelper;
|
||||
Ptr<Ipv6> ipv6 = n->GetObject<Ipv6> ();
|
||||
@@ -78,15 +77,15 @@ class StackHelper
|
||||
|
||||
nbRoutes = routing->GetNRoutes ();
|
||||
for (uint32_t i = 0 ; i < nbRoutes ; i++)
|
||||
{
|
||||
route = routing->GetRoute (i);
|
||||
std::cout << route.GetDest () << "\t"
|
||||
<< route.GetGateway () << "\t"
|
||||
<< route.GetInterface () << "\t"
|
||||
<< route.GetPrefixToUse () << "\t"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
{
|
||||
route = routing->GetRoute (i);
|
||||
std::cout << route.GetDest () << "\t"
|
||||
<< route.GetGateway () << "\t"
|
||||
<< route.GetInterface () << "\t"
|
||||
<< route.GetPrefixToUse () << "\t"
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
int main (int argc, char** argv)
|
||||
|
||||
@@ -35,9 +35,9 @@ TypeId Ipv6ExtensionDemux::GetTypeId ()
|
||||
static TypeId tid = TypeId ("ns3::Ipv6ExtensionDemux")
|
||||
.SetParent<Object> ()
|
||||
.AddAttribute ("Extensions", "The set of IPv6 extensions registered with this demux.",
|
||||
ObjectVectorValue (),
|
||||
MakeObjectVectorAccessor (&Ipv6ExtensionDemux::m_extensions),
|
||||
MakeObjectVectorChecker<Ipv6Extension> ())
|
||||
ObjectVectorValue (),
|
||||
MakeObjectVectorAccessor (&Ipv6ExtensionDemux::m_extensions),
|
||||
MakeObjectVectorChecker<Ipv6Extension> ())
|
||||
;
|
||||
return tid;
|
||||
}
|
||||
@@ -53,10 +53,10 @@ Ipv6ExtensionDemux::~Ipv6ExtensionDemux ()
|
||||
void Ipv6ExtensionDemux::DoDispose ()
|
||||
{
|
||||
for (Ipv6ExtensionList_t::iterator it = m_extensions.begin (); it != m_extensions.end (); it++)
|
||||
{
|
||||
(*it)->Dispose ();
|
||||
*it = 0;
|
||||
}
|
||||
{
|
||||
(*it)->Dispose ();
|
||||
*it = 0;
|
||||
}
|
||||
m_extensions.clear ();
|
||||
m_node = 0;
|
||||
Object::DoDispose ();
|
||||
@@ -75,12 +75,12 @@ void Ipv6ExtensionDemux::Insert (Ptr<Ipv6Extension> extension)
|
||||
Ptr<Ipv6Extension> Ipv6ExtensionDemux::GetExtension (uint8_t extensionNumber)
|
||||
{
|
||||
for (Ipv6ExtensionList_t::iterator i = m_extensions.begin (); i != m_extensions.end (); ++i)
|
||||
{
|
||||
if ((*i)->GetExtensionNumber () == extensionNumber)
|
||||
{
|
||||
return *i;
|
||||
if ((*i)->GetExtensionNumber () == extensionNumber)
|
||||
{
|
||||
return *i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,66 +37,66 @@ class Node;
|
||||
*/
|
||||
class Ipv6ExtensionDemux : public Object
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief The interface ID.
|
||||
* \return type ID
|
||||
*/
|
||||
static TypeId GetTypeId (void);
|
||||
public:
|
||||
/**
|
||||
* \brief The interface ID.
|
||||
* \return type ID
|
||||
*/
|
||||
static TypeId GetTypeId (void);
|
||||
|
||||
/**
|
||||
* \brief Constructor.
|
||||
*/
|
||||
Ipv6ExtensionDemux ();
|
||||
/**
|
||||
* \brief Constructor.
|
||||
*/
|
||||
Ipv6ExtensionDemux ();
|
||||
|
||||
/**
|
||||
* \brief Destructor.
|
||||
*/
|
||||
virtual ~Ipv6ExtensionDemux ();
|
||||
/**
|
||||
* \brief Destructor.
|
||||
*/
|
||||
virtual ~Ipv6ExtensionDemux ();
|
||||
|
||||
/**
|
||||
* \brief Set the node.
|
||||
* \param node the node to set
|
||||
*/
|
||||
void SetNode (Ptr<Node> node);
|
||||
/**
|
||||
* \brief Set the node.
|
||||
* \param node the node to set
|
||||
*/
|
||||
void SetNode (Ptr<Node> node);
|
||||
|
||||
/**
|
||||
* \brief Insert a new IPv6 Extension.
|
||||
* \param extension the extension to insert
|
||||
*/
|
||||
void Insert (Ptr<Ipv6Extension> extension);
|
||||
/**
|
||||
* \brief Insert a new IPv6 Extension.
|
||||
* \param extension the extension to insert
|
||||
*/
|
||||
void Insert (Ptr<Ipv6Extension> extension);
|
||||
|
||||
/**
|
||||
* \brief Get the extension corresponding to extensionNumber.
|
||||
* \param extensionNumber extension number of the extension to retrieve
|
||||
* \return a matching IPv6 extension
|
||||
*/
|
||||
Ptr<Ipv6Extension> GetExtension (uint8_t extensionNumber);
|
||||
/**
|
||||
* \brief Get the extension corresponding to extensionNumber.
|
||||
* \param extensionNumber extension number of the extension to retrieve
|
||||
* \return a matching IPv6 extension
|
||||
*/
|
||||
Ptr<Ipv6Extension> GetExtension (uint8_t extensionNumber);
|
||||
|
||||
/**
|
||||
* \brief Remove an extension from this demux.
|
||||
* \param extension pointer on the extension to remove
|
||||
*/
|
||||
void Remove (Ptr<Ipv6Extension> extension);
|
||||
/**
|
||||
* \brief Remove an extension from this demux.
|
||||
* \param extension pointer on the extension to remove
|
||||
*/
|
||||
void Remove (Ptr<Ipv6Extension> extension);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* \brief Dispose object.
|
||||
*/
|
||||
virtual void DoDispose ();
|
||||
protected:
|
||||
/**
|
||||
* \brief Dispose object.
|
||||
*/
|
||||
virtual void DoDispose ();
|
||||
|
||||
private:
|
||||
typedef std::list<Ptr<Ipv6Extension> > Ipv6ExtensionList_t;
|
||||
private:
|
||||
typedef std::list<Ptr<Ipv6Extension> > Ipv6ExtensionList_t;
|
||||
|
||||
/**
|
||||
* \brief List of IPv6 Extensions supported.
|
||||
*/
|
||||
Ipv6ExtensionList_t m_extensions;
|
||||
/**
|
||||
* \brief List of IPv6 Extensions supported.
|
||||
*/
|
||||
Ipv6ExtensionList_t m_extensions;
|
||||
|
||||
/**
|
||||
* \brief The node.
|
||||
*/
|
||||
Ptr<Node> m_node;
|
||||
/**
|
||||
* \brief The node.
|
||||
*/
|
||||
Ptr<Node> m_node;
|
||||
};
|
||||
|
||||
} /* namespace ns3 */
|
||||
|
||||
@@ -45,7 +45,7 @@ TypeId Ipv6ExtensionHeader::GetInstanceTypeId () const
|
||||
}
|
||||
|
||||
Ipv6ExtensionHeader::Ipv6ExtensionHeader ()
|
||||
: m_nextHeader (0),
|
||||
: m_nextHeader (0),
|
||||
m_length (0),
|
||||
m_data (0)
|
||||
{
|
||||
@@ -106,13 +106,13 @@ uint32_t Ipv6ExtensionHeader::Deserialize (Buffer::Iterator start)
|
||||
i.Read (data, dataLength);
|
||||
|
||||
if (dataLength > m_data.GetSize ())
|
||||
{
|
||||
m_data.AddAtEnd (dataLength - m_data.GetSize ());
|
||||
}
|
||||
{
|
||||
m_data.AddAtEnd (dataLength - m_data.GetSize ());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_data.RemoveAtEnd (m_data.GetSize () - dataLength);
|
||||
}
|
||||
{
|
||||
m_data.RemoveAtEnd (m_data.GetSize () - dataLength);
|
||||
}
|
||||
|
||||
i = m_data.Begin ();
|
||||
i.Write (data, dataLength);
|
||||
@@ -121,7 +121,7 @@ uint32_t Ipv6ExtensionHeader::Deserialize (Buffer::Iterator start)
|
||||
}
|
||||
|
||||
OptionField::OptionField (uint32_t optionsOffset)
|
||||
: m_optionData (0),
|
||||
: m_optionData (0),
|
||||
m_optionsOffset (optionsOffset)
|
||||
{
|
||||
}
|
||||
@@ -141,13 +141,13 @@ void OptionField::Serialize (Buffer::Iterator start) const
|
||||
uint32_t fill = CalculatePad ((Ipv6OptionHeader::Alignment) {8,0});
|
||||
NS_LOG_LOGIC ("fill with " << fill << " bytes padding");
|
||||
switch (fill)
|
||||
{
|
||||
{
|
||||
case 0: return;
|
||||
case 1: Ipv6OptionPad1Header ().Serialize (start);
|
||||
return;
|
||||
default: Ipv6OptionPadnHeader (fill).Serialize (start);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t OptionField::Deserialize (Buffer::Iterator start, uint32_t length)
|
||||
@@ -167,13 +167,13 @@ void OptionField::AddOption (Ipv6OptionHeader const& option)
|
||||
uint32_t pad = CalculatePad (option.GetAlignment ());
|
||||
NS_LOG_LOGIC ("need " << pad << " bytes padding");
|
||||
switch (pad)
|
||||
{
|
||||
{
|
||||
case 0: break; //no padding needed
|
||||
case 1: AddOption (Ipv6OptionPad1Header ());
|
||||
break;
|
||||
break;
|
||||
default: AddOption (Ipv6OptionPadnHeader (pad));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
m_optionData.AddAtEnd (option.GetSerializedSize ());
|
||||
Buffer::Iterator it = m_optionData.End ();
|
||||
@@ -214,7 +214,7 @@ TypeId Ipv6ExtensionHopByHopHeader::GetInstanceTypeId () const
|
||||
}
|
||||
|
||||
Ipv6ExtensionHopByHopHeader::Ipv6ExtensionHopByHopHeader ()
|
||||
: OptionField (2)
|
||||
: OptionField (2)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -269,7 +269,7 @@ TypeId Ipv6ExtensionDestinationHeader::GetInstanceTypeId () const
|
||||
}
|
||||
|
||||
Ipv6ExtensionDestinationHeader::Ipv6ExtensionDestinationHeader ()
|
||||
: OptionField (2)
|
||||
: OptionField (2)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -325,7 +325,7 @@ TypeId Ipv6ExtensionFragmentHeader::GetInstanceTypeId () const
|
||||
}
|
||||
|
||||
Ipv6ExtensionFragmentHeader::Ipv6ExtensionFragmentHeader ()
|
||||
: m_offset (0),
|
||||
: m_offset (0),
|
||||
m_identification (0)
|
||||
{
|
||||
}
|
||||
@@ -416,7 +416,7 @@ TypeId Ipv6ExtensionRoutingHeader::GetInstanceTypeId () const
|
||||
}
|
||||
|
||||
Ipv6ExtensionRoutingHeader::Ipv6ExtensionRoutingHeader ()
|
||||
: m_typeRouting (0),
|
||||
: m_typeRouting (0),
|
||||
m_segmentsLeft (0)
|
||||
{
|
||||
}
|
||||
@@ -495,7 +495,7 @@ TypeId Ipv6ExtensionLooseRoutingHeader::GetInstanceTypeId () const
|
||||
}
|
||||
|
||||
Ipv6ExtensionLooseRoutingHeader::Ipv6ExtensionLooseRoutingHeader ()
|
||||
: m_routersAddress (0)
|
||||
: m_routersAddress (0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -535,9 +535,9 @@ void Ipv6ExtensionLooseRoutingHeader::Print (std::ostream &os) const
|
||||
<< " typeRouting = " << (uint32_t)GetTypeRouting () << " segmentsLeft = " << (uint32_t)GetSegmentsLeft () << " ";
|
||||
|
||||
for (std::vector<Ipv6Address>::const_iterator it = m_routersAddress.begin (); it != m_routersAddress.end (); it++)
|
||||
{
|
||||
os << *it << " ";
|
||||
}
|
||||
{
|
||||
os << *it << " ";
|
||||
}
|
||||
|
||||
os << " )";
|
||||
}
|
||||
@@ -559,10 +559,10 @@ void Ipv6ExtensionLooseRoutingHeader::Serialize (Buffer::Iterator start) const
|
||||
i.WriteU32 (0);
|
||||
|
||||
for (VectorIpv6Address_t::const_iterator it = m_routersAddress.begin (); it != m_routersAddress.end () ; it++)
|
||||
{
|
||||
it->Serialize (buff);
|
||||
i.Write (buff, 16);
|
||||
}
|
||||
{
|
||||
it->Serialize (buff);
|
||||
i.Write (buff, 16);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t Ipv6ExtensionLooseRoutingHeader::Deserialize (Buffer::Iterator start)
|
||||
@@ -577,10 +577,10 @@ uint32_t Ipv6ExtensionLooseRoutingHeader::Deserialize (Buffer::Iterator start)
|
||||
i.ReadU32 ();
|
||||
|
||||
for (std::vector<Ipv6Address>::iterator it = m_routersAddress.begin (); it != m_routersAddress.end (); it++)
|
||||
{
|
||||
i.Read (buff, 16);
|
||||
it->Set (buff);
|
||||
}
|
||||
{
|
||||
i.Read (buff, 16);
|
||||
it->Set (buff);
|
||||
}
|
||||
|
||||
return GetSerializedSize ();
|
||||
}
|
||||
|
||||
@@ -53,11 +53,11 @@ TypeId Ipv6Extension::GetTypeId ()
|
||||
static TypeId tid = TypeId ("ns3::Ipv6Extension")
|
||||
.SetParent<Object> ()
|
||||
.AddAttribute ("ExtensionNumber", "The IPv6 extension number.",
|
||||
UintegerValue (0),
|
||||
MakeUintegerAccessor (&Ipv6Extension::GetExtensionNumber),
|
||||
MakeUintegerChecker<uint8_t> ())
|
||||
UintegerValue (0),
|
||||
MakeUintegerAccessor (&Ipv6Extension::GetExtensionNumber),
|
||||
MakeUintegerChecker<uint8_t> ())
|
||||
.AddTraceSource ("Drop", "Drop ipv6 packet",
|
||||
MakeTraceSourceAccessor (&Ipv6Extension::m_dropTrace))
|
||||
MakeTraceSourceAccessor (&Ipv6Extension::m_dropTrace))
|
||||
;
|
||||
return tid;
|
||||
}
|
||||
@@ -102,64 +102,64 @@ uint8_t Ipv6Extension::ProcessOptions (Ptr<Packet>& packet, uint8_t offset, uint
|
||||
uint8_t optionLength = 0;
|
||||
|
||||
while (length > processedSize && !isDropped)
|
||||
{
|
||||
optionType = *(data + processedSize);
|
||||
ipv6Option = ipv6OptionDemux->GetOption (optionType);
|
||||
|
||||
if (ipv6Option == 0)
|
||||
{
|
||||
optionType >>= 6;
|
||||
switch (optionType)
|
||||
{
|
||||
case 0:
|
||||
optionLength = *(data + processedSize + 1);
|
||||
break;
|
||||
optionType = *(data + processedSize);
|
||||
ipv6Option = ipv6OptionDemux->GetOption (optionType);
|
||||
|
||||
case 1:
|
||||
NS_LOG_LOGIC ("Unknown Option. Drop!");
|
||||
m_dropTrace (packet);
|
||||
optionLength = 0;
|
||||
isDropped = true;
|
||||
break;
|
||||
if (ipv6Option == 0)
|
||||
{
|
||||
optionType >>= 6;
|
||||
switch (optionType)
|
||||
{
|
||||
case 0:
|
||||
optionLength = *(data + processedSize + 1);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
NS_LOG_LOGIC ("Unknown Option. Drop!");
|
||||
icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
|
||||
m_dropTrace (packet);
|
||||
optionLength = 0;
|
||||
isDropped = true;
|
||||
break;
|
||||
case 1:
|
||||
NS_LOG_LOGIC ("Unknown Option. Drop!");
|
||||
m_dropTrace (packet);
|
||||
optionLength = 0;
|
||||
isDropped = true;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
NS_LOG_LOGIC ("Unknown Option. Drop!");
|
||||
case 2:
|
||||
NS_LOG_LOGIC ("Unknown Option. Drop!");
|
||||
icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
|
||||
m_dropTrace (packet);
|
||||
optionLength = 0;
|
||||
isDropped = true;
|
||||
break;
|
||||
|
||||
if (!ipv6Header.GetDestinationAddress ().IsMulticast ())
|
||||
{
|
||||
icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
|
||||
m_dropTrace (packet);
|
||||
optionLength = 0;
|
||||
isDropped = true;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
NS_LOG_LOGIC ("Unknown Option. Drop!");
|
||||
|
||||
m_dropTrace (packet);
|
||||
optionLength = 0;
|
||||
isDropped = true;
|
||||
break;
|
||||
if (!ipv6Header.GetDestinationAddress ().IsMulticast ())
|
||||
{
|
||||
icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
|
||||
m_dropTrace (packet);
|
||||
optionLength = 0;
|
||||
isDropped = true;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
m_dropTrace (packet);
|
||||
optionLength = 0;
|
||||
isDropped = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
optionLength = ipv6Option->Process (packet, offset + processedSize, ipv6Header, isDropped);
|
||||
}
|
||||
|
||||
processedSize += optionLength;
|
||||
p->RemoveAtStart (optionLength);
|
||||
}
|
||||
else
|
||||
{
|
||||
optionLength = ipv6Option->Process (packet, offset + processedSize, ipv6Header, isDropped);
|
||||
}
|
||||
|
||||
processedSize += optionLength;
|
||||
p->RemoveAtStart (optionLength);
|
||||
}
|
||||
|
||||
return processedSize;
|
||||
}
|
||||
@@ -203,9 +203,9 @@ uint8_t Ipv6ExtensionHopByHop::Process (Ptr<Packet>& packet, uint8_t offset, Ipv
|
||||
Ipv6ExtensionHopByHopHeader hopbyhopHeader;
|
||||
p->RemoveHeader (hopbyhopHeader);
|
||||
if (nextHeader)
|
||||
{
|
||||
*nextHeader = hopbyhopHeader.GetNextHeader ();
|
||||
}
|
||||
{
|
||||
*nextHeader = hopbyhopHeader.GetNextHeader ();
|
||||
}
|
||||
|
||||
uint8_t processedSize = hopbyhopHeader.GetOptionsOffset ();
|
||||
offset += processedSize;
|
||||
@@ -255,9 +255,9 @@ uint8_t Ipv6ExtensionDestination::Process (Ptr<Packet>& packet, uint8_t offset,
|
||||
Ipv6ExtensionDestinationHeader destinationHeader;
|
||||
p->RemoveHeader (destinationHeader);
|
||||
if (nextHeader)
|
||||
{
|
||||
*nextHeader = destinationHeader.GetNextHeader ();
|
||||
}
|
||||
{
|
||||
*nextHeader = destinationHeader.GetNextHeader ();
|
||||
}
|
||||
|
||||
uint8_t processedSize = destinationHeader.GetOptionsOffset ();
|
||||
offset += processedSize;
|
||||
@@ -295,9 +295,9 @@ void Ipv6ExtensionFragment::DoDispose ()
|
||||
NS_LOG_FUNCTION_NOARGS ();
|
||||
|
||||
for (MapFragments_t::iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
|
||||
{
|
||||
it->second = 0;
|
||||
}
|
||||
{
|
||||
it->second = 0;
|
||||
}
|
||||
|
||||
m_fragments.clear ();
|
||||
Ipv6Extension::DoDispose ();
|
||||
@@ -321,9 +321,9 @@ uint8_t Ipv6ExtensionFragment::Process (Ptr<Packet>& packet, uint8_t offset, Ipv
|
||||
p->RemoveHeader (fragmentHeader);
|
||||
|
||||
if (nextHeader)
|
||||
{
|
||||
*nextHeader = fragmentHeader.GetNextHeader ();
|
||||
}
|
||||
{
|
||||
*nextHeader = fragmentHeader.GetNextHeader ();
|
||||
}
|
||||
|
||||
bool moreFragment = fragmentHeader.GetMoreFragment ();
|
||||
uint16_t fragmentOffset = fragmentHeader.GetOffset ();
|
||||
@@ -335,35 +335,35 @@ uint8_t Ipv6ExtensionFragment::Process (Ptr<Packet>& packet, uint8_t offset, Ipv
|
||||
|
||||
MapFragments_t::iterator it = m_fragments.find (fragmentsId);
|
||||
if (it == m_fragments.end ())
|
||||
{
|
||||
fragments = Create<Fragments> ();
|
||||
m_fragments.insert (std::make_pair (fragmentsId, fragments));
|
||||
}
|
||||
{
|
||||
fragments = Create<Fragments> ();
|
||||
m_fragments.insert (std::make_pair (fragmentsId, fragments));
|
||||
}
|
||||
else
|
||||
{
|
||||
fragments = it->second;
|
||||
}
|
||||
{
|
||||
fragments = it->second;
|
||||
}
|
||||
|
||||
if (fragmentOffset == 0)
|
||||
{
|
||||
Ptr<Packet> unfragmentablePart = packet->Copy ();
|
||||
unfragmentablePart->RemoveAtEnd (packet->GetSize () - offset);
|
||||
fragments->SetUnfragmentablePart (unfragmentablePart);
|
||||
}
|
||||
{
|
||||
Ptr<Packet> unfragmentablePart = packet->Copy ();
|
||||
unfragmentablePart->RemoveAtEnd (packet->GetSize () - offset);
|
||||
fragments->SetUnfragmentablePart (unfragmentablePart);
|
||||
}
|
||||
|
||||
fragments->AddFragment (p, fragmentOffset, moreFragment);
|
||||
|
||||
if (fragments->IsEntire ())
|
||||
{
|
||||
packet = fragments->GetPacket ();
|
||||
isDropped = false;
|
||||
}
|
||||
{
|
||||
packet = fragments->GetPacket ();
|
||||
isDropped = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_LOGIC ("Fragment. Drop!");
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
}
|
||||
{
|
||||
NS_LOG_LOGIC ("Fragment. Drop!");
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -381,10 +381,10 @@ void Ipv6ExtensionFragment::GetFragments (Ptr<Packet> packet, uint32_t maxFragme
|
||||
bool moreHeader = true;
|
||||
if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING
|
||||
|| (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING)))
|
||||
{
|
||||
moreHeader = false;
|
||||
ipv6Header.SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION);
|
||||
}
|
||||
{
|
||||
moreHeader = false;
|
||||
ipv6Header.SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION);
|
||||
}
|
||||
|
||||
std::list<std::pair<Ipv6ExtensionHeader *, uint8_t> > unfragmentablePart;
|
||||
uint32_t unfragmentablePartSize = 0;
|
||||
@@ -394,64 +394,64 @@ void Ipv6ExtensionFragment::GetFragments (Ptr<Packet> packet, uint32_t maxFragme
|
||||
uint8_t extensionHeaderLength;
|
||||
|
||||
while (moreHeader)
|
||||
{
|
||||
if (nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP)
|
||||
{
|
||||
Ipv6ExtensionHopByHopHeader *hopbyhopHeader = new Ipv6ExtensionHopByHopHeader ();
|
||||
p->RemoveHeader (*hopbyhopHeader);
|
||||
if (nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP)
|
||||
{
|
||||
Ipv6ExtensionHopByHopHeader *hopbyhopHeader = new Ipv6ExtensionHopByHopHeader ();
|
||||
p->RemoveHeader (*hopbyhopHeader);
|
||||
|
||||
nextHeader = hopbyhopHeader->GetNextHeader ();
|
||||
extensionHeaderLength = hopbyhopHeader->GetLength ();
|
||||
nextHeader = hopbyhopHeader->GetNextHeader ();
|
||||
extensionHeaderLength = hopbyhopHeader->GetLength ();
|
||||
|
||||
if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING
|
||||
|| (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING)))
|
||||
{
|
||||
moreHeader = false;
|
||||
hopbyhopHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION);
|
||||
}
|
||||
if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING
|
||||
|| (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING)))
|
||||
{
|
||||
moreHeader = false;
|
||||
hopbyhopHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION);
|
||||
}
|
||||
|
||||
unfragmentablePart.push_back (std::make_pair<Ipv6ExtensionHeader *, uint8_t> (hopbyhopHeader, Ipv6Header::IPV6_EXT_HOP_BY_HOP));
|
||||
unfragmentablePartSize += extensionHeaderLength;
|
||||
unfragmentablePart.push_back (std::make_pair<Ipv6ExtensionHeader *, uint8_t> (hopbyhopHeader, Ipv6Header::IPV6_EXT_HOP_BY_HOP));
|
||||
unfragmentablePartSize += extensionHeaderLength;
|
||||
}
|
||||
else if (nextHeader == Ipv6Header::IPV6_EXT_ROUTING)
|
||||
{
|
||||
uint8_t numberAddress = (*(p->PeekData () + 1)) / 2;
|
||||
Ipv6ExtensionLooseRoutingHeader *routingHeader = new Ipv6ExtensionLooseRoutingHeader ();
|
||||
routingHeader->SetNumberAddress (numberAddress);
|
||||
p->RemoveHeader (*routingHeader);
|
||||
|
||||
nextHeader = routingHeader->GetNextHeader ();
|
||||
extensionHeaderLength = routingHeader->GetLength ();
|
||||
|
||||
if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING
|
||||
|| (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING)))
|
||||
{
|
||||
moreHeader = false;
|
||||
routingHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION);
|
||||
}
|
||||
|
||||
unfragmentablePart.push_back (std::make_pair<Ipv6ExtensionHeader *, uint8_t> (routingHeader, Ipv6Header::IPV6_EXT_ROUTING));
|
||||
unfragmentablePartSize += extensionHeaderLength;
|
||||
}
|
||||
else if (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION)
|
||||
{
|
||||
Ipv6ExtensionDestinationHeader *destinationHeader = new Ipv6ExtensionDestinationHeader ();
|
||||
p->RemoveHeader (*destinationHeader);
|
||||
|
||||
nextHeader = destinationHeader->GetNextHeader ();
|
||||
extensionHeaderLength = destinationHeader->GetLength ();
|
||||
|
||||
if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING
|
||||
|| (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING)))
|
||||
{
|
||||
moreHeader = false;
|
||||
destinationHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION);
|
||||
}
|
||||
|
||||
unfragmentablePart.push_back (std::make_pair<Ipv6ExtensionHeader *, uint8_t> (destinationHeader, Ipv6Header::IPV6_EXT_DESTINATION));
|
||||
unfragmentablePartSize += extensionHeaderLength;
|
||||
}
|
||||
}
|
||||
else if (nextHeader == Ipv6Header::IPV6_EXT_ROUTING)
|
||||
{
|
||||
uint8_t numberAddress = (*(p->PeekData () + 1)) / 2;
|
||||
Ipv6ExtensionLooseRoutingHeader *routingHeader = new Ipv6ExtensionLooseRoutingHeader ();
|
||||
routingHeader->SetNumberAddress (numberAddress);
|
||||
p->RemoveHeader (*routingHeader);
|
||||
|
||||
nextHeader = routingHeader->GetNextHeader ();
|
||||
extensionHeaderLength = routingHeader->GetLength ();
|
||||
|
||||
if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING
|
||||
|| (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING)))
|
||||
{
|
||||
moreHeader = false;
|
||||
routingHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION);
|
||||
}
|
||||
|
||||
unfragmentablePart.push_back (std::make_pair<Ipv6ExtensionHeader *, uint8_t> (routingHeader, Ipv6Header::IPV6_EXT_ROUTING));
|
||||
unfragmentablePartSize += extensionHeaderLength;
|
||||
}
|
||||
else if (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION)
|
||||
{
|
||||
Ipv6ExtensionDestinationHeader *destinationHeader = new Ipv6ExtensionDestinationHeader ();
|
||||
p->RemoveHeader (*destinationHeader);
|
||||
|
||||
nextHeader = destinationHeader->GetNextHeader ();
|
||||
extensionHeaderLength = destinationHeader->GetLength ();
|
||||
|
||||
if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING
|
||||
|| (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING)))
|
||||
{
|
||||
moreHeader = false;
|
||||
destinationHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION);
|
||||
}
|
||||
|
||||
unfragmentablePart.push_back (std::make_pair<Ipv6ExtensionHeader *, uint8_t> (destinationHeader, Ipv6Header::IPV6_EXT_DESTINATION));
|
||||
unfragmentablePartSize += extensionHeaderLength;
|
||||
}
|
||||
}
|
||||
|
||||
Ipv6ExtensionFragmentHeader fragmentHeader;
|
||||
uint8_t fragmentHeaderSize = fragmentHeader.GetSerializedSize ();
|
||||
@@ -465,65 +465,65 @@ void Ipv6ExtensionFragment::GetFragments (Ptr<Packet> packet, uint32_t maxFragme
|
||||
uint16_t offset = 0;
|
||||
|
||||
do
|
||||
{
|
||||
if (p->GetSize () > offset + maxFragmentablePartSize)
|
||||
{
|
||||
moreFragment = true;
|
||||
currentFragmentablePartSize = maxFragmentablePartSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
moreFragment = false;
|
||||
currentFragmentablePartSize = p->GetSize () - offset;
|
||||
}
|
||||
if (p->GetSize () > offset + maxFragmentablePartSize)
|
||||
{
|
||||
moreFragment = true;
|
||||
currentFragmentablePartSize = maxFragmentablePartSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
moreFragment = false;
|
||||
currentFragmentablePartSize = p->GetSize () - offset;
|
||||
}
|
||||
|
||||
currentFragmentablePartSize -= currentFragmentablePartSize % 8;
|
||||
currentFragmentablePartSize -= currentFragmentablePartSize % 8;
|
||||
|
||||
fragmentHeader.SetNextHeader (nextHeader);
|
||||
fragmentHeader.SetLength (currentFragmentablePartSize);
|
||||
fragmentHeader.SetOffset (offset);
|
||||
fragmentHeader.SetMoreFragment (moreFragment);
|
||||
fragmentHeader.SetIdentification (identification);
|
||||
fragmentHeader.SetNextHeader (nextHeader);
|
||||
fragmentHeader.SetLength (currentFragmentablePartSize);
|
||||
fragmentHeader.SetOffset (offset);
|
||||
fragmentHeader.SetMoreFragment (moreFragment);
|
||||
fragmentHeader.SetIdentification (identification);
|
||||
|
||||
Ptr<Packet> fragment = p->CreateFragment (offset, currentFragmentablePartSize);
|
||||
offset += currentFragmentablePartSize;
|
||||
Ptr<Packet> fragment = p->CreateFragment (offset, currentFragmentablePartSize);
|
||||
offset += currentFragmentablePartSize;
|
||||
|
||||
fragment->AddHeader (fragmentHeader);
|
||||
fragment->AddHeader (fragmentHeader);
|
||||
|
||||
for (std::list<std::pair<Ipv6ExtensionHeader *, uint8_t> >::iterator it = unfragmentablePart.begin (); it != unfragmentablePart.end (); it++)
|
||||
{
|
||||
if (it->second == Ipv6Header::IPV6_EXT_HOP_BY_HOP)
|
||||
{
|
||||
fragment->AddHeader (*dynamic_cast<Ipv6ExtensionHopByHopHeader *>(it->first));
|
||||
}
|
||||
else if (it->second == Ipv6Header::IPV6_EXT_ROUTING)
|
||||
{
|
||||
fragment->AddHeader (*dynamic_cast<Ipv6ExtensionLooseRoutingHeader *>(it->first));
|
||||
}
|
||||
else if (it->second == Ipv6Header::IPV6_EXT_DESTINATION)
|
||||
{
|
||||
fragment->AddHeader (*dynamic_cast<Ipv6ExtensionDestinationHeader *>(it->first));
|
||||
}
|
||||
}
|
||||
for (std::list<std::pair<Ipv6ExtensionHeader *, uint8_t> >::iterator it = unfragmentablePart.begin (); it != unfragmentablePart.end (); it++)
|
||||
{
|
||||
if (it->second == Ipv6Header::IPV6_EXT_HOP_BY_HOP)
|
||||
{
|
||||
fragment->AddHeader (*dynamic_cast<Ipv6ExtensionHopByHopHeader *>(it->first));
|
||||
}
|
||||
else if (it->second == Ipv6Header::IPV6_EXT_ROUTING)
|
||||
{
|
||||
fragment->AddHeader (*dynamic_cast<Ipv6ExtensionLooseRoutingHeader *>(it->first));
|
||||
}
|
||||
else if (it->second == Ipv6Header::IPV6_EXT_DESTINATION)
|
||||
{
|
||||
fragment->AddHeader (*dynamic_cast<Ipv6ExtensionDestinationHeader *>(it->first));
|
||||
}
|
||||
}
|
||||
|
||||
ipv6Header.SetPayloadLength (fragment->GetSize ());
|
||||
fragment->AddHeader (ipv6Header);
|
||||
ipv6Header.SetPayloadLength (fragment->GetSize ());
|
||||
fragment->AddHeader (ipv6Header);
|
||||
|
||||
std::ostringstream oss;
|
||||
fragment->Print (oss);
|
||||
listFragments.push_back (fragment);
|
||||
} while (moreFragment);
|
||||
std::ostringstream oss;
|
||||
fragment->Print (oss);
|
||||
listFragments.push_back (fragment);
|
||||
} while (moreFragment);
|
||||
|
||||
for (std::list<std::pair<Ipv6ExtensionHeader *, uint8_t> >::iterator it = unfragmentablePart.begin (); it != unfragmentablePart.end (); it++)
|
||||
{
|
||||
delete it->first;
|
||||
}
|
||||
{
|
||||
delete it->first;
|
||||
}
|
||||
|
||||
unfragmentablePart.clear ();
|
||||
}
|
||||
|
||||
Ipv6ExtensionFragment::Fragments::Fragments ()
|
||||
: m_moreFragment (0)
|
||||
: m_moreFragment (0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -536,17 +536,17 @@ void Ipv6ExtensionFragment::Fragments::AddFragment (Ptr<Packet> fragment, uint16
|
||||
std::list<std::pair<Ptr<Packet>, uint16_t> >::iterator it;
|
||||
|
||||
for (it = m_fragments.begin (); it != m_fragments.end (); it++)
|
||||
{
|
||||
if (it->second > fragmentOffset)
|
||||
{
|
||||
break;
|
||||
if (it->second > fragmentOffset)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (it == m_fragments.end ())
|
||||
{
|
||||
m_moreFragment = moreFragment;
|
||||
}
|
||||
{
|
||||
m_moreFragment = moreFragment;
|
||||
}
|
||||
|
||||
m_fragments.insert (it, std::make_pair<Ptr<Packet>, uint16_t> (fragment, fragmentOffset));
|
||||
}
|
||||
@@ -561,20 +561,20 @@ bool Ipv6ExtensionFragment::Fragments::IsEntire () const
|
||||
bool ret = !m_moreFragment && m_fragments.size () > 0;
|
||||
|
||||
if (ret)
|
||||
{
|
||||
uint16_t lastEndOffset = 0;
|
||||
|
||||
for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
|
||||
{
|
||||
if (lastEndOffset != it->second)
|
||||
{
|
||||
ret = false;
|
||||
break;
|
||||
}
|
||||
uint16_t lastEndOffset = 0;
|
||||
|
||||
lastEndOffset += it->first->GetSize ();
|
||||
for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
|
||||
{
|
||||
if (lastEndOffset != it->second)
|
||||
{
|
||||
ret = false;
|
||||
break;
|
||||
}
|
||||
|
||||
lastEndOffset += it->first->GetSize ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -584,9 +584,9 @@ Ptr<Packet> Ipv6ExtensionFragment::Fragments::GetPacket () const
|
||||
Ptr<Packet> p = m_unfragmentable->Copy ();
|
||||
|
||||
for (std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it = m_fragments.begin (); it != m_fragments.end (); it++)
|
||||
{
|
||||
p->AddAtEnd (it->first);
|
||||
}
|
||||
{
|
||||
p->AddAtEnd (it->first);
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
@@ -645,9 +645,9 @@ uint8_t Ipv6ExtensionRouting::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6
|
||||
uint8_t routingSegmentsLeft = *(buff+3);
|
||||
|
||||
if (nextHeader)
|
||||
{
|
||||
*nextHeader = routingNextHeader;
|
||||
}
|
||||
{
|
||||
*nextHeader = routingNextHeader;
|
||||
}
|
||||
|
||||
Ptr<Icmpv6L4Protocol> icmpv6 = GetNode ()->GetObject<Ipv6L3Protocol> ()->GetIcmpv6 ();
|
||||
|
||||
@@ -655,22 +655,22 @@ uint8_t Ipv6ExtensionRouting::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6
|
||||
Ptr<Ipv6ExtensionRouting> ipv6ExtensionRouting = ipv6ExtensionRoutingDemux->GetExtensionRouting (routingTypeRouting);
|
||||
|
||||
if (ipv6ExtensionRouting == 0)
|
||||
{
|
||||
if (routingSegmentsLeft == 0)
|
||||
{
|
||||
isDropped = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_LOGIC ("Malformed header. Drop!");
|
||||
if (routingSegmentsLeft == 0)
|
||||
{
|
||||
isDropped = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_LOGIC ("Malformed header. Drop!");
|
||||
|
||||
icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1);
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
}
|
||||
icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1);
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
}
|
||||
|
||||
return routingLength;
|
||||
}
|
||||
return routingLength;
|
||||
}
|
||||
|
||||
return ipv6ExtensionRouting->Process (packet, offset, ipv6Header, dst, (uint8_t *)0, isDropped);
|
||||
}
|
||||
@@ -683,9 +683,9 @@ TypeId Ipv6ExtensionRoutingDemux::GetTypeId ()
|
||||
static TypeId tid = TypeId ("ns3::Ipv6ExtensionRoutingDemux")
|
||||
.SetParent<Object> ()
|
||||
.AddAttribute ("Routing Extensions", "The set of IPv6 Routing extensions registered with this demux.",
|
||||
ObjectVectorValue (),
|
||||
MakeObjectVectorAccessor (&Ipv6ExtensionRoutingDemux::m_extensionsRouting),
|
||||
MakeObjectVectorChecker<Ipv6ExtensionRouting> ())
|
||||
ObjectVectorValue (),
|
||||
MakeObjectVectorAccessor (&Ipv6ExtensionRoutingDemux::m_extensionsRouting),
|
||||
MakeObjectVectorChecker<Ipv6ExtensionRouting> ())
|
||||
;
|
||||
return tid;
|
||||
}
|
||||
@@ -701,10 +701,10 @@ Ipv6ExtensionRoutingDemux::~Ipv6ExtensionRoutingDemux ()
|
||||
void Ipv6ExtensionRoutingDemux::DoDispose ()
|
||||
{
|
||||
for (Ipv6ExtensionRoutingList_t::iterator it = m_extensionsRouting.begin (); it != m_extensionsRouting.end (); it++)
|
||||
{
|
||||
(*it)->Dispose ();
|
||||
*it = 0;
|
||||
}
|
||||
{
|
||||
(*it)->Dispose ();
|
||||
*it = 0;
|
||||
}
|
||||
m_extensionsRouting.clear ();
|
||||
m_node = 0;
|
||||
Object::DoDispose ();
|
||||
@@ -723,12 +723,12 @@ void Ipv6ExtensionRoutingDemux::Insert (Ptr<Ipv6ExtensionRouting> extensionRouti
|
||||
Ptr<Ipv6ExtensionRouting> Ipv6ExtensionRoutingDemux::GetExtensionRouting (uint8_t typeRouting)
|
||||
{
|
||||
for (Ipv6ExtensionRoutingList_t::iterator i = m_extensionsRouting.begin (); i != m_extensionsRouting.end (); i++)
|
||||
{
|
||||
if ((*i)->GetTypeRouting () == typeRouting)
|
||||
{
|
||||
return *i;
|
||||
if ((*i)->GetTypeRouting () == typeRouting)
|
||||
{
|
||||
return *i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -792,9 +792,9 @@ uint8_t Ipv6ExtensionLooseRouting::Process (Ptr<Packet>& packet, uint8_t offset,
|
||||
p->RemoveHeader (routingHeader);
|
||||
|
||||
if (nextHeader)
|
||||
{
|
||||
*nextHeader = routingHeader.GetNextHeader ();
|
||||
}
|
||||
{
|
||||
*nextHeader = routingHeader.GetNextHeader ();
|
||||
}
|
||||
|
||||
Ptr<Icmpv6L4Protocol> icmpv6 = GetNode ()->GetObject<Ipv6L3Protocol> ()->GetIcmpv6 ();
|
||||
|
||||
@@ -808,51 +808,51 @@ uint8_t Ipv6ExtensionLooseRouting::Process (Ptr<Packet>& packet, uint8_t offset,
|
||||
Ipv6Address nextAddress;
|
||||
|
||||
if (segmentsLeft == 0)
|
||||
{
|
||||
isDropped = false;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
{
|
||||
isDropped = false;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
|
||||
if (length % 2 != 0)
|
||||
{
|
||||
NS_LOG_LOGIC ("Malformed header. Drop!");
|
||||
icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1);
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
{
|
||||
NS_LOG_LOGIC ("Malformed header. Drop!");
|
||||
icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1);
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
|
||||
if (segmentsLeft > nbAddress)
|
||||
{
|
||||
NS_LOG_LOGIC ("Malformed header. Drop!");
|
||||
icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 3);
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
{
|
||||
NS_LOG_LOGIC ("Malformed header. Drop!");
|
||||
icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 3);
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
|
||||
routingHeader.SetSegmentsLeft (segmentsLeft - 1);
|
||||
nextAddressIndex = nbAddress - segmentsLeft;
|
||||
nextAddress = routingHeader.GetRouterAddress (nextAddressIndex);
|
||||
|
||||
if (nextAddress.IsMulticast () || destAddress.IsMulticast ())
|
||||
{
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
{
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
|
||||
routingHeader.SetRouterAddress (nextAddressIndex, destAddress);
|
||||
ipv6header.SetDestinationAddress (nextAddress);
|
||||
|
||||
if (hopLimit <= 1)
|
||||
{
|
||||
NS_LOG_LOGIC ("Time Exceeded : Hop Limit <= 1. Drop!");
|
||||
icmpv6->SendErrorTimeExceeded (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_HOPLIMIT);
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
{
|
||||
NS_LOG_LOGIC ("Time Exceeded : Hop Limit <= 1. Drop!");
|
||||
icmpv6->SendErrorTimeExceeded (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_HOPLIMIT);
|
||||
m_dropTrace (packet);
|
||||
isDropped = true;
|
||||
return routingHeader.GetSerializedSize ();
|
||||
}
|
||||
|
||||
routingHeader.SetLength (88);
|
||||
ipv6header.SetHopLimit (hopLimit - 1);
|
||||
@@ -873,14 +873,14 @@ uint8_t Ipv6ExtensionLooseRouting::Process (Ptr<Packet>& packet, uint8_t offset,
|
||||
Ptr<Ipv6Route> rtentry = ipv6rp->RouteOutput (p, ipv6header, 0, err);
|
||||
|
||||
if (rtentry)
|
||||
{
|
||||
/* we know a route exists so send packet now */
|
||||
ipv6->SendRealOut (rtentry, p, ipv6header);
|
||||
}
|
||||
{
|
||||
/* we know a route exists so send packet now */
|
||||
ipv6->SendRealOut (rtentry, p, ipv6header);
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_LOG_INFO ("No route for next router");
|
||||
}
|
||||
{
|
||||
NS_LOG_INFO ("No route for next router");
|
||||
}
|
||||
|
||||
/* as we directly send packet, mark it as dropped */
|
||||
isDropped = true;
|
||||
|
||||
@@ -35,9 +35,9 @@ TypeId Ipv6OptionDemux::GetTypeId ()
|
||||
static TypeId tid = TypeId ("ns3::Ipv6OptionDemux")
|
||||
.SetParent<Object> ()
|
||||
.AddAttribute ("Options", "The set of IPv6 options registered with this demux.",
|
||||
ObjectVectorValue (),
|
||||
MakeObjectVectorAccessor (&Ipv6OptionDemux::m_options),
|
||||
MakeObjectVectorChecker<Ipv6Option> ())
|
||||
ObjectVectorValue (),
|
||||
MakeObjectVectorAccessor (&Ipv6OptionDemux::m_options),
|
||||
MakeObjectVectorChecker<Ipv6Option> ())
|
||||
;
|
||||
return tid;
|
||||
}
|
||||
@@ -53,10 +53,10 @@ Ipv6OptionDemux::~Ipv6OptionDemux ()
|
||||
void Ipv6OptionDemux::DoDispose ()
|
||||
{
|
||||
for (Ipv6OptionList_t::iterator it = m_options.begin (); it != m_options.end (); it++)
|
||||
{
|
||||
(*it)->Dispose ();
|
||||
*it = 0;
|
||||
}
|
||||
{
|
||||
(*it)->Dispose ();
|
||||
*it = 0;
|
||||
}
|
||||
m_options.clear ();
|
||||
m_node = 0;
|
||||
Object::DoDispose ();
|
||||
@@ -75,12 +75,12 @@ void Ipv6OptionDemux::Insert (Ptr<Ipv6Option> option)
|
||||
Ptr<Ipv6Option> Ipv6OptionDemux::GetOption (int optionNumber)
|
||||
{
|
||||
for (Ipv6OptionList_t::iterator i = m_options.begin (); i != m_options.end (); ++i)
|
||||
{
|
||||
if ((*i)->GetOptionNumber () == optionNumber)
|
||||
{
|
||||
return *i;
|
||||
if ((*i)->GetOptionNumber () == optionNumber)
|
||||
{
|
||||
return *i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,66 +37,66 @@ class Node;
|
||||
*/
|
||||
class Ipv6OptionDemux : public Object
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* \brief The interface ID.
|
||||
* \return type ID
|
||||
*/
|
||||
static TypeId GetTypeId (void);
|
||||
public:
|
||||
/**
|
||||
* \brief The interface ID.
|
||||
* \return type ID
|
||||
*/
|
||||
static TypeId GetTypeId (void);
|
||||
|
||||
/**
|
||||
* \brief Constructor.
|
||||
*/
|
||||
Ipv6OptionDemux ();
|
||||
/**
|
||||
* \brief Constructor.
|
||||
*/
|
||||
Ipv6OptionDemux ();
|
||||
|
||||
/**
|
||||
* \brief Destructor.
|
||||
*/
|
||||
virtual ~Ipv6OptionDemux ();
|
||||
/**
|
||||
* \brief Destructor.
|
||||
*/
|
||||
virtual ~Ipv6OptionDemux ();
|
||||
|
||||
/**
|
||||
* \brief Set the node.
|
||||
* \param node the node to set
|
||||
*/
|
||||
void SetNode (Ptr<Node> node);
|
||||
/**
|
||||
* \brief Set the node.
|
||||
* \param node the node to set
|
||||
*/
|
||||
void SetNode (Ptr<Node> node);
|
||||
|
||||
/**
|
||||
* \brief Insert a new IPv6 Option.
|
||||
* \param option the option to insert
|
||||
*/
|
||||
void Insert (Ptr<Ipv6Option> option);
|
||||
/**
|
||||
* \brief Insert a new IPv6 Option.
|
||||
* \param option the option to insert
|
||||
*/
|
||||
void Insert (Ptr<Ipv6Option> option);
|
||||
|
||||
/**
|
||||
* \brief Get the option corresponding to optionNumber.
|
||||
* \param optionNumber the option number of the option to retrieve
|
||||
* \return a matching IPv6 option
|
||||
*/
|
||||
Ptr<Ipv6Option> GetOption (int optionNumber);
|
||||
/**
|
||||
* \brief Get the option corresponding to optionNumber.
|
||||
* \param optionNumber the option number of the option to retrieve
|
||||
* \return a matching IPv6 option
|
||||
*/
|
||||
Ptr<Ipv6Option> GetOption (int optionNumber);
|
||||
|
||||
/**
|
||||
* \brief Remove an option from this demux.
|
||||
* \param option pointer on the option to remove
|
||||
*/
|
||||
void Remove (Ptr<Ipv6Option> option);
|
||||
/**
|
||||
* \brief Remove an option from this demux.
|
||||
* \param option pointer on the option to remove
|
||||
*/
|
||||
void Remove (Ptr<Ipv6Option> option);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* \brief Dispose this object.
|
||||
*/
|
||||
virtual void DoDispose();
|
||||
protected:
|
||||
/**
|
||||
* \brief Dispose this object.
|
||||
*/
|
||||
virtual void DoDispose();
|
||||
|
||||
private:
|
||||
typedef std::list<Ptr<Ipv6Option> > Ipv6OptionList_t;
|
||||
private:
|
||||
typedef std::list<Ptr<Ipv6Option> > Ipv6OptionList_t;
|
||||
|
||||
/**
|
||||
* \brief List of IPv6 Options supported.
|
||||
*/
|
||||
Ipv6OptionList_t m_options;
|
||||
/**
|
||||
* \brief List of IPv6 Options supported.
|
||||
*/
|
||||
Ipv6OptionList_t m_options;
|
||||
|
||||
/**
|
||||
* \brief The node.
|
||||
*/
|
||||
Ptr<Node> m_node;
|
||||
/**
|
||||
* \brief The node.
|
||||
*/
|
||||
Ptr<Node> m_node;
|
||||
};
|
||||
|
||||
} /* namespace ns3 */
|
||||
|
||||
@@ -45,7 +45,7 @@ TypeId Ipv6OptionHeader::GetInstanceTypeId () const
|
||||
}
|
||||
|
||||
Ipv6OptionHeader::Ipv6OptionHeader ()
|
||||
: m_type (0),
|
||||
: m_type (0),
|
||||
m_length (0)
|
||||
{
|
||||
}
|
||||
@@ -212,9 +212,9 @@ void Ipv6OptionPadnHeader::Serialize (Buffer::Iterator start) const
|
||||
i.WriteU8 (GetLength ());
|
||||
|
||||
for (int padding = 0; padding < GetLength (); padding++)
|
||||
{
|
||||
i.WriteU8 (0);
|
||||
}
|
||||
{
|
||||
i.WriteU8 (0);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t Ipv6OptionPadnHeader::Deserialize (Buffer::Iterator start)
|
||||
@@ -315,7 +315,7 @@ TypeId Ipv6OptionRouterAlertHeader::GetInstanceTypeId () const
|
||||
}
|
||||
|
||||
Ipv6OptionRouterAlertHeader::Ipv6OptionRouterAlertHeader ()
|
||||
: m_value (0)
|
||||
: m_value (0)
|
||||
{
|
||||
SetLength (2);
|
||||
}
|
||||
|
||||
@@ -36,9 +36,9 @@ TypeId Ipv6Option::GetTypeId ()
|
||||
static TypeId tid = TypeId ("ns3::Ipv6Option")
|
||||
.SetParent<Object> ()
|
||||
.AddAttribute ("OptionNumber", "The IPv6 option number.",
|
||||
UintegerValue (0),
|
||||
MakeUintegerAccessor (&Ipv6Option::GetOptionNumber),
|
||||
MakeUintegerChecker<uint8_t> ())
|
||||
UintegerValue (0),
|
||||
MakeUintegerAccessor (&Ipv6Option::GetOptionNumber),
|
||||
MakeUintegerChecker<uint8_t> ())
|
||||
;
|
||||
return tid;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user