00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef TCP_SOCKET_IMPL_H
00021 #define TCP_SOCKET_IMPL_H
00022
00023 #include <stdint.h>
00024 #include <queue>
00025 #include "ns3/callback.h"
00026 #include "ns3/traced-value.h"
00027 #include "ns3/tcp-socket.h"
00028 #include "ns3/ptr.h"
00029 #include "ns3/ipv4-address.h"
00030 #include "ns3/event-id.h"
00031 #include "tcp-typedefs.h"
00032 #include "pending-data.h"
00033 #include "sequence-number.h"
00034 #include "rtt-estimator.h"
00035
00036
00037 namespace ns3 {
00038
00039 class Ipv4EndPoint;
00040 class Node;
00041 class Packet;
00042 class TcpL4Protocol;
00043 class TcpHeader;
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 class TcpSocketImpl : public TcpSocket
00067 {
00068 public:
00069 static TypeId GetTypeId (void);
00070
00071
00072
00073 TcpSocketImpl ();
00074 TcpSocketImpl (const TcpSocketImpl& sock);
00075 virtual ~TcpSocketImpl ();
00076
00077 void SetNode (Ptr<Node> node);
00078 void SetTcp (Ptr<TcpL4Protocol> tcp);
00079 void SetRtt (Ptr<RttEstimator> rtt);
00080
00081 virtual enum SocketErrno GetErrno (void) const;
00082 virtual Ptr<Node> GetNode (void) const;
00083 virtual int Bind (void);
00084 virtual int Bind (const Address &address);
00085 virtual int Close (void);
00086 virtual int ShutdownSend (void);
00087 virtual int ShutdownRecv (void);
00088 virtual int Connect(const Address &address);
00089 virtual int Listen(void);
00090 virtual uint32_t GetTxAvailable (void) const;
00091 virtual int Send (Ptr<Packet> p, uint32_t flags);
00092 virtual int SendTo(Ptr<Packet> p, uint32_t flags, const Address &toAddress);
00093 virtual uint32_t GetRxAvailable (void) const;
00094 virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags);
00095 virtual Ptr<Packet> RecvFrom (uint32_t maxSize, uint32_t flags,
00096 Address &fromAddress);
00097 virtual int GetSockName (Address &address) const;
00098
00099 private:
00100 friend class Tcp;
00101
00102 int FinishBind (void);
00103 void ForwardUp (Ptr<Packet> p, Ipv4Address ipv4, uint16_t port);
00104 void Destroy (void);
00105 int DoSendTo (Ptr<Packet> p, const Address &daddr);
00106 int DoSendTo (Ptr<Packet> p, Ipv4Address daddr, uint16_t dport);
00107 void SendEmptyPacket(uint8_t flags);
00108
00109 bool ProcessAction (Actions_t a);
00110 bool ProcessAction (Actions_t a, const TcpHeader& tcpHeader,
00111 Ipv4Address saddr, Ipv4Address daddr);
00112 bool ProcessPacketAction (Actions_t a, Ptr<Packet> p,
00113 const TcpHeader& tcpHeader,
00114 const Address& fromAddress);
00115 Actions_t ProcessEvent (Events_t e);
00116 bool SendPendingData(bool withAck = false);
00117 void CompleteFork(Ptr<Packet>, const TcpHeader&, const Address& fromAddress);
00118 void ConnectionSucceeded();
00119
00120
00121 virtual uint32_t UnAckDataCount();
00122 virtual uint32_t BytesInFlight();
00123 virtual uint32_t Window();
00124 virtual uint32_t AvailableWindow();
00125
00126
00127 uint32_t RxBufferFreeSpace();
00128 uint16_t AdvertisedWindowSize();
00129
00130
00131 void NewRx (Ptr<Packet>, const TcpHeader&, const Address&);
00132 void RxBufFinishInsert (SequenceNumber);
00133
00134 Ptr<TcpSocketImpl> Copy ();
00135 void NewAck (SequenceNumber seq);
00136
00137 void DupAck (const TcpHeader& t, uint32_t count);
00138 void ReTxTimeout ();
00139 void DelAckTimeout ();
00140 void LastAckTimeout ();
00141 void PersistTimeout ();
00142 void Retransmit ();
00143 void CommonNewAck (SequenceNumber seq, bool skipTimer = false);
00144
00145
00146 virtual void SetSndBufSize (uint32_t size);
00147 virtual uint32_t GetSndBufSize (void) const;
00148 virtual void SetRcvBufSize (uint32_t size);
00149 virtual uint32_t GetRcvBufSize (void) const;
00150 virtual void SetSegSize (uint32_t size);
00151 virtual uint32_t GetSegSize (void) const;
00152 virtual void SetSSThresh (uint32_t threshold);
00153 virtual uint32_t GetSSThresh (void) const;
00154 virtual void SetInitialCwnd (uint32_t cwnd);
00155 virtual uint32_t GetInitialCwnd (void) const;
00156 virtual void SetConnTimeout (Time timeout);
00157 virtual Time GetConnTimeout (void) const;
00158 virtual void SetConnCount (uint32_t count);
00159 virtual uint32_t GetConnCount (void) const;
00160 virtual void SetDelAckTimeout (Time timeout);
00161 virtual Time GetDelAckTimeout (void) const;
00162 virtual void SetDelAckMaxCount (uint32_t count);
00163 virtual uint32_t GetDelAckMaxCount (void) const;
00164
00165 bool m_skipRetxResched;
00166 uint32_t m_dupAckCount;
00167 EventId m_retxEvent;
00168 EventId m_lastAckEvent;
00169
00170 EventId m_delAckEvent;
00171 uint32_t m_delAckCount;
00172 uint32_t m_delAckMaxCount;
00173 Time m_delAckTimeout;
00174
00175 Ipv4EndPoint *m_endPoint;
00176 Ptr<Node> m_node;
00177 Ptr<TcpL4Protocol> m_tcp;
00178 Ipv4Address m_remoteAddress;
00179 uint16_t m_remotePort;
00180
00181 Ipv4Address m_localAddress;
00182 uint16_t m_localPort;
00183 enum SocketErrno m_errno;
00184 bool m_shutdownSend;
00185 bool m_shutdownRecv;
00186 bool m_connected;
00187
00188
00189 States_t m_state;
00190 bool m_closeNotified;
00191 bool m_closeRequestNotified;
00192 bool m_closeOnEmpty;
00193 bool m_pendingClose;
00194
00195
00196
00197 SequenceNumber m_nextTxSequence;
00198 SequenceNumber m_highTxMark;
00199 SequenceNumber m_highestRxAck;
00200 SequenceNumber m_lastRxAck;
00201
00202
00203 SequenceNumber m_nextRxSequence;
00204
00205
00206 UnAckData_t m_bufferedData;
00207
00208 uint32_t m_rxAvailable;
00209 uint32_t m_rxBufSize;
00210
00211
00212
00213
00214
00215 PendingData* m_pendingData;
00216 SequenceNumber m_firstPendingSequence;
00217
00218
00219 uint32_t m_segmentSize;
00220 uint32_t m_rxWindowSize;
00221 TracedValue<uint32_t> m_cWnd;
00222 uint32_t m_ssThresh;
00223 uint32_t m_initialCWnd;
00224
00225
00226 Time m_persistTime;
00227 EventId m_persistEvent;
00228
00229
00230
00231 Ptr<RttEstimator> m_rtt;
00232 Time m_lastMeasuredRtt;
00233
00234
00235 Time m_cnTimeout;
00236 uint32_t m_cnCount;
00237
00238
00239 uint32_t m_sndBufSize;
00240 uint32_t m_rxBufMaxSize;
00241 };
00242
00243 }
00244
00245 #endif