diff --git a/src/internet-stack/ipv4-interface.cc b/src/internet-stack/ipv4-interface.cc index b1aeb61d8..c54155152 100644 --- a/src/internet-stack/ipv4-interface.cc +++ b/src/internet-stack/ipv4-interface.cc @@ -178,7 +178,7 @@ Ipv4Interface::SetForwarding (bool val) void Ipv4Interface::Send (Ptr p, Ipv4Address dest) { - NS_LOG_LOGIC (dest << *p); + NS_LOG_FUNCTION (dest << *p); if (!IsUp()) { return; @@ -188,7 +188,6 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) { // XXX additional checks needed here (such as whether multicast // goes to loopback)? - NS_LOG_LOGIC ("Ipv4Interface::Send loopback"); m_device->Send (p, m_device->GetBroadcast (), Ipv4L3Protocol::PROT_NUMBER); return; @@ -198,7 +197,6 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) { if (dest == (*i).GetLocal ()) { - NS_LOG_LOGIC ("to local"); Ptr ipv4 = m_node->GetObject (); ipv4->Receive (m_device, p, Ipv4L3Protocol::PROT_NUMBER, @@ -211,19 +209,19 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) } if (m_device->NeedsArp ()) { - NS_LOG_LOGIC ("Needs ARP" << " " << dest); + NS_LOG_LOGIC ("Needs ARP" << " " << dest); Ptr arp = m_node->GetObject (); Address hardwareDestination; bool found = false; if (dest.IsBroadcast ()) { - NS_LOG_LOGIC ("All-network Broadcast"); + NS_LOG_LOGIC ("All-network Broadcast"); hardwareDestination = m_device->GetBroadcast (); found = true; } else if (dest.IsMulticast ()) { - NS_LOG_LOGIC ("IsMulticast"); + NS_LOG_LOGIC ("IsMulticast"); NS_ASSERT_MSG(m_device->IsMulticast (), "ArpIpv4Interface::SendTo (): Sending multicast packet over " "non-multicast device"); @@ -237,7 +235,7 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) { if (dest.IsSubnetDirectedBroadcast ((*i).GetMask ())) { - NS_LOG_LOGIC ("Subnetwork Broadcast hardwareDestination " << hardwareDestination); + NS_LOG_LOGIC ("Subnetwork Broadcast"); hardwareDestination = m_device->GetBroadcast (); found = true; break; @@ -245,21 +243,21 @@ Ipv4Interface::Send (Ptr p, Ipv4Address dest) } if (!found) { - NS_LOG_LOGIC ("ARP Lookup"); + NS_LOG_LOGIC ("ARP Lookup"); found = arp->Lookup (p, dest, m_device, m_cache, &hardwareDestination); } } if (found) { - NS_LOG_LOGIC ("Address Resolved. Send."); + NS_LOG_LOGIC ("Address Resolved. Send."); m_device ->Send (p, hardwareDestination, Ipv4L3Protocol::PROT_NUMBER); } } else { - NS_LOG_LOGIC ("Doesn't need ARP"); + NS_LOG_LOGIC ("Doesn't need ARP"); m_device->Send (p, m_device->GetBroadcast (), Ipv4L3Protocol::PROT_NUMBER); } diff --git a/src/internet-stack/ipv4-l3-protocol.cc b/src/internet-stack/ipv4-l3-protocol.cc index 620bb96bd..1ee4acbb3 100644 --- a/src/internet-stack/ipv4-l3-protocol.cc +++ b/src/internet-stack/ipv4-l3-protocol.cc @@ -40,9 +40,6 @@ #include "icmpv4-l4-protocol.h" #include "ipv4-interface.h" #include "ipv4-raw-socket-impl.h" -#include "raw-socket-impl.h" - - NS_LOG_COMPONENT_DEFINE ("Ipv4L3Protocol"); @@ -128,35 +125,7 @@ Ipv4L3Protocol::CreateRawSocket (void) m_sockets.push_back (socket); return socket; } - -Ptr -Ipv4L3Protocol::CreateRawSocket2 (void) -{ - NS_LOG_FUNCTION (this); - Ptr socket = CreateObject (); - socket->SetProtocol(17); // UdpL4Protocol::PROT_NUMBER - socket->SetNode (m_node); - m_rawSocket.push_back (socket); - return socket; -} - - void -Ipv4L3Protocol::DeleteRawSocket2 (Ptr socket) -{ - NS_LOG_FUNCTION (this << socket); - for (RawSocketList::iterator i = m_rawSocket.begin (); i != m_rawSocket.end (); ++i) - { - if ((*i) == socket) - { - m_rawSocket.erase (i); - return; - } - } - return; -} - -void Ipv4L3Protocol::DeleteRawSocket (Ptr socket) { NS_LOG_FUNCTION (this << socket); @@ -170,7 +139,6 @@ Ipv4L3Protocol::DeleteRawSocket (Ptr socket) } return; } - /* * This method is called by AddAgregate and completes the aggregation * by setting the node in the ipv4 stack @@ -392,7 +360,7 @@ Ipv4L3Protocol::Receive( Ptr device, Ptr p, uint16_t pr { NS_LOG_FUNCTION (this << &device << p << protocol << from); - NS_LOG_LOGIC ("Packet from " << from << " received on node " << + NS_LOG_LOGIC ("Packet from " << from << " received on node " << m_node->GetId ()); uint32_t interface = 0; @@ -430,22 +398,13 @@ Ipv4L3Protocol::Receive( Ptr device, Ptr p, uint16_t pr if (!ipHeader.IsChecksumOk ()) { - NS_LOG_LOGIC("bad check sum"); m_dropTrace (packet); return; } - for (RawSocketList::iterator i = m_rawSocket.begin (); i != m_rawSocket.end (); ++i) - { - NS_LOG_LOGIC ("Forwarding to raw socket"); - Ptr socket = *i; - if(socket->ForwardUp (p, device)) - return; - } - for (SocketList::iterator i = m_sockets.begin (); i != m_sockets.end (); ++i) { - NS_LOG_LOGIC ("Forwarding to ip_raw socket"); + NS_LOG_LOGIC ("Forwarding to raw socket"); Ptr socket = *i; socket->ForwardUp (packet, ipHeader, device); } diff --git a/src/internet-stack/ipv4-l3-protocol.h b/src/internet-stack/ipv4-l3-protocol.h index 4a02e14a5..a95999778 100644 --- a/src/internet-stack/ipv4-l3-protocol.h +++ b/src/internet-stack/ipv4-l3-protocol.h @@ -31,7 +31,6 @@ #include "ns3/ipv4-header.h" #include "ns3/ipv4-routing-protocol.h" - namespace ns3 { class Packet; @@ -44,7 +43,6 @@ class Ipv4Route; class Node; class Socket; class Ipv4RawSocketImpl; -class RawSocketImpl; class Ipv4L4Protocol; class Ipv4L4Protocol; class Icmpv4L4Protocol; @@ -73,10 +71,7 @@ public: Ptr GetRoutingProtocol (void) const; Ptr CreateRawSocket (void); - Ptr CreateRawSocket2 (void); void DeleteRawSocket (Ptr socket); - void DeleteRawSocket2 (Ptr socket); - /** * \param protocol a template for the protocol to add to this L4 Demux. @@ -211,7 +206,6 @@ private: typedef std::list > Ipv4InterfaceList; typedef std::list > SocketList; - typedef std::list > RawSocketList; typedef std::list > L4List_t; bool m_ipForward; @@ -228,7 +222,6 @@ private: Ptr m_routingProtocol; SocketList m_sockets; - RawSocketList m_rawSocket; }; } // Namespace ns3 diff --git a/src/internet-stack/ipv4-raw-socket-impl.cc b/src/internet-stack/ipv4-raw-socket-impl.cc index 6efd29194..45302d6e8 100644 --- a/src/internet-stack/ipv4-raw-socket-impl.cc +++ b/src/internet-stack/ipv4-raw-socket-impl.cc @@ -244,35 +244,36 @@ Ipv4RawSocketImpl::ForwardUp (Ptr p, Ipv4Header ipHeader, Ptr -RawSocketFactoryImpl::CreateSocket (void) -{ - Ptr socket = m_ipv4->CreateRawSocket2 (); - return socket; -} - -} // namespace ns3 diff --git a/src/internet-stack/raw-socket-factory-impl.h b/src/internet-stack/raw-socket-factory-impl.h deleted file mode 100644 index 5456d9129..000000000 --- a/src/internet-stack/raw-socket-factory-impl.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef RAW_SOCKET_FACTORY_IMPL_H -#define RAW_SOCKET_FACTORY_IMPL_H - -#include "ns3/raw-socket-factory.h" -#include "ipv4-l3-protocol.h" - - -namespace ns3 { - -class Ipv4L3Protocol; - -class RawSocketFactoryImpl : public RawSocketFactory -{ -protected: - virtual void DoDispose (void); -public: - virtual Ptr CreateSocket (void); -private: - Ptr m_ipv4; - -}; - - -} // namespace ns3 - -#endif /* RAW_SOCKET_FACTORY_IMPL_H */ diff --git a/src/internet-stack/raw-socket-impl.cc b/src/internet-stack/raw-socket-impl.cc deleted file mode 100644 index 6f620fb4f..000000000 --- a/src/internet-stack/raw-socket-impl.cc +++ /dev/null @@ -1,388 +0,0 @@ -#include "raw-socket-impl.h" -#include "ipv4-l3-protocol.h" -#include "icmpv4.h" -#include "ns3/inet-socket-address.h" -#include "ns3/node.h" -#include "ns3/packet.h" -#include "ns3/uinteger.h" -#include "ns3/log.h" -#include "ipv4-interface.h" -#include "udp-header.h" - -NS_LOG_COMPONENT_DEFINE ("RawSocketImpl"); - -namespace ns3 -{ - -NS_OBJECT_ENSURE_REGISTERED (RawSocketImpl); - -TypeId -RawSocketImpl::GetTypeId (void) -{ - static TypeId tid = TypeId ("ns3::RawSocketImpl") .SetParent () .AddAttribute ("Protocol", "Protocol number to match.", UintegerValue (0), - MakeUintegerAccessor (&RawSocketImpl::m_protocol), MakeUintegerChecker ()) .AddAttribute ("IcmpFilter", - "Any icmp header whose type field matches a bit in this filter is dropped.", UintegerValue (0), MakeUintegerAccessor ( - &RawSocketImpl::m_icmpFilter), MakeUintegerChecker ()); - return tid; -} - -RawSocketImpl::RawSocketImpl () -{ - NS_LOG_FUNCTION (this); - m_err = Socket::ERROR_NOTERROR; - m_node = 0; - m_src = Ipv4Address::GetAny (); - m_dst = Ipv4Address::GetAny (); - m_protocol = 0; - m_shutdownSend = false; - m_shutdownRecv = false; -} - -void -RawSocketImpl::SetNode (Ptr node) -{ - m_node = node; - m_ipv4 = m_node->GetObject (); - NS_ASSERT(m_ipv4 != 0); - for(uint32_t i = 0; i < m_ipv4->GetNInterfaces(); ++i) - { - m_interfaces.push_back (m_ipv4->GetInterface(i)); - } -} - -void -RawSocketImpl::DoDispose (void) -{ - NS_LOG_FUNCTION (this); - m_node = 0; - Socket::DoDispose (); -} - -enum Socket::SocketErrno -RawSocketImpl::GetErrno (void) const -{ - NS_LOG_FUNCTION (this); - return m_err; -} -Ptr -RawSocketImpl::GetNode (void) const -{ - NS_LOG_FUNCTION (this); - return m_node; -} -int -RawSocketImpl::Bind (const Address &address) -{ - NS_LOG_FUNCTION (this << address); - if (!InetSocketAddress::IsMatchingType (address)) - { - m_err = Socket::ERROR_INVAL; - return -1; - } - InetSocketAddress ad = InetSocketAddress::ConvertFrom (address); - m_src = ad.GetIpv4 (); - m_sport = ad.GetPort(); - return 0; -} -int -RawSocketImpl::Bind (void) -{ - NS_LOG_FUNCTION (this); - m_src = Ipv4Address::GetAny (); - m_sport = 0; - return 0; -} -int -RawSocketImpl::GetSockName (Address &address) const -{ - address = InetSocketAddress (m_src, 0); - return 0; -} -int -RawSocketImpl::Close (void) -{ - NS_LOG_FUNCTION (this); - Ptr ipv4 = m_node->GetObject (); - if (ipv4 != 0) - { - ipv4->DeleteRawSocket (this); - } - return 0; -} -int -RawSocketImpl::ShutdownSend (void) -{ - NS_LOG_FUNCTION (this); - m_shutdownSend = true; - return 0; -} -int -RawSocketImpl::ShutdownRecv (void) -{ - NS_LOG_FUNCTION (this); - m_shutdownRecv = true; - return 0; -} -int -RawSocketImpl::Connect (const Address &address) -{ - NS_LOG_FUNCTION (this << address); - if (!InetSocketAddress::IsMatchingType (address)) - { - m_err = Socket::ERROR_INVAL; - return -1; - } - InetSocketAddress ad = InetSocketAddress::ConvertFrom (address); - m_dst = ad.GetIpv4 (); - return 0; -} -int -RawSocketImpl::Listen (void) -{ - NS_LOG_FUNCTION (this); - m_err = Socket::ERROR_OPNOTSUPP; - return -1; -} -uint32_t -RawSocketImpl::GetTxAvailable (void) const -{ - NS_LOG_FUNCTION (this); - return 0xffffffff; -} -int -RawSocketImpl::Send (Ptr p, uint32_t flags) -{ - NS_LOG_FUNCTION (this << " packet " << p << flags); - InetSocketAddress to = InetSocketAddress (m_dst, m_protocol); - return SendTo (p, flags, to); -} -int -RawSocketImpl::SendTo (Ptr packet, uint32_t flags, const Address &toAddress) -{ - - if (!InetSocketAddress::IsMatchingType (toAddress)) - { - m_err = Socket::ERROR_INVAL; - return -1; - } - if (m_shutdownSend) - { - return 0; - } - - - if (m_ipv4->GetRoutingProtocol ()) - { - Ipv4Header header; - Ptr copy = packet->Copy(); - copy->RemoveHeader (header); - NS_LOG_LOGIC ("RawSocketImpl::SendTo packet uid " << packet->GetUid() << " address " << header.GetDestination()); - SocketErrno errno_ = ERROR_NOTERROR;//do not use errno as it is the standard C last error number - Ptr route; - uint32_t oif = 0; //specify non-zero if bound to a source address - route = m_ipv4->GetRoutingProtocol ()->RouteOutput (copy, header, oif, errno_); - if (route != 0) - { - NS_LOG_LOGIC ("Route exists"); - SendByInterface(packet, route); - } - else - { - NS_LOG_LOGIC ("dropped because no outgoing route."); - } - } - return 0; -} - -void -RawSocketImpl::SendByInterface (Ptr p, Ptr route) -{ - NS_ASSERT(m_node != 0); - Ipv4Header ipv4Header; - Ptr packet = p->Copy(); - packet->RemoveHeader(ipv4Header); - Ipv4Address source = ipv4Header.GetSource (); - Ipv4Address destination = ipv4Header.GetDestination (); - NS_LOG_LOGIC ("RawSocketImpl::SendByInterface to " << destination << " from " << source); - - // Handle a few cases: - // 1) packet is destined to limited broadcast address - // 2) packet is destined to a subnet-directed broadcast address - // 3) packet is not broadcast, and is passed in with a route entry - const Ipv4Address loopback ("127.0.0.1"); - // 1) packet is destined to limited broadcast address - if (destination.IsBroadcast ()) - { - NS_LOG_LOGIC ("RawSocketImpl::Send case 1: limited broadcast"); - for (std::list< Ptr >::iterator ifaceIter = m_interfaces.begin (); ifaceIter != m_interfaces.end (); ifaceIter++) - { - Ptr outInterface = *ifaceIter; - Ptr packetCopy = p->Copy (); - - NS_ASSERT (packet->GetSize () <= outInterface->GetDevice()->GetMtu ()); - outInterface->Send (packetCopy, destination); - } - return; - } - - // 2) check: packet is destined to a subnet-directed broadcast address - bool result = false; - uint32_t ifaceIndex = 0; - NS_LOG_LOGIC("number of interfaces " << m_interfaces.size ()); - for (std::list< Ptr >::iterator ifaceIter = m_interfaces.begin (); ifaceIter != m_interfaces.end (); ifaceIter++, ifaceIndex++) - { - Ptr outInterface = *ifaceIter; - for (uint32_t j = 0; j < m_ipv4->GetNAddresses (ifaceIndex); j++) - { - Ipv4InterfaceAddress ifAddr = m_ipv4->GetAddress (ifaceIndex, j); - NS_LOG_LOGIC ("Testing address " << ifAddr.GetLocal () << " with mask " << ifAddr.GetMask ()); - if (destination.IsSubnetDirectedBroadcast (ifAddr.GetMask ()) && - (destination.CombineMask (ifAddr.GetMask ()) == ifAddr.GetLocal ().CombineMask (ifAddr.GetMask ())) ) - //if (ifAddr.GetLocal() == source) - { - NS_LOG_LOGIC ("Send case 2: subnet directed bcast to " << ifAddr.GetLocal ()); - Ptr packetCopy = p->Copy (); - outInterface->Send (packetCopy, destination); - result = true; - } - } - } - if(result) return; - - // 3) packet is not broadcast, and is passed in with a route entry - // with a valid Ipv4Address as the gateway - if (route && route->GetGateway () != Ipv4Address ()) - { - NS_LOG_LOGIC ("RawSocketImpl::Send case 3: passed in with route"); - Ptr outDev = route->GetOutputDevice (); - int32_t interface = m_ipv4->GetInterfaceForDevice (outDev); - NS_ASSERT (interface >= 0); - Ptr outInterface = m_ipv4->GetInterface (interface); - NS_LOG_LOGIC ("Send via NetDevice ifIndex " << outDev->GetIfIndex () << " ipv4InterfaceIndex " << interface); - - NS_ASSERT (p->GetSize () <= outInterface->GetDevice ()->GetMtu ()); - if (!route->GetGateway ().IsEqual (Ipv4Address ("0.0.0.0"))) - { - if (outInterface->IsUp ()) - { - NS_LOG_LOGIC ("Send to gateway " << route->GetGateway ()); - Ptr packetCopy = p->Copy (); - outInterface->Send (packetCopy, route->GetGateway ()); - } - else - { - NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << route->GetGateway ()); - } - } - else - { - if (outInterface->IsUp ()) - { - Ptr packetCopy = p->Copy (); - NS_LOG_LOGIC ("Send to destination " << destination); - outInterface->Send (packetCopy, destination); - } - else - { - NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << destination); - } - } return; - } -} - -uint32_t -RawSocketImpl::GetRxAvailable (void) const -{ - NS_LOG_FUNCTION (this); - uint32_t rx = 0; - for (std::list::const_iterator i = m_recv.begin (); i != m_recv.end (); ++i) - { - rx += (i->packet)->GetSize (); - } - return rx; -} -Ptr -RawSocketImpl::Recv (uint32_t maxSize, uint32_t flags) -{ - NS_LOG_LOGIC ("RawSocketImpl::Recv" << maxSize << flags); - Address tmp; - return RecvFrom (maxSize, flags, tmp); -} -Ptr -RawSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress) -{ - NS_LOG_LOGIC ("RawSocketImpl::RecvFrom" << " maxSize " << maxSize << " flags " << flags << " address " <GetSize () > maxSize) - { - Ptr first = data.packet->CreateFragment (0, maxSize); - data.packet->RemoveAtStart (maxSize); - m_recv.push_front (data); - return first; - } - - InetSocketAddress inet = InetSocketAddress (data.fromIp, data.fromProtocol); - fromAddress = inet; - return data.packet; -} - -void -RawSocketImpl::SetProtocol (uint16_t protocol) -{ - NS_LOG_FUNCTION (this << protocol); - m_protocol = protocol; -} - -bool -RawSocketImpl::ForwardUp (Ptr p, Ptr device) -{ - if (m_shutdownRecv) - { - return false; - } - Ptr copy = p->Copy (); - Ipv4Header ipHeader; - copy->RemoveHeader(ipHeader); - for (std::list< Ptr >::const_iterator ifaceIter = m_interfaces.begin (); ifaceIter != m_interfaces.end (); ifaceIter++) - { - for (uint32_t i = 0; i < (*ifaceIter)->GetNAddresses(); ++i) - { - if ((*ifaceIter)->GetAddress(i).GetLocal() == ipHeader.GetSource()) - return true; - } - } - UdpHeader udpHeader; - copy->RemoveHeader(udpHeader); - NS_LOG_LOGIC ("src = " << m_src << " dst = " << m_dst); - if ( m_sport == udpHeader.GetDestinationPort () && ipHeader.GetProtocol () == m_protocol) - { - - if (m_protocol == 1) - { - Icmpv4Header icmpHeader; - copy->PeekHeader (icmpHeader); - uint8_t type = icmpHeader.GetType (); - if (type < 32 && ((1 << type) & m_icmpFilter)) - { - // filter out icmp packet. - return false; - } - } - Ptr packet = p->Copy(); - struct Data data; - data.packet = packet; - data.fromIp = ipHeader.GetSource (); - data.fromProtocol = ipHeader.GetProtocol (); - m_recv.push_back (data); - NotifyDataRecv (); - return true; - } - return false; -} - -} // namespace ns3 diff --git a/src/internet-stack/raw-socket-impl.h b/src/internet-stack/raw-socket-impl.h deleted file mode 100644 index 3271149b3..000000000 --- a/src/internet-stack/raw-socket-impl.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef RAW_SOCKET_IMPL_H -#define RAW_SOCKET_IMPL_H - -#include "ns3/socket.h" -#include "ns3/ipv4-header.h" -#include "ns3/ipv4-route.h" -#include "ipv4-l3-protocol.h" -#include - -namespace ns3 { - -class NetDevice; -class Node; - -class RawSocketImpl : public Socket -{ -public: - static TypeId GetTypeId (void); - - RawSocketImpl (); - - void SetNode (Ptr node); - - virtual enum Socket::SocketErrno GetErrno (void) const; - virtual Ptr GetNode (void) const; - virtual int Bind (const Address &address); - virtual int Bind (); - virtual int GetSockName (Address &address) const; - virtual int Close (void); - virtual int ShutdownSend (void); - virtual int ShutdownRecv (void); - virtual int Connect (const Address &address); - virtual int Listen (void); - virtual uint32_t GetTxAvailable (void) const; - virtual int Send (Ptr p, uint32_t flags); - virtual int SendTo (Ptr p, uint32_t flags,const Address &toAddress); - void SendByInterface (Ptr packet, Ptr route); - virtual uint32_t GetRxAvailable (void) const; - virtual Ptr Recv (uint32_t maxSize, uint32_t flags); - virtual Ptr RecvFrom (uint32_t maxSize, uint32_t flags, - Address &fromAddress); - - void SetProtocol (uint16_t protocol); - bool ForwardUp (Ptr p, Ptr device); -private: - virtual void DoDispose (void); - - - struct Data { - Ptr packet; - Ipv4Address fromIp; - uint16_t fromProtocol; - }; - - enum Socket::SocketErrno m_err; - Ptr m_node; - Ipv4Address m_src; - uint16_t m_sport; - Ipv4Address m_dst; - uint16_t m_protocol; - std::list m_recv; - bool m_shutdownSend; - bool m_shutdownRecv; - uint32_t m_icmpFilter; - std::list< Ptr > m_interfaces; - Ptr m_ipv4; -}; - -} // namespace ns3 - -#endif /* RAW_SOCKET_IMPL_H */ diff --git a/src/internet-stack/wscript b/src/internet-stack/wscript index d1d171263..9d4ea3118 100644 --- a/src/internet-stack/wscript +++ b/src/internet-stack/wscript @@ -94,8 +94,6 @@ def build(bld): 'pending-data.cc', 'sequence-number.cc', 'rtt-estimator.cc', - 'raw-socket-factory-impl.cc', - 'raw-socket-impl.cc', 'ipv4-raw-socket-factory-impl.cc', 'ipv4-raw-socket-impl.cc', 'icmpv4.cc', diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 3b0a65455..59285c217 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -42,7 +42,7 @@ #include "ns3/nstime.h" #include "ns3/net-device.h" -#include "ns3/raw-socket-factory.h" +#include "ns3/udp-socket-factory.h" #include "src/internet-stack/udp-l4-protocol.h" #include @@ -260,8 +260,8 @@ RoutingProtocol::RouteInput (Ptr p, const Ipv4Header &header, Ptr< Ptr packet = p->Copy(); lcb (p, header, iif); Ptr route; - NS_LOG_LOGIC ("Forward broadcast"); - ucb (route, packet, header); +// NS_LOG_LOGIC ("Forward broadcast"); +// ucb (route, packet, header); return true; } } @@ -370,8 +370,7 @@ RoutingProtocol::NotifyInterfaceUp (uint32_t i ) if (iface.GetLocal () == Ipv4Address ("127.0.0.1")) return; // Create a socket to listen only on this interface - l3 = m_ipv4->GetObject (); - Ptr socket = l3->CreateRawSocket2(); + Ptr socket = Socket::CreateSocket (GetObject (), UdpSocketFactory::GetTypeId()); NS_ASSERT (socket != 0); socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); socket->Bind(InetSocketAddress (iface.GetLocal(), AODV_PORT)); @@ -420,8 +419,7 @@ RoutingProtocol::NotifyAddAddress (uint32_t i, Ipv4InterfaceAddress address ) if (iface.GetLocal () == Ipv4Address ("127.0.0.1")) return; // Create a socket to listen only on this interface - Ptr l3 = m_ipv4->GetObject (); - Ptr socket = l3->CreateRawSocket2 (); + Ptr socket = Socket::CreateSocket (GetObject (), UdpSocketFactory::GetTypeId()); NS_ASSERT (socket != 0); socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT)); @@ -456,8 +454,7 @@ RoutingProtocol::NotifyRemoveAddress (uint32_t i, Ipv4InterfaceAddress address ) { Ipv4InterfaceAddress iface = interface->GetAddress (0); // Create a socket to listen only on this interface - Ptr l3 = m_ipv4->GetObject (); - Ptr socket = l3->CreateRawSocket2 (); + Ptr socket = Socket::CreateSocket (GetObject (), UdpSocketFactory::GetTypeId()); NS_ASSERT (socket != 0); socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT)); @@ -549,7 +546,7 @@ RoutingProtocol::SendRequest (Ipv4Address dst) packet->AddHeader (rreqHeader); TypeHeader tHeader (AODVTYPE_RREQ); packet->AddHeader (tHeader); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ *j, /*dst*/iface.GetBroadcast (), /*TTL*/ NetDiameter, /*id*/0); + socket->Send(packet); } ScheduleRreqRetry (dst); if (EnableHello) @@ -583,17 +580,9 @@ RoutingProtocol::RecvAodv (Ptr socket ) NS_LOG_FUNCTION (this); Address sourceAddress; Ptr packet = socket->RecvFrom (sourceAddress); - - Ipv4Header ipv4Header; - packet->RemoveHeader (ipv4Header); - - UdpHeader udpHeader; - packet->RemoveHeader (udpHeader); - NS_ASSERT (udpHeader.GetDestinationPort () == AODV_PORT); - NS_ASSERT (udpHeader.GetSourcePort () == AODV_PORT); - + InetSocketAddress inetSourceAddr = InetSocketAddress::ConvertFrom (sourceAddress); + Ipv4Address sender = inetSourceAddr.GetIpv4 (); Ipv4Address receiver = m_socketAddresses[socket].GetLocal (); - Ipv4Address sender = ipv4Header.GetSource (); NS_LOG_DEBUG ("AODV node " << this << " received a AODV packet from " << sender << " to " << receiver); UpdateRouteToNeighbor (sender, receiver); @@ -608,12 +597,12 @@ RoutingProtocol::RecvAodv (Ptr socket ) { case AODVTYPE_RREQ: { - RecvRequest (packet, receiver, sender, ipv4Header); + RecvRequest (packet, receiver, sender); break; } case AODVTYPE_RREP: { - RecvReply (packet, receiver, sender, ipv4Header); + RecvReply (packet, receiver, sender); break; } case AODVTYPE_RERR: @@ -668,7 +657,7 @@ RoutingProtocol::UpdateRouteToNeighbor (Ipv4Address sender, Ipv4Address receiver } void -RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address src, Ipv4Header ipv4Header ) +RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address src) { NS_LOG_FUNCTION (this); RreqHeader rreqHeader; @@ -753,7 +742,7 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address s */ RoutingTableEntry toDst; Ipv4Address dst = rreqHeader.GetDst (); - NS_LOG_LOGIC (receiver << " recieve RREQ to destination " << dst << " with ttl " << (uint16_t) ipv4Header.GetTtl ()); + NS_LOG_LOGIC (receiver << " recieve RREQ to destination " << dst); if (m_routingTable.LookupRoute (dst, toDst)) { /* @@ -775,23 +764,15 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address s } } - /* - * If a node does not generate a RREP the incoming IP header has TTL larger than 1, the node updates - * and broadcasts the RREQ on each of its configured interfaces. - */ - if (ipv4Header.GetTtl () < 2) - return; - for (std::map , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) { Ptr socket = j->first; Ipv4InterfaceAddress iface = j->second; - Ptr packet = p->Copy (); + Ptr packet = Create (); packet->AddHeader (rreqHeader); TypeHeader tHeader (AODVTYPE_RREQ); packet->AddHeader (tHeader); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ *j, /*dst*/iface.GetBroadcast (), - /*TTL*/ ipv4Header.GetTtl () - 1, /*id*/ipv4Header.GetIdentification ()); + socket->Send (packet); } if (EnableHello) @@ -819,8 +800,7 @@ RoutingProtocol::SendReply (RreqHeader const & rreqHeader, RoutingTableEntry con packet->AddHeader (tHeader); Ptr socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); NS_ASSERT (socket); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, toOrigin.GetInterface ()), - /*dst*/toOrigin.GetNextHop (), /*TTL*/ toOrigin.GetHop (), /*id*/0); + socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); } void @@ -853,8 +833,7 @@ RoutingProtocol::SendReplyByIntermediateNode (RoutingTableEntry & toDst, Routing Ptr socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); m_routingTable.Print(std::cout); NS_ASSERT (socket); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, toOrigin.GetInterface ()), - /*dst*/toOrigin.GetNextHop (), /*TTL*/ toOrigin.GetHop (), /*id*/0); + socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); // Generating gratuitous RREPs if (gratRep) @@ -868,8 +847,7 @@ RoutingProtocol::SendReplyByIntermediateNode (RoutingTableEntry & toDst, Routing Ptr socket = FindSocketWithInterfaceAddress (toDst.GetInterface ()); NS_ASSERT (socket); NS_LOG_LOGIC ("Send gratuitous RREP " << packet->GetUid()); - SendPacketViaRawSocket (/*packet*/packetToDst, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, toDst.GetInterface ()), - /*dst*/toDst.GetNextHop (), /*TTL*/ toDst.GetHop (), /*id*/0); + socket->SendTo (packetToDst, 0, InetSocketAddress (toDst.GetNextHop (), AODV_PORT)); } } @@ -886,12 +864,11 @@ RoutingProtocol::SendReplyAck (Ipv4Address neighbor ) m_routingTable.LookupRoute (neighbor, toNeighbor); Ptr socket = FindSocketWithInterfaceAddress (toNeighbor.GetInterface ()); NS_ASSERT (socket); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, toNeighbor.GetInterface ()), - /*dst*/neighbor, /*TTL*/ 1, /*id*/0); + socket->SendTo (packet, 0, InetSocketAddress (neighbor, AODV_PORT)); } void -RoutingProtocol::RecvReply (Ptr p, Ipv4Address receiver, Ipv4Address sender, Ipv4Header ipv4Header ) +RoutingProtocol::RecvReply (Ptr p, Ipv4Address receiver, Ipv4Address sender) { NS_LOG_FUNCTION(this << " src " << sender); RrepHeader rrepHeader; @@ -1012,12 +989,11 @@ RoutingProtocol::RecvReply (Ptr p, Ipv4Address receiver, Ipv4Address sen packet->AddHeader (tHeader); Ptr socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); NS_ASSERT (socket); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, toOrigin.GetInterface ()), - /*dst*/toOrigin.GetNextHop (), /*TTL*/ ipv4Header.GetTtl () - 1, /*id*/0); + socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); } void -RoutingProtocol::RecvReplyAck (Ipv4Address neighbor ) +RoutingProtocol::RecvReplyAck (Ipv4Address neighbor) { NS_LOG_LOGIC(this); // TODO @@ -1063,11 +1039,6 @@ RoutingProtocol::RecvError (Ptr p, Ipv4Address src ) NS_LOG_FUNCTION (this << " from " << src); RerrHeader rerrHeader; p->RemoveHeader (rerrHeader); - bool noDelete = rerrHeader.GetNoDelete (); - if (noDelete) - { - NS_LOG_LOGIC ("Receive RERR with no delete flag."); - } std::map dstWithNextHopSrc; std::map unreachable; m_routingTable.GetListOfDestinationWithNextHop (src, dstWithNextHopSrc); @@ -1114,8 +1085,7 @@ RoutingProtocol::RecvError (Ptr p, Ipv4Address src ) rerrHeader.Print(std::cout); SendRerrMessage (packet, precursors); } - if (!noDelete) - m_routingTable.InvalidateRoutesWithDst (unreachable); + m_routingTable.InvalidateRoutesWithDst (unreachable); NS_LOG_LOGIC ("After receive RERR"); m_routingTable.Print (std::cout); } @@ -1169,7 +1139,6 @@ RoutingProtocol::HelloTimerExpire () // TODO select random time for the next hello htimer.Cancel (); Time t = Scalar(0.01)*MilliSeconds(UniformVariable().GetValue (0.0, 100.0)); - NS_LOG_LOGIC ("delay = " << t.GetMicroSeconds ()); htimer.Schedule (HelloInterval - t); } @@ -1195,37 +1164,16 @@ RoutingProtocol::SendHello () Ptr socket = j->first; Ipv4InterfaceAddress iface = j->second; RrepHeader helloHeader (/*prefix size=*/0, /*hops=*/0, /*dst=*/iface.GetLocal (), /*dst seqno=*/m_seqNo, - /*origin=*/iface.GetLocal (),/*lifetime=*/Scalar (AllowedHelloLoss) * HelloInterval); + /*origin=*/iface.GetLocal (),/*lifetime=*/Scalar (AllowedHelloLoss) * HelloInterval); Ptr packet = Create (); packet->AddHeader (helloHeader); TypeHeader tHeader (AODVTYPE_RREP); packet->AddHeader (tHeader); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ *j, - /*dst*/iface.GetBroadcast (), /*TTL*/ 1, /*id*/0); + socket->Send (packet); } } -void -RoutingProtocol::SendPacketViaRawSocket (Ptr packet, std::pair , Ipv4InterfaceAddress> socketAddress, Ipv4Address dst, - uint16_t ttl, uint16_t id ) -{ - UdpHeader udpHeader; - udpHeader.SetDestinationPort (AODV_PORT); - udpHeader.SetSourcePort (AODV_PORT); - packet->AddHeader (udpHeader); - Ipv4Header ipv4Header; - ipv4Header.SetSource (socketAddress.second.GetLocal ()); - ipv4Header.SetDestination (dst); - ipv4Header.SetIdentification (id); - ipv4Header.EnableChecksum (); - ipv4Header.SetProtocol (UdpL4Protocol::PROT_NUMBER); - ipv4Header.SetTtl (ttl); - ipv4Header.SetPayloadSize (packet->GetSize ()); - packet->AddHeader (ipv4Header); - NS_LOG_LOGIC ("Send packet " << packet->GetUid() << " from " << socketAddress.second.GetLocal () << " to " << dst); - socketAddress.first->SendTo (packet, 0, InetSocketAddress (dst, AODV_PORT)); -} void RoutingProtocol::SendPacketFromQueue (Ipv4Address dst, Ptr route ) @@ -1321,8 +1269,7 @@ RoutingProtocol::SendRerrWhenNoRouteToForward (Ipv4Address dst, uint32_t dstSeqN Ptr socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ()); NS_ASSERT (socket); NS_LOG_LOGIC ("unicast RERR to the source of the data transmission"); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, toOrigin.GetInterface ()), - /*dst*/toOrigin.GetNextHop (), /*TTL*/ 1, /*id*/0); + socket->SendTo(packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT)); } } @@ -1334,8 +1281,7 @@ RoutingProtocol::SendRerrWhenNoRouteToForward (Ipv4Address dst, uint32_t dstSeqN Ipv4InterfaceAddress iface = i->second; NS_ASSERT (socket); NS_LOG_LOGIC ("broadcast RERR meassage from interface " << iface.GetLocal()); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, iface), - /*dst*/iface.GetBroadcast (), /*TTL*/1, /*id*/0); + socket->Send (packet); } } } @@ -1358,8 +1304,7 @@ RoutingProtocol::SendRerrMessage (Ptr packet, std::vector p Ptr socket = FindSocketWithInterfaceAddress (toPrecursor.GetInterface ()); NS_ASSERT (socket); NS_LOG_LOGIC ("one precursor => unicast RERR to " << toPrecursor.GetDestination() << " from " << toPrecursor.GetInterface ().GetLocal ()); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, toPrecursor.GetInterface ()), - /*dst*/precursors.front (), /*TTL*/ 1, /*id*/0); + socket->SendTo(packet, 0, InetSocketAddress (precursors.front (), AODV_PORT)); return; } @@ -1386,8 +1331,7 @@ RoutingProtocol::SendRerrMessage (Ptr packet, std::vector p Ptr socket = FindSocketWithInterfaceAddress (*i); NS_ASSERT (socket); NS_LOG_LOGIC ("broadcast RERR meassage from interface " << i->GetLocal()); - SendPacketViaRawSocket (/*packet*/packet, /*pair , Ipv4InterfaceAddress>*/ std::make_pair(socket, *i), - /*dst*/m_socketAddresses[socket].GetBroadcast (), /*TTL*/ 1, /*id*/0); + socket->Send (packet); } } diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index d3e4f9578..5dcb78ea6 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -178,9 +178,9 @@ private: /// Receive and process control packet void RecvAodv (Ptr socket); /// Receive RREQ - void RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address src, Ipv4Header ipv4Header); + void RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address src); /// Receive RREP - void RecvReply (Ptr p, Ipv4Address my ,Ipv4Address src, Ipv4Header ipv4Header); + void RecvReply (Ptr p, Ipv4Address my ,Ipv4Address src); /// Receive RREP_ACK void RecvReplyAck(Ipv4Address neighbor); /// Receive RERR from node with address src @@ -218,10 +218,6 @@ private: * \param origin - originating node IP address */ void SendRerrWhenNoRouteToForward (Ipv4Address dst, uint32_t dstSeqNo, Ipv4Address origin); - /** - * Add UDP, IP headers to packet and send it via raw socket - */ - void SendPacketViaRawSocket (Ptr packet, std::pair , Ipv4InterfaceAddress> socketAddress, Ipv4Address dst, uint16_t ttl, uint16_t id); //\} /// Notify that packet is dropped for some reason