52 .SetParent<Object> () |
52 .SetParent<Object> () |
53 .AddAttribute ("ExtensionNumber", "The IPv6 extension number.", |
53 .AddAttribute ("ExtensionNumber", "The IPv6 extension number.", |
54 UintegerValue (0), |
54 UintegerValue (0), |
55 MakeUintegerAccessor (&Ipv6Extension::GetExtensionNumber), |
55 MakeUintegerAccessor (&Ipv6Extension::GetExtensionNumber), |
56 MakeUintegerChecker<uint8_t> ()) |
56 MakeUintegerChecker<uint8_t> ()) |
57 .AddTraceSource ("Drop", "Drop IPv6 packet", |
|
58 MakeTraceSourceAccessor (&Ipv6Extension::m_dropTrace)) |
|
59 ; |
57 ; |
60 return tid; |
58 return tid; |
61 } |
59 } |
62 |
60 |
63 Ipv6Extension::Ipv6Extension () |
61 Ipv6Extension::Ipv6Extension () |
84 NS_LOG_FUNCTION_NOARGS (); |
82 NS_LOG_FUNCTION_NOARGS (); |
85 |
83 |
86 return m_node; |
84 return m_node; |
87 } |
85 } |
88 |
86 |
89 uint8_t Ipv6Extension::ProcessOptions (Ptr<Packet>& packet, uint8_t offset, uint8_t length, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped) |
87 uint8_t Ipv6Extension::ProcessOptions (Ptr<Packet>& packet, |
|
88 uint8_t offset, |
|
89 uint8_t length, |
|
90 Ipv6Header const& ipv6Header, |
|
91 Ipv6Address dst, |
|
92 uint8_t *nextHeader, |
|
93 bool& stopProcessing, |
|
94 bool& isDropped, |
|
95 Ipv6L3Protocol::DropReason& dropReason) |
90 { |
96 { |
91 NS_LOG_FUNCTION (this << packet << offset << length << ipv6Header << dst << nextHeader << isDropped); |
97 NS_LOG_FUNCTION (this << packet << offset << length << ipv6Header << dst << nextHeader << isDropped); |
92 |
98 |
93 // For ICMPv6 Error packets |
99 // For ICMPv6 Error packets |
94 Ptr<Packet> malformedPacket = packet->Copy (); |
100 Ptr<Packet> malformedPacket = packet->Copy (); |
123 optionLength = *(data + processedSize + 1) + 2; |
129 optionLength = *(data + processedSize + 1) + 2; |
124 break; |
130 break; |
125 |
131 |
126 case 1: |
132 case 1: |
127 NS_LOG_LOGIC ("Unknown Option. Drop!"); |
133 NS_LOG_LOGIC ("Unknown Option. Drop!"); |
128 m_dropTrace (packet); |
|
129 optionLength = 0; |
134 optionLength = 0; |
130 isDropped = true; |
135 isDropped = true; |
|
136 stopProcessing = true; |
|
137 dropReason = Ipv6L3Protocol::DROP_UNKNOWN_OPTION; |
131 break; |
138 break; |
132 |
139 |
133 case 2: |
140 case 2: |
134 NS_LOG_LOGIC ("Unknown Option. Drop!"); |
141 NS_LOG_LOGIC ("Unknown Option. Drop!"); |
135 icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize); |
142 icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize); |
136 m_dropTrace (packet); |
|
137 optionLength = 0; |
143 optionLength = 0; |
138 isDropped = true; |
144 isDropped = true; |
|
145 stopProcessing = true; |
|
146 dropReason = Ipv6L3Protocol::DROP_UNKNOWN_OPTION; |
139 break; |
147 break; |
140 |
148 |
141 case 3: |
149 case 3: |
142 NS_LOG_LOGIC ("Unknown Option. Drop!"); |
150 NS_LOG_LOGIC ("Unknown Option. Drop!"); |
143 |
151 |
144 if (!ipv6Header.GetDestinationAddress ().IsMulticast ()) |
152 if (!ipv6Header.GetDestinationAddress ().IsMulticast ()) |
145 { |
153 { |
146 icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize); |
154 icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize); |
147 m_dropTrace (packet); |
|
148 optionLength = 0; |
|
149 isDropped = true; |
|
150 break; |
|
151 } |
155 } |
152 |
|
153 m_dropTrace (packet); |
|
154 optionLength = 0; |
156 optionLength = 0; |
155 isDropped = true; |
157 isDropped = true; |
|
158 stopProcessing = true; |
|
159 dropReason = Ipv6L3Protocol::DROP_UNKNOWN_OPTION; |
156 break; |
160 break; |
157 |
161 |
158 default: |
162 default: |
159 break; |
163 break; |
160 } |
164 } |
208 NS_LOG_FUNCTION_NOARGS (); |
212 NS_LOG_FUNCTION_NOARGS (); |
209 |
213 |
210 return EXT_NUMBER; |
214 return EXT_NUMBER; |
211 } |
215 } |
212 |
216 |
213 uint8_t Ipv6ExtensionHopByHop::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped) |
217 uint8_t Ipv6ExtensionHopByHop::Process (Ptr<Packet>& packet, |
|
218 uint8_t offset, |
|
219 Ipv6Header const& ipv6Header, |
|
220 Ipv6Address dst, |
|
221 uint8_t *nextHeader, |
|
222 bool& stopProcessing, |
|
223 bool& isDropped, |
|
224 Ipv6L3Protocol::DropReason& dropReason) |
214 { |
225 { |
215 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
226 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
216 |
227 |
217 Ptr<Packet> p = packet->Copy (); |
228 Ptr<Packet> p = packet->Copy (); |
218 p->RemoveAtStart (offset); |
229 p->RemoveAtStart (offset); |
226 |
237 |
227 uint8_t processedSize = hopbyhopHeader.GetOptionsOffset (); |
238 uint8_t processedSize = hopbyhopHeader.GetOptionsOffset (); |
228 offset += processedSize; |
239 offset += processedSize; |
229 uint8_t length = hopbyhopHeader.GetLength () - hopbyhopHeader.GetOptionsOffset (); |
240 uint8_t length = hopbyhopHeader.GetLength () - hopbyhopHeader.GetOptionsOffset (); |
230 |
241 |
231 processedSize += ProcessOptions (packet, offset, length, ipv6Header, dst, nextHeader, isDropped); |
242 processedSize += ProcessOptions (packet, offset, length, ipv6Header, dst, nextHeader, stopProcessing, isDropped, dropReason); |
232 |
243 |
233 return processedSize; |
244 return processedSize; |
234 } |
245 } |
235 |
246 |
236 |
247 |
260 NS_LOG_FUNCTION_NOARGS (); |
271 NS_LOG_FUNCTION_NOARGS (); |
261 |
272 |
262 return EXT_NUMBER; |
273 return EXT_NUMBER; |
263 } |
274 } |
264 |
275 |
265 uint8_t Ipv6ExtensionDestination::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped) |
276 uint8_t Ipv6ExtensionDestination::Process (Ptr<Packet>& packet, |
|
277 uint8_t offset, |
|
278 Ipv6Header const& ipv6Header, |
|
279 Ipv6Address dst, |
|
280 uint8_t *nextHeader, |
|
281 bool& stopProcessing, |
|
282 bool& isDropped, |
|
283 Ipv6L3Protocol::DropReason& dropReason) |
266 { |
284 { |
267 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
285 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
268 |
286 |
269 Ptr<Packet> p = packet->Copy (); |
287 Ptr<Packet> p = packet->Copy (); |
270 p->RemoveAtStart (offset); |
288 p->RemoveAtStart (offset); |
278 |
296 |
279 uint8_t processedSize = destinationHeader.GetOptionsOffset (); |
297 uint8_t processedSize = destinationHeader.GetOptionsOffset (); |
280 offset += processedSize; |
298 offset += processedSize; |
281 uint8_t length = destinationHeader.GetLength () - destinationHeader.GetOptionsOffset (); |
299 uint8_t length = destinationHeader.GetLength () - destinationHeader.GetOptionsOffset (); |
282 |
300 |
283 processedSize += ProcessOptions (packet, offset, length, ipv6Header, dst, nextHeader, isDropped); |
301 processedSize += ProcessOptions (packet, offset, length, ipv6Header, dst, nextHeader, stopProcessing, isDropped, dropReason); |
284 |
302 |
285 return processedSize; |
303 return processedSize; |
286 } |
304 } |
287 |
305 |
288 |
306 |
325 NS_LOG_FUNCTION_NOARGS (); |
343 NS_LOG_FUNCTION_NOARGS (); |
326 |
344 |
327 return EXT_NUMBER; |
345 return EXT_NUMBER; |
328 } |
346 } |
329 |
347 |
330 uint8_t Ipv6ExtensionFragment::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped) |
348 uint8_t Ipv6ExtensionFragment::Process (Ptr<Packet>& packet, |
|
349 uint8_t offset, |
|
350 Ipv6Header const& ipv6Header, |
|
351 Ipv6Address dst, |
|
352 uint8_t *nextHeader, |
|
353 bool& stopProcessing, |
|
354 bool& isDropped, |
|
355 Ipv6L3Protocol::DropReason& dropReason) |
331 { |
356 { |
332 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
357 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
333 |
358 |
334 Ptr<Packet> p = packet->Copy (); |
359 Ptr<Packet> p = packet->Copy (); |
335 p->RemoveAtStart (offset); |
360 p->RemoveAtStart (offset); |
567 unfragmentablePart.clear (); |
591 unfragmentablePart.clear (); |
568 } |
592 } |
569 |
593 |
570 |
594 |
571 void Ipv6ExtensionFragment::HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> fragmentsId, |
595 void Ipv6ExtensionFragment::HandleFragmentsTimeout (std::pair<Ipv6Address, uint32_t> fragmentsId, |
572 Ipv6Header & ipHeader) |
596 Ipv6Header ipHeader) |
573 { |
597 { |
574 Ptr<Fragments> fragments; |
598 Ptr<Fragments> fragments; |
575 |
599 |
576 MapFragments_t::iterator it = m_fragments.find (fragmentsId); |
600 MapFragments_t::iterator it = m_fragments.find (fragmentsId); |
577 NS_ASSERT_MSG(it != m_fragments.end (), "IPv6 Fragment timeout reached for non-existent fragment"); |
601 NS_ASSERT_MSG(it != m_fragments.end (), "IPv6 Fragment timeout reached for non-existent fragment"); |
578 fragments = it->second; |
602 fragments = it->second; |
579 |
603 |
580 Ptr<Packet> packet = fragments->GetPartialPacket (); |
604 Ptr<Packet> packet = fragments->GetPartialPacket (); |
581 |
605 |
582 packet->AddHeader (ipHeader); |
|
583 |
|
584 // if we have at least 8 bytes, we can send an ICMP. |
606 // if we have at least 8 bytes, we can send an ICMP. |
585 if ( packet->GetSize () > 8 ) |
607 if ( packet->GetSize () > 8 ) |
586 { |
608 { |
|
609 Ptr<Packet> p = packet->Copy (); |
|
610 p->AddHeader (ipHeader); |
587 Ptr<Icmpv6L4Protocol> icmp = GetNode ()->GetObject<Icmpv6L4Protocol> (); |
611 Ptr<Icmpv6L4Protocol> icmp = GetNode ()->GetObject<Icmpv6L4Protocol> (); |
588 icmp->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_FRAGTIME); |
612 icmp->SendErrorTimeExceeded (p, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_FRAGTIME); |
589 } |
613 } |
590 m_dropTrace (packet); |
614 |
|
615 Ptr<Ipv6L3Protocol> ipL3 = GetNode ()->GetObject<Ipv6L3Protocol> (); |
|
616 ipL3->ReportDrop (ipHeader, packet, Ipv6L3Protocol::DROP_FRAGMENT_TIMEOUT); |
591 |
617 |
592 // clear the buffers |
618 // clear the buffers |
593 m_fragments.erase (fragmentsId); |
619 m_fragments.erase (fragmentsId); |
594 } |
620 } |
595 |
621 |
735 { |
761 { |
736 NS_LOG_FUNCTION_NOARGS (); |
762 NS_LOG_FUNCTION_NOARGS (); |
737 return 0; |
763 return 0; |
738 } |
764 } |
739 |
765 |
740 uint8_t Ipv6ExtensionRouting::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped) |
766 uint8_t Ipv6ExtensionRouting::Process (Ptr<Packet>& packet, |
|
767 uint8_t offset, |
|
768 Ipv6Header const& ipv6Header, |
|
769 Ipv6Address dst, |
|
770 uint8_t *nextHeader, |
|
771 bool& stopProcessing, |
|
772 bool& isDropped, |
|
773 Ipv6L3Protocol::DropReason& dropReason) |
741 { |
774 { |
742 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
775 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
743 |
776 |
744 // For ICMPv6 Error Packets |
777 // For ICMPv6 Error Packets |
745 Ptr<Packet> malformedPacket = packet->Copy (); |
778 Ptr<Packet> malformedPacket = packet->Copy (); |
775 else |
808 else |
776 { |
809 { |
777 NS_LOG_LOGIC ("Malformed header. Drop!"); |
810 NS_LOG_LOGIC ("Malformed header. Drop!"); |
778 |
811 |
779 icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1); |
812 icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1); |
780 m_dropTrace (packet); |
813 dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER; |
781 isDropped = true; |
814 isDropped = true; |
|
815 stopProcessing = true; |
782 } |
816 } |
783 |
817 |
784 return routingLength; |
818 return routingLength; |
785 } |
819 } |
786 |
820 |
787 return ipv6ExtensionRouting->Process (packet, offset, ipv6Header, dst, (uint8_t *)0, isDropped); |
821 return ipv6ExtensionRouting->Process (packet, offset, ipv6Header, dst, (uint8_t *)0, stopProcessing, isDropped, dropReason); |
788 } |
822 } |
789 |
823 |
790 |
824 |
791 NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRoutingDemux); |
825 NS_OBJECT_ENSURE_REGISTERED (Ipv6ExtensionRoutingDemux); |
792 |
826 |
876 NS_LOG_FUNCTION_NOARGS (); |
910 NS_LOG_FUNCTION_NOARGS (); |
877 |
911 |
878 return TYPE_ROUTING; |
912 return TYPE_ROUTING; |
879 } |
913 } |
880 |
914 |
881 uint8_t Ipv6ExtensionLooseRouting::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped) |
915 uint8_t Ipv6ExtensionLooseRouting::Process (Ptr<Packet>& packet, |
|
916 uint8_t offset, |
|
917 Ipv6Header const& ipv6Header, |
|
918 Ipv6Address dst, |
|
919 uint8_t *nextHeader, |
|
920 bool& stopProcessing, |
|
921 bool& isDropped, |
|
922 Ipv6L3Protocol::DropReason& dropReason) |
882 { |
923 { |
883 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
924 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
884 |
925 |
885 // For ICMPv6 Error packets |
926 // For ICMPv6 Error packets |
886 Ptr<Packet> malformedPacket = packet->Copy (); |
927 Ptr<Packet> malformedPacket = packet->Copy (); |
929 |
970 |
930 if (length % 2 != 0) |
971 if (length % 2 != 0) |
931 { |
972 { |
932 NS_LOG_LOGIC ("Malformed header. Drop!"); |
973 NS_LOG_LOGIC ("Malformed header. Drop!"); |
933 icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1); |
974 icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1); |
934 m_dropTrace (packet); |
975 dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER; |
935 isDropped = true; |
976 isDropped = true; |
|
977 stopProcessing = true; |
936 return routingHeader.GetSerializedSize (); |
978 return routingHeader.GetSerializedSize (); |
937 } |
979 } |
938 |
980 |
939 if (segmentsLeft > nbAddress) |
981 if (segmentsLeft > nbAddress) |
940 { |
982 { |
941 NS_LOG_LOGIC ("Malformed header. Drop!"); |
983 NS_LOG_LOGIC ("Malformed header. Drop!"); |
942 icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 3); |
984 icmpv6->SendErrorParameterError (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 3); |
943 m_dropTrace (packet); |
985 dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER; |
944 isDropped = true; |
986 isDropped = true; |
|
987 stopProcessing = true; |
945 return routingHeader.GetSerializedSize (); |
988 return routingHeader.GetSerializedSize (); |
946 } |
989 } |
947 |
990 |
948 routingHeader.SetSegmentsLeft (segmentsLeft - 1); |
991 routingHeader.SetSegmentsLeft (segmentsLeft - 1); |
949 nextAddressIndex = nbAddress - segmentsLeft; |
992 nextAddressIndex = nbAddress - segmentsLeft; |
950 nextAddress = routingHeader.GetRouterAddress (nextAddressIndex); |
993 nextAddress = routingHeader.GetRouterAddress (nextAddressIndex); |
951 |
994 |
952 if (nextAddress.IsMulticast () || destAddress.IsMulticast ()) |
995 if (nextAddress.IsMulticast () || destAddress.IsMulticast ()) |
953 { |
996 { |
954 m_dropTrace (packet); |
997 dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER; |
955 isDropped = true; |
998 isDropped = true; |
|
999 stopProcessing = true; |
956 return routingHeader.GetSerializedSize (); |
1000 return routingHeader.GetSerializedSize (); |
957 } |
1001 } |
958 |
1002 |
959 routingHeader.SetRouterAddress (nextAddressIndex, destAddress); |
1003 routingHeader.SetRouterAddress (nextAddressIndex, destAddress); |
960 ipv6header.SetDestinationAddress (nextAddress); |
1004 ipv6header.SetDestinationAddress (nextAddress); |
961 |
1005 |
962 if (hopLimit <= 1) |
1006 if (hopLimit <= 1) |
963 { |
1007 { |
964 NS_LOG_LOGIC ("Time Exceeded : Hop Limit <= 1. Drop!"); |
1008 NS_LOG_LOGIC ("Time Exceeded : Hop Limit <= 1. Drop!"); |
965 icmpv6->SendErrorTimeExceeded (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_HOPLIMIT); |
1009 icmpv6->SendErrorTimeExceeded (malformedPacket, srcAddress, Icmpv6Header::ICMPV6_HOPLIMIT); |
966 m_dropTrace (packet); |
1010 dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER; |
967 isDropped = true; |
1011 isDropped = true; |
|
1012 stopProcessing = true; |
968 return routingHeader.GetSerializedSize (); |
1013 return routingHeader.GetSerializedSize (); |
969 } |
1014 } |
970 |
1015 |
971 routingHeader.SetLength (88); |
1016 routingHeader.SetLength (88); |
972 ipv6header.SetHopLimit (hopLimit - 1); |
1017 ipv6header.SetHopLimit (hopLimit - 1); |
1029 NS_LOG_FUNCTION_NOARGS (); |
1074 NS_LOG_FUNCTION_NOARGS (); |
1030 |
1075 |
1031 return EXT_NUMBER; |
1076 return EXT_NUMBER; |
1032 } |
1077 } |
1033 |
1078 |
1034 uint8_t Ipv6ExtensionESP::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped) |
1079 uint8_t Ipv6ExtensionESP::Process (Ptr<Packet>& packet, |
|
1080 uint8_t offset, |
|
1081 Ipv6Header const& ipv6Header, |
|
1082 Ipv6Address dst, |
|
1083 uint8_t *nextHeader, |
|
1084 bool& stopProcessing, |
|
1085 bool& isDropped, |
|
1086 Ipv6L3Protocol::DropReason& dropReason) |
1035 { |
1087 { |
1036 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
1088 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
1037 |
1089 |
1038 /** \todo */ |
1090 /** \todo */ |
1039 |
1091 |
1067 NS_LOG_FUNCTION_NOARGS (); |
1119 NS_LOG_FUNCTION_NOARGS (); |
1068 |
1120 |
1069 return EXT_NUMBER; |
1121 return EXT_NUMBER; |
1070 } |
1122 } |
1071 |
1123 |
1072 uint8_t Ipv6ExtensionAH::Process (Ptr<Packet>& packet, uint8_t offset, Ipv6Header const& ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool& isDropped) |
1124 uint8_t Ipv6ExtensionAH::Process (Ptr<Packet>& packet, |
|
1125 uint8_t offset, |
|
1126 Ipv6Header const& ipv6Header, |
|
1127 Ipv6Address dst, |
|
1128 uint8_t *nextHeader, |
|
1129 bool& stopProcessing, |
|
1130 bool& isDropped, |
|
1131 Ipv6L3Protocol::DropReason& dropReason) |
1073 { |
1132 { |
1074 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
1133 NS_LOG_FUNCTION (this << packet << offset << ipv6Header << dst << nextHeader << isDropped); |
1075 |
1134 |
1076 /** \todo */ |
1135 /** \todo */ |
1077 |
1136 |