wtp_init_states.def
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:6k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * wtp_init_state.h: Macro calls for implementing wtp initiator state tables
  3.  * See documentation for guidance how to use and update these.
  4.  *
  5.  * Only classes 0 and 1 are implemented. State NULL is called INITIATOR_NULL_
  6.  * STATE. 1 in the action field means that action is unconditional.
  7.  *
  8.  * Class 0 service is here a stateless invoke message (used for disconnection
  9.  * or unconfirmed push).
  10.  *
  11.  * Basic class 1 transaction, without timers, is following:
  12.  *               - initiator sends an invoke message to the responder
  13.  *               - responder acknowledges it, with an pdu with tid verification
  14.  *                 off (if it is on, we have a tid verification transaction, 
  15.  *                 see below).
  16.  *
  17.  * Retransmission until acknowledgement is implemented using timers and 
  18.  * retransmission counters. When the initiator sends an invoke it starts a 
  19.  * timer. When it expires, it resends the packet (either ack or invoke), until
  20.  * counter reaches the maximum value. Then the transaction is aborted.
  21.  *
  22.  * If user acknowledgement is on, timers have different values.
  23.  *
  24.  * When the initiator aborts the transaction, it sends an abort pdu. When the
  25.  * responder does it, the initiator wtp user is indicated.
  26.  *
  27.  * Tid verification in the initiator means answering the question posed by the
  28.  * responder: "Have you an outstanding transaction having this tid". If we do
  29.  * not have it, we have already, before feeding the event into the state 
  30.  * machine, sended an abort with reason INVALIDTID. So here we answer to  an
  31.  * ack pdu with tidve-flag set with an ack pdu with tidok-flag set. See WTP
  32.  * 5.6, table 2; WTP 8.9; WTP 9.3.4.1.
  33.  *
  34.  * By Aarno Syv鋘en for Wapit Ltd. 
  35.  */
  36. INIT_STATE_NAME(INITIATOR_NULL_STATE)
  37. INIT_STATE_NAME(INITIATOR_RESULT_WAIT)
  38. /*
  39.  * We do not use transaction class 2 here: Server is initiator only when it is 
  40.  * pushing (class 1 or class 0) or disconnecting (class 0). First and second 
  41.  * rows are similar, with exception of timer period.
  42.  */
  43. ROW(INITIATOR_NULL_STATE,
  44.     TR_Invoke_Req,
  45.     event->u.TR_Invoke_Req.tcl == 1,
  46.     {
  47.      WAPEvent *invoke;
  48. /*
  49.  * A special counter is used for storing value used (1) for tidnew flag when
  50.  * restarting (See WTP 8.8.3.2)
  51.  */
  52.      init_machine->tidnew = tidnew;
  53.      
  54.      wap_event_destroy(init_machine->invoke);
  55.      init_machine->rid = 0;
  56.      init_machine->rcr = 0;
  57.         
  58.      invoke = wtp_pack_invoke(init_machine, event);
  59.      init_machine->invoke = wap_event_duplicate(invoke);
  60.      dispatch_to_wdp(invoke);
  61.      init_machine->rid = 1;
  62. /*
  63.  * Turn the tidnew-flag off if it was on. (This can happen when tid was 
  64.  * wrapped or when we are restarting, see WTP 8.8.3.2) 
  65.  */     
  66.      if (init_machine->tidnew) {
  67.          init_machine->tidnew = 0;
  68.          tidnew = 0;
  69.      }
  70.      init_machine->u_ack = event->u.TR_Invoke_Req.up_flag;
  71.      init_machine->rcr = 0;
  72.      start_initiator_timer_R(init_machine);
  73.     }, 
  74.     INITIATOR_RESULT_WAIT)
  75. /*
  76.  * No need to turn tidnew flag when sending class 0 message; tid validation is
  77.  * not invoked in this case.
  78.  */
  79. ROW(INITIATOR_NULL_STATE,
  80.     TR_Invoke_Req,
  81.     event->u.TR_Invoke_Req.tcl == 0,
  82.     {
  83.      WAPEvent *invoke;
  84.      wap_event_destroy(init_machine->invoke);
  85.      invoke = wtp_pack_invoke(init_machine, event);
  86.      init_machine->invoke = wap_event_duplicate(invoke);
  87.      dispatch_to_wdp(invoke);
  88.     },
  89.     INITIATOR_NULL_STATE)
  90. ROW(INITIATOR_RESULT_WAIT,
  91.     TR_Abort_Req, 
  92.     1,
  93.     {
  94.      send_abort(init_machine, USER, event->u.TR_Abort_Req.abort_reason);
  95.     },
  96.     INITIATOR_NULL_STATE)
  97. /*
  98.  * Neither we check transaction class here: this can only be acknowledgement of
  99.  * class 1 transaction.
  100.  */
  101. ROW(INITIATOR_RESULT_WAIT,
  102.     RcvAck,
  103.     event->u.RcvAck.tid_ok == 0,
  104.     {
  105.      stop_initiator_timer(init_machine->timer);
  106.      wsp_event = create_tr_invoke_cnf(init_machine);
  107.      dispatch_to_wsp(wsp_event);     
  108.     },
  109.     INITIATOR_NULL_STATE)
  110. /*
  111.  * This is a positive answer to a tid verification (negative one being 
  112.  * already sent by init_machine_find_or_create).
  113.  */
  114. ROW(INITIATOR_RESULT_WAIT,
  115.     RcvAck,
  116.     event->u.RcvAck.tid_ok == 1 && init_machine->rcr < MAX_RCR,
  117.     {
  118.      send_ack(init_machine, TID_VERIFICATION, init_machine->rid);
  119.      init_machine->tidok_sent = 1;
  120.      ++init_machine->rcr;
  121.      start_initiator_timer_R(init_machine);
  122.     },
  123.     INITIATOR_RESULT_WAIT)
  124. /*
  125.  * RCR must not be greater than RCR_MAX. One of corrections from MOT_WTP_CR_01.
  126.  */ 
  127.    ROW(INITIATOR_RESULT_WAIT,
  128.        RcvAck,
  129.        event->u.RcvAck.tid_ok,
  130.        { },
  131.        INITIATOR_RESULT_WAIT)
  132. ROW(INITIATOR_RESULT_WAIT,
  133.     RcvAbort,
  134.     1,
  135.     {
  136.      wsp_event = create_tr_abort_ind(init_machine, 
  137.                  event->u.RcvAbort.abort_reason);
  138.      dispatch_to_wsp(wsp_event);
  139.     },
  140.     INITIATOR_NULL_STATE)
  141. ROW(INITIATOR_RESULT_WAIT,
  142.     RcvErrorPDU,
  143.     1,
  144.     {
  145.      send_abort(init_machine, USER, PROTOERR);
  146.      wsp_event = create_tr_abort_ind(init_machine, PROTOERR);
  147.      dispatch_to_wsp(wsp_event);
  148.     },
  149.     INITIATOR_NULL_STATE)
  150. ROW(INITIATOR_RESULT_WAIT,
  151.     TimerTO_R,
  152.     init_machine->rcr < MAX_RCR && !init_machine->tidok_sent,
  153.     {
  154.       WAPEvent *resend;
  155.       ++init_machine->rcr;
  156.      start_initiator_timer_R(init_machine);
  157.      resend = wap_event_duplicate(init_machine->invoke);
  158.      wtp_pack_set_rid(resend, init_machine->rid);
  159.      dispatch_to_wdp(resend);
  160.     },
  161.     INITIATOR_RESULT_WAIT)
  162. ROW(INITIATOR_RESULT_WAIT,
  163.     TimerTO_R,
  164.     init_machine->rcr < MAX_RCR && init_machine->tidok_sent,
  165.     {
  166.      ++init_machine->rcr;
  167.      start_initiator_timer_R(init_machine);
  168.      send_ack(init_machine, TID_VERIFICATION, init_machine->tidok_sent);
  169.     },
  170.     INITIATOR_RESULT_WAIT)
  171. ROW(INITIATOR_RESULT_WAIT,
  172.     TimerTO_R,
  173.     init_machine->rcr == MAX_RCR, 
  174.     {
  175.      wsp_event = create_tr_abort_ind(init_machine, NORESPONSE);
  176.      dispatch_to_wsp(wsp_event);
  177.     },
  178.     INITIATOR_NULL_STATE)
  179. #undef ROW
  180. #undef INIT_STATE_NAME