diff --git a/src/internet-stack/ipv4-l3-protocol.cc b/src/internet-stack/ipv4-l3-protocol.cc index bf1927b33..d9590a015 100644 --- a/src/internet-stack/ipv4-l3-protocol.cc +++ b/src/internet-stack/ipv4-l3-protocol.cc @@ -141,6 +141,21 @@ Ipv4L3Protocol::CreateRawSocket2 (void) 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); @@ -154,6 +169,7 @@ Ipv4L3Protocol::DeleteRawSocket (Ptr socket) } return; } + /* * This method is called by AddAgregate and completes the aggregation * by setting the node in the ipv4 stack @@ -424,6 +440,14 @@ Ipv4L3Protocol::Receive( Ptr device, Ptr p, uint16_t pr socket->ForwardUp (packet, ipHeader, device); } + NS_LOG_UNCOND(m_rawSocket.size()); + for (RawSocketList::iterator i = m_rawSocket.begin (); i != m_rawSocket.end (); ++i) + { + NS_LOG_UNCOND ("Forwarding to raw socket"); + Ptr socket = *i; + socket->ForwardUp (p, device); + } + NS_LOG_UNCOND("in route input"); m_routingProtocol->RouteInput (packet, ipHeader, device, MakeCallback (&Ipv4L3Protocol::IpForward, this), MakeCallback (&Ipv4L3Protocol::IpMulticastForward, this), diff --git a/src/internet-stack/ipv4-l3-protocol.h b/src/internet-stack/ipv4-l3-protocol.h index 89d1a7a13..4f4ba7bd0 100644 --- a/src/internet-stack/ipv4-l3-protocol.h +++ b/src/internet-stack/ipv4-l3-protocol.h @@ -75,6 +75,8 @@ public: 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. diff --git a/src/internet-stack/raw-socket-impl.cc b/src/internet-stack/raw-socket-impl.cc index 7f495db94..533653335 100644 --- a/src/internet-stack/raw-socket-impl.cc +++ b/src/internet-stack/raw-socket-impl.cc @@ -144,14 +144,14 @@ RawSocketImpl::GetTxAvailable (void) const int RawSocketImpl::Send (Ptr p, uint32_t flags) { - NS_LOG_FUNCTION (this << p << 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) { - NS_LOG_FUNCTION (this << packet << flags << toAddress); + if (!InetSocketAddress::IsMatchingType (toAddress)) { m_err = Socket::ERROR_INVAL; @@ -163,7 +163,9 @@ RawSocketImpl::SendTo (Ptr packet, uint32_t flags, const Address &toAddr } InetSocketAddress ad = InetSocketAddress::ConvertFrom (toAddress); Ptr ipv4 = m_node->GetObject (); + NS_ASSERT(ipv4 != 0); Ipv4Address dst = ad.GetIpv4 (); + NS_LOG_LOGIC ("RawSocketImpl::SendTo packet uid " << packet->GetUid() << " address " << dst); if (ipv4->GetRoutingProtocol ()) { Ipv4Header header; @@ -262,13 +264,16 @@ RawSocketImpl::SetProtocol (uint16_t protocol) } bool -RawSocketImpl::ForwardUp (Ptr p, Ipv4Header ipHeader, Ptr device) +RawSocketImpl::ForwardUp (Ptr p, Ptr device) { - NS_LOG_FUNCTION (this << *p << ipHeader << device); + NS_LOG_FUNCTION (this << *p << device); if (m_shutdownRecv) { return false; } NS_LOG_LOGIC ("src = " << m_src << " dst = " << m_dst); + Ptr copy = p->Copy (); + Ipv4Header ipHeader; + copy->RemoveHeader (ipHeader); if ((m_src == Ipv4Address::GetAny () || ipHeader.GetDestination () == m_src) && (m_dst == Ipv4Address::GetAny () || ipHeader.GetSource () == m_dst) && ipHeader.GetProtocol () == m_protocol) { @@ -284,7 +289,6 @@ RawSocketImpl::ForwardUp (Ptr p, Ipv4Header ipHeader, PtrAddHeader (ipHeader); struct Data data; data.packet = copy; data.fromIp = ipHeader.GetSource (); diff --git a/src/internet-stack/raw-socket-impl.h b/src/internet-stack/raw-socket-impl.h index fb67af581..1d15a6e17 100644 --- a/src/internet-stack/raw-socket-impl.h +++ b/src/internet-stack/raw-socket-impl.h @@ -40,7 +40,7 @@ public: Address &fromAddress); void SetProtocol (uint16_t protocol); - bool ForwardUp (Ptr p, Ipv4Header ipHeader, Ptr device); + bool ForwardUp (Ptr p, Ptr device); private: virtual void DoDispose (void); @@ -63,4 +63,4 @@ private: } // namespace ns3 -#endif /* IPV4_RAW_SOCKET_IMPL_H */ +#endif /* RAW_SOCKET_IMPL_H */ diff --git a/src/routing/aodv/aodv-routing-protocol.cc b/src/routing/aodv/aodv-routing-protocol.cc index 77fd61e28..3807c2a27 100644 --- a/src/routing/aodv/aodv-routing-protocol.cc +++ b/src/routing/aodv/aodv-routing-protocol.cc @@ -45,7 +45,7 @@ #include "ns3/raw-socket-factory.h" #include "ns3/ipv4-raw-socket-factory.h" - +#include "src/internet-stack/udp-l4-protocol.h" /// UDP Port for AODV control traffic @@ -235,15 +235,16 @@ RoutingProtocol::Start () continue; // Create a socket to listen only on this interface + NS_LOG_UNCOND("create raw socket"); Ptr socket = CreateObject (); socket->SetNode(GetObject ()); - //Ptr socket = Socket::CreateSocket (GetObject (), RawSocketFactory::GetTypeId()); +// Ptr socket = Socket::CreateSocket (GetObject (), RawSocketFactory::GetTypeId()); NS_ASSERT (socket != 0); - int status = socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT)); - NS_ASSERT (status != -1); + // int status = socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT)); + // NS_ASSERT (status != -1); socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this)); - status = socket->Connect (InetSocketAddress (iface.GetBroadcast (), AODV_PORT)); - NS_ASSERT (status != -1); +// status = socket->Connect (InetSocketAddress (iface.GetBroadcast (), AODV_PORT)); + // NS_ASSERT (status != -1); m_socketAddresses.insert (std::make_pair (socket, iface)); NS_LOG_INFO ("Interface " << iface << " used by AODV"); @@ -439,13 +440,12 @@ RoutingProtocol::IsMyOwnPacket (Ipv4Address src) void RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G) { - NS_LOG_FUNCTION (this << dst); + NS_LOG_FUNCTION ( this << dst); // Create RREQ header TypeHeader tHeader (AODVTYPE_RREQ); RreqHeader rreqHeader; Ipv4Header ipv4Header; - ipv4Header.SetTtl (NET_DIAMETER); rreqHeader.SetDst (dst); RoutingTableEntry rt; @@ -488,6 +488,8 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G) rreqHeader.SetId (m_broadcastID); rreqHeader.SetHopCount (0); + + // Send RREQ as subnet directed broadcast from each (own) interface Ptr packet = Create (); for (std::map , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j) @@ -498,11 +500,10 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G) rreqHeader.SetOrigin (iface.GetLocal ()); InsertBroadcastId (iface.GetLocal (), m_broadcastID); - ipv4Header.SetSource (iface.GetLocal ()); - ipv4Header.SetDestination (iface.GetBroadcast()); - - packet->AddHeader (rreqHeader); - packet->AddHeader (tHeader); + packet->AddHeader(rreqHeader); + packet->AddHeader(tHeader); + BuildPacket(/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/iface.GetLocal (), + /*destination address*/iface.GetBroadcast(), /*id*/ m_seqNo, /*TTL*/ NET_DIAMETER); //TODO add seqno for broadcast socket->Send (packet); } @@ -719,7 +720,7 @@ RoutingProtocol::RecvRequest (Ptr p, Ipv4Address receiver, Ipv4Address s { Ptr socket = j->first; Ipv4InterfaceAddress iface = j->second; - socket->Send (packet); + socket->Send (packet,0); } htimer.Cancel(); @@ -1094,7 +1095,7 @@ RoutingProtocol::SendHello () packet->AddHeader (helloHeader); TypeHeader tHeader (AODVTYPE_RREP); packet->AddHeader (tHeader); - socket->Send (packet); + socket->Send (packet,0); } } @@ -1193,7 +1194,7 @@ RoutingProtocol::SendRerrMessage (Ptr packet, std::vector p for (std::vector::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i) { Ptr socket = FindSocketWithInterfaceAddress (*i); - socket->Send (packet); + socket->Send (packet,0); } } @@ -1212,13 +1213,31 @@ RoutingProtocol::FindSocketWithInterfaceAddress (Ipv4Address addr) const return socket; } +void +RoutingProtocol::BuildPacket(Ptr packet, uint16_t sport, uint16_t dport, Ipv4Address src, Ipv4Address dst, uint32_t identification, uint16_t ttl) +{ + UdpHeader udpHeader; + udpHeader.SetDestinationPort(sport); + udpHeader.SetSourcePort(dport); + packet->AddHeader(udpHeader); + + Ipv4Header ipv4Header; + ipv4Header.SetSource (src); + ipv4Header.SetDestination (dst); + ipv4Header.SetIdentification(identification); + ipv4Header.EnableChecksum (); + ipv4Header.SetProtocol(UdpL4Protocol::PROT_NUMBER); + ipv4Header.SetTtl (ttl); + ipv4Header.SetPayloadSize (packet->GetSize()); + packet->AddHeader(ipv4Header); +} + void RoutingProtocol::LocalRouteRepair (Ipv4Address dst, Ptr p) { // TODO local_rt_repair } - void RoutingProtocol::HandleLinkFailure (Ipv4Address addr) { diff --git a/src/routing/aodv/aodv-routing-protocol.h b/src/routing/aodv/aodv-routing-protocol.h index a48611694..92fb3ecb2 100644 --- a/src/routing/aodv/aodv-routing-protocol.h +++ b/src/routing/aodv/aodv-routing-protocol.h @@ -204,6 +204,15 @@ private: bool IsMyOwnPacket(Ipv4Address src); /// Find socket with local interface address iface Ptr FindSocketWithInterfaceAddress(Ipv4Address iface) const; + /** + * Add UDP and IP header to packet. + * \param sport - source port number + * \param dport - destination port number + * \param src - source IP address + * \param dst - destination IP address + * \param identification - used as sequence number for broadcast traffic + */ + void BuildPacket(Ptr packet, uint16_t sport, uint16_t dport, Ipv4Address src, Ipv4Address dst, uint32_t identification, uint16_t ttl); /// Process hello message void ProcessHello(RrepHeader const & rrepHeader, Ipv4Address receiverIfaceAddr);