hsms_statemachine.cpp

00001 /*   
00002  *   (c) Copyright 2008 Philipp Skadorov (philipp_s@users.sourceforge.net)
00003  *
00004  *   This file is part of FREESECS.
00005  *
00006  *   FREESECS is free software: you can redistribute it and/or modify
00007  *   it under the terms of the GNU General Public License as published by
00008  *   the Free Software Foundation, either version 3 of the License, or
00009  *   (at your option) any later version.
00010  *
00011  *   FREESECS is distributed in the hope that it will be useful,
00012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *   GNU General Public License for more details.
00015  *
00016  *   You should have received a copy of the GNU General Public License
00017  *   along with FREESECS, see COPYING.
00018  *   If not, see <http://www.gnu.org/licenses/>.
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 /*TODO: implement upper bl query for readiness*/
00300 bool
00301 passive_hsms_sm_t::x0(pdata_t d)//System is ready to accept hsms cnx
00302 {
00303     bool result = true;
00304 
00305     return result;
00306 }
00307 bool
00308 passive_hsms_sm_t::x1(pdata_t d)//Msg received is Select.req
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)//Msg is a valid hsms-msg
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)//Msg received is Separate.req
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)//Msg received is Linktest.req
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)//Msg received is Linktest.rsp
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)//Msg received is data-msg
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)//send select.req with nonzero status
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)//send select.rsp with zero-status
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)//send linktest.rsp
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)//send separate.req
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)//send linktest.req + start t6 timer
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)//process data msg
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)//1. stop t6 timer 2. start linktest sending timer
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)//send msg over tcp/ip cnx
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)//Restart T8 timeout
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)//Stop T8 timeout
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)//Start hsms message reception
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)//start t7 timeout
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)//start linktest sending timeout
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 /*int active_hsms_sm_t::_sm_func (const hsms_event_t& e)*/
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             /*if(e_cnx_start_req == e.type)
00553             {
00554                 err = z8(e.pdata);
00555                 err = z14(e.pdata);
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)//select.rsp has sero status
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)//msg received is select.rsp
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)//msg received is a valid hsms msg
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)//msg received is separate.req
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)//msg received is linktest.req
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)//msg received is linktest.rsp
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)//msg received is data-msg
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)//Send Linktest.rsp
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)//send separate.req
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)//1. Send Linktest.req 2. Start T6 timer
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)//Process data msg
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)//1. Stop T6 timer 2. Start linktest sending timer
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)//Start tcp/ip connect in active mode
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)//Send msg over hsms cnx
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)//Restart T8 timeout
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)//Stop T8 timeout
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)//restart active connection
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     //t5.start(_params.t5);
00894     //fire t5 immediately to init tcp cnx
00895     //later on, t5 will take the value from
00896     //config params
00897     t5.start(1);
00898     state_signal(_state);
00899     return 0;
00900 }
00901 int 
00902 active_hsms_sm_t::z1_0(pdata_t pdata)//1. Send Select.req 2. Start T6 timeout
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)//1. Cancel T6 timeout 2. Start linktest sending timeout 3. Start message reception
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 

Generated on Fri Oct 3 15:30:01 2008 for FREESECS hsms by  doxygen 1.5.1