21 #include "ns3/packet.h"
23 #include "ns3/callback.h"
24 #include "ns3/ipv4-address.h"
25 #include "ns3/ipv4-route.h"
27 #include "ns3/socket.h"
28 #include "ns3/net-device.h"
29 #include "ns3/uinteger.h"
30 #include "ns3/trace-source-accessor.h"
31 #include "ns3/object-vector.h"
32 #include "ns3/ipv4-header.h"
33 #include "ns3/boolean.h"
34 #include "ns3/ipv4-routing-table-entry.h"
35 #include "ns3/traffic-control-layer.h"
58 .SetGroupName (
"Internet")
60 .AddAttribute (
"DefaultTtl",
61 "The TTL value set by default on "
62 "all outgoing packets generated on this node.",
65 MakeUintegerChecker<uint8_t> ())
66 .AddAttribute (
"FragmentExpirationTimeout",
67 "When this timeout expires, the fragments "
68 "will be cleared from the buffer.",
72 .AddTraceSource (
"Tx",
73 "Send ipv4 packet to outgoing interface.",
75 "ns3::Ipv4L3Protocol::TxRxTracedCallback")
76 .AddTraceSource (
"Rx",
77 "Receive ipv4 packet from incoming interface.",
79 "ns3::Ipv4L3Protocol::TxRxTracedCallback")
80 .AddTraceSource (
"Drop",
83 "ns3::Ipv4L3Protocol::DropTracedCallback")
84 .AddAttribute (
"InterfaceList",
85 "The set of Ipv4 interfaces associated to this Ipv4 stack.",
88 MakeObjectVectorChecker<Ipv4Interface> ())
90 .AddTraceSource (
"SendOutgoing",
91 "A newly-generated packet by this node is "
92 "about to be queued for transmission",
94 "ns3::Ipv4L3Protocol::SentTracedCallback")
95 .AddTraceSource (
"UnicastForward",
96 "A unicast IPv4 packet was received by this node "
97 "and is being forwarded to another node",
99 "ns3::Ipv4L3Protocol::SentTracedCallback")
100 .AddTraceSource (
"LocalDeliver",
101 "An IPv4 packet was received by/for this node, "
102 "and it is being forward up the stack",
104 "ns3::Ipv4L3Protocol::SentTracedCallback")
171 NS_LOG_WARN (
"Trying to remove an non-existent protocol " <<
int(protocol->
GetProtocolNumber ()) <<
" on interface " <<
int(interfaceIndex));
193 L4List_t::const_iterator i;
194 if (interfaceIndex >= 0)
197 key = std::make_pair (protocolNumber, interfaceIndex);
205 key = std::make_pair (protocolNumber, -1);
312 if (it->second.IsRunning ())
314 it->second.Cancel ();
341 device = CreateObject<LoopbackNetDevice> ();
344 interface->SetDevice (device);
345 interface->SetNode (
m_node);
347 interface->AddAddress (ifaceAddr);
351 Ipv4L3Protocol::PROT_NUMBER, device);
377 Ipv4L3Protocol::PROT_NUMBER, device);
382 Ipv4L3Protocol::PROT_NUMBER, device);
387 interface->SetNode (
m_node);
388 interface->SetDevice (device);
389 interface->SetTrafficControl (tc);
391 tc->SetupDevice (device);
428 int32_t
interface = 0;
429 for (Ipv4InterfaceList::const_iterator i =
m_interfaces.begin ();
433 for (uint32_t j = 0; j < (*i)->GetNAddresses (); j++)
435 if ((*i)->GetAddress (j).GetLocal () ==
address)
451 int32_t
interface = 0;
452 for (Ipv4InterfaceList::const_iterator i =
m_interfaces.begin ();
456 for (uint32_t j = 0; j < (*i)->GetNAddresses (); j++)
458 if ((*i)->GetAddress (j).GetLocal ().CombineMask (mask) == address.
CombineMask (mask))
477 return (*iter).second;
493 NS_LOG_LOGIC (
"For me (destination " << address <<
" match)");
506 if (MulticastCheckGroup (iif, address ))
525 if (j == uint32_t (iif))
continue;
531 NS_LOG_LOGIC (
"For me (destination " << address <<
" match) on another interface");
537 NS_LOG_LOGIC (
"For me (interface broadcast address on another interface)");
550 NS_LOG_FUNCTION (
this << device << p << protocol << from << to << packetType);
552 NS_LOG_LOGIC (
"Packet from " << from <<
" received on node " <<
556 int32_t
interface = GetInterfaceForDevice(device);
557 NS_ASSERT_MSG (interface != -1,
"Received a packet from an interface that is not known to IPv4");
563 if (ipv4Interface->
IsUp ())
569 NS_LOG_LOGIC (
"Dropping received packet -- interface is down");
591 NS_LOG_LOGIC (
"Dropping received packet -- checksum not ok");
614 std::list<ArpCache::Entry *> entryList = arpCache->
LookupInverse (from);
615 std::list<ArpCache::Entry *>::iterator iter;
616 for (iter = entryList.begin (); iter != entryList.end (); iter ++)
618 if ((*iter)->IsAlive ())
620 (*iter)->UpdateSeen ();
630 socket->
ForwardUp (packet, ipHeader, ipv4Interface);
641 NS_LOG_WARN (
"No route found for forwarding packet. Drop.");
673 for (uint32_t ifaceIndex = 0; ifaceIndex <
GetNInterfaces (); ifaceIndex++)
726 NS_LOG_FUNCTION (
this << packet << source << destination << uint32_t (protocol) << route);
729 bool mayFragment =
true;
756 NS_LOG_LOGIC (
"Ipv4L3Protocol::Send case 1: limited broadcast");
757 ipHeader =
BuildHeader (source, destination, protocol, packet->
GetSize (), ttl, tos, mayFragment);
758 uint32_t ifaceIndex = 0;
759 for (Ipv4InterfaceList::iterator ifaceIter =
m_interfaces.begin ();
760 ifaceIter !=
m_interfaces.end (); ifaceIter++, ifaceIndex++)
768 for (uint32_t index = 0; index < outInterface->
GetNAddresses (); index++)
783 outInterface->
Send (packetCopy, ipHeader, destination);
790 uint32_t ifaceIndex = 0;
791 for (Ipv4InterfaceList::iterator ifaceIter =
m_interfaces.begin ();
792 ifaceIter !=
m_interfaces.end (); ifaceIter++, ifaceIndex++)
803 ipHeader =
BuildHeader (source, destination, protocol, packet->
GetSize (), ttl, tos, mayFragment);
807 outInterface->
Send (packetCopy, ipHeader, destination);
817 NS_LOG_LOGIC (
"Ipv4L3Protocol::Send case 3: passed in with route");
818 ipHeader =
BuildHeader (source, destination, protocol, packet->
GetSize (), ttl, tos, mayFragment);
831 NS_FATAL_ERROR (
"Ipv4L3Protocol::Send case 4: This case not yet implemented");
834 NS_LOG_LOGIC (
"Ipv4L3Protocol::Send case 5: passed in with no route " << destination);
837 ipHeader =
BuildHeader (source, destination, protocol, packet->
GetSize (), ttl, tos, mayFragment);
845 NS_LOG_ERROR (
"Ipv4L3Protocol::Send: m_routingProtocol == 0");
868 uint16_t payloadSize,
873 NS_LOG_FUNCTION (
this << source << destination << (uint16_t)protocol << payloadSize << (uint16_t)ttl << (uint16_t)tos << mayFragment);
882 uint64_t src = source.
Get ();
883 uint64_t dst = destination.
Get ();
884 uint64_t srcDst = dst | (src << 32);
885 std::pair<uint64_t, uint8_t> key = std::make_pair (srcDst, protocol);
887 if (mayFragment ==
true)
923 int32_t
interface = GetInterfaceForDevice (outDev);
926 NS_LOG_LOGIC (
"Send via NetDevice ifIndex " << outDev->GetIfIndex () <<
" ipv4InterfaceIndex " << interface);
930 if (outInterface->
IsUp ())
935 std::list<Ipv4PayloadHeaderPair> listFragments;
937 for ( std::list<Ipv4PayloadHeaderPair>::iterator it = listFragments.begin (); it != listFragments.end (); it++ )
957 if (outInterface->
IsUp ())
962 std::list<Ipv4PayloadHeaderPair> listFragments;
964 for ( std::list<Ipv4PayloadHeaderPair>::iterator it = listFragments.begin (); it != listFragments.end (); it++ )
992 std::map<uint32_t, uint32_t> ttlMap = mrtentry->GetOutputTtlMap ();
993 std::map<uint32_t, uint32_t>::iterator mapIter;
995 for (mapIter = ttlMap.begin (); mapIter != ttlMap.end (); mapIter++)
997 uint32_t interfaceId = mapIter->first;
1009 NS_LOG_LOGIC (
"Forward multicast via interface " << interfaceId);
1030 ipHeader.SetTtl (ipHeader.GetTtl () - 1);
1031 if (ipHeader.GetTtl () == 0)
1035 ipHeader.GetDestination ().IsBroadcast () ==
false &&
1036 ipHeader.GetDestination ().IsMulticast () ==
false)
1039 icmp->SendTimeExceededTtl (ipHeader, packet);
1069 NS_LOG_LOGIC (
"Received a fragment, processing " << *p );
1070 bool isPacketComplete;
1072 if ( isPacketComplete ==
false)
1076 NS_LOG_LOGIC (
"Got last fragment, Packet is complete " << *p );
1105 bool subnetDirected =
false;
1112 subnetDirected =
true;
1115 if (subnetDirected ==
false)
1117 GetIcmp ()->SendDestUnreachPort (ipHeader, copy);
1128 bool retVal = interface->
AddAddress (address);
1236 if (iaddr.
GetScope () > scope)
continue;
1267 NS_LOG_WARN (
"Could not find source address for " << dst <<
" and scope "
1268 << scope <<
", returning 0");
1293 return interface->
GetDevice ()->GetMtu ();
1301 return interface->
IsUp ();
1314 if (interface->GetDevice ()->GetMtu () >= 68)
1316 interface->
SetUp ();
1325 NS_LOG_LOGIC (
"Interface " <<
int(i) <<
" is set to be down for IPv4. Reason: not respecting minimum IPv4 MTU (68 octects)");
1347 NS_LOG_LOGIC (
"Forwarding state: " << interface->IsForwarding ());
1348 return interface->IsForwarding ();
1373 (*i)->SetForwarding (forward);
1402 NS_LOG_LOGIC (
"Route input failure-- dropping packet to " << ipHeader <<
" with errno " << sockErrno);
1421 "IPv4 fragmentation implementation only works without option headers." );
1423 uint16_t offset = 0;
1424 bool moreFragment =
true;
1425 uint16_t originalOffset = 0;
1426 bool alreadyFragmented =
false;
1427 uint32_t currentFragmentablePartSize = 0;
1431 alreadyFragmented =
true;
1438 uint32_t fragmentSize = (outIfaceMtu - ipv4Header.
GetSerializedSize () ) & ~uint32_t (0x7);
1440 NS_LOG_LOGIC (
"Fragmenting - Target Size: " << fragmentSize );
1446 if (p->
GetSize () > offset + fragmentSize )
1448 moreFragment =
true;
1449 currentFragmentablePartSize = fragmentSize;
1454 moreFragment =
false;
1455 currentFragmentablePartSize = p->
GetSize () - offset;
1456 if (alreadyFragmented)
1466 NS_LOG_LOGIC (
"Fragment creation - " << offset <<
", " << currentFragmentablePartSize );
1480 NS_LOG_LOGIC (
"New fragment Header " << fragmentHeader);
1482 std::ostringstream oss;
1483 oss << fragmentHeader;
1484 fragment->
Print (oss);
1490 offset += currentFragmentablePartSize;
1493 while (moreFragment);
1505 std::pair<uint64_t, uint32_t> key;
1509 key.first = addressCombination;
1510 key.second = idProto;
1514 MapFragments_t::iterator it =
m_fragments.find (key);
1517 fragments = Create<Fragments> ();
1518 m_fragments.insert (std::make_pair (key, fragments));
1521 key, ipHeader, iif);
1525 fragments = it->second;
1550 : m_moreFragment (0)
1565 std::list<std::pair<Ptr<Packet>, uint16_t> >::iterator it;
1569 if (it->second > fragmentOffset)
1577 m_moreFragment = moreFragment;
1588 bool ret = !m_moreFragment &&
m_fragments.size () > 0;
1592 uint16_t lastEndOffset = 0;
1597 NS_LOG_LOGIC (
"Checking overlaps " << lastEndOffset <<
" - " << it->second );
1599 if (lastEndOffset < it->
second)
1605 uint16_t fragmentEnd = it->first->GetSize () + it->second;
1606 lastEndOffset =
std::max ( lastEndOffset, fragmentEnd );
1618 std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it =
m_fragments.begin ();
1621 uint16_t lastEndOffset = p->
GetSize ();
1626 if ( lastEndOffset > it->second )
1632 uint32_t newStart = lastEndOffset - it->second;
1633 if ( it->first->GetSize () > newStart )
1635 uint32_t newSize = it->first->GetSize () - newStart;
1636 Ptr<Packet> tempFragment = it->first->CreateFragment (newStart, newSize);
1645 lastEndOffset = p->
GetSize ();
1656 std::list<std::pair<Ptr<Packet>, uint16_t> >::const_iterator it =
m_fragments.begin ();
1659 uint16_t lastEndOffset = 0;
1668 if ( lastEndOffset > it->second )
1670 uint32_t newStart = lastEndOffset - it->second;
1671 uint32_t newSize = it->first->GetSize () - newStart;
1672 Ptr<Packet> tempFragment = it->first->CreateFragment (newStart, newSize);
1675 else if ( lastEndOffset == it->second )
1680 lastEndOffset = p->
GetSize ();
1691 MapFragments_t::iterator it =
m_fragments.find (key);
1692 Ptr<Packet> packet = it->second->GetPartialPacket ();
1698 icmp->SendTimeExceededTtl (ipHeader, packet);
virtual Ipv4Address SourceAddressSelection(uint32_t interface, Ipv4Address dest)
Choose the source address to use with destination address.
void SetDown(void)
Disable this interface.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
bool m_weakEsModel
Weak ES model state.
void SetForwarding(bool val)
InterfaceAddressScope_e
Address scope.
void SetDefaultTtl(uint8_t ttl)
virtual void SetIpForward(bool forward)
Set or unset the IP forwarding state.
void Receive(Ptr< NetDevice > device, Ptr< const Packet > p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType)
Receive a packet.
Ptr< Packet > GetPacket() const
Get the entire packet.
void Send(Ptr< Packet > p, const Ipv4Header &hdr, Ipv4Address dest)
static Ipv4Address GetAny(void)
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
SocketErrno
Enumeration of the possible errors returned by a socket.
virtual void NotifyNewAggregate()
This function will notify other components connected to the node that a new stack member is now conne...
Time m_fragmentExpirationTimeout
Expiration timeout.
Ipv4Mask GetMask(void) const
Get the network mask.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Ipv4Address GetLocal(void) const
Get the local address.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Introspection did not find any typical Config paths.
uint8_t GetTos(void) const
Get the tag's TOS.
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > m_sendOutgoingTrace
Trace of sent packets.
a class to represent an Ipv4 address mask
static bool ChecksumEnabled(void)
ArpCache::Entry * Lookup(Ipv4Address destination)
Do lookup in the ARP cache against an IP address.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
bool IsLocalMulticast(void) const
Ptr< const AttributeAccessor > MakeObjectVectorAccessor(U T::*memberVariable)
MakeAccessorHelper implementation for ObjectVector.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
PacketType
Packet types are used as they are in Linux.
U * PeekPointer(const Ptr< U > &p)
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
virtual bool GetWeakEsModel(void) const
Get the Weak Es Model status.
void SetNode(Ptr< Node > node)
Set the node associated with this socket.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Ptr< ArpCache > GetArpCache() const
bool IsMulticast(void) const
Ipv4Address CombineMask(Ipv4Mask const &mask) const
Combine this address with a network mask.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
int32_t GetInterfaceForDevice(Ptr< const NetDevice > device) const
virtual void DoDispose(void)
Destructor implementation.
virtual void Receive(Ptr< NetDevice > device, Ptr< const Packet > p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType)
Called by NetDevices, incoming packet.
int32_t GetInterfaceForPrefix(Ipv4Address addr, Ipv4Mask mask) const
Return the interface number of first interface found that has an Ipv4 address within the prefix speci...
bool AddAddress(Ipv4InterfaceAddress address)
uint32_t AddInterface(Ptr< NetDevice > device)
TracedCallback< const Ipv4Header &, Ptr< const Packet >, DropReason, Ptr< Ipv4 >, uint32_t > m_dropTrace
Trace of dropped packets.
static uint8_t IpTos2Priority(uint8_t ipTos)
Return the priority corresponding to a given TOS value.
virtual int GetProtocolNumber(void) const =0
Returns the protocol number of this protocol.
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer...
void Print(std::ostream &os) const
Print the packet contents.
Ptr< Ipv4RoutingProtocol > m_routingProtocol
Routing protocol associated with the stack.
L4List_t m_protocols
List of transport protocol.
a polymophic address class
Ipv4InterfaceAddress GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const
Because addresses can be removed, the addressIndex is not guaranteed to be static across calls to thi...
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
void SetSource(Ipv4Address src)
bool IsSubnetDirectedBroadcast(Ipv4Mask const &mask) const
Generate subnet-directed broadcast address corresponding to mask.
Ptr< NetDevice > GetOutputDevice(void) const
Ipv4InterfaceList m_interfaces
List of IPv4 interfaces.
bool IsDestinationAddress(Ipv4Address address, uint32_t iif) const
Determine whether address and interface corresponding to received packet can be accepted for local de...
Ptr< Packet > GetPartialPacket() const
Get the complete part of the packet.
TracedCallback< Ptr< const Packet >, Ptr< Ipv4 >, uint32_t > m_rxTrace
Trace of received packets.
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
void AddAtEnd(Ptr< const Packet > packet)
Concatenate the input packet at the end of the current packet.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Fragment timeout exceeded.
void SetupLoopback(void)
Setup loopback interface.
AttributeValue implementation for Time.
Ptr< Icmpv4L4Protocol > GetIcmp(void) const
Get ICMPv4 protocol.
uint32_t Get(void) const
Get the host-order 32-bit IP address.
void SetGateway(Ipv4Address gw)
TracedCallback< Ptr< const Packet >, Ptr< Ipv4 >, uint32_t > m_txTrace
Trace of transmitted packets.
Hold an unsigned integer type.
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > m_localDeliverTrace
Trace of locally delivered packets.
bool IsEntire() const
If all fragments have been added.
void SetMetric(uint32_t i, uint16_t metric)
virtual void DoDispose(void)
Destructor implementation.
bool IsBroadcast(void) const
indicates whether the socket has a priority set.
void CallTxTrace(const Ipv4Header &ipHeader, Ptr< Packet > packet, Ptr< Ipv4 > ipv4, uint32_t interface)
Make a copy of the packet, add the header and invoke the TX trace callback.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Ptr< Socket > CreateRawSocket(void)
Creates a raw socket.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
virtual enum RxStatus Receive(Ptr< Packet > p, Ipv4Header const &header, Ptr< Ipv4Interface > incomingInterface)=0
Called from lower-level layers to send the packet up in the stack.
void Send(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr< Ipv4Route > route)
static TypeId GetTypeId(void)
Get the type ID.
bool IsUp(uint32_t i) const
MapFragments_t m_fragments
Fragmented packets.
void SendWithHeader(Ptr< Packet > packet, Ipv4Header ipHeader, Ptr< Ipv4Route > route)
void IpForward(Ptr< Ipv4Route > rtentry, Ptr< const Packet > p, const Ipv4Header &header)
Forward a packet.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Ipv4Address GetGateway(void) const
bool RemoveAddress(uint32_t interfaceIndex, uint32_t addressIndex)
Remove the address at addressIndex on named interface.
bool IsSecondary(void) const
Check if the address is a secondary address.
void AddFragment(Ptr< Packet > fragment, uint16_t fragmentOffset, bool moreFragment)
Add a fragment.
Ipv4InterfaceAddress GetAddress(uint32_t index) const
Access to the IPv4 forwarding table, interfaces, and configuration.
bool m_ipForward
Forwarding packets (i.e.
uint32_t GetNDevices(void) const
void SetForwarding(uint32_t i, bool val)
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
void DoFragmentation(Ptr< Packet > packet, const Ipv4Header &ipv4Header, uint32_t outIfaceMtu, std::list< Ipv4PayloadHeaderPair > &listFragments)
Fragment a packet.
Implement the IPv4 layer.
static const uint16_t PROT_NUMBER
ARP protocol number (0x0806)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
int32_t GetInterfaceForAddress(Ipv4Address addr) const
Return the interface number of the interface that has been assigned the specified IP address...
std::pair< Ptr< Packet >, Ipv4Header > Ipv4PayloadHeaderPair
Pair of a packet and an Ipv4 header.
bool IsEqual(const Ipv4Address &other) const
Comparison operation between two Ipv4Addresses.
void RemoveAtEnd(uint32_t size)
Remove size bytes from the end of the current packet.
std::pair< int, int32_t > L4ListKey_t
Container of the IPv4 L4 keys: protocol number, interface index.
Ptr< Node > m_node
Node attached to stack.
void RouteInputError(Ptr< const Packet > p, const Ipv4Header &ipHeader, Socket::SocketErrno sockErrno)
Fallback when no route is found.
Ipv4Header BuildHeader(Ipv4Address source, Ipv4Address destination, uint8_t protocol, uint16_t payloadSize, uint8_t ttl, uint8_t tos, bool mayFragment)
Construct an IPv4 header.
void SendRealOut(Ptr< Ipv4Route > route, Ptr< Packet > packet, Ipv4Header const &ipHeader)
Send packet with route.
A record that that holds information about an ArpCache entry.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
static Time Now(void)
Return the current simulation virtual time.
void SetOutputDevice(Ptr< NetDevice > outputDevice)
Equivalent in Linux to dst_entry.dev.
static Ipv4Address GetLoopback(void)
static Ipv4Mask GetLoopback(void)
void RegisterProtocolHandler(ProtocolHandler handler, uint16_t protocolType, Ptr< NetDevice > device, bool promiscuous=false)
Ptr< NetDevice > GetNetDevice(uint32_t i)
uint16_t GetMetric(void) const
void UpdateSeen(void)
Update the entry when seeing a packet.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
bool ProcessFragment(Ptr< Packet > &packet, Ipv4Header &ipHeader, uint32_t iif)
Process a packet fragment.
uint32_t AddIpv4Interface(Ptr< Ipv4Interface > interface)
Add an IPv4 interface to the stack.
virtual void Remove(Ptr< IpL4Protocol > protocol)
Ipv4 addresses are stored in host order in this class.
Ipv4Address GetBroadcast(void) const
Get the broadcast address.
virtual void SetWeakEsModel(bool model)
Set or unset the Weak Es Model.
void SetNode(Ptr< Node > node)
Set node associated with this stack.
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
uint32_t GetId(void) const
a class to store IPv4 address information on an interface
SocketList m_sockets
List of IPv4 raw sockets.
void DeleteRawSocket(Ptr< Socket > socket)
Deletes a particular raw socket.
bool AddAddress(uint32_t i, Ipv4InterfaceAddress address)
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Ptr< NetDevice > GetDevice(void) const
Ptr< Ipv4Interface > GetInterface(uint32_t i) const
Get an interface.
static uint16_t GetStaticProtocolNumber(void)
Get the protocol number.
virtual void Insert(Ptr< IpL4Protocol > protocol)
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
bool IsUnicast(Ipv4Address ad) const
Check if an IPv4 address is unicast according to the node.
void LocalDeliver(Ptr< const Packet > p, Ipv4Header const &ip, uint32_t iif)
Deliver a packet.
void IpMulticastForward(Ptr< Ipv4MulticastRoute > mrtentry, Ptr< const Packet > p, const Ipv4Header &header)
Forward a multicast packet.
Time Seconds(double value)
Construct a Time in the indicated unit.
uint32_t GetNAddresses(uint32_t interface) const
MapFragmentsTimers_t m_fragmentsTimers
Expiration events.
uint16_t GetMtu(uint32_t i) const
void Receive(Ptr< NetDevice > device, Ptr< const Packet > p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType)
Lower layer calls this method after calling L3Demux::Lookup The ARP subclass needs to know from which...
bool ForwardUp(Ptr< const Packet > p, Ipv4Header ipHeader, Ptr< Ipv4Interface > incomingInterface)
Forward up to receive method.
Ipv4InterfaceAddress::InterfaceAddressScope_e GetScope(void) const
Get address scope.
uint8_t m_defaultTtl
Default TTL.
uint32_t GetNInterfaces(void) const
Ptr< T > CreateObject(void)
Create an object by type, with varying number of constructor parameters.
virtual Ptr< IpL4Protocol > GetProtocol(int protocolNumber) const
void SetMetric(uint16_t metric)
std::list< ArpCache::Entry * > LookupInverse(Address destination)
Do lookup in the ARP cache against a MAC address.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
uint8_t GetTtl(void) const
Get the tag's TTL.
virtual void NotifyNewAggregate(void)
Notify all Objects aggregated to this one of a new Object being aggregated.
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > m_unicastForwardTrace
Trace of unicast forwarded packets.
Container for a set of ns3::Object pointers.
This is the implementation of the ICMP protocol as described in RFC 792.
uint16_t GetMetric(uint32_t i) const
void SetPriority(uint8_t priority)
Set the tag's priority.
Ptr< Ipv4RoutingProtocol > GetRoutingProtocol(void) const
Get the routing protocol to be used by this Ipv4 stack.
Ipv4InterfaceReverseContainer m_reverseInterfacesContainer
Container of NetDevice / Interface index associations.
indicates whether the socket has IP_TOS set.
uint32_t GetNAddresses(void) const
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
a unique identifier for an interface.
std::map< std::pair< uint64_t, uint8_t >, uint16_t > m_identification
Identification (for each {src, dst, proto} tuple)
TypeId SetParent(TypeId tid)
Set the parent TypeId.
void test(void)
Example use of ns3::SystemThread.
Interface is down so can not send packet.
virtual ~Ipv4L3Protocol()
void HandleFragmentsTimeout(std::pair< uint64_t, uint32_t > key, Ipv4Header &ipHeader, uint32_t iif)
Process the timeout for packet fragments.
virtual bool GetIpForward(void) const
Get the IP forwarding state.
void AddHeader(const Header &header)
Add header to this packet.
static const uint8_t PROT_NUMBER
ICMP protocol number (0x1)
static const uint16_t PROT_NUMBER
Protocol number (0x0800)
void SetDestination(Ipv4Address dest)
bool IsUp(void) const
These are IP interface states and may be distinct from NetDevice states, such as found in real implem...
void SetUp(void)
Enable this interface.
bool IsForwarding(uint32_t i) const
Ipv4Address SelectSourceAddress(Ptr< const NetDevice > device, Ipv4Address dst, Ipv4InterfaceAddress::InterfaceAddressScope_e scope)
Return the first primary source address with scope less than or equal to the requested scope...
void SetRoutingProtocol(Ptr< Ipv4RoutingProtocol > routingProtocol)
Register a new routing protocol to be used by this Ipv4 stack.