23 #include "ns3/uinteger.h"
24 #include "ns3/vector.h"
25 #include "ns3/boolean.h"
26 #include "ns3/callback.h"
27 #include "ns3/trace-source-accessor.h"
28 #include "ns3/object-vector.h"
29 #include "ns3/ipv6-routing-protocol.h"
30 #include "ns3/ipv6-route.h"
31 #include "ns3/mac16-address.h"
32 #include "ns3/mac64-address.h"
48 #define IPV6_MIN_MTU 1280
62 .AddConstructor<Ipv6L3Protocol> ()
63 .AddAttribute (
"DefaultTtl",
"The TTL value set by default on all outgoing packets generated on this node.",
66 MakeUintegerChecker<uint8_t> ())
67 .AddAttribute (
"DefaultTclass",
"The TCLASS value set by default on all outgoing packets generated on this node.",
70 MakeUintegerChecker<uint8_t> ())
71 .AddAttribute (
"InterfaceList",
"The set of IPv6 interfaces associated to this IPv6 stack.",
74 MakeObjectVectorChecker<Ipv6Interface> ())
75 .AddAttribute (
"SendIcmpv6Redirect",
"Send the ICMPv6 Redirect when appropriate.",
79 MakeBooleanChecker ())
80 .AddTraceSource (
"Tx",
"Send IPv6 packet to outgoing interface.",
82 .AddTraceSource (
"Rx",
"Receive IPv6 packet from incoming interface.",
84 .AddTraceSource (
"Drop",
"Drop IPv6 packet",
130 (*it)->StopValidTimer ();
131 (*it)->StopPreferredTimer ();
162 interface->SetNode (
m_node);
163 interface->SetDevice (device);
208 uint32_t max = (*it)->GetNAddresses ();
210 for (j = 0; j < max; j++)
212 if ((*it)->GetAddress (j).GetAddress () ==
address)
230 for (j = 0; j < (*it)->GetNAddresses (); j++)
232 if ((*it)->GetAddress (j).GetAddress ().CombinePrefix (mask) == address.
CombinePrefix (mask))
255 if ((*it)->GetDevice () == device)
266 NS_LOG_FUNCTION (
this << interface << network << mask << (uint32_t)flags << validTime << preferredTime);
271 if (flags & (1 << 6))
288 NS_FATAL_ERROR (
"Unknown method to make autoconfigured address for this kind of device.");
295 if ((*it)->GetInterface () ==
interface && (*it)->GetPrefix () == network && (*it)->GetMask () == mask)
297 (*it)->StopPreferredTimer ();
298 (*it)->StopValidTimer ();
299 (*it)->StartPreferredTimer ();
311 if (!defaultRouter.
IsAny())
346 NS_FATAL_ERROR (
"Unknown method to make autoconfigured address for this kind of device.");
350 for (i = 0; i < max; i++)
362 if ((*it)->GetInterface () ==
interface && (*it)->GetPrefix () == network && (*it)->GetMask () == mask)
465 return interface->
GetDevice ()->GetMtu ();
479 return interface->
IsUp ();
526 device = CreateObject<LoopbackNetDevice> ();
530 interface->SetDevice (device);
531 interface->SetNode (
m_node);
533 interface->AddAddress (ifaceAddr);
550 NS_LOG_LOGIC (
"Forwarding state: " << interface->IsForwarding ());
551 return interface->IsForwarding ();
568 (*it)->SetForwarding (forward);
608 Ptr<Node> node = this->GetObject<Node> ();
645 if ((*i)->GetProtocolNumber () == protocolNumber)
705 NS_LOG_FUNCTION (
this << packet << source << destination << (uint32_t)protocol << route);
734 NS_LOG_LOGIC (
"Ipv6L3Protocol::Send case 1: passed in with a route");
743 NS_LOG_LOGIC (
"Ipv6L3Protocol::Send case 1: probably sent to machine on same IPv6 network");
751 NS_LOG_LOGIC (
"Ipv6L3Protocol::Send case 3: passed in with no route " << destination);
786 NS_LOG_FUNCTION (
this << device << p << protocol << from << to << packetType);
788 uint32_t
interface = 0;
796 if (ipv6Interface->
GetDevice () == device)
798 if (ipv6Interface->
IsUp ())
805 NS_LOG_LOGIC (
"Dropping received packet-- interface is down");
807 packet->RemoveHeader (hdr);
816 packet->RemoveHeader (hdr);
834 bool isDropped =
false;
838 ipv6Extension = ipv6ExtensionDemux->GetExtension (nextHeader);
857 NS_LOG_WARN (
"No route found for forwarding packet. Drop.");
873 int32_t
interface = GetInterfaceForDevice (dev);
877 NS_LOG_LOGIC (
"Send via NetDevice ifIndex " << dev->GetIfIndex () <<
" Ipv6InterfaceIndex " << interface);
880 std::list<Ptr<Packet> > fragments;
886 targetMtu = dev->GetMtu ();
889 if (packet->
GetSize () > targetMtu + 40)
911 icmpv6->SendErrorTooBig (packet, ipHeader.
GetSourceAddress (), dev->GetMtu ());
923 ipv6Fragment->
GetFragments (packet, targetMtu, fragments);
928 if (outInterface->IsUp ())
930 NS_LOG_LOGIC (
"Send to gateway " << route->GetGateway ());
932 if (fragments.size () != 0)
934 std::ostringstream oss;
937 for (
std::list<
Ptr<Packet> >::const_iterator it = fragments.begin (); it != fragments.end (); it++)
940 outInterface->Send (*it, route->GetGateway ());
947 outInterface->Send (packet, route->GetGateway ());
952 NS_LOG_LOGIC (
"Dropping-- outgoing interface is down: " << route->GetGateway ());
958 if (outInterface->IsUp ())
962 if (fragments.size () != 0)
964 std::ostringstream oss;
967 for (
std::list<
Ptr<Packet> >::const_iterator it = fragments.begin (); it != fragments.end (); it++)
996 NS_LOG_WARN (
"Received a packet for 2001:db8::/32 (documentation class). Drop.");
1048 if (target.
IsAny ())
1056 if (icmpv6->Lookup (target, rtentry->GetOutputDevice (), 0, &hardwareTarget))
1058 icmpv6->SendRedirection (copy, linkLocal, src, target, dst, hardwareTarget);
1062 icmpv6->SendRedirection (copy, linkLocal, src, target, dst,
Address ());
1074 std::map<uint32_t, uint32_t> ttlMap = mrtentry->GetOutputTtlMap ();
1075 std::map<uint32_t, uint32_t>::iterator mapIter;
1077 for (mapIter = ttlMap.begin (); mapIter != ttlMap.end (); mapIter++)
1079 uint32_t interfaceId = mapIter->first;
1090 NS_LOG_LOGIC (
"Forward multicast via interface " << interfaceId);
1111 uint8_t nextHeaderPosition = 0;
1112 bool isDropped =
false;
1122 NS_LOG_WARN(
"Double Ipv6Header::IPV6_EXT_HOP_BY_HOP in packet, dropping packet");
1131 ipv6Extension = ipv6ExtensionDemux->GetExtension (nextHeader);
1135 uint8_t nextHeaderStep = 0;
1136 uint8_t curHeader = nextHeader;
1137 nextHeaderStep = ipv6Extension->Process (p, nextHeaderPosition, ip, dst, &nextHeader, isDropped);
1138 nextHeaderPosition += nextHeaderStep;
1145 "Zero-size IPv6 Option Header, aborting" << *packet );
1158 if (nextHeaderPosition == 0)
1199 while (ipv6Extension);
1205 NS_LOG_LOGIC (
"Route input failure-- dropping packet to " << ipHeader <<
" with errno " << sockErrno);
1211 NS_LOG_FUNCTION (
this << src << dst << (uint32_t)protocol << (uint32_t)payloadSize << (uint32_t)ttl << (uint32_t)tclass);
1226 ipv6ExtensionDemux->SetNode (
m_node);
1229 hopbyhopExtension->SetNode (
m_node);
1231 destinationExtension->SetNode (
m_node);
1233 fragmentExtension->SetNode (
m_node);
1239 ipv6ExtensionDemux->Insert (hopbyhopExtension);
1240 ipv6ExtensionDemux->Insert (destinationExtension);
1241 ipv6ExtensionDemux->Insert (fragmentExtension);
1242 ipv6ExtensionDemux->Insert (routingExtension);
1247 routingExtensionDemux->SetNode (
m_node);
1249 looseRoutingExtension->SetNode (
m_node);
1250 routingExtensionDemux->Insert (looseRoutingExtension);
1259 ipv6OptionDemux->SetNode (
m_node);
1262 pad1Option->SetNode (
m_node);
1264 padnOption->SetNode (
m_node);
1266 jumbogramOption->SetNode (
m_node);
1268 routerAlertOption->SetNode (
m_node);
1270 ipv6OptionDemux->Insert (pad1Option);
1271 ipv6OptionDemux->Insert (padnOption);
1272 ipv6OptionDemux->Insert (jumbogramOption);
1273 ipv6OptionDemux->Insert (routerAlertOption);
void SetNode(Ptr< Node > node)
Set the node.
bool IsAny() const
If the IPv6 address is the "Any" address.
void GetFragments(Ptr< Packet > packet, uint32_t fragmentSize, std::list< Ptr< Packet > > &listFragments)
Fragment a packet.
static bool IsMatchingType(const Address &address)
Ptr< const AttributeAccessor > MakeObjectVectorAccessor(U T::*memberContainer)
static Ipv6Address GetLoopback()
Get the loopback address.
Ipv6Header BuildHeader(Ipv6Address src, Ipv6Address dst, uint8_t protocol, uint16_t payloadSize, uint8_t hopLimit, uint8_t tclass)
Construct an IPv6 header.
void SetForwarding(uint32_t i, bool val)
Enable or disable forwarding on interface.
bool AddAddress(Ipv6InterfaceAddress iface)
Add an IPv6 address.
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
virtual ~Ipv6L3Protocol()
Destructor.
void SetUp()
Enable this interface.
Ipv6L3Protocol()
Constructor.
virtual void SetPmtu(Ipv6Address dst, uint32_t pmtu)
Set the Path MTU for the specified IPv6 destination address.
This class implements a tag that carries the socket-specific HOPLIMIT of a packet to the IPv6 layer...
Ptr< NetDevice > GetNetDevice(uint32_t i)
Get device by index.
bool AddAddress(uint32_t i, Ipv6InterfaceAddress address)
Add an address on interface.
Ptr< Ipv6RoutingProtocol > m_routingProtocol
Routing protocol.
Access to the IPv6 forwarding table, interfaces, and configuration.
static Mac16Address ConvertFrom(const Address &address)
static bool IsMatchingType(const Address &address)
Ptr< Ipv6RoutingProtocol > GetRoutingProtocol() const
Get current routing protocol used.
uint32_t AddIpv6Interface(Ptr< Ipv6Interface > interface)
Add an IPv6 interface to the stack.
void Send(Ptr< Packet > packet, Ipv6Address source, Ipv6Address destination, uint8_t protocol, Ptr< Ipv6Route > route)
Higher-level layers call this method to send a packet down the stack to the MAC and PHY layers...
Demultiplexes IPv6 extensions.
bool IsLinkLocal() const
If the IPv6 address is a link-local address (fe80::/64).
bool IsAllRoutersMulticast() const
If the IPv6 address is "all routers multicast" (ff02::2/8).
void SetNode(Ptr< Node > node)
Set the node.
#define NS_ASSERT(condition)
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
Ipv6InterfaceAddress GetAddress(uint32_t index) const
Get an address from IPv6 interface.
static Ipv6Address MakeAutoconfiguredAddress(Mac16Address addr, Ipv6Address prefix)
Make the autoconfigured IPv6 address with Mac16Address.
IPv6 address associated with an interface.
static const uint8_t PROT_NUMBER
ICMPv6 protocol number (58).
uint32_t GetNAddresses(uint32_t interface) const
Get number of address for an interface.
uint32_t GetSize(void) const
void Receive(Ptr< NetDevice > device, Ptr< const Packet > p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType)
Receive method when a packet arrive in the stack. This method removes IPv6 header and forward up to L...
virtual void DoDispose(void)
bool IsDocumentation() const
If the IPv6 address is a documentation address (2001:DB8::/32).
bool IsAllHostsMulticast() const
If the IPv6 address is "all hosts multicast" (ff02::3/8).
#define NS_LOG_FUNCTION_NOARGS()
virtual bool GetSendIcmpv6Redirect() const
Get the ICMPv6 Redirect sending state.
bool IsAllNodesMulticast() const
If the IPv6 address is "all nodes multicast" (ff02::1/8).
virtual void DoDispose()
Dispose object.
void SetMetric(uint32_t i, uint16_t metric)
Set metric for an interface.
bool ForwardUp(Ptr< const Packet > p, Ipv6Header hdr, Ptr< NetDevice > device)
Forward up to receive method.
uint32_t AddInterface(Ptr< NetDevice > device)
Add IPv6 interface for a device.
Ptr< Node > m_node
Node attached to stack.
bool IsUp() const
Is the interface UP ?
#define NS_FATAL_ERROR(msg)
fatal error handling
a polymophic address class
virtual void SetIpForward(bool forward)
Set IPv6 forwarding state.
virtual void NotifyNewAggregate()
Notify other components connected to the node that a new stack member is now connected.
Ptr< T > CreateObject(void)
bool IsUp(uint32_t i) const
Is specified interface up ?
uint32_t m_nInterfaces
Number of IPv6 interfaces managed by the stack.
void SetDefaultTclass(uint8_t tclass)
Set the default TCLASS.
Ipv6Address GetAddress() const
Get the IPv6 address.
uint32_t GetNAddresses(void) const
Get number of addresses on this IPv6 interface.
void SetMetric(uint16_t metric)
Set the metric.
void RemoveAtStart(uint32_t size)
int32_t GetInterfaceForPrefix(Ipv6Address addr, Ipv6Prefix mask) const
Get interface index which match specified address/prefix.
uint8_t GetTclass(void) const
Ptr< Socket > CreateRawSocket()
Create raw IPv6 socket.
#define IPV6_MIN_MTU
Minimum IPv6 MTU, as defined by RFC 2460
Hold an unsigned integer type.
L4List_t m_protocols
List of transport protocol.
void SetDefaultTtl(uint8_t ttl)
Set the default TTL.
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
NS_OBJECT_ENSURE_REGISTERED(AntennaModel)
void IpMulticastForward(Ptr< const NetDevice > idev, Ptr< Ipv6MulticastRoute > mrtentry, Ptr< const Packet > p, const Ipv6Header &header)
Forward a packet in multicast.
T * PeekPointer(const Ptr< T > &p)
Ptr< NetDevice > GetDevice(uint32_t index) const
void SetUp(uint32_t i)
Set an interface up.
An implementation of the ICMPv6 protocol.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
virtual enum RxStatus Receive(Ptr< Packet > p, Ipv4Header const &header, Ptr< Ipv4Interface > incomingInterface)=0
virtual Ptr< NetDevice > GetDevice() const
Get the NetDevice.
static TypeId GetTypeId()
Get the type ID of this class.
Ipv6InterfaceList m_interfaces
List of IPv6 interfaces.
void AggregateObject(Ptr< Object > other)
#define NS_LOG_LOGIC(msg)
bool m_ipForward
Forwarding packets (i.e. router mode) state.
uint32_t GetNInterfaces() const
Get current number of interface on this stack.
static Mac48Address ConvertFrom(const Address &address)
uint16_t GetMetric(uint32_t i) const
Get metric for an interface.
virtual void NotifyNewAggregate(void)
uint32_t GetNDevices(void) const
void SetForwarding(bool forward)
Set forwarding enabled or not.
Ptr< Packet > Copy(void) const
std::list< Ptr< Ipv6AutoconfiguredPrefix > >::iterator Ipv6AutoconfiguredPrefixListI
Ipv6AutoconfiguredPrefixList m_prefixes
List of IPv6 prefix received from RA.
void LocalDeliver(Ptr< const Packet > p, Ipv6Header const &ip, uint32_t iif)
Deliver a packet.
void DeleteRawSocket(Ptr< Socket > socket)
Remove raw IPv6 socket.
virtual bool GetIpForward() const
Get IPv6 forwarding state.
static uint16_t GetStaticProtocolNumber()
Get ICMPv6 protocol number.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
void IpForward(Ptr< const NetDevice > idev, Ptr< Ipv6Route > rtentry, Ptr< const Packet > p, const Ipv6Header &header)
Forward a packet.
Ipv6InterfaceAddress GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const
Get an address.
uint8_t m_defaultTtl
Default TTL for outgoing packets.
TracedCallback< const Ipv6Header &, Ptr< const Packet >, DropReason, Ptr< Ipv6 >, uint32_t > m_dropTrace
Callback to trace drop packets.
bool IsMulticast() const
If the IPv6 address is multicast (ff00::/8).
TracedCallback< Ptr< const Packet >, Ptr< Ipv6 >, uint32_t > m_rxTrace
Callback to trace RX (reception) packets.
int32_t GetInterfaceForDevice(Ptr< const NetDevice > device) const
Get interface index which is on a specified net device.
void SetNode(Ptr< Node > node)
Set node for this stack.
bool IsForwarding(uint32_t i) const
Is interface allows forwarding ?
void RemoveAutoconfiguredAddress(uint32_t interface, Ipv6Address network, Ipv6Prefix mask, Ipv6Address defaultRouter)
Remove an autoconfigured address.
void SendRealOut(Ptr< Ipv6Route > route, Ptr< Packet > packet, Ipv6Header const &ipHeader)
Send packet with route.
void RegisterProtocolHandler(ProtocolHandler handler, uint16_t protocolType, Ptr< NetDevice > device, bool promiscuous=false)
void SetupLoopback()
Setup loopback interface.
#define NS_ASSERT_MSG(condition, message)
virtual void RegisterExtensions()
Register the IPv6 Extensions.
uint8_t GetHopLimit(void) const
Ipv6InterfaceAddress GetLinkLocalAddress() const
Get link-local address from IPv6 interface.
Describes an IPv6 address.
uint16_t GetMetric() const
Get the metric.
void SetRoutingProtocol(Ptr< Ipv6RoutingProtocol > routingProtocol)
Set routing protocol for this stack.
bool IsSolicitedMulticast() const
If the IPv6 address is a Solicited multicast address.
NS_LOG_COMPONENT_DEFINE("PacketLossCounter")
uint32_t AddDevice(Ptr< NetDevice > device)
Ptr< IpL4Protocol > GetProtocol(int protocolNumber) const
Get L4 protocol by protocol number.
uint32_t GetId(void) const
Ptr< Icmpv6L4Protocol > GetIcmpv6() const
Get ICMPv6 protocol.
static Mac64Address ConvertFrom(const Address &address)
bool RemovePacketTag(Tag &tag)
void Insert(Ptr< IpL4Protocol > protocol)
Add an L4 protocol.
uint16_t GetMtu(uint32_t i) const
Get MTU for an interface.
bool m_sendIcmpv6Redirect
Allow ICMPv6 Redirect sending state.
virtual void RegisterOptions()
Register the IPv6 Options.
Describes an IPv6 prefix. It is just a bitmask like Ipv4Mask.
void SetDown(uint32_t i)
set an interface down.
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
bool m_mtuDiscover
MTU Discover (i.e. Path MTU) state.
int32_t GetInterfaceForAddress(Ipv6Address addr) const
Get interface index which has specified IPv6 address.
bool RemoveAddress(uint32_t interfaceIndex, uint32_t addressIndex)
Remove an address from an interface.
contain a set of ns3::Object pointers.
Ptr< Ipv6PmtuCache > m_pmtuCache
Path MTU Cache.
static bool IsMatchingType(const Address &address)
virtual bool GetMtuDiscover(void) const
Get IPv6 MTU discover state.
TracedCallback< Ptr< const Packet >, Ptr< Ipv6 >, uint32_t > m_txTrace
Callback to trace TX (transmission) packets.
virtual void SetMtuDiscover(bool mtuDiscover)
Set IPv6 MTU discover state.
Ipv6Address CombinePrefix(Ipv6Prefix const &prefix)
Combine this address with a prefix.
uint8_t m_defaultTclass
Default TCLASS for outgoing packets.
Ptr< T > GetObject(void) const
void SetDown()
Disable this interface.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
SocketList m_sockets
List of IPv6 raw sockets.
static const uint16_t PROT_NUMBER
The protocol number for IPv6 (0x86DD).
Ptr< Ipv6Interface > GetInterface(uint32_t i) const
Get an interface.
void AddHeader(const Header &header)
void Remove(Ptr< IpL4Protocol > protocol)
Remove an L4 protocol.
void AddAutoconfiguredAddress(uint32_t interface, Ipv6Address network, Ipv6Prefix mask, uint8_t flags, uint32_t validTime, uint32_t preferredTime, Ipv6Address defaultRouter=Ipv6Address::GetZero())
Add an autoconfigured address with RA information.
virtual void SetSendIcmpv6Redirect(bool sendIcmpv6Redirect)
Set the ICMPv6 Redirect sending state.
void RouteInputError(Ptr< const Packet > p, const Ipv6Header &ipHeader, Socket::SocketErrno sockErrno)
Fallback when no route is found.