Implement the Ipv4 layer. More...
#include <ipv4-l3-protocol.h>
Classes | |
class | Fragments |
A Set of Fragment belonging to the same packet (src, dst, identification and proto) More... |
Public Types | |
enum | DropReason { DROP_TTL_EXPIRED = 1, DROP_NO_ROUTE, DROP_BAD_CHECKSUM, DROP_INTERFACE_DOWN, DROP_ROUTE_ERROR, DROP_FRAGMENT_TIMEOUT } |
Reason why a packet has been dropped. More... |
Public Member Functions | |
Ipv4L3Protocol () | |
virtual | ~Ipv4L3Protocol () |
bool | AddAddress (uint32_t i, Ipv4InterfaceAddress address) |
uint32_t | AddInterface (Ptr< NetDevice > device) |
Ptr< Socket > | CreateRawSocket (void) |
Creates a raw socket. | |
void | DeleteRawSocket (Ptr< Socket > socket) |
Deletes a particular raw socket. | |
Ipv4InterfaceAddress | GetAddress (uint32_t interfaceIndex, uint32_t addressIndex) const |
Ptr< Ipv4Interface > | GetInterface (uint32_t i) const |
int32_t | GetInterfaceForAddress (Ipv4Address addr) const |
Return the interface number of the interface that has been assigned the specified IP address. | |
int32_t | GetInterfaceForDevice (Ptr< const NetDevice > device) const |
int32_t | GetInterfaceForPrefix (Ipv4Address addr, Ipv4Mask mask) const |
Return the interface number of first interface found that has an Ipv4 address within the prefix specified by the input address and mask parameters. | |
uint16_t | GetMetric (uint32_t i) const |
uint16_t | GetMtu (uint32_t i) const |
uint32_t | GetNAddresses (uint32_t interface) const |
Ptr< NetDevice > | GetNetDevice (uint32_t i) |
uint32_t | GetNInterfaces (void) const |
Ptr< IpL4Protocol > | GetProtocol (int protocolNumber) const |
Ptr< Ipv4RoutingProtocol > | GetRoutingProtocol (void) const |
Get the routing protocol to be used by this Ipv4 stack. | |
void | Insert (Ptr< IpL4Protocol > protocol) |
bool | IsDestinationAddress (Ipv4Address address, uint32_t iif) const |
Determine whether address and interface corresponding to received packet can be accepted for local delivery. | |
bool | IsForwarding (uint32_t i) const |
bool | IsUp (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) |
void | Remove (Ptr< IpL4Protocol > protocol) |
bool | RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex) |
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, to use in sending a packet to destination dst out of the specified device. | |
void | Send (Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr< Ipv4Route > route) |
void | SendWithHeader (Ptr< Packet > packet, Ipv4Header ipHeader, Ptr< Ipv4Route > route) |
void | SetDefaultTtl (uint8_t ttl) |
void | SetDown (uint32_t i) |
void | SetForwarding (uint32_t i, bool val) |
void | SetMetric (uint32_t i, uint16_t metric) |
void | SetNode (Ptr< Node > node) |
void | SetRoutingProtocol (Ptr< Ipv4RoutingProtocol > routingProtocol) |
Register a new routing protocol to be used by this Ipv4 stack. | |
void | SetUp (uint32_t i) |
![]() | |
Ipv4 () | |
virtual | ~Ipv4 () |
![]() | |
Object () | |
virtual | ~Object () |
void | AggregateObject (Ptr< Object > other) |
void | Dispose (void) |
AggregateIterator | GetAggregateIterator (void) const |
virtual TypeId | GetInstanceTypeId (void) const |
template<typename T > | |
Ptr< T > | GetObject (void) const |
template<typename T > | |
Ptr< T > | GetObject (TypeId tid) const |
void | Initialize (void) |
![]() | |
SimpleRefCount () | |
SimpleRefCount (const SimpleRefCount &o) | |
uint32_t | GetReferenceCount (void) const |
SimpleRefCount & | operator= (const SimpleRefCount &o) |
void | Ref (void) const |
void | Unref (void) const |
![]() | |
virtual | ~ObjectBase () |
void | GetAttribute (std::string name, AttributeValue &value) const |
bool | GetAttributeFailSafe (std::string name, AttributeValue &attribute) const |
void | SetAttribute (std::string name, const AttributeValue &value) |
bool | SetAttributeFailSafe (std::string name, const AttributeValue &value) |
bool | TraceConnect (std::string name, std::string context, const CallbackBase &cb) |
bool | TraceConnectWithoutContext (std::string name, const CallbackBase &cb) |
bool | TraceDisconnect (std::string name, std::string context, const CallbackBase &cb) |
bool | TraceDisconnectWithoutContext (std::string name, const CallbackBase &cb) |
Static Public Member Functions | |
static TypeId | GetTypeId (void) |
Static Public Attributes | |
static const uint16_t | PROT_NUMBER = 0x0800 |
![]() | |
static const uint32_t | IF_ANY = 0xffffffff |
Protected Member Functions | |
virtual void | DoDispose (void) |
virtual void | NotifyNewAggregate () |
Private Types | |
typedef std::vector< Ptr < Ipv4Interface > > | Ipv4InterfaceList |
typedef std::list< Ptr < IpL4Protocol > > | L4List_t |
typedef std::map< std::pair < uint64_t, uint32_t >, Ptr < Fragments > > | MapFragments_t |
typedef std::map< std::pair < uint64_t, uint32_t > , EventId > | MapFragmentsTimers_t |
typedef std::list< Ptr < Ipv4RawSocketImpl > > | SocketList |
Private Member Functions | |
Ipv4L3Protocol (const Ipv4L3Protocol &) | |
uint32_t | AddIpv4Interface (Ptr< Ipv4Interface > interface) |
Ipv4Header | BuildHeader (Ipv4Address source, Ipv4Address destination, uint8_t protocol, uint16_t payloadSize, uint8_t ttl, uint8_t tos, bool mayFragment) |
void | DoFragmentation (Ptr< Packet > packet, uint32_t outIfaceMtu, std::list< Ptr< Packet > > &listFragments) |
Fragment a packet. | |
Ptr< Icmpv4L4Protocol > | GetIcmp (void) const |
Get ICMPv4 protocol. | |
virtual bool | GetIpForward (void) const |
virtual bool | GetWeakEsModel (void) const |
void | HandleFragmentsTimeout (std::pair< uint64_t, uint32_t > key, Ipv4Header &ipHeader, uint32_t iif) |
Process the timeout for packet fragments. | |
void | IpForward (Ptr< Ipv4Route > rtentry, Ptr< const Packet > p, const Ipv4Header &header) |
void | IpMulticastForward (Ptr< Ipv4MulticastRoute > mrtentry, Ptr< const Packet > p, const Ipv4Header &header) |
bool | IsUnicast (Ipv4Address ad, Ipv4Mask interfaceMask) const |
void | LocalDeliver (Ptr< const Packet > p, Ipv4Header const &ip, uint32_t iif) |
Ipv4L3Protocol & | operator= (const Ipv4L3Protocol &) |
bool | ProcessFragment (Ptr< Packet > &packet, Ipv4Header &ipHeader, uint32_t iif) |
Process a packet fragment. | |
void | RouteInputError (Ptr< const Packet > p, const Ipv4Header &ipHeader, Socket::SocketErrno sockErrno) |
void | SendRealOut (Ptr< Ipv4Route > route, Ptr< Packet > packet, Ipv4Header const &ipHeader) |
virtual void | SetIpForward (bool forward) |
void | SetupLoopback (void) |
virtual void | SetWeakEsModel (bool model) |
Private Attributes | |
uint8_t | m_defaultTos |
uint8_t | m_defaultTtl |
TracedCallback< const Ipv4Header &, Ptr< const Packet >, DropReason, Ptr < Ipv4 >, uint32_t > | m_dropTrace |
Time | m_fragmentExpirationTimeout |
MapFragments_t | m_fragments |
The hash of fragmented packets. | |
MapFragmentsTimers_t | m_fragmentsTimers |
uint16_t | m_identification |
Ipv4InterfaceList | m_interfaces |
bool | m_ipForward |
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > | m_localDeliverTrace |
Ptr< Node > | m_node |
L4List_t | m_protocols |
Ptr< Ipv4RoutingProtocol > | m_routingProtocol |
TracedCallback< Ptr< const Packet >, Ptr< Ipv4 > , uint32_t > | m_rxTrace |
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > | m_sendOutgoingTrace |
SocketList | m_sockets |
TracedCallback< Ptr< const Packet >, Ptr< Ipv4 > , uint32_t > | m_txTrace |
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > | m_unicastForwardTrace |
bool | m_weakEsModel |
Friends | |
class | Ipv4L3ProtocolTestCase |
Implement the Ipv4 layer.
This is the actual implementation of IP. It contains APIs to send and receive packets at the IP layer, as well as APIs for IP routing.
This class contains two distinct groups of trace sources. The trace sources 'Rx' and 'Tx' are called, respectively, immediately after receiving from the NetDevice and immediately before sending to a NetDevice for transmitting a packet. These are low level trace sources that include the Ipv4Header already serialized into the packet. In contrast, the Drop, SendOutgoing, UnicastForward, and LocalDeliver trace sources are slightly higher-level and pass around the Ipv4Header as an explicit parameter and not as part of the packet.
IP fragmentation and reassembly is handled at this level. At the moment the fragmentation does not handle IP option headers, and in particular the ones that shall not be fragmented. Moreover, the actual implementation does not mimic exactly the Linux kernel. Hence it is not possible, for instance, to test a fragmentation attack.
ns3::Ipv4L3Protocol is accessible through the following paths with Config::Set and Config::Connect:
Definition at line 77 of file ipv4-l3-protocol.h.
|
private |
Definition at line 293 of file ipv4-l3-protocol.h.
|
private |
Definition at line 295 of file ipv4-l3-protocol.h.
|
private |
Definition at line 376 of file ipv4-l3-protocol.h.
|
private |
Definition at line 377 of file ipv4-l3-protocol.h.
|
private |
Definition at line 294 of file ipv4-l3-protocol.h.
Reason why a packet has been dropped.
DROP_TTL_EXPIRED |
Packet TTL has expired |
DROP_NO_ROUTE |
No route to host |
DROP_BAD_CHECKSUM |
Bad checksum |
DROP_INTERFACE_DOWN |
Interface is down so can not send packet |
DROP_ROUTE_ERROR |
Route error |
DROP_FRAGMENT_TIMEOUT |
Fragment timeout exceeded |
Definition at line 90 of file ipv4-l3-protocol.h.
ns3::Ipv4L3Protocol::Ipv4L3Protocol | ( | ) |
Definition at line 92 of file ipv4-l3-protocol.cc.
References NS_LOG_FUNCTION.
|
virtual |
Definition at line 99 of file ipv4-l3-protocol.cc.
References NS_LOG_FUNCTION.
|
private |
|
virtual |
interface | Interface number of an Ipv4 interface |
address | Ipv4InterfaceAddress address to associate with the underlying Ipv4 interface |
Implements ns3::Ipv4.
Definition at line 937 of file ipv4-l3-protocol.cc.
References ns3::Ipv4Interface::AddAddress(), GetInterface(), m_routingProtocol, ns3::Ipv4RoutingProtocol::NotifyAddAddress(), and NS_LOG_FUNCTION.
device | device to add to the list of Ipv4 interfaces which can be used as output interfaces during packet forwarding. |
Once a device has been added, it can never be removed: if you want to disable it, you can invoke Ipv4::SetDown which will make sure that it is never used during packet forwarding.
Implements ns3::Ipv4.
Definition at line 280 of file ipv4-l3-protocol.cc.
References AddIpv4Interface(), ns3::CreateObject(), m_ipForward, m_node, ns3::MakeCallback(), NS_LOG_FUNCTION, ns3::PeekPointer(), ns3::ArpL3Protocol::PROT_NUMBER, PROT_NUMBER, ns3::ArpL3Protocol::Receive(), Receive(), and ns3::Node::RegisterProtocolHandler().
|
private |
Definition at line 298 of file ipv4-l3-protocol.cc.
References m_interfaces, and NS_LOG_FUNCTION.
Referenced by AddInterface(), and SetupLoopback().
|
private |
Definition at line 694 of file ipv4-l3-protocol.cc.
References ns3::Node::ChecksumEnabled(), ns3::Ipv4Header::EnableChecksum(), m_identification, NS_LOG_FUNCTION, ns3::Ipv4Header::SetDestination(), ns3::Ipv4Header::SetDontFragment(), ns3::Ipv4Header::SetIdentification(), ns3::Ipv4Header::SetMayFragment(), ns3::Ipv4Header::SetPayloadSize(), ns3::Ipv4Header::SetProtocol(), ns3::Ipv4Header::SetSource(), ns3::Ipv4Header::SetTos(), and ns3::Ipv4Header::SetTtl().
Referenced by Send().
Creates a raw socket.
Implements ns3::Ipv4.
Definition at line 140 of file ipv4-l3-protocol.cc.
References m_node, m_sockets, NS_LOG_FUNCTION, and ns3::Ipv4RawSocketImpl::SetNode().
Deletes a particular raw socket.
socket | Smart pointer to the raw socket to be deleted |
Implements ns3::Ipv4.
Definition at line 149 of file ipv4-l3-protocol.cc.
References m_sockets, and NS_LOG_FUNCTION.
|
protectedvirtual |
This method is called by Object::Dispose or by the object's destructor, whichever comes first.
Subclasses are expected to implement their real destruction code in an overriden version of this method and chain up to their parent's implementation once they are done. i.e., for simplicity, the destructor of every subclass should be empty and its content should be moved to the associated DoDispose method.
It is safe to call GetObject from within this method.
Reimplemented from ns3::Object.
Definition at line 200 of file ipv4-l3-protocol.cc.
References m_fragments, m_fragmentsTimers, m_interfaces, m_node, m_protocols, m_routingProtocol, m_sockets, and NS_LOG_FUNCTION.
|
private |
Fragment a packet.
packet | the packet |
outIfaceMtu | the MTU of the interface |
listFragments | the list of fragments |
Definition at line 1158 of file ipv4-l3-protocol.cc.
References ns3::Packet::AddHeader(), ns3::Node::ChecksumEnabled(), ns3::Packet::Copy(), ns3::Packet::CreateFragment(), ns3::Ipv4Header::EnableChecksum(), ns3::Ipv4Header::GetFragmentOffset(), ns3::Ipv4Header::GetSerializedSize(), ns3::Packet::GetSize(), ns3::Ipv4Header::IsLastFragment(), NS_ASSERT_MSG, NS_LOG_FUNCTION, NS_LOG_LOGIC, ns3::Packet::Print(), ns3::Packet::RemoveHeader(), ns3::Ipv4Header::SetFragmentOffset(), ns3::Ipv4Header::SetLastFragment(), ns3::Ipv4Header::SetMoreFragments(), and ns3::Ipv4Header::SetPayloadSize().
Referenced by SendRealOut().
|
virtual |
Because addresses can be removed, the addressIndex is not guaranteed to be static across calls to this method.
interface | Interface number of an Ipv4 interface |
addressIndex | index of Ipv4InterfaceAddress |
Implements ns3::Ipv4.
Definition at line 950 of file ipv4-l3-protocol.cc.
References ns3::Ipv4Interface::GetAddress(), GetInterface(), and NS_LOG_FUNCTION.
Referenced by IsDestinationAddress(), LocalDeliver(), ns3::aodv::RoutingProtocol::NotifyAddAddress(), ns3::dsdv::RoutingProtocol::NotifyAddAddress(), ns3::aodv::RoutingProtocol::NotifyRemoveAddress(), ns3::dsdv::RoutingProtocol::NotifyRemoveAddress(), SelectSourceAddress(), Send(), and ns3::dsr::DsrRouting::Start().
|
private |
Get ICMPv4 protocol.
Definition at line 528 of file ipv4-l3-protocol.cc.
References ns3::Object::GetObject(), GetProtocol(), ns3::Icmpv4L4Protocol::GetStaticProtocolNumber(), and NS_LOG_FUNCTION.
Referenced by HandleFragmentsTimeout(), IpForward(), and LocalDeliver().
Ptr< Ipv4Interface > ns3::Ipv4L3Protocol::GetInterface | ( | uint32_t | i | ) | const |
Definition at line 307 of file ipv4-l3-protocol.cc.
References m_interfaces, and NS_LOG_FUNCTION.
Referenced by AddAddress(), ns3::dsr::DsrRouting::DoDispose(), ns3::EpcS1uUlTestCase::DoRun(), GetAddress(), GetMetric(), GetMtu(), GetNAddresses(), GetNetDevice(), IsForwarding(), IsUp(), LocalDeliver(), RemoveAddress(), SendRealOut(), SetDown(), SetForwarding(), SetMetric(), SetUp(), and ns3::dsr::DsrRouting::Start().
|
virtual |
Return the interface number of the interface that has been assigned the specified IP address.
address | The IP address being searched for |
Each IP interface has one or more IP addresses associated with it. This method searches the list of interfaces for one that holds a particular address. This call takes an IP address as a parameter and returns the interface number of the first interface that has been assigned that address, or -1 if not found. There must be an exact match; this method will not match broadcast or multicast addresses.
Implements ns3::Ipv4.
Definition at line 325 of file ipv4-l3-protocol.cc.
References m_interfaces, and NS_LOG_FUNCTION.
Referenced by ns3::dsr::DsrRouting::SendReply(), and ns3::dsr::DsrRouting::Start().
device | The NetDevice for an Ipv4Interface |
Implements ns3::Ipv4.
Definition at line 370 of file ipv4-l3-protocol.cc.
References m_interfaces, and NS_LOG_FUNCTION.
Referenced by IpForward(), SelectSourceAddress(), Send(), and SendRealOut().
|
virtual |
Return the interface number of first interface found that has an Ipv4 address within the prefix specified by the input address and mask parameters.
address | The IP address assigned to the interface of interest. |
mask | The IP prefix to use in the mask |
Each IP interface has one or more IP addresses associated with it. This method searches the list of interfaces for the first one found that holds an address that is included within the prefix formed by the input address and mask parameters. The value -1 is returned if no match is found.
Implements ns3::Ipv4.
Definition at line 347 of file ipv4-l3-protocol.cc.
References ns3::Ipv4Address::CombineMask(), m_interfaces, and NS_LOG_FUNCTION.
|
privatevirtual |
Definition at line 1129 of file ipv4-l3-protocol.cc.
References m_ipForward, and NS_LOG_FUNCTION.
|
virtual |
interface | The interface number of an Ipv4 interface |
Implements ns3::Ipv4.
Definition at line 1044 of file ipv4-l3-protocol.cc.
References GetInterface(), ns3::Ipv4Interface::GetMetric(), and NS_LOG_FUNCTION.
|
virtual |
interface | Interface number of Ipv4 interface |
Implements ns3::Ipv4.
Definition at line 1052 of file ipv4-l3-protocol.cc.
References ns3::Ipv4Interface::GetDevice(), GetInterface(), ns3::NetDevice::GetMtu(), and NS_LOG_FUNCTION.
|
virtual |
interface | Interface number of an Ipv4 interface |
Implements ns3::Ipv4.
Definition at line 958 of file ipv4-l3-protocol.cc.
References GetInterface(), ns3::Ipv4Interface::GetNAddresses(), and NS_LOG_FUNCTION.
Referenced by IsDestinationAddress(), LocalDeliver(), ns3::aodv::RoutingProtocol::NotifyAddAddress(), ns3::aodv::RoutingProtocol::NotifyRemoveAddress(), ns3::dsdv::RoutingProtocol::NotifyRemoveAddress(), SelectSourceAddress(), and Send().
interface | The interface number of an Ipv4 interface. |
Implements ns3::Ipv4.
Definition at line 1111 of file ipv4-l3-protocol.cc.
References ns3::Ipv4Interface::GetDevice(), GetInterface(), and NS_LOG_FUNCTION.
Referenced by ns3::dsr::DsrRouting::DoDispose(), IpMulticastForward(), ns3::aodv::RoutingProtocol::NotifyAddAddress(), ns3::dsdv::RoutingProtocol::NotifyAddAddress(), ns3::dsdv::RoutingProtocol::NotifyInterfaceDown(), ns3::dsr::DsrRouting::SendReply(), and ns3::dsr::DsrRouting::Start().
|
virtual |
Implements ns3::Ipv4.
Definition at line 318 of file ipv4-l3-protocol.cc.
References m_interfaces, and NS_LOG_FUNCTION.
Referenced by ns3::dsr::DsrRouting::DoDispose(), IsDestinationAddress(), SelectSourceAddress(), and ns3::dsr::DsrRouting::Start().
|
virtual |
protocolNumber | number of protocol to lookup in this L4 Demux |
This method is typically called by lower layers to forward packets up the stack to the right protocol.
Implements ns3::Ipv4.
Definition at line 111 of file ipv4-l3-protocol.cc.
References m_protocols, and NS_LOG_FUNCTION.
Referenced by GetIcmp(), LocalDeliver(), and ns3::dsr::DsrRouting::Receive().
|
virtual |
Get the routing protocol to be used by this Ipv4 stack.
Implements ns3::Ipv4.
Definition at line 193 of file ipv4-l3-protocol.cc.
References m_routingProtocol, and NS_LOG_FUNCTION.
|
static |
Reimplemented from ns3::Ipv4.
Definition at line 52 of file ipv4-l3-protocol.cc.
References m_defaultTos, m_defaultTtl, m_dropTrace, m_fragmentExpirationTimeout, m_interfaces, m_localDeliverTrace, m_rxTrace, m_sendOutgoingTrace, m_txTrace, m_unicastForwardTrace, ns3::MakeObjectVectorAccessor(), ns3::MakeTraceSourceAccessor(), ns3::Seconds(), and ns3::TypeId::SetParent().
|
privatevirtual |
Definition at line 1143 of file ipv4-l3-protocol.cc.
References m_weakEsModel, and NS_LOG_FUNCTION.
Referenced by IsDestinationAddress().
|
private |
Process the timeout for packet fragments.
key | representing the packet fragments |
ipHeader | the IP header of the original packet |
iif | Input Interface |
Definition at line 1438 of file ipv4-l3-protocol.cc.
References DROP_FRAGMENT_TIMEOUT, GetIcmp(), ns3::Object::GetObject(), ns3::Packet::GetSize(), m_dropTrace, m_fragments, m_fragmentsTimers, m_node, and NS_LOG_FUNCTION.
Referenced by ProcessFragment().
|
virtual |
protocol | a template for the protocol to add to this L4 Demux. |
Invoke Copy on the input template to get a copy of the input protocol which can be used on the Node on which this L4 Demux is running. The new L4Protocol is registered internally as a working L4 Protocol and returned from this method. The caller does not get ownership of the returned pointer.
Implements ns3::Ipv4.
Definition at line 105 of file ipv4-l3-protocol.cc.
References m_protocols, and NS_LOG_FUNCTION.
Referenced by ns3::NscTcpL4Protocol::NotifyNewAggregate(), and ns3::dsr::DsrRouting::NotifyNewAggregate().
|
private |
Definition at line 848 of file ipv4-l3-protocol.cc.
References ns3::Packet::Copy(), DROP_TTL_EXPIRED, GetIcmp(), ns3::Node::GetId(), GetInterfaceForDevice(), ns3::Object::GetObject(), m_dropTrace, m_node, m_unicastForwardTrace, NS_LOG_FUNCTION, NS_LOG_LOGIC, NS_LOG_WARN, ns3::Icmpv4L4Protocol::PROT_NUMBER, and SendRealOut().
Referenced by Receive().
|
private |
Definition at line 813 of file ipv4-l3-protocol.cc.
References ns3::Packet::Copy(), DROP_TTL_EXPIRED, ns3::Ipv4Address::GetAny(), ns3::Ipv4Header::GetDestination(), ns3::Node::GetId(), GetNetDevice(), ns3::Object::GetObject(), ns3::Ipv4Header::GetSource(), ns3::Ipv4Header::GetTtl(), m_dropTrace, m_node, NS_LOG_FUNCTION, NS_LOG_LOGIC, NS_LOG_WARN, SendRealOut(), ns3::Ipv4Route::SetDestination(), ns3::Ipv4Route::SetGateway(), ns3::Ipv4Route::SetOutputDevice(), ns3::Ipv4Route::SetSource(), and ns3::Ipv4Header::SetTtl().
Referenced by Receive().
|
virtual |
Determine whether address and interface corresponding to received packet can be accepted for local delivery.
address | The IP address being considered |
iif | The incoming Ipv4 interface index |
This method can be used to determine whether a received packet has an acceptable address for local delivery on the host. The address may be a unicast, multicast, or broadcast address. This method will return true if address is an exact match of a unicast address on one of the host's interfaces (see below), if address corresponds to a multicast group that the host has joined (and the incoming device is acceptable), or if address corresponds to a broadcast address.
If the Ipv4 attribute WeakEsModel is true, the unicast address may match any of the Ipv4 addresses on any interface. If the attribute is false, the address must match one assigned to the incoming device.
Implements ns3::Ipv4.
Definition at line 389 of file ipv4-l3-protocol.cc.
References GetAddress(), ns3::Ipv4InterfaceAddress::GetBroadcast(), ns3::Ipv4InterfaceAddress::GetLocal(), GetNAddresses(), GetNInterfaces(), GetWeakEsModel(), ns3::Ipv4Address::IsBroadcast(), ns3::Ipv4Address::IsMulticast(), NS_LOG_FUNCTION, and NS_LOG_LOGIC.
|
virtual |
interface | Interface number of Ipv4 interface |
Implements ns3::Ipv4.
Definition at line 1094 of file ipv4-l3-protocol.cc.
References GetInterface(), NS_LOG_FUNCTION, and NS_LOG_LOGIC.
|
private |
Definition at line 543 of file ipv4-l3-protocol.cc.
References ns3::Ipv4Address::IsMulticast(), ns3::Ipv4Address::IsSubnetDirectedBroadcast(), and NS_LOG_FUNCTION.
|
virtual |
interface | Interface number of Ipv4 interface |
Implements ns3::Ipv4.
Definition at line 1060 of file ipv4-l3-protocol.cc.
References GetInterface(), ns3::Ipv4Interface::IsUp(), and NS_LOG_FUNCTION.
Referenced by ns3::aodv::RoutingProtocol::NotifyAddAddress(), and ns3::dsdv::RoutingProtocol::NotifyAddAddress().
|
private |
Definition at line 876 of file ipv4-l3-protocol.cc.
References ns3::Ipv4Address::CombineMask(), ns3::Packet::Copy(), GetAddress(), ns3::Ipv4Header::GetDestination(), ns3::Ipv4Header::GetFragmentOffset(), GetIcmp(), GetInterface(), ns3::Ipv4InterfaceAddress::GetLocal(), ns3::Ipv4InterfaceAddress::GetMask(), GetNAddresses(), GetProtocol(), ns3::Ipv4Header::GetProtocol(), ns3::Ipv4Address::IsBroadcast(), ns3::Ipv4Header::IsLastFragment(), ns3::Ipv4Address::IsMulticast(), ns3::Ipv4Address::IsSubnetDirectedBroadcast(), m_localDeliverTrace, NS_LOG_FUNCTION, NS_LOG_LOGIC, ProcessFragment(), ns3::IpL4Protocol::Receive(), ns3::IpL4Protocol::RX_CSUM_FAILED, ns3::IpL4Protocol::RX_ENDPOINT_CLOSED, ns3::IpL4Protocol::RX_ENDPOINT_UNREACH, and ns3::IpL4Protocol::RX_OK.
Referenced by Receive().
|
protectedvirtual |
This function will notify other components connected to the node that a new stack member is now connected This will be used to notify Layer 3 protocol of layer 4 protocol stack to connect them together.
Reimplemented from ns3::Object.
Definition at line 167 of file ipv4-l3-protocol.cc.
References m_node, NS_LOG_FUNCTION, and SetNode().
|
private |
|
private |
Process a packet fragment.
packet | the packet |
fragmentSize | the size of the fragment |
iif | Input Interface |
Definition at line 1251 of file ipv4-l3-protocol.cc.
References ns3::Ipv4L3Protocol::Fragments::AddFragment(), ns3::Packet::Copy(), ns3::Ipv4Address::Get(), ns3::Ipv4Header::GetDestination(), ns3::Ipv4Header::GetFragmentOffset(), ns3::Ipv4Header::GetIdentification(), ns3::Ipv4L3Protocol::Fragments::GetPacket(), ns3::Ipv4Header::GetProtocol(), ns3::Packet::GetSize(), ns3::Ipv4Header::GetSource(), HandleFragmentsTimeout(), ns3::Ipv4L3Protocol::Fragments::IsEntire(), ns3::Ipv4Header::IsLastFragment(), m_fragmentExpirationTimeout, m_fragments, m_fragmentsTimers, ns3::Simulator::Now(), NS_LOG_FUNCTION, NS_LOG_LOGIC, and ns3::Simulator::Schedule().
Referenced by LocalDeliver().
void ns3::Ipv4L3Protocol::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 NetDevice this packet is coming to:
device | network device |
p | the packet |
protocol | protocol value |
from | address of the correspondant |
to | address of the destination |
packetType | type of the packet |
Definition at line 452 of file ipv4-l3-protocol.cc.
References ns3::Node::ChecksumEnabled(), ns3::Packet::Copy(), DROP_BAD_CHECKSUM, DROP_INTERFACE_DOWN, DROP_NO_ROUTE, ns3::Ipv4Header::EnableChecksum(), ns3::Ipv4RawSocketImpl::ForwardUp(), ns3::Ipv4Interface::GetDevice(), ns3::Node::GetId(), ns3::Object::GetObject(), ns3::Ipv4Header::GetPayloadSize(), IpForward(), IpMulticastForward(), ns3::Ipv4Header::IsChecksumOk(), ns3::Ipv4Interface::IsUp(), LocalDeliver(), m_dropTrace, m_interfaces, m_node, m_routingProtocol, m_rxTrace, m_sockets, ns3::MakeCallback(), NS_ASSERT_MSG, NS_LOG_FUNCTION, NS_LOG_LOGIC, NS_LOG_WARN, ns3::Ipv4RoutingProtocol::RouteInput(), and RouteInputError().
Referenced by AddInterface(), ns3::Ipv4Interface::Send(), and SetupLoopback().
void ns3::Ipv4L3Protocol::Remove | ( | Ptr< IpL4Protocol > | protocol | ) |
protocol | protocol to remove from this demux. |
The input value to this method should be the value returned from the Ipv4L4Protocol::Insert method.
Definition at line 124 of file ipv4-l3-protocol.cc.
References m_protocols, and NS_LOG_FUNCTION.
|
virtual |
Remove the address at addressIndex on named interface. The addressIndex for all higher indices will decrement by one after this method is called; so, for example, to remove 5 addresses from an interface i, one could call RemoveAddress (i, 0); 5 times.
interface | Interface number of an Ipv4 interface |
addressIndex | index of Ipv4InterfaceAddress to remove |
Implements ns3::Ipv4.
Definition at line 966 of file ipv4-l3-protocol.cc.
References GetInterface(), m_routingProtocol, ns3::Ipv4RoutingProtocol::NotifyRemoveAddress(), and NS_LOG_FUNCTION.
|
private |
Definition at line 1150 of file ipv4-l3-protocol.cc.
References DROP_ROUTE_ERROR, ns3::Object::GetObject(), m_dropTrace, m_node, NS_LOG_FUNCTION, and NS_LOG_LOGIC.
Referenced by Receive().
|
virtual |
Return the first primary source address with scope less than or equal to the requested scope, to use in sending a packet to destination dst out of the specified device.
This method mirrors the behavior of Linux inet_select_addr() and is provided because interfaces may have multiple IP addresses configured on them with different scopes, and with a primary and secondary status. Secondary addresses are never returned.
If a non-zero device pointer is provided, the method first tries to return a primary address that is configured on that device, and whose subnet matches that of dst and whose scope is less than or equal to the requested scope. If a primary address does not match the subnet of dst but otherwise matches the scope, it is returned. If no such address on the device is found, the other devices are searched in order of their interface index, but not considering dst as a factor in the search. Because a loopback interface is typically the first one configured on a node, it will be the first alternate device to be tried. Addresses scoped at LINK scope are not returned in this phase.
If no device pointer is provided, the same logic as above applies, only that there is no preferred device that is consulted first. This means that if the device pointer is null, input parameter dst will be ignored.
If there are no possible addresses to return, a warning log message is issued and the all-zeroes address is returned.
device | output NetDevice (optionally provided, only to constrain the search) |
dst | Destination address to match, if device is provided |
scope | Scope of returned address must be less than or equal to this |
Implements ns3::Ipv4.
Definition at line 983 of file ipv4-l3-protocol.cc.
References ns3::Ipv4Address::CombineMask(), GetAddress(), GetInterfaceForDevice(), ns3::Ipv4InterfaceAddress::GetLocal(), ns3::Ipv4InterfaceAddress::GetMask(), GetNAddresses(), GetNInterfaces(), ns3::Ipv4InterfaceAddress::GetScope(), ns3::Ipv4InterfaceAddress::IsSecondary(), ns3::Ipv4InterfaceAddress::LINK, NS_ASSERT_MSG, NS_LOG_FUNCTION, and NS_LOG_WARN.
Referenced by ns3::ArpL3Protocol::SendArpRequest().
|
virtual |
packet | packet to send |
source | source address of packet |
destination | address of packet |
protocol | number of packet |
route | route entry |
Higher-level layers call this method to send a packet down the stack to the MAC and PHY layers.
Implements ns3::Ipv4.
Definition at line 563 of file ipv4-l3-protocol.cc.
References ns3::Packet::AddHeader(), BuildHeader(), ns3::Ipv4Address::CombineMask(), ns3::Packet::Copy(), DROP_NO_ROUTE, GetAddress(), ns3::Ipv4Interface::GetDevice(), ns3::Ipv4Route::GetGateway(), GetInterfaceForDevice(), ns3::Ipv4InterfaceAddress::GetLocal(), ns3::Ipv4InterfaceAddress::GetMask(), ns3::NetDevice::GetMtu(), GetNAddresses(), ns3::Object::GetObject(), ns3::Packet::GetSize(), ns3::SocketIpTosTag::GetTos(), ns3::SocketIpTtlTag::GetTtl(), ns3::Ipv4Address::IsBroadcast(), ns3::Ipv4Address::IsLocalMulticast(), ns3::Ipv4Address::IsSubnetDirectedBroadcast(), m_defaultTos, m_defaultTtl, m_dropTrace, m_interfaces, m_node, m_routingProtocol, m_sendOutgoingTrace, m_txTrace, NS_ASSERT, NS_FATAL_ERROR, NS_LOG_ERROR, NS_LOG_FUNCTION, NS_LOG_LOGIC, NS_LOG_WARN, ns3::Packet::RemovePacketTag(), ns3::Ipv4RoutingProtocol::RouteOutput(), ns3::Ipv4Interface::Send(), and SendRealOut().
Referenced by ns3::NscTcpL4Protocol::NotifyNewAggregate(), ns3::dsr::DsrRouting::NotifyNewAggregate(), and ns3::dsdv::RoutingProtocol::Send().
|
private |
Definition at line 732 of file ipv4-l3-protocol.cc.
References ns3::Packet::AddHeader(), DoFragmentation(), DROP_INTERFACE_DOWN, DROP_NO_ROUTE, ns3::Ipv4Header::GetDestination(), ns3::Ipv4Interface::GetDevice(), ns3::Ipv4Route::GetGateway(), GetInterface(), GetInterfaceForDevice(), ns3::NetDevice::GetMtu(), ns3::Object::GetObject(), ns3::Ipv4Route::GetOutputDevice(), ns3::Packet::GetSize(), ns3::Ipv4Address::IsEqual(), ns3::Ipv4Interface::IsUp(), list, m_dropTrace, m_node, m_txTrace, NS_ASSERT, NS_LOG_FUNCTION, NS_LOG_LOGIC, NS_LOG_WARN, ns3::Packet::RemoveHeader(), and ns3::Ipv4Interface::Send().
Referenced by IpForward(), IpMulticastForward(), Send(), and SendWithHeader().
|
virtual |
packet | packet to send |
ipHeader | IP Header |
route | route entry |
Higher-level layers call this method to send a packet with IPv4 Header (Intend to be used with IpHeaderInclude attribute.)
Implements ns3::Ipv4.
Definition at line 550 of file ipv4-l3-protocol.cc.
References ns3::Node::ChecksumEnabled(), ns3::Ipv4Header::EnableChecksum(), NS_LOG_FUNCTION, and SendRealOut().
void ns3::Ipv4L3Protocol::SetDefaultTtl | ( | uint8_t | ttl | ) |
ttl | default ttl to use |
When we need to send an ipv4 packet, we use this default ttl value.
Definition at line 273 of file ipv4-l3-protocol.cc.
References m_defaultTtl, and NS_LOG_FUNCTION.
|
virtual |
interface | Interface number of Ipv4 interface |
Set the interface into the "down" state. In this state, it is ignored during Ipv4 forwarding.
Implements ns3::Ipv4.
Definition at line 1081 of file ipv4-l3-protocol.cc.
References GetInterface(), m_routingProtocol, ns3::Ipv4RoutingProtocol::NotifyInterfaceDown(), NS_LOG_FUNCTION, and ns3::Ipv4Interface::SetDown().
|
virtual |
interface | Interface number of Ipv4 interface |
val | Value to set the forwarding flag |
If set to true, IP forwarding is enabled for input datagrams on this device
Implements ns3::Ipv4.
Definition at line 1103 of file ipv4-l3-protocol.cc.
References GetInterface(), NS_LOG_FUNCTION, and ns3::Ipv4Interface::SetForwarding().
|
privatevirtual |
Definition at line 1118 of file ipv4-l3-protocol.cc.
References m_interfaces, m_ipForward, and NS_LOG_FUNCTION.
|
virtual |
interface | The interface number of an Ipv4 interface |
metric | routing metric (cost) associated to the underlying Ipv4 interface |
Implements ns3::Ipv4.
Definition at line 1036 of file ipv4-l3-protocol.cc.
References GetInterface(), NS_LOG_FUNCTION, and ns3::Ipv4Interface::SetMetric().
Definition at line 131 of file ipv4-l3-protocol.cc.
References m_node, NS_LOG_FUNCTION, and SetupLoopback().
Referenced by NotifyNewAggregate().
|
virtual |
Register a new routing protocol to be used by this Ipv4 stack.
This call will replace any routing protocol that has been previously registered. If you want to add multiple routing protocols, you must add them to a Ipv4ListRoutingProtocol directly.
routingProtocol | smart pointer to Ipv4RoutingProtocol object |
Implements ns3::Ipv4.
Definition at line 184 of file ipv4-l3-protocol.cc.
References m_routingProtocol, NS_LOG_FUNCTION, and ns3::Ipv4RoutingProtocol::SetIpv4().
Referenced by anonymous_namespace{ipv4-packet-info-tag-test-suite.cc}::AddInternetStack(), AddInternetStack(), CreateDualStackNode(), and TcpTestCase::CreateInternetNode().
|
virtual |
interface | Interface number of Ipv4 interface |
Set the interface into the "up" state. In this state, it is considered valid during Ipv4 forwarding.
Implements ns3::Ipv4.
Definition at line 1068 of file ipv4-l3-protocol.cc.
References GetInterface(), m_routingProtocol, ns3::Ipv4RoutingProtocol::NotifyInterfaceUp(), NS_LOG_FUNCTION, and ns3::Ipv4Interface::SetUp().
|
private |
Definition at line 238 of file ipv4-l3-protocol.cc.
References ns3::Node::AddDevice(), AddIpv4Interface(), ns3::CreateObject(), ns3::Node::GetDevice(), ns3::Ipv4Address::GetLoopback(), ns3::Ipv4Mask::GetLoopback(), ns3::Node::GetNDevices(), m_node, m_routingProtocol, ns3::MakeCallback(), ns3::Ipv4RoutingProtocol::NotifyInterfaceUp(), NS_LOG_FUNCTION, PROT_NUMBER, Receive(), and ns3::Node::RegisterProtocolHandler().
Referenced by SetNode().
|
privatevirtual |
Definition at line 1136 of file ipv4-l3-protocol.cc.
References m_weakEsModel, and NS_LOG_FUNCTION.
|
friend |
Definition at line 221 of file ipv4-l3-protocol.h.
|
private |
Definition at line 301 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), and Send().
|
private |
Definition at line 302 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), Send(), and SetDefaultTtl().
|
private |
Definition at line 314 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), HandleFragmentsTimeout(), IpForward(), IpMulticastForward(), Receive(), RouteInputError(), Send(), and SendRealOut().
|
private |
Definition at line 383 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), and ProcessFragment().
|
private |
The hash of fragmented packets.
Definition at line 382 of file ipv4-l3-protocol.h.
Referenced by ns3::Ipv4L3Protocol::Fragments::AddFragment(), DoDispose(), ns3::Ipv4L3Protocol::Fragments::GetPacket(), ns3::Ipv4L3Protocol::Fragments::GetPartialPacket(), HandleFragmentsTimeout(), ns3::Ipv4L3Protocol::Fragments::IsEntire(), and ProcessFragment().
|
private |
Definition at line 384 of file ipv4-l3-protocol.h.
Referenced by DoDispose(), HandleFragmentsTimeout(), and ProcessFragment().
|
private |
Definition at line 303 of file ipv4-l3-protocol.h.
Referenced by BuildHeader().
|
private |
Definition at line 300 of file ipv4-l3-protocol.h.
Referenced by AddIpv4Interface(), DoDispose(), GetInterface(), GetInterfaceForAddress(), GetInterfaceForDevice(), GetInterfaceForPrefix(), GetNInterfaces(), GetTypeId(), Receive(), Send(), and SetIpForward().
|
private |
Definition at line 297 of file ipv4-l3-protocol.h.
Referenced by AddInterface(), GetIpForward(), and SetIpForward().
|
private |
Definition at line 308 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), and LocalDeliver().
Definition at line 304 of file ipv4-l3-protocol.h.
Referenced by AddInterface(), CreateRawSocket(), DoDispose(), HandleFragmentsTimeout(), IpForward(), IpMulticastForward(), NotifyNewAggregate(), Receive(), RouteInputError(), Send(), SendRealOut(), SetNode(), and SetupLoopback().
|
private |
Definition at line 299 of file ipv4-l3-protocol.h.
Referenced by DoDispose(), GetProtocol(), Insert(), and Remove().
|
private |
Definition at line 316 of file ipv4-l3-protocol.h.
Referenced by AddAddress(), DoDispose(), GetRoutingProtocol(), Receive(), RemoveAddress(), Send(), SetDown(), SetRoutingProtocol(), SetUp(), and SetupLoopback().
|
private |
Definition at line 312 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), and Receive().
|
private |
Definition at line 306 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), and Send().
|
private |
Definition at line 318 of file ipv4-l3-protocol.h.
Referenced by CreateRawSocket(), DeleteRawSocket(), DoDispose(), and Receive().
|
private |
Definition at line 311 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), Send(), and SendRealOut().
|
private |
Definition at line 307 of file ipv4-l3-protocol.h.
Referenced by GetTypeId(), and IpForward().
|
private |
Definition at line 298 of file ipv4-l3-protocol.h.
Referenced by GetWeakEsModel(), and SetWeakEsModel().
|
static |
Definition at line 81 of file ipv4-l3-protocol.h.
Referenced by ns3::EpcHelper::AddEnb(), AddInterface(), ns3::dsr::DsrRouting::PromiscReceive(), ns3::LteNetDevice::Receive(), ns3::LteEnbNetDevice::Send(), ns3::LteUeNetDevice::Send(), ns3::Ipv4Interface::Send(), and SetupLoopback().