A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Portuguese
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
tcp-socket-base.h
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2007 Georgia Tech Research Corporation
4
* Copyright (c) 2010 Adrian Sai-wah Tam
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 as
8
* published by the Free Software Foundation;
9
*
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
14
*
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
*
19
* Author: Adrian Sai-wah Tam <adrian.sw.tam@gmail.com>
20
*/
21
#ifndef TCP_SOCKET_BASE_H
22
#define TCP_SOCKET_BASE_H
23
24
#include <stdint.h>
25
#include <queue>
26
#include "ns3/callback.h"
27
#include "ns3/traced-value.h"
28
#include "ns3/tcp-socket.h"
29
#include "ns3/ptr.h"
30
#include "ns3/ipv4-address.h"
31
#include "ns3/ipv4-header.h"
32
#include "ns3/ipv4-interface.h"
33
#include "ns3/ipv6-header.h"
34
#include "ns3/event-id.h"
35
#include "
tcp-tx-buffer.h
"
36
#include "
tcp-rx-buffer.h
"
37
#include "
rtt-estimator.h
"
38
39
namespace
ns3 {
40
41
class
Ipv4EndPoint;
42
class
Ipv6EndPoint;
43
class
Node;
44
class
Packet;
45
class
TcpL4Protocol;
46
class
TcpHeader;
47
61
class
TcpSocketBase
:
public
TcpSocket
62
{
63
public
:
64
static
TypeId
GetTypeId
(
void
);
68
TcpSocketBase
(
void
);
69
73
TcpSocketBase
(
const
TcpSocketBase
& sock);
74
virtual
~TcpSocketBase
(
void
);
75
76
// Set associated Node, TcpL4Protocol, RttEstimator to this socket
77
virtual
void
SetNode
(
Ptr<Node>
node);
78
virtual
void
SetTcp
(
Ptr<TcpL4Protocol>
tcp);
79
virtual
void
SetRtt
(
Ptr<RttEstimator>
rtt);
80
81
// Necessary implementations of null functions from ns3::Socket
82
virtual
enum
SocketErrno
GetErrno
(
void
)
const
;
// returns m_errno
83
virtual
enum
SocketType
GetSocketType
(
void
)
const
;
// returns socket type
84
virtual
Ptr<Node>
GetNode
(
void
)
const
;
// returns m_node
85
virtual
int
Bind
(
void
);
// Bind a socket by setting up endpoint in TcpL4Protocol
86
virtual
int
Bind6
(
void
);
// Bind a socket by setting up endpoint in TcpL4Protocol
87
virtual
int
Bind
(
const
Address
&address);
// ... endpoint of specific addr or port
88
virtual
int
Connect
(
const
Address
&address);
// Setup endpoint and call ProcessAction() to connect
89
virtual
int
Listen
(
void
);
// Verify the socket is in a correct state and call ProcessAction() to listen
90
virtual
int
Close
(
void
);
// Close by app: Kill socket upon tx buffer emptied
91
virtual
int
ShutdownSend
(
void
);
// Assert the m_shutdownSend flag to prevent send to network
92
virtual
int
ShutdownRecv
(
void
);
// Assert the m_shutdownRecv flag to prevent forward to app
93
virtual
int
Send
(
Ptr<Packet>
p, uint32_t flags);
// Call by app to send data to network
94
virtual
int
SendTo
(
Ptr<Packet>
p, uint32_t flags,
const
Address
&toAddress);
// Same as Send(), toAddress is insignificant
95
virtual
Ptr<Packet>
Recv
(uint32_t maxSize, uint32_t flags);
// Return a packet to be forwarded to app
96
virtual
Ptr<Packet>
RecvFrom
(uint32_t maxSize, uint32_t flags,
Address
&fromAddress);
// ... and write the remote address at fromAddress
97
virtual
uint32_t
GetTxAvailable
(
void
)
const
;
// Available Tx buffer size
98
virtual
uint32_t
GetRxAvailable
(
void
)
const
;
// Available-to-read data size, i.e. value of m_rxAvailable
99
virtual
int
GetSockName
(
Address
&address)
const
;
// Return local addr:port in address
100
virtual
void
BindToNetDevice
(
Ptr<NetDevice>
netdevice);
// NetDevice with my m_endPoint
101
102
protected
:
103
// Implementing ns3::TcpSocket -- Attribute get/set
104
virtual
void
SetSndBufSize
(uint32_t size);
105
virtual
uint32_t
GetSndBufSize
(
void
)
const
;
106
virtual
void
SetRcvBufSize
(uint32_t size);
107
virtual
uint32_t
GetRcvBufSize
(
void
)
const
;
108
virtual
void
SetSegSize
(uint32_t size);
109
virtual
uint32_t
GetSegSize
(
void
)
const
;
110
virtual
void
SetSSThresh
(uint32_t threshold) = 0;
111
virtual
uint32_t
GetSSThresh
(
void
)
const
= 0;
112
virtual
void
SetInitialCwnd
(uint32_t cwnd) = 0;
113
virtual
uint32_t
GetInitialCwnd
(
void
)
const
= 0;
114
virtual
void
SetConnTimeout
(
Time
timeout
);
115
virtual
Time
GetConnTimeout
(
void
)
const
;
116
virtual
void
SetConnCount
(uint32_t count);
117
virtual
uint32_t
GetConnCount
(
void
)
const
;
118
virtual
void
SetDelAckTimeout
(
Time
timeout);
119
virtual
Time
GetDelAckTimeout
(
void
)
const
;
120
virtual
void
SetDelAckMaxCount
(uint32_t count);
121
virtual
uint32_t
GetDelAckMaxCount
(
void
)
const
;
122
virtual
void
SetTcpNoDelay
(
bool
noDelay);
123
virtual
bool
GetTcpNoDelay
(
void
)
const
;
124
virtual
void
SetPersistTimeout
(
Time
timeout);
125
virtual
Time
GetPersistTimeout
(
void
)
const
;
126
virtual
bool
SetAllowBroadcast
(
bool
allowBroadcast);
127
virtual
bool
GetAllowBroadcast
(
void
)
const
;
128
129
// Helper functions: Connection set up
130
int
SetupCallback
(
void
);
// Common part of the two Bind(), i.e. set callback and remembering local addr:port
131
int
DoConnect
(
void
);
// Sending a SYN packet to make a connection if the state allows
132
void
ConnectionSucceeded
(
void
);
// Schedule-friendly wrapper for Socket::NotifyConnectionSucceeded()
133
int
SetupEndpoint
(
void
);
// Configure m_endpoint for local addr for given remote addr
134
int
SetupEndpoint6
(
void
);
// Configure m_endpoint6 for local addr for given remote addr
135
void
CompleteFork
(
Ptr<Packet>
,
const
TcpHeader
&,
const
Address
& fromAddress,
const
Address
& toAdress);
136
137
// Helper functions: Transfer operation
138
void
ForwardUp
(
Ptr<Packet>
packet,
Ipv4Header
header, uint16_t
port
,
Ptr<Ipv4Interface>
incomingInterface);
139
void
ForwardUp6
(
Ptr<Packet>
packet,
Ipv6Header
header, uint16_t port);
140
virtual
void
DoForwardUp
(
Ptr<Packet>
packet,
Ipv4Header
header, uint16_t port,
Ptr<Ipv4Interface>
incomingInterface);
//Get a pkt from L3
141
virtual
void
DoForwardUp
(
Ptr<Packet>
packet,
Ipv6Header
header, uint16_t port);
// Ipv6 version
142
void
ForwardIcmp
(
Ipv4Address
icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
143
void
ForwardIcmp6
(
Ipv6Address
icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
144
bool
SendPendingData
(
bool
withAck =
false
);
// Send as much as the window allows
145
uint32_t
SendDataPacket
(
SequenceNumber32
seq, uint32_t maxSize,
bool
withAck);
// Send a data packet
146
void
SendEmptyPacket
(uint8_t flags);
// Send a empty packet that carries a flag, e.g. ACK
147
void
SendRST
(
void
);
// Send reset and tear down this socket
148
bool
OutOfRange
(
SequenceNumber32
head,
SequenceNumber32
tail)
const
;
// Check if a sequence number range is within the rx window
149
150
// Helper functions: Connection close
151
int
DoClose
(
void
);
// Close a socket by sending RST, FIN, or FIN+ACK, depend on the current state
152
void
CloseAndNotify
(
void
);
// To CLOSED state, notify upper layer, and deallocate end point
153
void
Destroy
(
void
);
// Kill this socket by zeroing its attributes
154
void
Destroy6
(
void
);
// Kill this socket by zeroing its attributes
155
void
DeallocateEndPoint
(
void
);
// Deallocate m_endPoint
156
void
PeerClose
(
Ptr<Packet>
,
const
TcpHeader
&);
// Received a FIN from peer, notify rx buffer
157
void
DoPeerClose
(
void
);
// FIN is in sequence, notify app and respond with a FIN
158
void
CancelAllTimers
(
void
);
// Cancel all timer when endpoint is deleted
159
void
TimeWait
(
void
);
// Move from CLOSING or FIN_WAIT_2 to TIME_WAIT state
160
161
// State transition functions
162
void
ProcessEstablished
(
Ptr<Packet>
,
const
TcpHeader
&);
// Received a packet upon ESTABLISHED state
163
void
ProcessListen
(
Ptr<Packet>
,
const
TcpHeader
&,
const
Address
&,
const
Address
&);
// Process the newly received ACK
164
void
ProcessSynSent
(
Ptr<Packet>
,
const
TcpHeader
&);
// Received a packet upon SYN_SENT
165
void
ProcessSynRcvd
(
Ptr<Packet>
,
const
TcpHeader
&,
const
Address
&,
const
Address
&);
// Received a packet upon SYN_RCVD
166
void
ProcessWait
(
Ptr<Packet>
,
const
TcpHeader
&);
// Received a packet upon CLOSE_WAIT, FIN_WAIT_1, FIN_WAIT_2
167
void
ProcessClosing
(
Ptr<Packet>
,
const
TcpHeader
&);
// Received a packet upon CLOSING
168
void
ProcessLastAck
(
Ptr<Packet>
,
const
TcpHeader
&);
// Received a packet upon LAST_ACK
169
170
// Window management
171
virtual
uint32_t
UnAckDataCount
(
void
);
// Return count of number of unacked bytes
172
virtual
uint32_t
BytesInFlight
(
void
);
// Return total bytes in flight
173
virtual
uint32_t
Window
(
void
);
// Return the max possible number of unacked bytes
174
virtual
uint32_t
AvailableWindow
(
void
);
// Return unfilled portion of window
175
virtual
uint16_t
AdvertisedWindowSize
(
void
);
// The amount of Rx window announced to the peer
176
177
// Manage data tx/rx
178
virtual
Ptr<TcpSocketBase>
Fork
(
void
) = 0;
// Call CopyObject<> to clone me
179
virtual
void
ReceivedAck
(
Ptr<Packet>
,
const
TcpHeader
&);
// Received an ACK packet
180
virtual
void
ReceivedData
(
Ptr<Packet>
,
const
TcpHeader
&);
// Recv of a data, put into buffer, call L7 to get it if necessary
181
virtual
void
EstimateRtt
(
const
TcpHeader
&);
// RTT accounting
182
virtual
void
NewAck
(
SequenceNumber32
const
& seq);
// Update buffers w.r.t. ACK
183
virtual
void
DupAck
(
const
TcpHeader
& t, uint32_t count) = 0;
// Received dupack
184
virtual
void
ReTxTimeout
(
void
);
// Call Retransmit() upon RTO event
185
virtual
void
Retransmit
(
void
);
// Halving cwnd and call DoRetransmit()
186
virtual
void
DelAckTimeout
(
void
);
// Action upon delay ACK timeout, i.e. send an ACK
187
virtual
void
LastAckTimeout
(
void
);
// Timeout at LAST_ACK, close the connection
188
virtual
void
PersistTimeout
(
void
);
// Send 1 byte probe to get an updated window size
189
virtual
void
DoRetransmit
(
void
);
// Retransmit the oldest packet
190
virtual
void
ReadOptions
(
const
TcpHeader
&);
// Read option from incoming packets
191
virtual
void
AddOptions
(
TcpHeader
&);
// Add option to outgoing packets
192
193
protected
:
194
// Counters and events
195
EventId
m_retxEvent
;
//< Retransmission event
196
EventId
m_lastAckEvent
;
//< Last ACK timeout event
197
EventId
m_delAckEvent
;
//< Delayed ACK timeout event
198
EventId
m_persistEvent
;
//< Persist event: Send 1 byte to probe for a non-zero Rx window
199
EventId
m_timewaitEvent
;
//< TIME_WAIT expiration event: Move this socket to CLOSED state
200
uint32_t
m_dupAckCount
;
//< Dupack counter
201
uint32_t
m_delAckCount
;
//< Delayed ACK counter
202
uint32_t
m_delAckMaxCount
;
//< Number of packet to fire an ACK before delay timeout
203
bool
m_noDelay
;
//< Set to true to disable Nagle's algorithm
204
uint32_t
m_cnCount
;
//< Count of remaining connection retries
205
uint32_t
m_cnRetries
;
//< Number of connection retries before giving up
206
TracedValue<Time>
m_rto
;
//< Retransmit timeout
207
TracedValue<Time>
m_lastRtt
;
//< Last RTT sample collected
208
Time
m_delAckTimeout
;
//< Time to delay an ACK
209
Time
m_persistTimeout
;
//< Time between sending 1-byte probes
210
Time
m_cnTimeout
;
//< Timeout for connection retry
211
212
// Connections to other layers of TCP/IP
213
Ipv4EndPoint
*
m_endPoint
;
214
Ipv6EndPoint
*
m_endPoint6
;
215
Ptr<Node>
m_node
;
216
Ptr<TcpL4Protocol>
m_tcp
;
217
Callback<void, Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t>
m_icmpCallback
;
218
Callback<void, Ipv6Address,uint8_t,uint8_t,uint8_t,uint32_t>
m_icmpCallback6
;
219
220
// Round trip time estimation
221
Ptr<RttEstimator>
m_rtt
;
222
223
// Rx and Tx buffer management
224
TracedValue<SequenceNumber32>
m_nextTxSequence
;
//< Next seqnum to be sent (SND.NXT), ReTx pushes it back
225
TracedValue<SequenceNumber32>
m_highTxMark
;
//< Highest seqno ever sent, regardless of ReTx
226
TcpRxBuffer
m_rxBuffer
;
//< Rx buffer (reordering buffer)
227
TcpTxBuffer
m_txBuffer
;
//< Tx buffer
228
229
// State-related attributes
230
TracedValue<TcpStates_t>
m_state
;
//< TCP state
231
enum
SocketErrno
m_errno
;
//< Socket error code
232
bool
m_closeNotified
;
//< Told app to close socket
233
bool
m_closeOnEmpty
;
//< Close socket upon tx buffer emptied
234
bool
m_shutdownSend
;
//< Send no longer allowed
235
bool
m_shutdownRecv
;
//< Receive no longer allowed
236
bool
m_connected
;
//< Connection established
237
double
m_msl
;
//< Max segment lifetime
238
239
// Window management
240
uint32_t
m_segmentSize
;
//< Segment size
241
uint16_t
m_maxWinSize
;
//< Maximum window size to advertise
242
TracedValue<uint32_t>
m_rWnd
;
//< Flow control window at remote side
243
};
244
245
}
// namespace ns3
246
247
#endif
/* TCP_SOCKET_BASE_H */
src
internet
model
tcp-socket-base.h
Generated on Tue May 14 2013 11:08:23 for ns-3 by
1.8.1.2