00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "ns3/assert.h"
00022 #include "ns3/log.h"
00023 #include "ns3/nstime.h"
00024 #include "ns3/boolean.h"
00025
00026 #include "ns3/packet.h"
00027 #include "ns3/node.h"
00028
00029 #include "tcp-l4-protocol.h"
00030 #include "tcp-header.h"
00031 #include "ipv4-end-point-demux.h"
00032 #include "ipv4-end-point.h"
00033 #include "ipv4-l3-protocol.h"
00034 #include "tcp-socket-impl.h"
00035
00036 #include "tcp-typedefs.h"
00037
00038 #include <vector>
00039 #include <sstream>
00040 #include <iomanip>
00041
00042 NS_LOG_COMPONENT_DEFINE ("TcpL4Protocol");
00043
00044 namespace ns3 {
00045
00046 NS_OBJECT_ENSURE_REGISTERED (TcpL4Protocol);
00047
00048
00049 TcpStateMachine::TcpStateMachine()
00050 : aT (LAST_STATE, StateActionVec_t(LAST_EVENT)),
00051 eV (MAX_FLAGS)
00052 {
00053 NS_LOG_FUNCTION_NOARGS ();
00054
00055
00056
00057 aT[CLOSED][APP_LISTEN] = SA (LISTEN, NO_ACT);
00058 aT[CLOSED][APP_CONNECT] = SA (SYN_SENT, SYN_TX);
00059 aT[CLOSED][APP_SEND] = SA (CLOSED, RST_TX);
00060 aT[CLOSED][SEQ_RECV] = SA (CLOSED, NO_ACT);
00061 aT[CLOSED][APP_CLOSE] = SA (CLOSED, NO_ACT);
00062 aT[CLOSED][TIMEOUT] = SA (CLOSED, RST_TX);
00063 aT[CLOSED][ACK_RX] = SA (CLOSED, RST_TX);
00064 aT[CLOSED][SYN_RX] = SA (CLOSED, RST_TX);
00065 aT[CLOSED][SYN_ACK_RX] = SA (CLOSED, RST_TX);
00066 aT[CLOSED][FIN_RX] = SA (CLOSED, RST_TX);
00067 aT[CLOSED][FIN_ACK_RX] = SA (CLOSED, RST_TX);
00068 aT[CLOSED][RST_RX] = SA (CLOSED, CANCEL_TM);
00069 aT[CLOSED][BAD_FLAGS] = SA (CLOSED, RST_TX);
00070
00071
00072
00073
00074
00075
00076 aT[LISTEN][APP_LISTEN] = SA (LISTEN, NO_ACT);
00077 aT[LISTEN][APP_CONNECT] = SA (SYN_SENT, SYN_TX);
00078 aT[LISTEN][APP_SEND] = SA (SYN_SENT, SYN_TX);
00079 aT[LISTEN][SEQ_RECV] = SA (LISTEN, NO_ACT);
00080 aT[LISTEN][APP_CLOSE] = SA (CLOSED, NO_ACT);
00081 aT[LISTEN][TIMEOUT] = SA (LISTEN, NO_ACT);
00082 aT[LISTEN][ACK_RX] = SA (LISTEN, NO_ACT);
00083 aT[LISTEN][SYN_RX] = SA (LISTEN, SYN_ACK_TX);
00084 aT[LISTEN][SYN_ACK_RX] = SA (LISTEN, NO_ACT);
00085 aT[LISTEN][FIN_RX] = SA (LISTEN, NO_ACT);
00086 aT[LISTEN][FIN_ACK_RX] = SA (LISTEN, NO_ACT);
00087 aT[LISTEN][RST_RX] = SA (LISTEN, NO_ACT);
00088 aT[LISTEN][BAD_FLAGS] = SA (LISTEN, NO_ACT);
00089
00090
00091 aT[SYN_SENT][APP_LISTEN] = SA (CLOSED, RST_TX);
00092 aT[SYN_SENT][APP_CONNECT] = SA (SYN_SENT, SYN_TX);
00093 aT[SYN_SENT][APP_SEND] = SA (SYN_SENT, NO_ACT);
00094 aT[SYN_SENT][SEQ_RECV] = SA (ESTABLISHED, NEW_SEQ_RX);
00095 aT[SYN_SENT][APP_CLOSE] = SA (CLOSED, RST_TX);
00096 aT[SYN_SENT][TIMEOUT] = SA (CLOSED, NO_ACT);
00097 aT[SYN_SENT][ACK_RX] = SA (SYN_SENT, NO_ACT);
00098 aT[SYN_SENT][SYN_RX] = SA (SYN_RCVD, SYN_ACK_TX);
00099 aT[SYN_SENT][SYN_ACK_RX] = SA (ESTABLISHED, ACK_TX_1);
00100 aT[SYN_SENT][FIN_RX] = SA (CLOSED, RST_TX);
00101 aT[SYN_SENT][FIN_ACK_RX] = SA (CLOSED, RST_TX);
00102 aT[SYN_SENT][RST_RX] = SA (CLOSED, APP_NOTIFY);
00103 aT[SYN_SENT][BAD_FLAGS] = SA (CLOSED, RST_TX);
00104
00105
00106 aT[SYN_RCVD][APP_LISTEN] = SA (CLOSED, RST_TX);
00107 aT[SYN_RCVD][APP_CONNECT] = SA (CLOSED, RST_TX);
00108 aT[SYN_RCVD][APP_SEND] = SA (CLOSED, RST_TX);
00109 aT[SYN_RCVD][SEQ_RECV] = SA (ESTABLISHED, NEW_SEQ_RX);
00110 aT[SYN_RCVD][APP_CLOSE] = SA (FIN_WAIT_1, FIN_TX);
00111 aT[SYN_RCVD][TIMEOUT] = SA (CLOSED, RST_TX);
00112 aT[SYN_RCVD][ACK_RX] = SA (ESTABLISHED, SERV_NOTIFY);
00113 aT[SYN_RCVD][SYN_RX] = SA (SYN_RCVD, SYN_ACK_TX);
00114 aT[SYN_RCVD][SYN_ACK_RX] = SA (CLOSED, RST_TX);
00115 aT[SYN_RCVD][FIN_RX] = SA (CLOSED, RST_TX);
00116 aT[SYN_RCVD][FIN_ACK_RX] = SA (CLOSE_WAIT, PEER_CLOSE);
00117 aT[SYN_RCVD][RST_RX] = SA (CLOSED, CANCEL_TM);
00118 aT[SYN_RCVD][BAD_FLAGS] = SA (CLOSED, RST_TX);
00119
00120
00121 aT[ESTABLISHED][APP_LISTEN] = SA (CLOSED, RST_TX);
00122 aT[ESTABLISHED][APP_CONNECT]= SA (CLOSED, RST_TX);
00123 aT[ESTABLISHED][APP_SEND] = SA (ESTABLISHED,TX_DATA);
00124 aT[ESTABLISHED][SEQ_RECV] = SA (ESTABLISHED,NEW_SEQ_RX);
00125 aT[ESTABLISHED][APP_CLOSE] = SA (FIN_WAIT_1, FIN_TX);
00126 aT[ESTABLISHED][TIMEOUT] = SA (ESTABLISHED,RETX);
00127 aT[ESTABLISHED][ACK_RX] = SA (ESTABLISHED,NEW_ACK);
00128 aT[ESTABLISHED][SYN_RX] = SA (SYN_RCVD, SYN_ACK_TX);
00129 aT[ESTABLISHED][SYN_ACK_RX] = SA (ESTABLISHED,NO_ACT);
00130 aT[ESTABLISHED][FIN_RX] = SA (CLOSE_WAIT, PEER_CLOSE);
00131 aT[ESTABLISHED][FIN_ACK_RX] = SA (CLOSE_WAIT, PEER_CLOSE);
00132 aT[ESTABLISHED][RST_RX] = SA (CLOSED, CANCEL_TM);
00133 aT[ESTABLISHED][BAD_FLAGS] = SA (CLOSED, RST_TX);
00134
00135
00136 aT[CLOSE_WAIT][APP_LISTEN] = SA (CLOSED, RST_TX);
00137 aT[CLOSE_WAIT][APP_CONNECT] = SA (SYN_SENT, SYN_TX);
00138 aT[CLOSE_WAIT][APP_SEND] = SA (CLOSE_WAIT, TX_DATA);
00139 aT[CLOSE_WAIT][SEQ_RECV] = SA (CLOSE_WAIT, NEW_SEQ_RX);
00140 aT[CLOSE_WAIT][APP_CLOSE] = SA (LAST_ACK, FIN_ACK_TX);
00141 aT[CLOSE_WAIT][TIMEOUT] = SA (CLOSE_WAIT, NO_ACT);
00142 aT[CLOSE_WAIT][ACK_RX] = SA (CLOSE_WAIT, NEW_ACK);
00143 aT[CLOSE_WAIT][SYN_RX] = SA (CLOSED, RST_TX);
00144 aT[CLOSE_WAIT][SYN_ACK_RX] = SA (CLOSED, RST_TX);
00145 aT[CLOSE_WAIT][FIN_RX] = SA (CLOSE_WAIT, ACK_TX);
00146 aT[CLOSE_WAIT][FIN_ACK_RX] = SA (CLOSE_WAIT, ACK_TX);
00147 aT[CLOSE_WAIT][RST_RX] = SA (CLOSED, CANCEL_TM);
00148 aT[CLOSE_WAIT][BAD_FLAGS] = SA (CLOSED, RST_TX);
00149
00150
00151 aT[LAST_ACK][APP_LISTEN] = SA (CLOSED, RST_TX);
00152 aT[LAST_ACK][APP_CONNECT] = SA (SYN_SENT, SYN_TX);
00153 aT[LAST_ACK][APP_SEND] = SA (CLOSED, RST_TX);
00154 aT[LAST_ACK][SEQ_RECV] = SA (LAST_ACK, NEW_SEQ_RX);
00155 aT[LAST_ACK][APP_CLOSE] = SA (CLOSED, NO_ACT);
00156 aT[LAST_ACK][TIMEOUT] = SA (CLOSED, NO_ACT);
00157 aT[LAST_ACK][ACK_RX] = SA (CLOSED, APP_CLOSED);
00158 aT[LAST_ACK][SYN_RX] = SA (CLOSED, RST_TX);
00159 aT[LAST_ACK][SYN_ACK_RX] = SA (CLOSED, RST_TX);
00160 aT[LAST_ACK][FIN_RX] = SA (LAST_ACK, FIN_ACK_TX);
00161 aT[LAST_ACK][FIN_ACK_RX] = SA (CLOSED, NO_ACT);
00162 aT[LAST_ACK][RST_RX] = SA (CLOSED, CANCEL_TM);
00163 aT[LAST_ACK][BAD_FLAGS] = SA (CLOSED, RST_TX);
00164
00165
00166 aT[FIN_WAIT_1][APP_LISTEN] = SA (CLOSED, RST_TX);
00167 aT[FIN_WAIT_1][APP_CONNECT] = SA (CLOSED, RST_TX);
00168 aT[FIN_WAIT_1][APP_SEND] = SA (CLOSED, RST_TX);
00169 aT[FIN_WAIT_1][SEQ_RECV] = SA (FIN_WAIT_1, NEW_SEQ_RX);
00170 aT[FIN_WAIT_1][APP_CLOSE] = SA (FIN_WAIT_1, NO_ACT);
00171 aT[FIN_WAIT_1][TIMEOUT] = SA (FIN_WAIT_1, NO_ACT);
00172 aT[FIN_WAIT_1][ACK_RX] = SA (FIN_WAIT_2, NEW_ACK);
00173 aT[FIN_WAIT_1][SYN_RX] = SA (CLOSED, RST_TX);
00174 aT[FIN_WAIT_1][SYN_ACK_RX] = SA (CLOSED, RST_TX);
00175 aT[FIN_WAIT_1][FIN_RX] = SA (CLOSING, ACK_TX);
00176 aT[FIN_WAIT_1][FIN_ACK_RX] = SA (TIMED_WAIT, ACK_TX);
00177 aT[FIN_WAIT_1][RST_RX] = SA (CLOSED, CANCEL_TM);
00178 aT[FIN_WAIT_1][BAD_FLAGS] = SA (CLOSED, RST_TX);
00179
00180
00181 aT[FIN_WAIT_2][APP_LISTEN] = SA (CLOSED, RST_TX);
00182 aT[FIN_WAIT_2][APP_CONNECT] = SA (CLOSED, RST_TX);
00183 aT[FIN_WAIT_2][APP_SEND] = SA (CLOSED, RST_TX);
00184 aT[FIN_WAIT_2][SEQ_RECV] = SA (FIN_WAIT_2, NEW_SEQ_RX);
00185 aT[FIN_WAIT_2][APP_CLOSE] = SA (FIN_WAIT_2, NO_ACT);
00186 aT[FIN_WAIT_2][TIMEOUT] = SA (FIN_WAIT_2, NO_ACT);
00187 aT[FIN_WAIT_2][ACK_RX] = SA (FIN_WAIT_2, NEW_ACK);
00188 aT[FIN_WAIT_2][SYN_RX] = SA (CLOSED, RST_TX);
00189 aT[FIN_WAIT_2][SYN_ACK_RX] = SA (CLOSED, RST_TX);
00190 aT[FIN_WAIT_2][FIN_RX] = SA (TIMED_WAIT, ACK_TX);
00191 aT[FIN_WAIT_2][FIN_ACK_RX] = SA (TIMED_WAIT, ACK_TX);
00192 aT[FIN_WAIT_2][RST_RX] = SA (CLOSED, CANCEL_TM);
00193 aT[FIN_WAIT_2][BAD_FLAGS] = SA (CLOSED, RST_TX);
00194
00195
00196 aT[CLOSING][APP_LISTEN] = SA (CLOSED, RST_TX);
00197 aT[CLOSING][APP_CONNECT] = SA (CLOSED, RST_TX);
00198 aT[CLOSING][APP_SEND] = SA (CLOSED, RST_TX);
00199 aT[CLOSING][SEQ_RECV] = SA (CLOSED, RST_TX);
00200 aT[CLOSING][APP_CLOSE] = SA (CLOSED, RST_TX);
00201 aT[CLOSING][TIMEOUT] = SA (CLOSING, NO_ACT);
00202 aT[CLOSING][ACK_RX] = SA (TIMED_WAIT, NO_ACT);
00203 aT[CLOSING][SYN_RX] = SA (CLOSED, RST_TX);
00204 aT[CLOSING][SYN_ACK_RX] = SA (CLOSED, RST_TX);
00205 aT[CLOSING][FIN_RX] = SA (CLOSED, ACK_TX);
00206 aT[CLOSING][FIN_ACK_RX] = SA (CLOSED, ACK_TX);
00207 aT[CLOSING][RST_RX] = SA (CLOSED, CANCEL_TM);
00208 aT[CLOSING][BAD_FLAGS] = SA (CLOSED, RST_TX);
00209
00210
00211 aT[TIMED_WAIT][APP_LISTEN] = SA (TIMED_WAIT, NO_ACT);
00212 aT[TIMED_WAIT][APP_CONNECT] = SA (TIMED_WAIT, NO_ACT);
00213 aT[TIMED_WAIT][APP_SEND] = SA (TIMED_WAIT, NO_ACT);
00214 aT[TIMED_WAIT][SEQ_RECV] = SA (TIMED_WAIT, NO_ACT);
00215 aT[TIMED_WAIT][APP_CLOSE] = SA (TIMED_WAIT, NO_ACT);
00216 aT[TIMED_WAIT][TIMEOUT] = SA (TIMED_WAIT, NO_ACT);
00217 aT[TIMED_WAIT][ACK_RX] = SA (TIMED_WAIT, NO_ACT);
00218 aT[TIMED_WAIT][SYN_RX] = SA (TIMED_WAIT, NO_ACT);
00219 aT[TIMED_WAIT][SYN_ACK_RX] = SA (TIMED_WAIT, NO_ACT);
00220 aT[TIMED_WAIT][FIN_RX] = SA (TIMED_WAIT, NO_ACT);
00221 aT[TIMED_WAIT][FIN_ACK_RX] = SA (TIMED_WAIT, NO_ACT);
00222 aT[TIMED_WAIT][RST_RX] = SA (TIMED_WAIT, NO_ACT);
00223 aT[TIMED_WAIT][BAD_FLAGS] = SA (TIMED_WAIT, NO_ACT);
00224
00225
00226 eV[ 0x00] = SEQ_RECV;
00227 eV[ 0x01] = FIN_RX;
00228 eV[ 0x02] = SYN_RX;
00229 eV[ 0x03] = BAD_FLAGS;
00230 eV[ 0x04] = RST_RX;
00231 eV[ 0x05] = BAD_FLAGS;
00232 eV[ 0x06] = BAD_FLAGS;
00233 eV[ 0x07] = BAD_FLAGS;
00234 eV[ 0x08] = SEQ_RECV;
00235 eV[ 0x09] = FIN_RX;
00236 eV[ 0x0a] = SYN_RX;
00237 eV[ 0x0b] = BAD_FLAGS;
00238 eV[ 0x0c] = RST_RX;
00239 eV[ 0x0d] = BAD_FLAGS;
00240 eV[ 0x0e] = BAD_FLAGS;
00241 eV[ 0x0f] = BAD_FLAGS;
00242 eV[ 0x10] = ACK_RX;
00243 eV[ 0x11] = FIN_ACK_RX;
00244 eV[ 0x12] = SYN_ACK_RX;
00245 eV[ 0x13] = BAD_FLAGS;
00246 eV[ 0x14] = RST_RX;
00247 eV[ 0x15] = BAD_FLAGS;
00248 eV[ 0x16] = BAD_FLAGS;
00249 eV[ 0x17] = BAD_FLAGS;
00250 eV[ 0x18] = ACK_RX;
00251 eV[ 0x19] = FIN_ACK_RX;
00252 eV[ 0x1a] = SYN_ACK_RX;
00253 eV[ 0x1b] = BAD_FLAGS;
00254 eV[ 0x1c] = RST_RX;
00255 eV[ 0x1d] = BAD_FLAGS;
00256 eV[ 0x1e] = BAD_FLAGS;
00257 eV[ 0x1f] = BAD_FLAGS;
00258 eV[ 0x20] = SEQ_RECV;
00259 eV[ 0x21] = FIN_RX;
00260 eV[ 0x22] = SYN_RX;
00261 eV[ 0x23] = BAD_FLAGS;
00262 eV[ 0x24] = RST_RX;
00263 eV[ 0x25] = BAD_FLAGS;
00264 eV[ 0x26] = BAD_FLAGS;
00265 eV[ 0x27] = BAD_FLAGS;
00266 eV[ 0x28] = SEQ_RECV;
00267 eV[ 0x29] = FIN_RX;
00268 eV[ 0x2a] = SYN_RX;
00269 eV[ 0x2b] = BAD_FLAGS;
00270 eV[ 0x2c] = RST_RX;
00271 eV[ 0x2d] = BAD_FLAGS;
00272 eV[ 0x2e] = BAD_FLAGS;
00273 eV[ 0x2f] = BAD_FLAGS;
00274 eV[ 0x30] = ACK_RX;
00275 eV[ 0x31] = FIN_ACK_RX;
00276 eV[ 0x32] = SYN_ACK_RX;
00277 eV[ 0x33] = BAD_FLAGS;
00278 eV[ 0x34] = RST_RX;
00279 eV[ 0x35] = BAD_FLAGS;
00280 eV[ 0x36] = BAD_FLAGS;
00281 eV[ 0x37] = BAD_FLAGS;
00282 eV[ 0x38] = ACK_RX;
00283 eV[ 0x39] = FIN_ACK_RX;
00284 eV[ 0x3a] = SYN_ACK_RX;
00285 eV[ 0x3b] = BAD_FLAGS;
00286 eV[ 0x3c] = RST_RX;
00287 eV[ 0x3d] = BAD_FLAGS;
00288 eV[ 0x3e] = BAD_FLAGS;
00289 eV[ 0x3f] = BAD_FLAGS;
00290 }
00291
00292 SA TcpStateMachine::Lookup (States_t s, Events_t e)
00293 {
00294 NS_LOG_FUNCTION (this << s << e);
00295 return aT[s][e];
00296 }
00297
00298 Events_t TcpStateMachine::FlagsEvent (uint8_t f)
00299 {
00300 NS_LOG_FUNCTION (this << f);
00301
00302 if (f >= MAX_FLAGS) return BAD_FLAGS;
00303 return eV[f];
00304 }
00305
00306 static TcpStateMachine tcpStateMachine;
00307
00308
00309
00310
00311
00312 const uint8_t TcpL4Protocol::PROT_NUMBER = 6;
00313
00314 ObjectFactory
00315 TcpL4Protocol::GetDefaultRttEstimatorFactory (void)
00316 {
00317 ObjectFactory factory;
00318 factory.SetTypeId (RttMeanDeviation::GetTypeId ());
00319 return factory;
00320 }
00321
00322 TypeId
00323 TcpL4Protocol::GetTypeId (void)
00324 {
00325 static TypeId tid = TypeId ("ns3::TcpL4Protocol")
00326 .SetParent<Ipv4L4Protocol> ()
00327 .AddAttribute ("RttEstimatorFactory",
00328 "How RttEstimator objects are created.",
00329 ObjectFactoryValue (GetDefaultRttEstimatorFactory ()),
00330 MakeObjectFactoryAccessor (&TcpL4Protocol::m_rttFactory),
00331 MakeObjectFactoryChecker ())
00332 .AddAttribute ("CalcChecksum", "If true, we calculate the checksum of outgoing packets"
00333 " and verify the checksum of incoming packets.",
00334 BooleanValue (false),
00335 MakeBooleanAccessor (&TcpL4Protocol::m_calcChecksum),
00336 MakeBooleanChecker ())
00337 ;
00338 return tid;
00339 }
00340
00341 TcpL4Protocol::TcpL4Protocol ()
00342 : m_endPoints (new Ipv4EndPointDemux ())
00343 {
00344 NS_LOG_FUNCTION_NOARGS ();
00345 NS_LOG_LOGIC("Made a TcpL4Protocol "<<this);
00346 }
00347
00348 TcpL4Protocol::~TcpL4Protocol ()
00349 {
00350 NS_LOG_FUNCTION_NOARGS ();
00351 }
00352
00353 void
00354 TcpL4Protocol::SetNode (Ptr<Node> node)
00355 {
00356 m_node = node;
00357 }
00358
00359 int
00360 TcpL4Protocol::GetProtocolNumber (void) const
00361 {
00362 return PROT_NUMBER;
00363 }
00364
00365 void
00366 TcpL4Protocol::DoDispose (void)
00367 {
00368 NS_LOG_FUNCTION_NOARGS ();
00369 if (m_endPoints != 0)
00370 {
00371 delete m_endPoints;
00372 m_endPoints = 0;
00373 }
00374 m_node = 0;
00375 Ipv4L4Protocol::DoDispose ();
00376 }
00377
00378 Ptr<Socket>
00379 TcpL4Protocol::CreateSocket (void)
00380 {
00381 NS_LOG_FUNCTION_NOARGS ();
00382 Ptr<RttEstimator> rtt = m_rttFactory.Create<RttEstimator> ();
00383 Ptr<TcpSocketImpl> socket = CreateObject<TcpSocketImpl> ();
00384 socket->SetNode (m_node);
00385 socket->SetTcp (this);
00386 socket->SetRtt (rtt);
00387 return socket;
00388 }
00389
00390 Ipv4EndPoint *
00391 TcpL4Protocol::Allocate (void)
00392 {
00393 NS_LOG_FUNCTION_NOARGS ();
00394 return m_endPoints->Allocate ();
00395 }
00396
00397 Ipv4EndPoint *
00398 TcpL4Protocol::Allocate (Ipv4Address address)
00399 {
00400 NS_LOG_FUNCTION (this << address);
00401 return m_endPoints->Allocate (address);
00402 }
00403
00404 Ipv4EndPoint *
00405 TcpL4Protocol::Allocate (uint16_t port)
00406 {
00407 NS_LOG_FUNCTION (this << port);
00408 return m_endPoints->Allocate (port);
00409 }
00410
00411 Ipv4EndPoint *
00412 TcpL4Protocol::Allocate (Ipv4Address address, uint16_t port)
00413 {
00414 NS_LOG_FUNCTION (this << address << port);
00415 return m_endPoints->Allocate (address, port);
00416 }
00417
00418 Ipv4EndPoint *
00419 TcpL4Protocol::Allocate (Ipv4Address localAddress, uint16_t localPort,
00420 Ipv4Address peerAddress, uint16_t peerPort)
00421 {
00422 NS_LOG_FUNCTION (this << localAddress << localPort << peerAddress << peerPort);
00423 return m_endPoints->Allocate (localAddress, localPort,
00424 peerAddress, peerPort);
00425 }
00426
00427 void
00428 TcpL4Protocol::DeAllocate (Ipv4EndPoint *endPoint)
00429 {
00430 NS_LOG_FUNCTION (this << endPoint);
00431 m_endPoints->DeAllocate (endPoint);
00432 }
00433
00434 enum Ipv4L4Protocol::RxStatus
00435 TcpL4Protocol::Receive (Ptr<Packet> packet,
00436 Ipv4Address const &source,
00437 Ipv4Address const &destination,
00438 Ptr<Ipv4Interface> incomingInterface)
00439 {
00440 NS_LOG_FUNCTION (this << packet << source << destination << incomingInterface);
00441
00442 TcpHeader tcpHeader;
00443 if(m_calcChecksum)
00444 {
00445 tcpHeader.EnableChecksums();
00446 tcpHeader.InitializeChecksum (source, destination, PROT_NUMBER);
00447 }
00448
00449 packet->PeekHeader (tcpHeader);
00450
00451 NS_LOG_LOGIC("TcpL4Protocol " << this
00452 << " receiving seq " << tcpHeader.GetSequenceNumber()
00453 << " ack " << tcpHeader.GetAckNumber()
00454 << " flags "<< std::hex << (int)tcpHeader.GetFlags() << std::dec
00455 << " data size " << packet->GetSize());
00456
00457 if(!tcpHeader.IsChecksumOk ())
00458 {
00459 NS_LOG_INFO("Bad checksum, dropping packet!");
00460 return Ipv4L4Protocol::RX_CSUM_FAILED;
00461 }
00462
00463 NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" received a packet");
00464 Ipv4EndPointDemux::EndPoints endPoints =
00465 m_endPoints->Lookup (destination, tcpHeader.GetDestinationPort (),
00466 source, tcpHeader.GetSourcePort (),incomingInterface);
00467 if (endPoints.empty ())
00468 {
00469 NS_LOG_LOGIC (" No endpoints matched on TcpL4Protocol "<<this);
00470 std::ostringstream oss;
00471 oss<<" destination IP: ";
00472 destination.Print (oss);
00473 oss<<" destination port: "<< tcpHeader.GetDestinationPort ()<<" source IP: ";
00474 source.Print (oss);
00475 oss<<" source port: "<<tcpHeader.GetSourcePort ();
00476 NS_LOG_LOGIC (oss.str ());
00477 return Ipv4L4Protocol::RX_ENDPOINT_UNREACH;
00478 }
00479 NS_ASSERT_MSG (endPoints.size() == 1 , "Demux returned more than one endpoint");
00480 NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" forwarding up to endpoint/socket");
00481 (*endPoints.begin ())->ForwardUp (packet, source, tcpHeader.GetSourcePort ());
00482 return Ipv4L4Protocol::RX_OK;
00483 }
00484
00485 void
00486 TcpL4Protocol::Send (Ptr<Packet> packet,
00487 Ipv4Address saddr, Ipv4Address daddr,
00488 uint16_t sport, uint16_t dport)
00489 {
00490 NS_LOG_FUNCTION (this << packet << saddr << daddr << sport << dport);
00491
00492 TcpHeader tcpHeader;
00493 tcpHeader.SetDestinationPort (dport);
00494 tcpHeader.SetSourcePort (sport);
00495 if(m_calcChecksum)
00496 {
00497 tcpHeader.EnableChecksums();
00498 }
00499 tcpHeader.InitializeChecksum (saddr,
00500 daddr,
00501 PROT_NUMBER);
00502 tcpHeader.SetFlags (TcpHeader::ACK);
00503 tcpHeader.SetAckNumber (0);
00504
00505 packet->AddHeader (tcpHeader);
00506
00507 Ptr<Ipv4L3Protocol> ipv4 =
00508 m_node->GetObject<Ipv4L3Protocol> ();
00509 if (ipv4 != 0)
00510 {
00511 ipv4->Send (packet, saddr, daddr, PROT_NUMBER);
00512 }
00513 }
00514
00515 void
00516 TcpL4Protocol::SendPacket (Ptr<Packet> packet, TcpHeader outgoingHeader,
00517 Ipv4Address saddr, Ipv4Address daddr)
00518 {
00519 NS_LOG_LOGIC("TcpL4Protocol " << this
00520 << " sending seq " << outgoingHeader.GetSequenceNumber()
00521 << " ack " << outgoingHeader.GetAckNumber()
00522 << " flags " << std::hex << (int)outgoingHeader.GetFlags() << std::dec
00523 << " data size " << packet->GetSize());
00524 NS_LOG_FUNCTION (this << packet << saddr << daddr);
00525
00526
00527 outgoingHeader.SetLength (5);
00528
00529 if(m_calcChecksum)
00530 {
00531 outgoingHeader.EnableChecksums();
00532 }
00533 outgoingHeader.InitializeChecksum(saddr, daddr, PROT_NUMBER);
00534
00535 packet->AddHeader (outgoingHeader);
00536
00537 Ptr<Ipv4L3Protocol> ipv4 =
00538 m_node->GetObject<Ipv4L3Protocol> ();
00539 if (ipv4 != 0)
00540 {
00541 ipv4->Send (packet, saddr, daddr, PROT_NUMBER);
00542 }
00543 else
00544 NS_FATAL_ERROR("Trying to use Tcp on a node without an Ipv4 interface");
00545 }
00546
00547 };
00548