00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "hsms_cnx.h"
00021 #include "hsms_statemachine.h"
00022 #include "log.h"
00023
00024 #define HSMS_SM_LOG_LEVEL 10
00025
00026 using namespace freesecs;
00027
00028 inline void
00029 check_init_pdata(freesecs::hsms_sm_t::pdata_t& pdata)
00030 {
00031 if(NULL == pdata.get())
00032 {
00033 pdata = new hsms_sm_t::pdata_t::value_type;
00034 }
00035 }
00036
00037 hsms_sm_t::hsms_sm_t()
00038 :_state(e_hsms_not_connected), _tid(0)
00039 {
00040 t5.add_handler(this, &hsms_sm_t::t5_handler);
00041 t6.add_handler(this, &hsms_sm_t::t6_handler);
00042 t7.add_handler(this, &hsms_sm_t::t7_handler);
00043 t8.add_handler(this, &hsms_sm_t::t8_handler);
00044 linktest_timer.add_handler(this, &hsms_sm_t::linktest_handler);
00045 }
00046
00047 hsms_sm_t::~hsms_sm_t()
00048 {
00049 t5.stop();
00050 t6.stop();
00051 t7.stop();
00052 t8.stop();
00053 linktest_timer.stop();
00054 }
00055
00056 hsms_state_et
00057 hsms_sm_t::get_state() const
00058 {
00059 return _state;
00060 }
00061
00062
00063 int
00064 hsms_sm_t::t5_handler()
00065 {
00066 TRACE_DEBUG(HSMS_SM_LOG_LEVEL, "HSMS SM: T5 timeout");
00067 hsms_event_t ev = {e_t5_timeout,};
00068
00069 *this << ev;
00070
00071 return 0;
00072 }
00073
00074 int
00075 hsms_sm_t::t6_handler()
00076 {
00077 TRACE_DEBUG(HSMS_SM_LOG_LEVEL, "HSMS SM: T6 timeout");
00078 hsms_event_t ev = {e_t6_timeout,};
00079
00080 *this << ev;
00081
00082 return 0;
00083 }
00084
00085 int
00086 hsms_sm_t::t7_handler()
00087 {
00088 TRACE_DEBUG(HSMS_SM_LOG_LEVEL, "HSMS SM: T7 timeout");
00089 hsms_event_t ev = {e_t7_timeout,};
00090
00091 *this << ev;
00092
00093 return 0;
00094 }
00095
00096 int
00097 hsms_sm_t::t8_handler()
00098 {
00099 TRACE_DEBUG(HSMS_SM_LOG_LEVEL, "HSMS SM: T8 timeout");
00100 hsms_event_t ev = {e_t8_timeout,};
00101
00102 *this << ev;
00103
00104 return 0;
00105 }
00106
00107 int
00108 hsms_sm_t::linktest_handler()
00109 {
00110 TRACE_DEBUG(HSMS_SM_LOG_LEVEL, "HSMS SM: linktest sending timeout");
00111 hsms_event_t ev = {e_linktest_timeout,};
00112
00113 *this << ev;
00114
00115 return 0;
00116 }
00117
00118 void
00119 hsms_sm_t::close_cnx()
00120 {
00121 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "HSMS SM", __func__, "");
00122 t5.stop();
00123 t6.stop();
00124 t7.stop();
00125 t8.stop();
00126 linktest_timer.stop();
00127
00128 close_tcp();
00129 }
00130
00131
00132 passive_hsms_sm_t::passive_hsms_sm_t(hsms_passive_params_t params)
00133 :_params(params)
00134 {
00135 _params.t6 *= 1000;
00136 _params.t7 *= 1000;
00137 _params.t8 *= 1000;
00138 _params.linktest *= 1000;
00139 }
00140
00141 passive_hsms_sm_t::~passive_hsms_sm_t()
00142 {}
00143
00144 int
00145 passive_hsms_sm_t::process(const hsms_event_t &e)
00146 {
00147 int err = 0;
00148 hsms_state_et old_y0 = _state;
00149
00150 TRACE_FSM_BEGIN(HSMS_SM_LOG_LEVEL, "PSM", _state, e.type);
00151
00152 switch (_state)
00153 {
00154 case e_hsms_not_connected:
00155 if(e_tcpip_established == e.type)
00156 {
00157 _state = e_hsms_not_selected;
00158 }
00159 else
00160 {
00161 goto passive_sm_wrong_ev;
00162 }
00163 break;
00164 case e_hsms_not_selected:
00165 if(e_hsms_msg_rcvd == e.type)
00166 {
00167 err = z11(e.pdata);
00168 if(!x0(e.pdata))
00169 {
00170 err = z1(e.pdata);
00171 _state = e_hsms_not_connected;
00172 }
00173 else if(!x1(e.pdata))
00174 {
00175 _state = e_hsms_not_connected;
00176 }
00177 else
00178 {
00179 _state = e_hsms_selected;
00180 err = z2(e.pdata);
00181 err = z12(e.pdata);
00182 }
00183 }
00184 else if(e_t7_timeout == e.type ||
00185 e_t8_timeout == e.type)
00186 {
00187 _state = e_hsms_not_connected;
00188 }
00189 else if(e_tcpip_error == e.type)
00190 {
00191 _state = e_hsms_not_connected;
00192 }
00193 else if(e_data_received == e.type)
00194 {
00195 err = z10(e.pdata);
00196 }
00197 else
00198 {
00199 goto passive_sm_wrong_ev;
00200 }
00201 break;
00202 case e_hsms_selected:
00203 if(e_hsms_msg_rcvd == e.type)
00204 {
00205 err = z11(e.pdata);
00206 if(!x2(e.pdata))
00207 {
00208 err = z4(e.pdata);
00209 _state = e_hsms_not_connected;
00210 }
00211 else if(x3(e.pdata))
00212 {
00213 _state = e_hsms_not_connected;
00214 }
00215 else
00216 {
00217 if(x4(e.pdata))
00218 {
00219 err = z3(e.pdata);
00220 }
00221 else if(x5(e.pdata))
00222 {
00223 err = z7(e.pdata);
00224 }
00225 else if(x6(e.pdata))
00226 {
00227 err = z6(e.pdata);
00228 }
00229 err = z12(e.pdata);
00230 }
00231 }
00232 else if(e_linktest_timeout == e.type)
00233 {
00234 err = z5(e.pdata);
00235 }
00236 else if(e_datamsg_send_req == e.type)
00237 {
00238 err = z9(e.pdata);
00239 }
00240 else if(e_cnx_term_req == e.type)
00241 {
00242 err = z4(e.pdata);
00243 err = z11(e.pdata);
00244 _state = e_hsms_not_connected;
00245 }
00246 else if(e_tcpip_error == e.type)
00247 {
00248 err = z4(e.pdata);
00249 err = z11(e.pdata);
00250 _state = e_hsms_not_connected;
00251 }
00252 else if(e_t6_timeout == e.type)
00253 {
00254 err = z4(e.pdata);
00255 err = z11(e.pdata);
00256 _state = e_hsms_not_connected;
00257 }
00258 else
00259 {
00260 goto passive_sm_wrong_ev;
00261 }
00262 break;
00263 default:
00264 err = ENOSYS;
00265 break;
00266 };
00267 if (err || old_y0 == _state)
00268 {
00269 goto passive_a0_end;
00270 }
00271
00272 TRACE_FSM_TRANS(HSMS_SM_LOG_LEVEL, "PSM", old_y0, _state);
00273
00274 switch (_state)
00275 {
00276 case e_hsms_not_connected:
00277 err = z0_0(e);
00278 break;
00279 case e_hsms_not_selected:
00280 err = z1_0(e.pdata);
00281 break;
00282 case e_hsms_selected:
00283 err = z2_0(e.pdata);
00284 break;
00285 default:
00286 err = ENOSYS;
00287 break;
00288 };
00289 passive_a0_end:
00290 TRACE_FSM_END(HSMS_SM_LOG_LEVEL, "PSM", _state, e.type);
00291 return err;
00292
00293 passive_sm_wrong_ev:
00294 TRACE_FSM_ERROR(HSMS_SM_LOG_LEVEL, "PSM", "event %d not handled in state %d", e.type, _state);
00295 TRACE_FSM_END(HSMS_SM_LOG_LEVEL, "PSM", _state, e.type);
00296 return EPERM;
00297 };
00298
00299
00300 bool
00301 passive_hsms_sm_t::x0(pdata_t d)
00302 {
00303 bool result = true;
00304
00305 return result;
00306 }
00307 bool
00308 passive_hsms_sm_t::x1(pdata_t d)
00309 {
00310 select_req<data_t> sel_req;
00311 bool valid = sel_req.valid(*d);
00312 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, ": %d",valid);
00313 return valid;
00314 }
00315 bool
00316 passive_hsms_sm_t::x2(pdata_t d)
00317 {
00318 hsms_msg_base<data_t> msg;
00319 bool valid = msg.valid(*d);
00320 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, ": %d", valid);
00321 return valid;
00322 }
00323 bool
00324 passive_hsms_sm_t::x3(pdata_t d)
00325 {
00326 separate_req<data_t> sep_req;
00327 bool valid = sep_req.valid(*d);
00328 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, ": %d", valid);
00329 return valid;
00330 }
00331 bool
00332 passive_hsms_sm_t::x4(pdata_t d)
00333 {
00334 linktest_req<data_t> lnktest_req;
00335 bool valid = lnktest_req.valid(*d);
00336 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, ": %d", valid);
00337 return valid;
00338 }
00339 bool
00340 passive_hsms_sm_t::x5(pdata_t d)
00341 {
00342 linktest_rsp<data_t> lnktest_rsp;
00343 bool valid = lnktest_rsp.valid(*d);
00344 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, ": %d", valid);
00345 return valid;
00346 }
00347 bool
00348 passive_hsms_sm_t::x6(pdata_t d)
00349 {
00350 data_msg<data_t> data_msg;
00351 bool valid = data_msg.valid(*d);
00352 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, ": %d", valid);
00353 return valid;
00354 }
00355
00356 int
00357 passive_hsms_sm_t::z1(pdata_t pdata)
00358 {
00359 select_req<data_t> req;
00360 select_rsp<data_t> rsp;
00361
00362 check_init_pdata(pdata);
00363
00364 rsp.compose(*pdata,
00365 req.transaction_id(*pdata),
00366 select_rsp<data_t>::e_not_ready);
00367
00368 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "sending select response...");
00369
00370 return send_over_tcp(pdata);
00371 }
00372 int
00373 passive_hsms_sm_t::z2(pdata_t pdata)
00374 {
00375
00376 select_req<data_t> req;
00377 select_rsp<data_t> rsp;
00378
00379 check_init_pdata(pdata);
00380
00381 rsp.compose(*pdata,
00382 req.transaction_id(*pdata),
00383 select_rsp<data_t>::e_established);
00384
00385 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "sending select response...");
00386
00387 return send_over_tcp(pdata);
00388 }
00389 int
00390 passive_hsms_sm_t::z3(pdata_t pdata)
00391 {
00392 linktest_req<data_t> req;
00393 linktest_rsp<data_t> rsp;
00394
00395 check_init_pdata(pdata);
00396 rsp.compose(*pdata, req.transaction_id(*pdata));
00397
00398 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "sending linktest response...");
00399
00400 return send_over_tcp(pdata);
00401 }
00402 int
00403 passive_hsms_sm_t::z4(pdata_t pdata)
00404 {
00405 separate_req<data_t> req;
00406
00407 check_init_pdata(pdata);
00408 req.compose(*pdata, _tid++);
00409
00410 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "sending separate request...");
00411
00412 return send_over_tcp(pdata);
00413 }
00414 int
00415 passive_hsms_sm_t::z5(pdata_t pdata)
00416 {
00417 linktest_req<data_t> req;
00418
00419 check_init_pdata(pdata);
00420 req.compose(*pdata, _tid++);
00421
00422 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "sending linktest request...");
00423
00424 return send_over_tcp(pdata);
00425 }
00426 int
00427 passive_hsms_sm_t::z6(pdata_t d)
00428 {
00429 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "start processing message...");
00430 hsms_msg_received(d);
00431
00432 return 0;
00433 }
00434 int
00435 passive_hsms_sm_t::z7(pdata_t)
00436 {
00437 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "");
00438 t6.stop();
00439
00440 if(_params.linktest)
00441 {
00442 linktest_timer.start(_params.linktest);
00443 }
00444 return 0;
00445 }
00446 int
00447 passive_hsms_sm_t::z9(pdata_t pdata)
00448 {
00449 data_msg<data_t> data_msg;
00450
00451 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "");
00452
00453 if(false == data_msg.valid(*pdata))
00454 {
00455 return EINVAL;
00456 }
00457
00458 return send_over_tcp(pdata);
00459 }
00460 int
00461 passive_hsms_sm_t::z10(pdata_t)
00462 {
00463 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "restarting T8 timeout...");
00464 t8.stop();
00465 t8.start(_params.t8);
00466 return 0;
00467 }
00468 int
00469 passive_hsms_sm_t::z11(pdata_t)
00470 {
00471 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "stopping T8 timeout...");
00472 t8.stop();
00473 return 0;
00474 }
00475 int
00476 passive_hsms_sm_t::z12(pdata_t pdata)
00477 {
00478 check_init_pdata(pdata);
00479
00480 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "started async message reception");
00481
00482 recv_from_tcp(pdata);
00483 return 0;
00484 }
00485
00486 int
00487 passive_hsms_sm_t::z0_0(hsms_event_t e)
00488 {
00489 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "");
00490 close_cnx();
00491 state_signal(_state);
00492
00493 if(e_cnx_term_req != e.type)
00494 {
00495 return open_tcp();
00496 }
00497 return 0;
00498 }
00499
00500 int
00501 passive_hsms_sm_t::z1_0(pdata_t pdata)
00502 {
00503 z12(pdata);
00504 t7.start(_params.t7);
00505 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "started T7 timer");
00506
00507 state_signal(_state);
00508 return 0;
00509 }
00510 int
00511 passive_hsms_sm_t::z2_0(pdata_t)
00512 {
00513 t7.stop();
00514
00515 if(_params.linktest)
00516 {
00517 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__, "started linktest sending timeout");
00518 linktest_timer.start(_params.linktest);
00519 }
00520 state_signal(_state);
00521 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "PSM", __func__,"");
00522 return 0;
00523 }
00524
00525
00526
00529 active_hsms_sm_t::active_hsms_sm_t(hsms_active_params_t params)
00530 :_params(params)
00531 {
00532 _params.t5 *= 1000;
00533 _params.t6 *= 1000;
00534 _params.t8 *= 1000;
00535 _params.linktest *= 1000;
00536 }
00537
00538 active_hsms_sm_t::~active_hsms_sm_t(){}
00539
00540
00541 int
00542 active_hsms_sm_t::process(const hsms_event_t &e)
00543 {
00544 int err = 0;
00545 hsms_state_et old_y0 = this->_state;
00546
00547 TRACE_FSM_BEGIN(HSMS_SM_LOG_LEVEL, "ASM", _state, e.type);
00548
00549 switch (_state)
00550 {
00551 case e_hsms_not_connected:
00552
00553
00554
00555
00556
00557 if(e_t5_timeout == e.type)
00558 {
00559 err = z8(e.pdata);
00560 }
00561 else if(e_tcpip_established == e.type)
00562 {
00563 _state = e_hsms_not_selected;
00564 err = z13(e.pdata);
00565 }
00566 else if(e_tcpip_cnx_failure == e.type)
00567 {
00568 err = z14(e.pdata);
00569 }
00570 else
00571 {
00572 goto active_sm_wrong_ev;
00573 }
00574 break;
00575 case e_hsms_not_selected:
00576 if(e_hsms_msg_rcvd == e.type)
00577 {
00578 err = z11(e.pdata);
00579 if(!x0(e.pdata))
00580 {
00581 this->_state = e_hsms_not_connected;
00582 }
00583 else if(!x1(e.pdata))
00584 {
00585 this->_state = e_hsms_not_connected;
00586 }
00587 else if(!x2(e.pdata))
00588 {
00589 this->_state = e_hsms_not_connected;
00590 }
00591 else
00592 {
00593 this->_state = e_hsms_selected;
00594 }
00595 }
00596 else if(e_t6_timeout == e.type)
00597 {
00598 _state = e_hsms_not_connected;
00599 }
00600 else if(e_t8_timeout == e.type)
00601 {
00602 _state = e_hsms_not_connected;
00603 }
00604 else if(e_tcpip_error == e.type)
00605 {
00606 _state = e_hsms_not_connected;
00607 }
00608 else if(e_data_received == e.type)
00609 {
00610 err = z10(e.pdata);
00611 }
00612 else
00613 {
00614 goto active_sm_wrong_ev;
00615 }
00616 break;
00617 case e_hsms_selected:
00618 if(e_hsms_msg_rcvd == e.type)
00619 {
00620 err = z11(e.pdata);
00621 if(!x2(e.pdata))
00622 {
00623 err = z4(e.pdata);
00624 _state = e_hsms_not_connected;
00625 }
00626 else if(x3(e.pdata))
00627 {
00628 _state = e_hsms_not_connected;
00629 }
00630 else
00631 {
00632 if(x4(e.pdata))
00633 {
00634 err = z3(e.pdata);
00635 }
00636 else if(x5(e.pdata))
00637 {
00638 err = z7(e.pdata);
00639 }
00640 else if(x6(e.pdata))
00641 {
00642 err = z6(e.pdata);
00643 }
00644 err = z12(e.pdata);
00645 }
00646 }
00647 else if(e_linktest_timeout == e.type)
00648 {
00649 err = z5(e.pdata);
00650 }
00651 else if(e_datamsg_send_req == e.type)
00652 {
00653 err = z9(e.pdata);
00654 }
00655 else if(e_cnx_term_req == e.type)
00656 {
00657 err = z4(e.pdata);
00658 err = z11(e.pdata);
00659 _state = e_hsms_not_connected;
00660 }
00661 else if(e_tcpip_error == e.type)
00662 {
00663 err = z4(e.pdata);
00664 err = z11(e.pdata);
00665 _state = e_hsms_not_connected;
00666 }
00667 else if(e_t6_timeout == e.type)
00668 {
00669 err = z4(e.pdata);
00670 err = z11(e.pdata);
00671 _state = e_hsms_not_connected;
00672 }
00673 else
00674 {
00675 goto active_sm_wrong_ev;
00676 }
00677 break;
00678 default:
00679 err = ENOSYS;
00680 break;
00681 };
00682 if (err || old_y0 == _state)
00683 {
00684 goto active_sm_end;
00685 }
00686
00687 TRACE_FSM_TRANS(HSMS_SM_LOG_LEVEL, "ASM", old_y0, _state);
00688
00689 switch (_state)
00690 {
00691 case e_hsms_not_connected:
00692 err = z0_0(e.pdata);
00693 break;
00694 case e_hsms_not_selected:
00695 err = z1_0(e.pdata);
00696 break;
00697 case e_hsms_selected:
00698 err = z2_0(e.pdata);
00699 break;
00700 default:
00701 err = ENOSYS;
00702 break;
00703 };
00704 active_sm_end:
00705 TRACE_FSM_END(HSMS_SM_LOG_LEVEL, "ASM", _state, e.type);
00706 return err;
00707
00708 active_sm_wrong_ev:
00709 TRACE_FSM_ERROR(HSMS_SM_LOG_LEVEL, "ASM", "event %d not handled in state %d", e.type, _state);
00710 TRACE_FSM_END(HSMS_SM_LOG_LEVEL, "ASM", _state, e.type);
00711 return EPERM;
00712
00713 };
00714
00715 bool
00716 active_hsms_sm_t::x0(pdata_t d)
00717 {
00718 select_rsp<data_t> select_rsp;
00719 bool valid = select_rsp.valid(*d) && 0 == select_rsp.status(*d);
00720 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "%d", valid);
00721 return valid;
00722 }
00723 bool
00724 active_hsms_sm_t::x1(pdata_t d)
00725 {
00726 select_rsp<data_t> select_rsp;
00727 bool valid = select_rsp.valid(*d);
00728 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "%d", valid);
00729 return valid;
00730 }
00731 bool
00732 active_hsms_sm_t::x2(pdata_t d)
00733 {
00734 hsms_msg_base<data_t> msg;
00735 bool valid = msg.valid(*d);
00736 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "%d", valid);
00737 return valid;
00738 }
00739 bool
00740 active_hsms_sm_t::x3(pdata_t d)
00741 {
00742 separate_req<data_t> separate_req;
00743 bool valid = separate_req.valid(*d);
00744 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "%d", valid);
00745 return valid;
00746 }
00747 bool
00748 active_hsms_sm_t::x4(pdata_t d)
00749 {
00750 linktest_req<data_t> linktest_req;
00751 bool valid = linktest_req.valid(*d);
00752 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "%d", valid);
00753 return valid;
00754 }
00755 bool
00756 active_hsms_sm_t::x5(pdata_t d)
00757 {
00758 linktest_rsp<data_t> linktest_rsp;
00759 bool valid = linktest_rsp.valid(*d);
00760 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "%d", valid);
00761 return valid;
00762 }
00763 bool
00764 active_hsms_sm_t::x6(pdata_t d)
00765 {
00766 data_msg<data_t> data_msg;
00767 bool valid = data_msg.valid(*d);
00768 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "%d", valid);
00769 return valid;
00770 }
00771
00772 int
00773 active_hsms_sm_t::z3(pdata_t pdata)
00774 {
00775 linktest_req<data_t> req;
00776 linktest_rsp<data_t> rsp;
00777
00778 check_init_pdata(pdata);
00779
00780 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "sending linktest response...");
00781 rsp.compose(*pdata, req.transaction_id(*pdata));
00782 return send_over_tcp(pdata);
00783 }
00784 int
00785 active_hsms_sm_t::z4(pdata_t pdata)
00786 {
00787 separate_req<data_t> req;
00788
00789 check_init_pdata(pdata);
00790
00791 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "sending separate request...");
00792 req.compose(*pdata, _tid++);
00793 return send_over_tcp(pdata);
00794 }
00795 int
00796 active_hsms_sm_t::z5(pdata_t pdata)
00797 {
00798 int error;
00799
00800 linktest_req<data_t> req;
00801
00802 check_init_pdata(pdata);
00803
00804 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "sending linktest request...");
00805
00806 req.compose(*pdata, _tid++);
00807
00808 error = send_over_tcp(pdata);
00809
00810 t6.start(_params.t6);
00811
00812 return error;
00813 }
00814 int
00815 active_hsms_sm_t::z6(pdata_t pdata)
00816 {
00817 int err = 0;
00818 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "start processing message...");
00819 hsms_msg_received(pdata);
00820 return err;
00821 }
00822 int
00823 active_hsms_sm_t::z7(pdata_t)
00824 {
00825 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "");
00826
00827 t6.stop();
00828
00829 if(_params.linktest)
00830 {
00831 linktest_timer.start(_params.linktest);
00832 }
00833 return 0;
00834 }
00835 int
00836 active_hsms_sm_t::z8(pdata_t)
00837 {
00838 state_signal(e_hsms_not_connected_t5);
00839
00840 return open_tcp();
00841 }
00842 int
00843 active_hsms_sm_t::z9(pdata_t pdata)
00844 {
00845 data_msg<data_t> data_msg;
00846
00847 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "");
00848
00849 if(false == data_msg.valid(*pdata))
00850 {
00851 return EINVAL;
00852 }
00853
00854 return send_over_tcp(pdata);
00855 }
00856 int
00857 active_hsms_sm_t::z10(pdata_t)
00858 {
00859 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "restarting T8 timeout...");
00860 t8.stop();
00861 t8.start(_params.t8);
00862 return 0;
00863 }
00864 int
00865 active_hsms_sm_t::z11(pdata_t)
00866 {
00867 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "stopping T8 timeout...");
00868 t8.stop();
00869 return 0;
00870 }
00871 int
00872 active_hsms_sm_t::z12(pdata_t pdata)
00873 {
00874 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "started async message reception");
00875 return recv_from_tcp(pdata);
00876 }
00877 int
00878 active_hsms_sm_t::z13(pdata_t)
00879 {
00880 t5.stop();
00881 return 0;
00882 }
00883 int
00884 active_hsms_sm_t::z14(pdata_t)
00885 {
00886 t5.start(_params.t5);
00887 return 0;
00888 }
00889 int
00890 active_hsms_sm_t::z0_0(pdata_t)
00891 {
00892 close_cnx();
00893
00894
00895
00896
00897 t5.start(1);
00898 state_signal(_state);
00899 return 0;
00900 }
00901 int
00902 active_hsms_sm_t::z1_0(pdata_t pdata)
00903 {
00904 select_req<data_t> req;
00905
00906 check_init_pdata(pdata);
00907
00908 recv_from_tcp(pdata);
00909
00910 req.compose(*pdata, _tid++);
00911 int err = send_over_tcp(pdata);
00912
00913 if(err)
00914 {
00915 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "send select.req: %s (%d)", strerror(err), err);
00916 }
00917
00918 t6.start(_params.t6);
00919
00920
00921 state_signal(_state);
00922
00923 return err;
00924 }
00925 int
00926 active_hsms_sm_t::z2_0(pdata_t pdata)
00927 {
00928 int err;
00929
00930 TRACE_FSM_ACTION(HSMS_SM_LOG_LEVEL, "ASM", __func__, "");
00931
00932 t6.stop();
00933
00934 if(_params.linktest)
00935 {
00936 linktest_timer.start(_params.linktest);
00937 }
00938
00939 err = recv_from_tcp(pdata);
00940
00941 state_signal(_state);
00942
00943 return err;
00944 }
00945
00946