LEFT | RIGHT |
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2007 Georgia Tech Research Corporation | 3 * Copyright (c) 2007 Georgia Tech Research Corporation |
4 * | 4 * |
5 * This program is free software; you can redistribute it and/or modify | 5 * This program is free software; you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 2 as | 6 * it under the terms of the GNU General Public License version 2 as |
7 * published by the Free Software Foundation; | 7 * published by the Free Software Foundation; |
8 * | 8 * |
9 * This program is distributed in the hope that it will be useful, | 9 * This program is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "ns3/ipv4-route.h" | 30 #include "ns3/ipv4-route.h" |
31 | 31 |
32 #include "tcp-l4-protocol.h" | 32 #include "tcp-l4-protocol.h" |
33 #include "tcp-header.h" | 33 #include "tcp-header.h" |
34 #include "ipv4-end-point-demux.h" | 34 #include "ipv4-end-point-demux.h" |
35 #include "ipv4-end-point.h" | 35 #include "ipv4-end-point.h" |
36 #include "ipv4-l3-protocol.h" | 36 #include "ipv4-l3-protocol.h" |
37 #include "tcp-socket-factory-impl.h" | 37 #include "tcp-socket-factory-impl.h" |
38 #include "tcp-newreno.h" | 38 #include "tcp-newreno.h" |
39 #include "rtt-estimator.h" | 39 #include "rtt-estimator.h" |
40 #include "tcp-typedefs.h" | |
41 | 40 |
42 #include <vector> | 41 #include <vector> |
43 #include <sstream> | 42 #include <sstream> |
44 #include <iomanip> | 43 #include <iomanip> |
45 | 44 |
46 NS_LOG_COMPONENT_DEFINE ("TcpL4Protocol"); | 45 NS_LOG_COMPONENT_DEFINE ("TcpL4Protocol"); |
47 | 46 |
48 namespace ns3 { | 47 namespace ns3 { |
49 | 48 |
50 NS_OBJECT_ENSURE_REGISTERED (TcpL4Protocol); | 49 NS_OBJECT_ENSURE_REGISTERED (TcpL4Protocol); |
51 | |
52 //State Machine things -------------------------------------------------------- | |
53 TcpStateMachine::TcpStateMachine()· | |
54 : aT (LAST_STATE, StateActionVec_t(LAST_EVENT)), | |
55 eV (MAX_FLAGS) | |
56 {· | |
57 NS_LOG_FUNCTION_NOARGS (); | |
58 | |
59 // Create the state table | |
60 // Closed state | |
61 aT[CLOSED][APP_LISTEN] = SA (LISTEN, NO_ACT); | |
62 aT[CLOSED][APP_CONNECT] = SA (SYN_SENT, SYN_TX); | |
63 aT[CLOSED][APP_SEND] = SA (CLOSED, RST_TX); | |
64 aT[CLOSED][SEQ_RECV] = SA (CLOSED, NO_ACT); | |
65 aT[CLOSED][APP_CLOSE] = SA (CLOSED, NO_ACT); | |
66 aT[CLOSED][TIMEOUT] = SA (CLOSED, RST_TX); | |
67 aT[CLOSED][ACK_RX] = SA (CLOSED, RST_TX); | |
68 aT[CLOSED][SYN_RX] = SA (CLOSED, RST_TX); | |
69 aT[CLOSED][SYN_ACK_RX] = SA (CLOSED, RST_TX); | |
70 aT[CLOSED][FIN_RX] = SA (CLOSED, RST_TX); | |
71 aT[CLOSED][FIN_ACK_RX] = SA (CLOSED, RST_TX); | |
72 aT[CLOSED][RST_RX] = SA (CLOSED, CANCEL_TM); | |
73 aT[CLOSED][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
74 | |
75 // Listen State | |
76 // For the listen state, anything other than CONNECT or SEND | |
77 // is simply ignored....this likely indicates the child TCP | |
78 // has finished and issued unbind call, but the remote end | |
79 // has not yet closed. | |
80 aT[LISTEN][APP_LISTEN] = SA (LISTEN, NO_ACT); | |
81 aT[LISTEN][APP_CONNECT] = SA (SYN_SENT, SYN_TX); | |
82 aT[LISTEN][APP_SEND] = SA (SYN_SENT, SYN_TX); | |
83 aT[LISTEN][SEQ_RECV] = SA (LISTEN, NO_ACT); | |
84 aT[LISTEN][APP_CLOSE] = SA (CLOSED, NO_ACT); | |
85 aT[LISTEN][TIMEOUT] = SA (LISTEN, NO_ACT); | |
86 aT[LISTEN][ACK_RX] = SA (LISTEN, NO_ACT); | |
87 aT[LISTEN][SYN_RX] = SA (LISTEN, SYN_ACK_TX);//stay in listen and fork | |
88 aT[LISTEN][SYN_ACK_RX] = SA (LISTEN, NO_ACT); | |
89 aT[LISTEN][FIN_RX] = SA (LISTEN, NO_ACT); | |
90 aT[LISTEN][FIN_ACK_RX] = SA (LISTEN, NO_ACT); | |
91 aT[LISTEN][RST_RX] = SA (LISTEN, NO_ACT); | |
92 aT[LISTEN][BAD_FLAGS] = SA (LISTEN, NO_ACT); | |
93 | |
94 // Syn Sent State | |
95 aT[SYN_SENT][APP_LISTEN] = SA (CLOSED, RST_TX); | |
96 aT[SYN_SENT][APP_CONNECT] = SA (SYN_SENT, SYN_TX); | |
97 aT[SYN_SENT][APP_SEND] = SA (SYN_SENT, NO_ACT); | |
98 aT[SYN_SENT][SEQ_RECV] = SA (ESTABLISHED, NEW_SEQ_RX); | |
99 aT[SYN_SENT][APP_CLOSE] = SA (CLOSED, RST_TX); | |
100 aT[SYN_SENT][TIMEOUT] = SA (CLOSED, NO_ACT); | |
101 aT[SYN_SENT][ACK_RX] = SA (SYN_SENT, NO_ACT); | |
102 aT[SYN_SENT][SYN_RX] = SA (SYN_RCVD, SYN_ACK_TX); | |
103 aT[SYN_SENT][SYN_ACK_RX] = SA (ESTABLISHED, ACK_TX_1); | |
104 aT[SYN_SENT][FIN_RX] = SA (CLOSED, RST_TX); | |
105 aT[SYN_SENT][FIN_ACK_RX] = SA (CLOSED, RST_TX); | |
106 aT[SYN_SENT][RST_RX] = SA (CLOSED, APP_NOTIFY); | |
107 aT[SYN_SENT][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
108 | |
109 // Syn Recvd State | |
110 aT[SYN_RCVD][APP_LISTEN] = SA (CLOSED, RST_TX); | |
111 aT[SYN_RCVD][APP_CONNECT] = SA (CLOSED, RST_TX); | |
112 aT[SYN_RCVD][APP_SEND] = SA (CLOSED, RST_TX); | |
113 aT[SYN_RCVD][SEQ_RECV] = SA (ESTABLISHED, NEW_SEQ_RX); | |
114 aT[SYN_RCVD][APP_CLOSE] = SA (FIN_WAIT_1, FIN_TX); | |
115 aT[SYN_RCVD][TIMEOUT] = SA (CLOSED, RST_TX); | |
116 aT[SYN_RCVD][ACK_RX] = SA (ESTABLISHED, SERV_NOTIFY); | |
117 aT[SYN_RCVD][SYN_RX] = SA (SYN_RCVD, SYN_ACK_TX); | |
118 aT[SYN_RCVD][SYN_ACK_RX] = SA (CLOSED, RST_TX); | |
119 aT[SYN_RCVD][FIN_RX] = SA (CLOSED, RST_TX); | |
120 aT[SYN_RCVD][FIN_ACK_RX] = SA (CLOSE_WAIT, PEER_CLOSE); | |
121 aT[SYN_RCVD][RST_RX] = SA (CLOSED, CANCEL_TM); | |
122 aT[SYN_RCVD][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
123 | |
124 // Established State | |
125 aT[ESTABLISHED][APP_LISTEN] = SA (CLOSED, RST_TX); | |
126 aT[ESTABLISHED][APP_CONNECT]= SA (CLOSED, RST_TX); | |
127 aT[ESTABLISHED][APP_SEND] = SA (ESTABLISHED,TX_DATA); | |
128 aT[ESTABLISHED][SEQ_RECV] = SA (ESTABLISHED,NEW_SEQ_RX); | |
129 aT[ESTABLISHED][APP_CLOSE] = SA (FIN_WAIT_1, FIN_TX); | |
130 aT[ESTABLISHED][TIMEOUT] = SA (ESTABLISHED,RETX); | |
131 aT[ESTABLISHED][ACK_RX] = SA (ESTABLISHED,NEW_ACK); | |
132 aT[ESTABLISHED][SYN_RX] = SA (SYN_RCVD, SYN_ACK_TX); | |
133 aT[ESTABLISHED][SYN_ACK_RX] = SA (ESTABLISHED,NO_ACT); | |
134 aT[ESTABLISHED][FIN_RX] = SA (CLOSE_WAIT, PEER_CLOSE); | |
135 aT[ESTABLISHED][FIN_ACK_RX] = SA (CLOSE_WAIT, PEER_CLOSE); | |
136 aT[ESTABLISHED][RST_RX] = SA (CLOSED, CANCEL_TM); | |
137 aT[ESTABLISHED][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
138 | |
139 // Close Wait State | |
140 aT[CLOSE_WAIT][APP_LISTEN] = SA (CLOSED, RST_TX); | |
141 aT[CLOSE_WAIT][APP_CONNECT] = SA (SYN_SENT, SYN_TX); | |
142 aT[CLOSE_WAIT][APP_SEND] = SA (CLOSE_WAIT, TX_DATA); | |
143 aT[CLOSE_WAIT][SEQ_RECV] = SA (CLOSE_WAIT, NEW_SEQ_RX); | |
144 aT[CLOSE_WAIT][APP_CLOSE] = SA (LAST_ACK, FIN_ACK_TX); | |
145 aT[CLOSE_WAIT][TIMEOUT] = SA (CLOSE_WAIT, NO_ACT); | |
146 aT[CLOSE_WAIT][ACK_RX] = SA (CLOSE_WAIT, NEW_ACK); | |
147 aT[CLOSE_WAIT][SYN_RX] = SA (CLOSED, RST_TX); | |
148 aT[CLOSE_WAIT][SYN_ACK_RX] = SA (CLOSED, RST_TX); | |
149 aT[CLOSE_WAIT][FIN_RX] = SA (CLOSE_WAIT, ACK_TX); | |
150 aT[CLOSE_WAIT][FIN_ACK_RX] = SA (CLOSE_WAIT, ACK_TX); | |
151 aT[CLOSE_WAIT][RST_RX] = SA (CLOSED, CANCEL_TM); | |
152 aT[CLOSE_WAIT][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
153 | |
154 // Close Last Ack State | |
155 aT[LAST_ACK][APP_LISTEN] = SA (CLOSED, RST_TX); | |
156 aT[LAST_ACK][APP_CONNECT] = SA (SYN_SENT, SYN_TX); | |
157 aT[LAST_ACK][APP_SEND] = SA (CLOSED, RST_TX); | |
158 aT[LAST_ACK][SEQ_RECV] = SA (LAST_ACK, NEW_SEQ_RX); | |
159 aT[LAST_ACK][APP_CLOSE] = SA (CLOSED, NO_ACT); | |
160 aT[LAST_ACK][TIMEOUT] = SA (CLOSED, NO_ACT); | |
161 aT[LAST_ACK][ACK_RX] = SA (LAST_ACK, NO_ACT); | |
162 aT[LAST_ACK][FIN_ACKED] = SA (CLOSED, APP_CLOSED); | |
163 aT[LAST_ACK][SYN_RX] = SA (CLOSED, RST_TX); | |
164 aT[LAST_ACK][SYN_ACK_RX] = SA (CLOSED, RST_TX); | |
165 aT[LAST_ACK][FIN_RX] = SA (LAST_ACK, FIN_ACK_TX); | |
166 aT[LAST_ACK][FIN_ACK_RX] = SA (CLOSED, NO_ACT); | |
167 aT[LAST_ACK][RST_RX] = SA (CLOSED, CANCEL_TM); | |
168 aT[LAST_ACK][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
169 | |
170 // FIN_WAIT_1 state | |
171 aT[FIN_WAIT_1][APP_LISTEN] = SA (CLOSED, RST_TX); | |
172 aT[FIN_WAIT_1][APP_CONNECT] = SA (CLOSED, RST_TX); | |
173 aT[FIN_WAIT_1][APP_SEND] = SA (CLOSED, RST_TX); | |
174 aT[FIN_WAIT_1][SEQ_RECV] = SA (FIN_WAIT_1, NEW_SEQ_RX); | |
175 aT[FIN_WAIT_1][APP_CLOSE] = SA (FIN_WAIT_1, NO_ACT); | |
176 aT[FIN_WAIT_1][TIMEOUT] = SA (FIN_WAIT_1, NO_ACT); | |
177 aT[FIN_WAIT_1][ACK_RX] = SA (FIN_WAIT_1, NEW_ACK); | |
178 aT[FIN_WAIT_1][FIN_ACKED] = SA (FIN_WAIT_2, NEW_ACK); | |
179 aT[FIN_WAIT_1][SYN_RX] = SA (CLOSED, RST_TX); | |
180 aT[FIN_WAIT_1][SYN_ACK_RX] = SA (CLOSED, RST_TX); | |
181 aT[FIN_WAIT_1][FIN_RX] = SA (CLOSING, ACK_TX); | |
182 aT[FIN_WAIT_1][FIN_ACK_RX] = SA (TIMED_WAIT, ACK_TX); | |
183 aT[FIN_WAIT_1][RST_RX] = SA (CLOSED, CANCEL_TM); | |
184 aT[FIN_WAIT_1][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
185 | |
186 // FIN_WAIT_2 state | |
187 aT[FIN_WAIT_2][APP_LISTEN] = SA (CLOSED, RST_TX); | |
188 aT[FIN_WAIT_2][APP_CONNECT] = SA (CLOSED, RST_TX); | |
189 aT[FIN_WAIT_2][APP_SEND] = SA (CLOSED, RST_TX); | |
190 aT[FIN_WAIT_2][SEQ_RECV] = SA (FIN_WAIT_2, NEW_SEQ_RX); | |
191 aT[FIN_WAIT_2][APP_CLOSE] = SA (FIN_WAIT_2, NO_ACT); | |
192 aT[FIN_WAIT_2][TIMEOUT] = SA (FIN_WAIT_2, NO_ACT); | |
193 aT[FIN_WAIT_2][ACK_RX] = SA (FIN_WAIT_2, NEW_ACK); | |
194 aT[FIN_WAIT_2][SYN_RX] = SA (CLOSED, RST_TX); | |
195 aT[FIN_WAIT_2][SYN_ACK_RX] = SA (CLOSED, RST_TX); | |
196 aT[FIN_WAIT_2][FIN_RX] = SA (TIMED_WAIT, ACK_TX); | |
197 aT[FIN_WAIT_2][FIN_ACK_RX] = SA (TIMED_WAIT, ACK_TX); | |
198 aT[FIN_WAIT_2][RST_RX] = SA (CLOSED, CANCEL_TM); | |
199 aT[FIN_WAIT_2][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
200 | |
201 // CLOSING state | |
202 aT[CLOSING][APP_LISTEN] = SA (CLOSED, RST_TX); | |
203 aT[CLOSING][APP_CONNECT] = SA (CLOSED, RST_TX); | |
204 aT[CLOSING][APP_SEND] = SA (CLOSED, RST_TX); | |
205 aT[CLOSING][SEQ_RECV] = SA (CLOSED, RST_TX); | |
206 aT[CLOSING][APP_CLOSE] = SA (CLOSED, RST_TX); | |
207 aT[CLOSING][TIMEOUT] = SA (CLOSING, NO_ACT); | |
208 aT[CLOSING][ACK_RX] = SA (CLOSING, NO_ACT); | |
209 aT[CLOSING][FIN_ACKED] = SA (TIMED_WAIT, NO_ACT); | |
210 aT[CLOSING][SYN_RX] = SA (CLOSED, RST_TX); | |
211 aT[CLOSING][SYN_ACK_RX] = SA (CLOSED, RST_TX); | |
212 aT[CLOSING][FIN_RX] = SA (CLOSED, ACK_TX); | |
213 aT[CLOSING][FIN_ACK_RX] = SA (CLOSED, ACK_TX); | |
214 aT[CLOSING][RST_RX] = SA (CLOSED, CANCEL_TM); | |
215 aT[CLOSING][BAD_FLAGS] = SA (CLOSED, RST_TX); | |
216 | |
217 // TIMED_WAIT state | |
218 aT[TIMED_WAIT][APP_LISTEN] = SA (TIMED_WAIT, NO_ACT); | |
219 aT[TIMED_WAIT][APP_CONNECT] = SA (TIMED_WAIT, NO_ACT); | |
220 aT[TIMED_WAIT][APP_SEND] = SA (TIMED_WAIT, NO_ACT); | |
221 aT[TIMED_WAIT][SEQ_RECV] = SA (TIMED_WAIT, NO_ACT); | |
222 aT[TIMED_WAIT][APP_CLOSE] = SA (TIMED_WAIT, NO_ACT); | |
223 aT[TIMED_WAIT][TIMEOUT] = SA (TIMED_WAIT, NO_ACT); | |
224 aT[TIMED_WAIT][ACK_RX] = SA (TIMED_WAIT, NO_ACT); | |
225 aT[TIMED_WAIT][SYN_RX] = SA (TIMED_WAIT, NO_ACT); | |
226 aT[TIMED_WAIT][SYN_ACK_RX] = SA (TIMED_WAIT, NO_ACT); | |
227 aT[TIMED_WAIT][FIN_RX] = SA (TIMED_WAIT, NO_ACT); | |
228 aT[TIMED_WAIT][FIN_ACK_RX] = SA (TIMED_WAIT, NO_ACT); | |
229 aT[TIMED_WAIT][RST_RX] = SA (TIMED_WAIT, NO_ACT); | |
230 aT[TIMED_WAIT][BAD_FLAGS] = SA (TIMED_WAIT, NO_ACT); | |
231 | |
232 // Create the flags lookup table | |
233 eV[ 0x00] = SEQ_RECV; // No flags | |
234 eV[ 0x01] = FIN_RX; // Fin | |
235 eV[ 0x02] = SYN_RX; // Syn | |
236 eV[ 0x03] = BAD_FLAGS; // Illegal | |
237 eV[ 0x04] = RST_RX; // Rst | |
238 eV[ 0x05] = BAD_FLAGS; // Illegal | |
239 eV[ 0x06] = BAD_FLAGS; // Illegal | |
240 eV[ 0x07] = BAD_FLAGS; // Illegal | |
241 eV[ 0x08] = SEQ_RECV; // Psh flag is not used | |
242 eV[ 0x09] = FIN_RX; // Fin | |
243 eV[ 0x0a] = SYN_RX; // Syn | |
244 eV[ 0x0b] = BAD_FLAGS; // Illegal | |
245 eV[ 0x0c] = RST_RX; // Rst | |
246 eV[ 0x0d] = BAD_FLAGS; // Illegal | |
247 eV[ 0x0e] = BAD_FLAGS; // Illegal | |
248 eV[ 0x0f] = BAD_FLAGS; // Illegal | |
249 eV[ 0x10] = ACK_RX; // Ack | |
250 eV[ 0x11] = FIN_ACK_RX;// Fin/Ack | |
251 eV[ 0x12] = SYN_ACK_RX;// Syn/Ack | |
252 eV[ 0x13] = BAD_FLAGS; // Illegal | |
253 eV[ 0x14] = RST_RX; // Rst | |
254 eV[ 0x15] = BAD_FLAGS; // Illegal | |
255 eV[ 0x16] = BAD_FLAGS; // Illegal | |
256 eV[ 0x17] = BAD_FLAGS; // Illegal | |
257 eV[ 0x18] = ACK_RX; // Ack | |
258 eV[ 0x19] = FIN_ACK_RX;// Fin/Ack | |
259 eV[ 0x1a] = SYN_ACK_RX;// Syn/Ack | |
260 eV[ 0x1b] = BAD_FLAGS; // Illegal | |
261 eV[ 0x1c] = RST_RX; // Rst | |
262 eV[ 0x1d] = BAD_FLAGS; // Illegal | |
263 eV[ 0x1e] = BAD_FLAGS; // Illegal | |
264 eV[ 0x1f] = BAD_FLAGS; // Illegal | |
265 eV[ 0x20] = SEQ_RECV; // No flags (Urgent not presently used) | |
266 eV[ 0x21] = FIN_RX; // Fin | |
267 eV[ 0x22] = SYN_RX; // Syn | |
268 eV[ 0x23] = BAD_FLAGS; // Illegal | |
269 eV[ 0x24] = RST_RX; // Rst | |
270 eV[ 0x25] = BAD_FLAGS; // Illegal | |
271 eV[ 0x26] = BAD_FLAGS; // Illegal | |
272 eV[ 0x27] = BAD_FLAGS; // Illegal | |
273 eV[ 0x28] = SEQ_RECV; // Psh flag is not used | |
274 eV[ 0x29] = FIN_RX; // Fin | |
275 eV[ 0x2a] = SYN_RX; // Syn | |
276 eV[ 0x2b] = BAD_FLAGS; // Illegal | |
277 eV[ 0x2c] = RST_RX; // Rst | |
278 eV[ 0x2d] = BAD_FLAGS; // Illegal | |
279 eV[ 0x2e] = BAD_FLAGS; // Illegal | |
280 eV[ 0x2f] = BAD_FLAGS; // Illegal | |
281 eV[ 0x30] = ACK_RX; // Ack (Urgent not used) | |
282 eV[ 0x31] = FIN_ACK_RX;// Fin/Ack | |
283 eV[ 0x32] = SYN_ACK_RX;// Syn/Ack | |
284 eV[ 0x33] = BAD_FLAGS; // Illegal | |
285 eV[ 0x34] = RST_RX; // Rst | |
286 eV[ 0x35] = BAD_FLAGS; // Illegal | |
287 eV[ 0x36] = BAD_FLAGS; // Illegal | |
288 eV[ 0x37] = BAD_FLAGS; // Illegal | |
289 eV[ 0x38] = ACK_RX; // Ack | |
290 eV[ 0x39] = FIN_ACK_RX;// Fin/Ack | |
291 eV[ 0x3a] = SYN_ACK_RX;// Syn/Ack | |
292 eV[ 0x3b] = BAD_FLAGS; // Illegal | |
293 eV[ 0x3c] = RST_RX; // Rst | |
294 eV[ 0x3d] = BAD_FLAGS; // Illegal | |
295 eV[ 0x3e] = BAD_FLAGS; // Illegal | |
296 eV[ 0x3f] = BAD_FLAGS; // Illegal | |
297 } | |
298 | |
299 SA TcpStateMachine::Lookup (States_t s, Events_t e) | |
300 { | |
301 NS_LOG_FUNCTION (this << s << e); | |
302 return aT[s][e]; | |
303 } | |
304 | |
305 Events_t TcpStateMachine::FlagsEvent (uint8_t f) | |
306 {· | |
307 NS_LOG_FUNCTION (this << f); | |
308 // Lookup event from flags | |
309 if (f >= MAX_FLAGS) return BAD_FLAGS; | |
310 return eV[f]; // Look up flags event | |
311 } | |
312 | |
313 static TcpStateMachine tcpStateMachine; //only instance of a TcpStateMachine | |
314 | 50 |
315 //TcpL4Protocol stuff---------------------------------------------------------- | 51 //TcpL4Protocol stuff---------------------------------------------------------- |
316 | 52 |
317 #undef NS_LOG_APPEND_CONTEXT | 53 #undef NS_LOG_APPEND_CONTEXT |
318 #define NS_LOG_APPEND_CONTEXT \ | 54 #define NS_LOG_APPEND_CONTEXT \ |
319 if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_n
ode->GetId () << "] "; }· | 55 if (m_node) { std::clog << Simulator::Now ().GetSeconds () << " [node " << m_n
ode->GetId () << "] "; }· |
320 | 56 |
321 /* see http://www.iana.org/assignments/protocol-numbers */ | 57 /* see http://www.iana.org/assignments/protocol-numbers */ |
322 const uint8_t TcpL4Protocol::PROT_NUMBER = 6; | 58 const uint8_t TcpL4Protocol::PROT_NUMBER = 6; |
323 | 59 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 { | 146 { |
411 delete m_endPoints; | 147 delete m_endPoints; |
412 m_endPoints = 0; | 148 m_endPoints = 0; |
413 } | 149 } |
414 | 150 |
415 m_node = 0; | 151 m_node = 0; |
416 Ipv4L4Protocol::DoDispose (); | 152 Ipv4L4Protocol::DoDispose (); |
417 } | 153 } |
418 | 154 |
419 Ptr<Socket> | 155 Ptr<Socket> |
420 TcpL4Protocol::CreateSocket (void) | 156 TcpL4Protocol::CreateSocket (TypeId socketTypeId) |
421 { | 157 { |
422 NS_LOG_FUNCTION_NOARGS (); | 158 NS_LOG_FUNCTION_NOARGS (); |
423 ObjectFactory rttFactory; | 159 ObjectFactory rttFactory; |
424 ObjectFactory socketFactory; | 160 ObjectFactory socketFactory; |
425 rttFactory.SetTypeId(m_rttTypeId); | 161 rttFactory.SetTypeId(m_rttTypeId); |
426 socketFactory.SetTypeId(m_socketTypeId); | 162 socketFactory.SetTypeId(socketTypeId); |
427 Ptr<RttEstimator> rtt = rttFactory.Create<RttEstimator> (); | 163 Ptr<RttEstimator> rtt = rttFactory.Create<RttEstimator> (); |
428 Ptr<TcpSocketBase> socket = socketFactory.Create<TcpSocketBase> (); | 164 Ptr<TcpSocketBase> socket = socketFactory.Create<TcpSocketBase> (); |
429 socket->SetNode (m_node); | 165 socket->SetNode (m_node); |
430 socket->SetTcp (this); | 166 socket->SetTcp (this); |
431 socket->SetRtt (rtt); | 167 socket->SetRtt (rtt); |
432 m_sockets.push_back (socket); | 168 m_sockets.push_back (socket); |
433 return socket; | 169 return socket; |
434 } | 170 } |
435 | 171 |
| 172 Ptr<Socket> |
| 173 TcpL4Protocol::CreateSocket (void) |
| 174 { |
| 175 return CreateSocket (m_socketTypeId); |
| 176 } |
| 177 |
436 Ipv4EndPoint * | 178 Ipv4EndPoint * |
437 TcpL4Protocol::Allocate (void) | 179 TcpL4Protocol::Allocate (void) |
438 { | 180 { |
439 NS_LOG_FUNCTION_NOARGS (); | 181 NS_LOG_FUNCTION_NOARGS (); |
440 return m_endPoints->Allocate (); | 182 return m_endPoints->Allocate (); |
441 } | 183 } |
442 | 184 |
443 Ipv4EndPoint * | 185 Ipv4EndPoint * |
444 TcpL4Protocol::Allocate (Ipv4Address address) | 186 TcpL4Protocol::Allocate (Ipv4Address address) |
445 { | 187 { |
(...skipping 26 matching lines...) Expand all Loading... |
472 | 214 |
473 void· | 215 void· |
474 TcpL4Protocol::DeAllocate (Ipv4EndPoint *endPoint) | 216 TcpL4Protocol::DeAllocate (Ipv4EndPoint *endPoint) |
475 { | 217 { |
476 NS_LOG_FUNCTION (this << endPoint); | 218 NS_LOG_FUNCTION (this << endPoint); |
477 m_endPoints->DeAllocate (endPoint); | 219 m_endPoints->DeAllocate (endPoint); |
478 } | 220 } |
479 | 221 |
480 enum Ipv4L4Protocol::RxStatus | 222 enum Ipv4L4Protocol::RxStatus |
481 TcpL4Protocol::Receive (Ptr<Packet> packet, | 223 TcpL4Protocol::Receive (Ptr<Packet> packet, |
482 Ipv4Address const &source, | 224 Ipv4Header const &ipHeader, |
483 Ipv4Address const &destination, | |
484 Ptr<Ipv4Interface> incomingInterface) | 225 Ptr<Ipv4Interface> incomingInterface) |
485 { | 226 { |
486 NS_LOG_FUNCTION (this << packet << source << destination << incomingInterface)
; | 227 NS_LOG_FUNCTION (this << packet << ipHeader << incomingInterface); |
487 | 228 |
488 TcpHeader tcpHeader; | 229 TcpHeader tcpHeader; |
489 if(Node::ChecksumEnabled ()) | 230 if(Node::ChecksumEnabled ()) |
490 { | 231 { |
491 tcpHeader.EnableChecksums(); | 232 tcpHeader.EnableChecksums(); |
492 tcpHeader.InitializeChecksum (source, destination, PROT_NUMBER); | 233 tcpHeader.InitializeChecksum (ipHeader.GetSource (), ipHeader.GetDestination
(), PROT_NUMBER); |
493 } | 234 } |
494 | 235 |
495 packet->PeekHeader (tcpHeader); | 236 packet->PeekHeader (tcpHeader); |
496 | 237 |
497 NS_LOG_LOGIC("TcpL4Protocol " << this | 238 NS_LOG_LOGIC("TcpL4Protocol " << this |
498 << " receiving seq " << tcpHeader.GetSequenceNumber() | 239 << " receiving seq " << tcpHeader.GetSequenceNumber() |
499 << " ack " << tcpHeader.GetAckNumber() | 240 << " ack " << tcpHeader.GetAckNumber() |
500 << " flags "<< std::hex << (int)tcpHeader.GetFlags() << std::dec | 241 << " flags "<< std::hex << (int)tcpHeader.GetFlags() << std::dec |
501 << " data size " << packet->GetSize()); | 242 << " data size " << packet->GetSize()); |
502 | 243 |
503 if(!tcpHeader.IsChecksumOk ()) | 244 if(!tcpHeader.IsChecksumOk ()) |
504 { | 245 { |
505 NS_LOG_INFO("Bad checksum, dropping packet!"); | 246 NS_LOG_INFO("Bad checksum, dropping packet!"); |
506 return Ipv4L4Protocol::RX_CSUM_FAILED; | 247 return Ipv4L4Protocol::RX_CSUM_FAILED; |
507 } | 248 } |
508 | 249 |
509 NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" received a packet"); | 250 NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" received a packet"); |
510 Ipv4EndPointDemux::EndPoints endPoints = | 251 Ipv4EndPointDemux::EndPoints endPoints = |
511 m_endPoints->Lookup (destination, tcpHeader.GetDestinationPort (), | 252 m_endPoints->Lookup (ipHeader.GetDestination (), tcpHeader.GetDestinationPor
t (), |
512 source, tcpHeader.GetSourcePort (),incomingInterface); | 253 ipHeader.GetSource (), tcpHeader.GetSourcePort (),incom
ingInterface); |
513 if (endPoints.empty ()) | 254 if (endPoints.empty ()) |
514 { | 255 { |
515 NS_LOG_LOGIC (" No endpoints matched on TcpL4Protocol "<<this); | 256 NS_LOG_LOGIC (" No endpoints matched on TcpL4Protocol "<<this); |
516 std::ostringstream oss; | 257 std::ostringstream oss; |
517 oss<<" destination IP: "; | 258 oss<<" destination IP: "; |
518 destination.Print (oss); | 259 ipHeader.GetDestination ().Print (oss); |
519 oss<<" destination port: "<< tcpHeader.GetDestinationPort ()<<" source IP: "
; | 260 oss<<" destination port: "<< tcpHeader.GetDestinationPort ()<<" source IP: "
; |
520 source.Print (oss); | 261 ipHeader.GetSource ().Print (oss); |
521 oss<<" source port: "<<tcpHeader.GetSourcePort (); | 262 oss<<" source port: "<<tcpHeader.GetSourcePort (); |
522 NS_LOG_LOGIC (oss.str ()); | 263 NS_LOG_LOGIC (oss.str ()); |
523 | 264 |
524 if (!(tcpHeader.GetFlags () & TcpHeader::RST)) | 265 if (!(tcpHeader.GetFlags () & TcpHeader::RST)) |
525 { | 266 { |
526 // build a RST packet and send | 267 // build a RST packet and send |
527 Ptr<Packet> rstPacket = Create<Packet> (); | 268 Ptr<Packet> rstPacket = Create<Packet> (); |
528 TcpHeader header; | 269 TcpHeader header; |
529 if (tcpHeader.GetFlags () & TcpHeader::ACK) | 270 if (tcpHeader.GetFlags () & TcpHeader::ACK) |
530 { | 271 { |
531 // ACK bit was set | 272 // ACK bit was set |
532 header.SetFlags (TcpHeader::RST); | 273 header.SetFlags (TcpHeader::RST); |
533 header.SetSequenceNumber (header.GetAckNumber ()); | 274 header.SetSequenceNumber (header.GetAckNumber ()); |
534 } | 275 } |
535 else | 276 else |
536 { | 277 { |
537 header.SetFlags (TcpHeader::RST | TcpHeader::ACK); | 278 header.SetFlags (TcpHeader::RST | TcpHeader::ACK); |
538 header.SetSequenceNumber (SequenceNumber (0)); | 279 header.SetSequenceNumber (SequenceNumber32 (0)); |
539 header.SetAckNumber (header.GetSequenceNumber () + SequenceNumber (1
)); | 280 header.SetAckNumber (header.GetSequenceNumber () + SequenceNumber32
(1)); |
540 } | 281 } |
541 header.SetSourcePort (tcpHeader.GetDestinationPort ()); | 282 header.SetSourcePort (tcpHeader.GetDestinationPort ()); |
542 header.SetDestinationPort (tcpHeader.GetSourcePort ()); | 283 header.SetDestinationPort (tcpHeader.GetSourcePort ()); |
543 SendPacket (rstPacket, header, destination, source); | 284 SendPacket (rstPacket, header, ipHeader.GetDestination (), ipHeader.GetS
ource ()); |
544 return Ipv4L4Protocol::RX_ENDPOINT_CLOSED; | 285 return Ipv4L4Protocol::RX_ENDPOINT_CLOSED; |
545 } | 286 } |
546 else | 287 else |
547 { | 288 { |
548 return Ipv4L4Protocol::RX_ENDPOINT_CLOSED; | 289 return Ipv4L4Protocol::RX_ENDPOINT_CLOSED; |
549 } | 290 } |
550 } | 291 } |
551 NS_ASSERT_MSG (endPoints.size() == 1 , "Demux returned more than one endpoint"
); | 292 NS_ASSERT_MSG (endPoints.size() == 1 , "Demux returned more than one endpoint"
); |
552 NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" forwarding up to endpoint/socket"); | 293 NS_LOG_LOGIC ("TcpL4Protocol "<<this<<" forwarding up to endpoint/socket"); |
553 (*endPoints.begin ())->ForwardUp (packet, source, destination, tcpHeader.GetSo
urcePort ()); | 294 (*endPoints.begin ())->ForwardUp (packet, ipHeader, tcpHeader.GetSourcePort ()
,· |
| 295 incomingInterface); |
554 return Ipv4L4Protocol::RX_OK; | 296 return Ipv4L4Protocol::RX_OK; |
555 } | 297 } |
556 | 298 |
557 void | 299 void |
558 TcpL4Protocol::Send (Ptr<Packet> packet,· | 300 TcpL4Protocol::Send (Ptr<Packet> packet,· |
559 Ipv4Address saddr, Ipv4Address daddr,· | 301 Ipv4Address saddr, Ipv4Address daddr,· |
560 uint16_t sport, uint16_t dport, Ptr<NetDevice> oif) | 302 uint16_t sport, uint16_t dport, Ptr<NetDevice> oif) |
561 { | 303 { |
562 NS_LOG_FUNCTION (this << packet << saddr << daddr << sport << dport << oif); | 304 NS_LOG_FUNCTION (this << packet << saddr << daddr << sport << dport << oif); |
563 | 305 |
564 TcpHeader tcpHeader; | 306 TcpHeader tcpHeader; |
565 tcpHeader.SetDestinationPort (dport); | 307 tcpHeader.SetDestinationPort (dport); |
566 tcpHeader.SetSourcePort (sport); | 308 tcpHeader.SetSourcePort (sport); |
567 if(Node::ChecksumEnabled ()) | 309 if(Node::ChecksumEnabled ()) |
568 { | 310 { |
569 tcpHeader.EnableChecksums(); | 311 tcpHeader.EnableChecksums(); |
570 } | 312 } |
571 tcpHeader.InitializeChecksum (saddr, | 313 tcpHeader.InitializeChecksum (saddr, |
572 daddr, | 314 daddr, |
573 PROT_NUMBER); | 315 PROT_NUMBER); |
574 tcpHeader.SetFlags (TcpHeader::ACK); | 316 tcpHeader.SetFlags (TcpHeader::ACK); |
575 tcpHeader.SetAckNumber (0); | 317 tcpHeader.SetAckNumber (SequenceNumber32 (0)); |
576 | 318 |
577 packet->AddHeader (tcpHeader); | 319 packet->AddHeader (tcpHeader); |
578 | 320 |
579 Ptr<Ipv4L3Protocol> ipv4 =· | 321 Ptr<Ipv4L3Protocol> ipv4 =· |
580 m_node->GetObject<Ipv4L3Protocol> (); | 322 m_node->GetObject<Ipv4L3Protocol> (); |
581 if (ipv4 != 0) | 323 if (ipv4 != 0) |
582 { | 324 { |
583 // XXX We've already performed the route lookup in TcpSocketImpl | 325 // XXX We've already performed the route lookup in TcpSocketImpl |
584 // should be cached. | 326 // should be cached. |
585 Ipv4Header header; | 327 Ipv4Header header; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 route = 0; | 387 route = 0; |
646 } | 388 } |
647 ipv4->Send (packet, saddr, daddr, PROT_NUMBER, route); | 389 ipv4->Send (packet, saddr, daddr, PROT_NUMBER, route); |
648 } | 390 } |
649 else | 391 else |
650 NS_FATAL_ERROR("Trying to use Tcp on a node without an Ipv4 interface"); | 392 NS_FATAL_ERROR("Trying to use Tcp on a node without an Ipv4 interface"); |
651 } | 393 } |
652 | 394 |
653 }; // namespace ns3 | 395 }; // namespace ns3 |
654 | 396 |
LEFT | RIGHT |