OLD | NEW |
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 17 matching lines...) Expand all Loading... |
28 #include "ns3/node.h" | 28 #include "ns3/node.h" |
29 #include "ns3/simulator.h" | 29 #include "ns3/simulator.h" |
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-socket-impl.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 | 50 |
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 | |
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 |
324 ObjectFactory | |
325 TcpL4Protocol::GetDefaultRttEstimatorFactory (void) | |
326 { | |
327 ObjectFactory factory; | |
328 factory.SetTypeId (RttMeanDeviation::GetTypeId ()); | |
329 return factory; | |
330 } | |
331 | |
332 TypeId· | 60 TypeId· |
333 TcpL4Protocol::GetTypeId (void) | 61 TcpL4Protocol::GetTypeId (void) |
334 { | 62 { |
335 static TypeId tid = TypeId ("ns3::TcpL4Protocol") | 63 static TypeId tid = TypeId ("ns3::TcpL4Protocol") |
336 .SetParent<Ipv4L4Protocol> () | 64 .SetParent<Ipv4L4Protocol> () |
337 .AddConstructor<TcpL4Protocol> () | 65 .AddConstructor<TcpL4Protocol> () |
338 .AddAttribute ("RttEstimatorFactory", | 66 .AddAttribute ("RttEstimatorType", |
339 "How RttEstimator objects are created.", | 67 "Type of RttEstimator objects.", |
340 ObjectFactoryValue (GetDefaultRttEstimatorFactory ()), | 68 TypeIdValue (RttMeanDeviation::GetTypeId()), |
341 MakeObjectFactoryAccessor (&TcpL4Protocol::m_rttFactory), | 69 MakeTypeIdAccessor (&TcpL4Protocol::m_rttTypeId), |
342 MakeObjectFactoryChecker ()) | 70 MakeTypeIdChecker ()) |
| 71 .AddAttribute ("SocketType", |
| 72 "Socket type of TCP objects.", |
| 73 TypeIdValue (TcpNewReno::GetTypeId()), |
| 74 MakeTypeIdAccessor (&TcpL4Protocol::m_socketTypeId), |
| 75 MakeTypeIdChecker ()) |
343 .AddAttribute ("SocketList", "The list of sockets associated to this protoco
l.", | 76 .AddAttribute ("SocketList", "The list of sockets associated to this protoco
l.", |
344 ObjectVectorValue (), | 77 ObjectVectorValue (), |
345 MakeObjectVectorAccessor (&TcpL4Protocol::m_sockets), | 78 MakeObjectVectorAccessor (&TcpL4Protocol::m_sockets), |
346 MakeObjectVectorChecker<TcpSocketImpl> ()) | 79 MakeObjectVectorChecker<TcpSocketBase> ()) |
347 ; | 80 ; |
348 return tid; | 81 return tid; |
349 } | 82 } |
350 | 83 |
351 TcpL4Protocol::TcpL4Protocol () | 84 TcpL4Protocol::TcpL4Protocol () |
352 : m_endPoints (new Ipv4EndPointDemux ()) | 85 : m_endPoints (new Ipv4EndPointDemux ()) |
353 { | 86 { |
354 NS_LOG_FUNCTION_NOARGS (); | 87 NS_LOG_FUNCTION_NOARGS (); |
355 NS_LOG_LOGIC("Made a TcpL4Protocol "<<this); | 88 NS_LOG_LOGIC("Made a TcpL4Protocol "<<this); |
356 } | 89 } |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 int· | 129 int· |
397 TcpL4Protocol::GetProtocolNumber (void) const | 130 TcpL4Protocol::GetProtocolNumber (void) const |
398 { | 131 { |
399 return PROT_NUMBER; | 132 return PROT_NUMBER; |
400 } | 133 } |
401 | 134 |
402 void | 135 void |
403 TcpL4Protocol::DoDispose (void) | 136 TcpL4Protocol::DoDispose (void) |
404 { | 137 { |
405 NS_LOG_FUNCTION_NOARGS (); | 138 NS_LOG_FUNCTION_NOARGS (); |
406 for (std::vector<Ptr<TcpSocketImpl> >::iterator i = m_sockets.begin (); i != m
_sockets.end (); i++) | 139 for (std::vector<Ptr<TcpSocketBase> >::iterator i = m_sockets.begin (); i != m
_sockets.end (); i++) |
407 { | 140 { |
408 *i = 0; | 141 *i = 0; |
409 } | 142 } |
410 m_sockets.clear (); | 143 m_sockets.clear (); |
411 | 144 |
412 if (m_endPoints != 0) | 145 if (m_endPoints != 0) |
413 { | 146 { |
414 delete m_endPoints; | 147 delete m_endPoints; |
415 m_endPoints = 0; | 148 m_endPoints = 0; |
416 } | 149 } |
417 | 150 |
418 m_node = 0; | 151 m_node = 0; |
419 Ipv4L4Protocol::DoDispose (); | 152 Ipv4L4Protocol::DoDispose (); |
420 } | 153 } |
421 | 154 |
422 Ptr<Socket> | 155 Ptr<Socket> |
423 TcpL4Protocol::CreateSocket (void) | 156 TcpL4Protocol::CreateSocket (TypeId socketTypeId) |
424 { | 157 { |
425 NS_LOG_FUNCTION_NOARGS (); | 158 NS_LOG_FUNCTION_NOARGS (); |
426 Ptr<RttEstimator> rtt = m_rttFactory.Create<RttEstimator> (); | 159 ObjectFactory rttFactory; |
427 Ptr<TcpSocketImpl> socket = CreateObject<TcpSocketImpl> (); | 160 ObjectFactory socketFactory; |
| 161 rttFactory.SetTypeId(m_rttTypeId); |
| 162 socketFactory.SetTypeId(socketTypeId); |
| 163 Ptr<RttEstimator> rtt = rttFactory.Create<RttEstimator> (); |
| 164 Ptr<TcpSocketBase> socket = socketFactory.Create<TcpSocketBase> (); |
428 socket->SetNode (m_node); | 165 socket->SetNode (m_node); |
429 socket->SetTcp (this); | 166 socket->SetTcp (this); |
430 socket->SetRtt (rtt); | 167 socket->SetRtt (rtt); |
431 m_sockets.push_back (socket); | 168 m_sockets.push_back (socket); |
432 return socket; | 169 return socket; |
433 } | 170 } |
434 | 171 |
| 172 Ptr<Socket> |
| 173 TcpL4Protocol::CreateSocket (void) |
| 174 { |
| 175 return CreateSocket (m_socketTypeId); |
| 176 } |
| 177 |
435 Ipv4EndPoint * | 178 Ipv4EndPoint * |
436 TcpL4Protocol::Allocate (void) | 179 TcpL4Protocol::Allocate (void) |
437 { | 180 { |
438 NS_LOG_FUNCTION_NOARGS (); | 181 NS_LOG_FUNCTION_NOARGS (); |
439 return m_endPoints->Allocate (); | 182 return m_endPoints->Allocate (); |
440 } | 183 } |
441 | 184 |
442 Ipv4EndPoint * | 185 Ipv4EndPoint * |
443 TcpL4Protocol::Allocate (Ipv4Address address) | 186 TcpL4Protocol::Allocate (Ipv4Address address) |
444 { | 187 { |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 route = 0; | 387 route = 0; |
645 } | 388 } |
646 ipv4->Send (packet, saddr, daddr, PROT_NUMBER, route); | 389 ipv4->Send (packet, saddr, daddr, PROT_NUMBER, route); |
647 } | 390 } |
648 else | 391 else |
649 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"); |
650 } | 393 } |
651 | 394 |
652 }; // namespace ns3 | 395 }; // namespace ns3 |
653 | 396 |
OLD | NEW |