00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef UDP_SOCKET_IMPL_H
00021 #define UDP_SOCKET_IMPL_H
00022
00023 #include <stdint.h>
00024 #include <queue>
00025 #include "ns3/callback.h"
00026 #include "ns3/traced-callback.h"
00027 #include "ns3/socket.h"
00028 #include "ns3/ptr.h"
00029 #include "ns3/ipv4-address.h"
00030 #include "ns3/udp-socket.h"
00031 #include "icmpv4.h"
00032
00033 namespace ns3 {
00034
00035 class Ipv4EndPoint;
00036 class Node;
00037 class Packet;
00038 class UdpL4Protocol;
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 class UdpSocketImpl : public UdpSocket
00049 {
00050 public:
00051 static TypeId GetTypeId (void);
00052
00053
00054
00055 UdpSocketImpl ();
00056 virtual ~UdpSocketImpl ();
00057
00058 void SetNode (Ptr<Node> node);
00059 void SetUdp (Ptr<UdpL4Protocol> udp);
00060
00061 virtual enum SocketErrno GetErrno (void) const;
00062 virtual Ptr<Node> GetNode (void) const;
00063 virtual int Bind (void);
00064 virtual int Bind (const Address &address);
00065 virtual int Close (void);
00066 virtual int ShutdownSend (void);
00067 virtual int ShutdownRecv (void);
00068 virtual int Connect(const Address &address);
00069 virtual int Listen (void);
00070 virtual uint32_t GetTxAvailable (void) const;
00071 virtual int Send (Ptr<Packet> p, uint32_t flags);
00072 virtual int SendTo (Ptr<Packet> p, uint32_t flags, const Address &address);
00073 virtual uint32_t GetRxAvailable (void) const;
00074 virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags);
00075 virtual Ptr<Packet> RecvFrom (uint32_t maxSize, uint32_t flags,
00076 Address &fromAddress);
00077 virtual int GetSockName (Address &address) const;
00078
00079 private:
00080
00081 virtual void SetRcvBufSize (uint32_t size);
00082 virtual uint32_t GetRcvBufSize (void) const;
00083 virtual void SetIpTtl (uint32_t ipTtl);
00084 virtual uint32_t GetIpTtl (void) const;
00085 virtual void SetIpMulticastTtl (uint32_t ipTtl);
00086 virtual uint32_t GetIpMulticastTtl (void) const;
00087 virtual void SetMtuDiscover (bool discover);
00088 virtual bool GetMtuDiscover (void) const;
00089
00090
00091 friend class UdpSocketFactory;
00092
00093 int FinishBind (void);
00094 void ForwardUp (Ptr<Packet> p, Ipv4Address ipv4, uint16_t port);
00095 void Destroy (void);
00096 int DoSend (Ptr<Packet> p);
00097 int DoSendTo (Ptr<Packet> p, const Address &daddr);
00098 int DoSendTo (Ptr<Packet> p, Ipv4Address daddr, uint16_t dport);
00099 void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
00100 uint8_t icmpType, uint8_t icmpCode,
00101 uint32_t icmpInfo);
00102
00103 Ipv4EndPoint *m_endPoint;
00104 Ptr<Node> m_node;
00105 Ptr<UdpL4Protocol> m_udp;
00106 Ipv4Address m_defaultAddress;
00107 uint16_t m_defaultPort;
00108 Callback<void,Ptr<Socket>,uint32_t,const Address &> m_dummyRxCallback;
00109 Callback<void,Ptr<Socket>,uint8_t const*,uint32_t,const Address &> m_rxCallback;
00110 TracedCallback<Ptr<const Packet> > m_dropTrace;
00111
00112 enum SocketErrno m_errno;
00113 bool m_shutdownSend;
00114 bool m_shutdownRecv;
00115 bool m_connected;
00116
00117 std::queue<Ptr<Packet> > m_deliveryQueue;
00118 uint32_t m_rxAvailable;
00119
00120
00121 uint32_t m_rcvBufSize;
00122 uint32_t m_ipTtl;
00123 uint32_t m_ipMulticastTtl;
00124 bool m_mtuDiscover;
00125 Callback<void, Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback;
00126 };
00127
00128 }
00129
00130 #endif