--- a/src/internet/model/ipv6-extension.cc Mon Mar 17 19:34:43 2014 +0100
+++ b/src/internet/model/ipv6-extension.cc Mon Mar 17 19:43:11 2014 +0100
@@ -54,8 +54,6 @@
UintegerValue (0),
MakeUintegerAccessor (&Ipv6Extension::GetExtensionNumber),
MakeUintegerChecker<uint8_t> ())
- .AddTraceSource ("Drop", "Drop IPv6 packet",
- MakeTraceSourceAccessor (&Ipv6Extension::m_dropTrace))
;
return tid;
}
@@ -86,7 +84,15 @@
return m_node;
}
-uint8_t Ipv6Extension::ProcessOptions (Ptr<Packet>& packet, uint8_t offset, uint8_t length, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped)
+uint8_t Ipv6Extension::ProcessOptions (Ptr<Packet>& packet,
+ uint8_t offset,
+ uint8_t length,
+ Ipv6Header const& ipv6Header,
+ Ipv6Address dst,
+ uint8_t *nextHeader,
+ bool& stopProcessing,
+ bool& isDropped,
+ Ipv6L3Protocol::DropReason& dropReason)
{
NS_LOG_FUNCTION (this << packet << offset << length << ipv6Header << dst << nextHeader << isDropped);
@@ -125,17 +131,19 @@
case 1:
NS_LOG_LOGIC ("Unknown Option. Drop!");
- m_dropTrace (packet);
optionLength = 0;
isDropped = true;
+ stopProcessing = true;
+ dropReason = Ipv6L3Protocol::DROP_UNKNOWN_OPTION;
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;
+ stopProcessing = true;
+ dropReason = Ipv6L3Protocol::DROP_UNKNOWN_OPTION;
break;
case 3:
@@ -144,15 +152,11 @@
if (!ipv6Header.GetDestinationAddress ().IsMulticast ())
{
icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
- m_dropTrace (packet);
- optionLength = 0;
- isDropped = true;
- break;
}
-
- m_dropTrace (packet);
optionLength = 0;
isDropped = true;
+ stopProcessing = true;
+ dropReason = Ipv6L3Protocol::DROP_UNKNOWN_OPTION;
break;
default:
@@ -210,7 +214,14 @@
return EXT_NUMBER;
}
-uint8_t Ipv6ExtensionHopByHop::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped)
+uint8_t Ipv6ExtensionHopByHop::Process (Ptr<Packet>& packet,
+ uint8_t offset,
+ Ipv6Header const& ipv6Header,
+ Ipv6Address dst,
+ uint8_t *nextHeader,
+ bool& stopProcessing,
+ bool& isDropped,
+ Ipv6L3Protocol::DropReason& dropReason)
{
NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped);
@@ -228,7 +239,7 @@
offset += processedSize;
uint8_t length = hopbyhopHeader.GetLength () - hopbyhopHeader.GetOptionsOffset ();
- processedSize += ProcessOptions (packet, offset, length, ipv6Header, dst, nextHeader, isDropped);
+ processedSize += ProcessOptions (packet, offset, length, ipv6Header, dst, nextHeader, stopProcessing, isDropped, dropReason);
return processedSize;
}
@@ -262,7 +273,14 @@
return EXT_NUMBER;
}
-uint8_t Ipv6ExtensionDestination::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped)
+uint8_t Ipv6ExtensionDestination::Process (Ptr<Packet>& packet,
+ uint8_t offset,
+ Ipv6Header const& ipv6Header,
+ Ipv6Address dst,
+ uint8_t *nextHeader,
+ bool& stopProcessing,
+ bool& isDropped,
+ Ipv6L3Protocol::DropReason& dropReason)
{
NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped);
@@ -280,7 +298,7 @@
offset += processedSize;
uint8_t length = destinationHeader.GetLength () - destinationHeader.GetOptionsOffset ();
- processedSize += ProcessOptions (packet, offset, length, ipv6Header, dst, nextHeader, isDropped);
+ processedSize += ProcessOptions (packet, offset, length, ipv6Header, dst, nextHeader, stopProcessing, isDropped, dropReason);
return processedSize;
}
@@ -327,7 +345,14 @@
return EXT_NUMBER;
}
-uint8_t Ipv6ExtensionFragment::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped)
+uint8_t Ipv6ExtensionFragment::Process (Ptr<Packet>& packet,
+ uint8_t offset,
+ Ipv6Header const& ipv6Header,
+ Ipv6Address dst,
+ uint8_t *nextHeader,
+ bool& stopProcessing,
+ bool& isDropped,
+ Ipv6L3Protocol::DropReason& dropReason)
{
NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped);
@@ -382,12 +407,11 @@
packet = fragments->GetPacket ();
fragments->CancelTimeout ();
m_fragments.erase (fragmentsId);
- isDropped = false;
+ stopProcessing = false;
}
else
{
- // the fragment is not "dropped", but Ipv6L3Protocol::LocalDeliver must stop processing it.
- isDropped = true;
+ stopProcessing = true;
}
return 0;
@@ -569,7 +593,7 @@
void Ipv6ExtensionFragment::HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> fragmentsId,
- Ipv6Header & ipHeader)
+ Ipv6Header ipHeader)
{
Ptr<Fragments> fragments;
@@ -579,15 +603,17 @@
Ptr<Packet> packet = fragments->GetPartialPacket ();
- packet->AddHeader (ipHeader);
-
// if we have at least 8 bytes, we can send an ICMP.
if ( packet->GetSize () > 8 )
{
+ Ptr<Packet> p = packet->Copy ();
+ p->AddHeader (ipHeader);
Ptr<Icmpv6L4Protocol> icmp = GetNode ()->GetObject<Icmpv6L4Protocol> ();
- icmp->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_FRAGTIME);
+ icmp->SendErrorTimeExceeded (p, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_FRAGTIME);
}
- m_dropTrace (packet);
+
+ Ptr<Ipv6L3Protocol> ipL3 = GetNode ()->GetObject<Ipv6L3Protocol> ();
+ ipL3->ReportDrop (ipHeader, packet, Ipv6L3Protocol::DROP_FRAGMENT_TIMEOUT);
// clear the buffers
m_fragments.erase (fragmentsId);
@@ -737,7 +763,14 @@
return 0;
}
-uint8_t Ipv6ExtensionRouting::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped)
+uint8_t Ipv6ExtensionRouting::Process (Ptr<Packet>& packet,
+ uint8_t offset,
+ Ipv6Header const& ipv6Header,
+ Ipv6Address dst,
+ uint8_t *nextHeader,
+ bool& stopProcessing,
+ bool& isDropped,
+ Ipv6L3Protocol::DropReason& dropReason)
{
NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped);
@@ -777,14 +810,15 @@
NS_LOG_LOGIC ("Malformed header. Drop!");
icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1);
- m_dropTrace (packet);
+ dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER;
isDropped = true;
+ stopProcessing = true;
}
return routingLength;
}
- return ipv6ExtensionRouting->Process (packet, offset, ipv6Header, dst, (uint8_t *)0, isDropped);
+ return ipv6ExtensionRouting->Process (packet, offset, ipv6Header, dst, (uint8_t *)0, stopProcessing, isDropped, dropReason);
}
@@ -878,7 +912,14 @@
return TYPE_ROUTING;
}
-uint8_t Ipv6ExtensionLooseRouting::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped)
+uint8_t Ipv6ExtensionLooseRouting::Process (Ptr<Packet>& packet,
+ uint8_t offset,
+ Ipv6Header const& ipv6Header,
+ Ipv6Address dst,
+ uint8_t *nextHeader,
+ bool& stopProcessing,
+ bool& isDropped,
+ Ipv6L3Protocol::DropReason& dropReason)
{
NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped);
@@ -931,8 +972,9 @@
{
NS_LOG_LOGIC ("Malformed header. Drop!");
icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1);
- m_dropTrace (packet);
+ dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER;
isDropped = true;
+ stopProcessing = true;
return routingHeader.GetSerializedSize ();
}
@@ -940,8 +982,9 @@
{
NS_LOG_LOGIC ("Malformed header. Drop!");
icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 3);
- m_dropTrace (packet);
+ dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER;
isDropped = true;
+ stopProcessing = true;
return routingHeader.GetSerializedSize ();
}
@@ -951,8 +994,9 @@
if (nextAddress.IsMulticast () || destAddress.IsMulticast ())
{
- m_dropTrace (packet);
+ dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER;
isDropped = true;
+ stopProcessing = true;
return routingHeader.GetSerializedSize ();
}
@@ -963,8 +1007,9 @@
{
NS_LOG_LOGIC ("Time Exceeded : Hop Limit <= 1. Drop!");
icmpv6->SendErrorTimeExceeded (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_HOPLIMIT);
- m_dropTrace (packet);
+ dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER;
isDropped = true;
+ stopProcessing = true;
return routingHeader.GetSerializedSize ();
}
@@ -1031,7 +1076,14 @@
return EXT_NUMBER;
}
-uint8_t Ipv6ExtensionESP::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped)
+uint8_t Ipv6ExtensionESP::Process (Ptr<Packet>& packet,
+ uint8_t offset,
+ Ipv6Header const& ipv6Header,
+ Ipv6Address dst,
+ uint8_t *nextHeader,
+ bool& stopProcessing,
+ bool& isDropped,
+ Ipv6L3Protocol::DropReason& dropReason)
{
NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped);
@@ -1069,7 +1121,14 @@
return EXT_NUMBER;
}
-uint8_t Ipv6ExtensionAH::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped)
+uint8_t Ipv6ExtensionAH::Process (Ptr<Packet>& packet,
+ uint8_t offset,
+ Ipv6Header const& ipv6Header,
+ Ipv6Address dst,
+ uint8_t *nextHeader,
+ bool& stopProcessing,
+ bool& isDropped,
+ Ipv6L3Protocol::DropReason& dropReason)
{
NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped);