![]() |
User Manual, Developers Guide and API Documentation |
![]() |
00001 /******************************************************************************* 00002 * This file is part of openWNS (open Wireless Network Simulator) 00003 * _____________________________________________________________________________ 00004 * 00005 * Copyright (C) 2004-2007 00006 * Chair of Communication Networks (ComNets) 00007 * Kopernikusstr. 16, D-52074 Aachen, Germany 00008 * phone: ++49-241-80-27910, 00009 * fax: ++49-241-80-22242 00010 * email: info@openwns.org 00011 * www: http://www.openwns.org 00012 * _____________________________________________________________________________ 00013 * 00014 * openWNS is free software; you can redistribute it and/or modify it under the 00015 * terms of the GNU Lesser General Public License version 2 as published by the 00016 * Free Software Foundation; 00017 * 00018 * openWNS is distributed in the hope that it will be useful, but WITHOUT ANY 00019 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 00020 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 00021 * details. 00022 * 00023 * You should have received a copy of the GNU Lesser General Public License 00024 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00025 * 00026 ******************************************************************************/ 00027 00028 #include <TCP/ConnectionControl.hpp> 00029 #include <TCP/ThreeWayHandshake.hpp> 00030 00031 #include <WNS/Exception.hpp> 00032 00033 00034 using namespace tcp; 00035 00036 00037 STATIC_FACTORY_REGISTER_WITH_CREATOR(Closed, 00038 ConnectionControlInterface::StateInterface, 00039 "tcp_fsm_closed", 00040 wns::fsm::FSMConfigCreator); 00041 00042 Closed::StateInterface* 00043 Closed::syn() 00044 { 00045 vars().resetTCPFlags(); 00046 vars().syn = true; 00047 return getFSM()->createState<Syn_sent>(); 00048 } 00049 00050 Closed::StateInterface* 00051 Closed::syn_ack() 00052 { 00053 // invalid signal 00054 throw(wns::Exception("Invalid signal in state Closed")); 00055 return this; 00056 } 00057 00058 Closed::StateInterface* 00059 Closed::ack() 00060 { 00061 // invalid signal 00062 throw(wns::Exception("Invalid signal in state Closed")); 00063 return this; 00064 } 00065 00066 Closed::StateInterface* 00067 Closed::fin() 00068 { 00069 // invalid signal 00070 throw(wns::Exception("Invalid signal in state Closed")); 00071 return this; 00072 } 00073 00074 Closed::StateInterface* 00075 Closed::rst() 00076 { 00077 // invalid signal 00078 throw(wns::Exception("Invalid signal in state Closed")); 00079 return this; 00080 } 00081 00082 Closed::StateInterface* 00083 Closed::fin_ack() 00084 { 00085 // invalid signal 00086 throw(wns::Exception("Invalid signal in state Closed")); 00087 return this; 00088 } 00089 00090 00091 STATIC_FACTORY_REGISTER_WITH_CREATOR(Listen, 00092 ConnectionControlInterface::StateInterface, 00093 "tcp_fsm_listen", 00094 wns::fsm::FSMConfigCreator); 00095 00096 Listen::StateInterface* 00097 Listen::syn() 00098 { 00099 throw(wns::Exception("Invalid signal in state Listen")); 00100 return this; 00101 } 00102 00103 Listen::StateInterface* 00104 Listen::syn_ack() 00105 { 00106 vars().resetTCPFlags(); 00107 vars().syn = true; 00108 vars().ack = true; 00109 return getFSM()->createState<Syn_rcvd>(); 00110 } 00111 00112 Listen::StateInterface* 00113 Listen::ack() 00114 { 00115 // invalid signal 00116 throw(wns::Exception("Invalid signal in state Listen")); 00117 return this; 00118 } 00119 00120 Listen::StateInterface* 00121 Listen::fin() 00122 { 00123 // invalid signal 00124 throw(wns::Exception("Invalid signal in state Listen")); 00125 return this; 00126 } 00127 00128 Listen::StateInterface* 00129 Listen::rst() 00130 { 00131 // invalid signal 00132 throw(wns::Exception("Invalid signal in state Listen")); 00133 return this; 00134 } 00135 00136 Listen::StateInterface* 00137 Listen::fin_ack() 00138 { 00139 // invalid signal 00140 throw(wns::Exception("Invalid signal in state Listen")); 00141 return this; 00142 } 00143 00144 00145 STATIC_FACTORY_REGISTER_WITH_CREATOR(Syn_rcvd, 00146 ConnectionControlInterface::StateInterface, 00147 "tcp_fsm_syn_rcvd", 00148 wns::fsm::FSMConfigCreator); 00149 00150 Syn_rcvd::StateInterface* 00151 Syn_rcvd::syn() 00152 { 00153 // invalid signal 00154 throw(wns::Exception("Invalid signal in state Syn_rcvd")); 00155 return this; 00156 } 00157 00158 Syn_rcvd::StateInterface* 00159 Syn_rcvd::syn_ack() 00160 { 00161 // invalid signal 00162 throw(wns::Exception("Invalid signal in state Syn_rcvd")); 00163 return this; 00164 } 00165 00166 Syn_rcvd::StateInterface* 00167 Syn_rcvd::ack() 00168 { 00169 // invalid signal 00170 throw(wns::Exception("Invalid signal in state Syn_rcvd")); 00171 return this; 00172 } 00173 00174 Syn_rcvd::StateInterface* 00175 Syn_rcvd::fin() 00176 { 00177 vars().resetTCPFlags(); 00178 vars().fin = true; 00179 return getFSM()->createState<Fin_wait_1>(); 00180 } 00181 00182 Syn_rcvd::StateInterface* 00183 Syn_rcvd::rst() 00184 { 00185 // invalid signal 00186 throw(wns::Exception("Invalid signal in state Syn_rcvd")); 00187 return this; 00188 } 00189 00190 Syn_rcvd::StateInterface* 00191 Syn_rcvd::fin_ack() 00192 { 00193 // invalid signal 00194 throw(wns::Exception("Invalid signal in state Syn_rcvd")); 00195 return this; 00196 } 00197 00198 00199 00200 STATIC_FACTORY_REGISTER_WITH_CREATOR(Syn_sent, 00201 ConnectionControlInterface::StateInterface, 00202 "tcp_fsm_syn_sent", 00203 wns::fsm::FSMConfigCreator); 00204 00205 Syn_sent::StateInterface* 00206 Syn_sent::syn() 00207 { 00208 // invalid signal 00209 throw(wns::Exception("Invalid signal in state Syn_sent")); 00210 return this; 00211 } 00212 00213 Syn_sent::StateInterface* 00214 Syn_sent::syn_ack() 00215 { 00216 // if syn received 00217 // simultaneous open (not provided by server) 00218 //return getFSM()->createState<Syn_rcvd>(); 00219 throw(wns::Exception("Invalid signal in state Syn_sent")); 00220 return this; 00221 } 00222 00223 Syn_sent::StateInterface* 00224 Syn_sent::ack() 00225 { 00226 // if syn, ack received 00227 vars().resetTCPFlags(); 00228 vars().ack = true; 00229 return getFSM()->createState<Established>(); 00230 } 00231 00232 Syn_sent::StateInterface* 00233 Syn_sent::fin() 00234 { 00235 // invalid signal 00236 throw(wns::Exception("Invalid signal in state Syn_sent")); 00237 return this; 00238 } 00239 00240 Syn_sent::StateInterface* 00241 Syn_sent::rst() 00242 { 00243 // invalid signal 00244 throw(wns::Exception("Invalid signal in state Syn_sent")); 00245 return this; 00246 } 00247 00248 Syn_sent::StateInterface* 00249 Syn_sent::fin_ack() 00250 { 00251 // invalid signal 00252 throw(wns::Exception("Invalid signal in state Syn_sent")); 00253 return this; 00254 } 00255 00256 00257 STATIC_FACTORY_REGISTER_WITH_CREATOR(Established, 00258 ConnectionControlInterface::StateInterface, 00259 "tcp_fsm_established", 00260 wns::fsm::FSMConfigCreator); 00261 00262 Established::StateInterface* 00263 Established::syn() 00264 { 00265 // invalid signal 00266 throw(wns::Exception("Invalid signal in state Established")); 00267 return this; 00268 } 00269 00270 Established::StateInterface* 00271 Established::syn_ack() 00272 { 00273 // invalid signal 00274 throw(wns::Exception("Invalid signal in state Established")); 00275 return this; 00276 } 00277 00278 Established::StateInterface* 00279 Established::ack() 00280 { 00281 vars().resetTCPFlags(); 00282 vars().ack = true; 00283 // if signal fin received 00284 return getFSM()->createState<Close_wait>(); 00285 } 00286 00287 Established::StateInterface* 00288 Established::fin() 00289 { 00290 // if connection closed by application 00291 vars().resetTCPFlags(); 00292 vars().fin = true; 00293 return getFSM()->createState<Fin_wait_1>(); 00294 } 00295 00296 Established::StateInterface* 00297 Established::rst() 00298 { 00299 // invalid signal 00300 throw(wns::Exception("Invalid signal in state Established")); 00301 return this; 00302 } 00303 00304 Established::StateInterface* 00305 Established::fin_ack() 00306 { 00307 // invalid signal 00308 throw(wns::Exception("Invalid signal in state Established")); 00309 return this; 00310 } 00311 00312 00313 00314 STATIC_FACTORY_REGISTER_WITH_CREATOR(Close_wait, 00315 ConnectionControlInterface::StateInterface, 00316 "tcp_fsm_close_wait", 00317 wns::fsm::FSMConfigCreator); 00318 00319 Close_wait::StateInterface* 00320 Close_wait::syn() 00321 { 00322 // invalid signal 00323 throw(wns::Exception("Invalid signal in state Close_wait")); 00324 return this; 00325 } 00326 00327 Close_wait::StateInterface* 00328 Close_wait::syn_ack() 00329 { 00330 // invalid signal 00331 throw(wns::Exception("Invalid signal in state Close_wait")); 00332 return this; 00333 } 00334 00335 Close_wait::StateInterface* 00336 Close_wait::ack() 00337 { 00338 // invalid signal 00339 throw(wns::Exception("Invalid signal in state Close_wait")); 00340 return this; 00341 } 00342 00343 Close_wait::StateInterface* 00344 Close_wait::fin() 00345 { 00346 vars().resetTCPFlags(); 00347 vars().fin = true; 00348 return getFSM()->createState<Last_ack>(); 00349 } 00350 00351 Close_wait::StateInterface* 00352 Close_wait::rst() 00353 { 00354 // invalid signal 00355 throw(wns::Exception("Invalid signal in state Close_wait")); 00356 return this; 00357 } 00358 00359 Close_wait::StateInterface* 00360 Close_wait::fin_ack() 00361 { 00362 // invalid signal 00363 throw(wns::Exception("Invalid signal in state Close_wait")); 00364 return this; 00365 } 00366 00367 00368 STATIC_FACTORY_REGISTER_WITH_CREATOR(Last_ack, 00369 ConnectionControlInterface::StateInterface, 00370 "tcp_fsm_last_ack", 00371 wns::fsm::FSMConfigCreator); 00372 00373 Last_ack::StateInterface* 00374 Last_ack::syn() 00375 { 00376 // invalid signal 00377 throw(wns::Exception("Invalid signal in state Last_ack")); 00378 return this; 00379 } 00380 00381 Last_ack::StateInterface* 00382 Last_ack::syn_ack() 00383 { 00384 // invalid signal 00385 throw(wns::Exception("Invalid signal in state Last_ack")); 00386 return this; 00387 } 00388 00389 Last_ack::StateInterface* 00390 Last_ack::ack() 00391 { 00392 // invalid signal 00393 throw(wns::Exception("Invalid signal in state Last_ack")); 00394 return this; 00395 } 00396 00397 Last_ack::StateInterface* 00398 Last_ack::fin() 00399 { 00400 // invalid signal 00401 throw(wns::Exception("Invalid signal in state Last_ack")); 00402 return this; 00403 } 00404 00405 Last_ack::StateInterface* 00406 Last_ack::rst() 00407 { 00408 // invalid signal 00409 throw(wns::Exception("Invalid signal in state Last_ack")); 00410 return this; 00411 } 00412 00413 Last_ack::StateInterface* 00414 Last_ack::fin_ack() 00415 { 00416 // invalid signal 00417 throw(wns::Exception("Invalid signal in state Last_ack")); 00418 return this; 00419 } 00420 00421 00422 00423 STATIC_FACTORY_REGISTER_WITH_CREATOR(Closing, 00424 ConnectionControlInterface::StateInterface, 00425 "tcp_fsm_closing", 00426 wns::fsm::FSMConfigCreator); 00427 00428 Closing::StateInterface* 00429 Closing::syn() 00430 { 00431 // invalid signal 00432 throw(wns::Exception("Invalid signal in state Closing")); 00433 return this; 00434 } 00435 00436 Closing::StateInterface* 00437 Closing::syn_ack() 00438 { 00439 // invalid signal 00440 throw(wns::Exception("Invalid signal in state Closing")); 00441 return this; 00442 } 00443 00444 Closing::StateInterface* 00445 Closing::ack() 00446 { 00447 throw(wns::Exception("Invalid signal in state Closing")); 00448 return this; 00449 } 00450 00451 Closing::StateInterface* 00452 Closing::fin() 00453 { 00454 // invalid signal 00455 throw(wns::Exception("Invalid signal in state Closing")); 00456 return this; 00457 } 00458 00459 Closing::StateInterface* 00460 Closing::rst() 00461 { 00462 // invalid signal 00463 throw(wns::Exception("Invalid signal in state Closing")); 00464 return this; 00465 } 00466 00467 Closing::StateInterface* 00468 Closing::fin_ack() 00469 { 00470 // invalid signal 00471 throw(wns::Exception("Invalid signal in state Closing")); 00472 return this; 00473 } 00474 00475 00476 STATIC_FACTORY_REGISTER_WITH_CREATOR(Fin_wait_1, 00477 ConnectionControlInterface::StateInterface, 00478 "tcp_fsm_fin_wait_1", 00479 wns::fsm::FSMConfigCreator); 00480 00481 Fin_wait_1::StateInterface* 00482 Fin_wait_1::syn() 00483 { 00484 // invalid signal 00485 throw(wns::Exception("Invalid signal in state Fin_wait_1")); 00486 return this; 00487 } 00488 00489 Fin_wait_1::StateInterface* 00490 Fin_wait_1::syn_ack() 00491 { 00492 // invalid signal 00493 throw(wns::Exception("Invalid signal in state Fin_wait_1")); 00494 return this; 00495 } 00496 00497 Fin_wait_1::StateInterface* 00498 Fin_wait_1::ack() 00499 { 00500 //return getFSM()->createState<Time_wait>(); 00501 // change: drop state time_wait (timeout) 00502 // directly go to closed 00503 vars().resetTCPFlags(); 00504 vars().ack = true; 00505 return getFSM()->createState<Closing>(); 00506 } 00507 00508 Fin_wait_1::StateInterface* 00509 Fin_wait_1::fin() 00510 { 00511 // invalid signal 00512 throw(wns::Exception("Invalid signal in state Fin_wait_1")); 00513 return this; 00514 } 00515 00516 Fin_wait_1::StateInterface* 00517 Fin_wait_1::rst() 00518 { 00519 // invalid signal 00520 throw(wns::Exception("Invalid signal in state Fin_wait_1")); 00521 return this; 00522 } 00523 00524 Fin_wait_1::StateInterface* 00525 Fin_wait_1::fin_ack() 00526 { 00527 // invalid signal 00528 throw(wns::Exception("Invalid signal in state Fin_wait_1")); 00529 return this; 00530 } 00531 00532 00533 00534 00535 STATIC_FACTORY_REGISTER_WITH_CREATOR(Fin_wait_2, 00536 ConnectionControlInterface::StateInterface, 00537 "tcp_fsm_fin_wait_2", 00538 wns::fsm::FSMConfigCreator); 00539 00540 Fin_wait_2::StateInterface* 00541 Fin_wait_2::syn() 00542 { 00543 // invalid signal 00544 throw(wns::Exception("Invalid signal in state Fin_wait_2")); 00545 return this; 00546 } 00547 00548 Fin_wait_2::StateInterface* 00549 Fin_wait_2::syn_ack() 00550 { 00551 // invalid signal 00552 throw(wns::Exception("Invalid signal in state Fin_wait_2")); 00553 return this; 00554 } 00555 00556 Fin_wait_2::StateInterface* 00557 Fin_wait_2::ack() 00558 { 00559 // if signal fin received 00560 vars().resetTCPFlags(); 00561 vars().ack = true; 00562 //return getFSM()->createState<Time_wait>(); 00563 // change: drop state time_wait (timeout) 00564 // directly go to closed 00565 return getFSM()->createState<Closed>(); 00566 } 00567 00568 Fin_wait_2::StateInterface* 00569 Fin_wait_2::fin() 00570 { 00571 // invalid signal 00572 throw(wns::Exception("Invalid signal in state Fin_wait_2")); 00573 return this; 00574 } 00575 00576 Fin_wait_2::StateInterface* 00577 Fin_wait_2::rst() 00578 { 00579 // invalid signal 00580 throw(wns::Exception("Invalid signal in state Fin_wait_2")); 00581 return this; 00582 } 00583 00584 Fin_wait_2::StateInterface* 00585 Fin_wait_2::fin_ack() 00586 { 00587 // invalid signal 00588 throw(wns::Exception("Invalid signal in state Fin_wait_2")); 00589 return this; 00590 } 00591 00592 00593 00594 00595 STATIC_FACTORY_REGISTER_WITH_CREATOR(Time_wait, 00596 ConnectionControlInterface::StateInterface, 00597 "tcp_fsm_time_wait", 00598 wns::fsm::FSMConfigCreator); 00599 00600 Time_wait::StateInterface* 00601 Time_wait::syn() 00602 { 00603 // invalid signal 00604 throw(wns::Exception("Invalid signal in state Time_wait")); 00605 return this; 00606 } 00607 00608 Time_wait::StateInterface* 00609 Time_wait::syn_ack() 00610 { 00611 // invalid signal 00612 throw(wns::Exception("Invalid signal in state Time_wait")); 00613 return this; 00614 } 00615 00616 Time_wait::StateInterface* 00617 Time_wait::ack() 00618 { 00619 // invalid signal 00620 throw(wns::Exception("Invalid signal in state Time_wait")); 00621 return this; 00622 } 00623 00624 Time_wait::StateInterface* 00625 Time_wait::fin() 00626 { 00627 // invalid signal 00628 throw(wns::Exception("Invalid signal in state Time_wait")); 00629 return this; 00630 } 00631 00632 Time_wait::StateInterface* 00633 Time_wait::rst() 00634 { 00635 // invalid signal 00636 throw(wns::Exception("Invalid signal in state Time_wait")); 00637 return this; 00638 } 00639 00640 Time_wait::StateInterface* 00641 Time_wait::fin_ack() 00642 { 00643 // invalid signal 00644 throw(wns::Exception("Invalid signal in state Time_wait")); 00645 return this; 00646 } 00647
1.5.5