Tue Jan 27 14:37:17 2015 +0100 c8f41a4 Application improvements  [Natale Patriciello] diff --git a/src/applications/model/bulk-send-application.cc b/src/applications/model/bulk-send-application.cc index 2623e41..e8744b7 100644 --- a/src/applications/model/bulk-send-application.cc +++ b/src/applications/model/bulk-send-application.cc @@ -109,6 +109,12 @@ BulkSendApplication::DoDispose (void) Application::DoDispose (); } +void +BulkSendApplication::SetSocket(Ptr socket) +{ + m_socket = socket; +} + // Application Methods void BulkSendApplication::StartApplication (void) // Called at time specified by Start { @@ -118,33 +124,33 @@ void BulkSendApplication::StartApplication (void) // Called at time specified by if (!m_socket) { m_socket = Socket::CreateSocket (GetNode (), m_tid); + } + // Fatal error if socket type is not NS3_SOCK_STREAM or NS3_SOCK_SEQPACKET + if (m_socket->GetSocketType () != Socket::NS3_SOCK_STREAM && + m_socket->GetSocketType () != Socket::NS3_SOCK_SEQPACKET) + { + NS_FATAL_ERROR ("Using BulkSend with an incompatible socket type. " + "BulkSend requires SOCK_STREAM or SOCK_SEQPACKET. " + "In other words, use TCP instead of UDP."); + } - // Fatal error if socket type is not NS3_SOCK_STREAM or NS3_SOCK_SEQPACKET - if (m_socket->GetSocketType () != Socket::NS3_SOCK_STREAM && - m_socket->GetSocketType () != Socket::NS3_SOCK_SEQPACKET) - { - NS_FATAL_ERROR ("Using BulkSend with an incompatible socket type. " - "BulkSend requires SOCK_STREAM or SOCK_SEQPACKET. " - "In other words, use TCP instead of UDP."); - } + if (Inet6SocketAddress::IsMatchingType (m_peer)) + { + m_socket->Bind6 (); + } + else if (InetSocketAddress::IsMatchingType (m_peer)) + { + m_socket->Bind (); + } - if (Inet6SocketAddress::IsMatchingType (m_peer)) - { - m_socket->Bind6 (); - } - else if (InetSocketAddress::IsMatchingType (m_peer)) - { - m_socket->Bind (); - } + m_socket->Connect (m_peer); + m_socket->ShutdownRecv (); + m_socket->SetConnectCallback ( + MakeCallback (&BulkSendApplication::ConnectionSucceeded, this), + MakeCallback (&BulkSendApplication::ConnectionFailed, this)); + m_socket->SetSendCallback ( + MakeCallback (&BulkSendApplication::DataSend, this)); - m_socket->Connect (m_peer); - m_socket->ShutdownRecv (); - m_socket->SetConnectCallback ( - MakeCallback (&BulkSendApplication::ConnectionSucceeded, this), - MakeCallback (&BulkSendApplication::ConnectionFailed, this)); - m_socket->SetSendCallback ( - MakeCallback (&BulkSendApplication::DataSend, this)); - } if (m_connected) { SendData (); @@ -200,6 +206,9 @@ void BulkSendApplication::SendData (void) // Check if time to close (all sent) if (m_totBytes == m_maxBytes && m_connected) { + if (! m_dataTransferred.IsNull ()) + m_dataTransferred (m_node); + m_socket->Close (); m_connected = false; } @@ -229,6 +238,9 @@ void BulkSendApplication::DataSend (Ptr, uint32_t) } } - +void BulkSendApplication::SetDataTransferredCallback (Callback > dataTransferred) +{ + m_dataTransferred = dataTransferred; +} } // Namespace ns3 diff --git a/src/applications/model/bulk-send-application.h b/src/applications/model/bulk-send-application.h index d8f4856..585117c 100644 --- a/src/applications/model/bulk-send-application.h +++ b/src/applications/model/bulk-send-application.h @@ -94,11 +94,29 @@ public: void SetMaxBytes (uint32_t maxBytes); /** - * \brief Get the socket this application is attached to. - * \return pointer to associated socket + * \brief Get the socket of this application + * + * \return pointer to the socket */ Ptr GetSocket (void) const; + /** + * \brief (Optional) Set the application socket + * + * The socket will be created by the application if this + * method is not called. + * + * \param socket Socket pointer + */ + void SetSocket (Ptr socket); + + /** + * \brief Set the callback to call when all data has been transmitted + * \param cbDataTransferred Callback + */ + void SetDataTransferredCallback (Callback > + cbDataTransferred); + protected: virtual void DoDispose (void); private: @@ -106,6 +124,8 @@ private: virtual void StartApplication (void); // Called at time specified by Start virtual void StopApplication (void); // Called at time specified by Stop + Callback > m_dataTransferred; //!< callback to call when all + // data has been transmitted /** * \brief Send data until the L4 transmission buffer is full. */ diff --git a/src/applications/model/onoff-application.cc b/src/applications/model/onoff-application.cc index 52556df..015a56e 100644 --- a/src/applications/model/onoff-application.cc +++ b/src/applications/model/onoff-application.cc @@ -142,6 +142,12 @@ OnOffApplication::DoDispose (void) Application::DoDispose (); } +void +OnOffApplication::SetSocket(Ptr socket) +{ + m_socket = socket; +} + // Application Methods void OnOffApplication::StartApplication () // Called at time specified by Start { @@ -151,23 +157,24 @@ void OnOffApplication::StartApplication () // Called at time specified by Start if (!m_socket) { m_socket = Socket::CreateSocket (GetNode (), m_tid); - if (Inet6SocketAddress::IsMatchingType (m_peer)) - { - m_socket->Bind6 (); - } - else if (InetSocketAddress::IsMatchingType (m_peer) || - PacketSocketAddress::IsMatchingType (m_peer)) - { - m_socket->Bind (); - } - m_socket->Connect (m_peer); - m_socket->SetAllowBroadcast (true); - m_socket->ShutdownRecv (); + } + if (Inet6SocketAddress::IsMatchingType (m_peer)) + { + m_socket->Bind6 (); + } + else if (InetSocketAddress::IsMatchingType (m_peer) || + PacketSocketAddress::IsMatchingType (m_peer)) + { + m_socket->Bind (); + } + m_socket->Connect (m_peer); + m_socket->SetAllowBroadcast (true); + m_socket->ShutdownRecv (); - m_socket->SetConnectCallback ( + m_socket->SetConnectCallback ( MakeCallback (&OnOffApplication::ConnectionSucceeded, this), MakeCallback (&OnOffApplication::ConnectionFailed, this)); - } + m_cbrRateFailSafe = m_cbrRate; // Insure no pending event @@ -293,6 +300,7 @@ void OnOffApplication::SendPacket () << " port " << Inet6SocketAddress::ConvertFrom (m_peer).GetPort () << " total Tx " << m_totBytes << " bytes"); } + m_lastStartTime = Simulator::Now (); m_residualBits = 0; ScheduleNextTx (); diff --git a/src/applications/model/onoff-application.h b/src/applications/model/onoff-application.h index 2d65906..40787d2 100644 --- a/src/applications/model/onoff-application.h +++ b/src/applications/model/onoff-application.h @@ -112,6 +112,8 @@ public: */ Ptr GetSocket (void) const; + void SetSocket (Ptr socket); + /** * \brief Assign a fixed random variable stream number to the random variables * used by this model. diff --git a/src/applications/model/packet-sink.cc b/src/applications/model/packet-sink.cc index 627b449..1b43857 100644 --- a/src/applications/model/packet-sink.cc +++ b/src/applications/model/packet-sink.cc @@ -105,7 +105,6 @@ void PacketSink::DoDispose (void) Application::DoDispose (); } - // Application Methods void PacketSink::StartApplication () // Called at time specified by Start { @@ -114,21 +113,22 @@ void PacketSink::StartApplication () // Called at time specified by Start if (!m_socket) { m_socket = Socket::CreateSocket (GetNode (), m_tid); - m_socket->Bind (m_local); - m_socket->Listen (); - m_socket->ShutdownSend (); - if (addressUtils::IsMulticast (m_local)) + } + + m_socket->Bind (m_local); + m_socket->Listen (); + m_socket->ShutdownSend (); + if (addressUtils::IsMulticast (m_local)) + { + Ptr udpSocket = DynamicCast (m_socket); + if (udpSocket) { - Ptr udpSocket = DynamicCast (m_socket); - if (udpSocket) - { - // equivalent to setsockopt (MCAST_JOIN_GROUP) - udpSocket->MulticastJoinGroup (0, m_local); - } - else - { - NS_FATAL_ERROR ("Error: joining multicast on a non-UDP socket"); - } + // equivalent to setsockopt (MCAST_JOIN_GROUP) + udpSocket->MulticastJoinGroup (0, m_local); + } + else + { + NS_FATAL_ERROR ("Error: joining multicast on a non-UDP socket"); } } @@ -141,6 +141,12 @@ void PacketSink::StartApplication () // Called at time specified by Start MakeCallback (&PacketSink::HandlePeerError, this)); } +void +PacketSink::SetSocket(Ptr socket) +{ + m_socket = socket; +} + void PacketSink::StopApplication () // Called at time specified by Stop { NS_LOG_FUNCTION (this); diff --git a/src/applications/model/packet-sink.h b/src/applications/model/packet-sink.h index 69ae054..600cba4 100644 --- a/src/applications/model/packet-sink.h +++ b/src/applications/model/packet-sink.h @@ -91,6 +91,8 @@ public: * \return list of pointers to accepted sockets */ std::list > GetAcceptedSockets (void) const; + + void SetSocket (Ptr socket); protected: virtual void DoDispose (void);