/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ /* * Copyright (c) 2007 INRIA * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation; * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Mathieu Lacage */ #ifndef UDP_SOCKET_IMPL_H #define UDP_SOCKET_IMPL_H #include #include #include "ns3/callback.h" #include "ns3/traced-callback.h" #include "ns3/socket.h" #include "ns3/ptr.h" #include "ns3/ipv4-address.h" #include "ns3/udp-socket.h" #include "icmpv4.h" namespace ns3 { class Ipv4EndPoint; class Node; class Packet; class UdpL4Protocol; /** * \ingroup udp * \brief A sockets interface to UDP * * This class subclasses ns3::UdpSocket, and provides a socket interface * to ns3's implementation of UDP. */ class UdpSocketImpl : public UdpSocket { public: static TypeId GetTypeId (void); /** * Create an unbound udp socket. */ UdpSocketImpl (); virtual ~UdpSocketImpl (); void SetNode (Ptr node); void SetUdp (Ptr udp); virtual enum SocketErrno GetErrno (void) const; virtual Ptr GetNode (void) const; virtual int Bind (void); virtual int Bind (const Address &address); 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 &address); 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); virtual int GetSockName (Address &address) const; private: // Attributes set through UdpSocket base class virtual void SetRcvBufSize (uint32_t size); virtual uint32_t GetRcvBufSize (void) const; virtual void SetIpTtl (uint32_t ipTtl); virtual uint32_t GetIpTtl (void) const; virtual void SetIpMulticastTtl (uint32_t ipTtl); virtual uint32_t GetIpMulticastTtl (void) const; virtual void SetMtuDiscover (bool discover); virtual bool GetMtuDiscover (void) const; friend class UdpSocketFactory; // invoked by Udp class int FinishBind (void); void ForwardUp (Ptr p, Ipv4Address ipv4, uint16_t port); void Destroy (void); int DoSend (Ptr p); int DoSendTo (Ptr p, const Address &daddr); int DoSendTo (Ptr p, Ipv4Address daddr, uint16_t dport); void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo); Ipv4EndPoint *m_endPoint; Ptr m_node; Ptr m_udp; Ipv4Address m_defaultAddress; uint16_t m_defaultPort; TracedCallback > m_dropTrace; enum SocketErrno m_errno; bool m_shutdownSend; bool m_shutdownRecv; bool m_connected; std::queue > m_deliveryQueue; uint32_t m_rxAvailable; // Socket attributes uint32_t m_rcvBufSize; uint32_t m_ipTtl; uint32_t m_ipMulticastTtl; bool m_mtuDiscover; Callback m_icmpCallback; }; }//namespace ns3 #endif /* UDP_SOCKET_IMPL_H */