
/*
 * wtp_resp_machine.def - macro call for generating WTP responder statemachine.
 * See the architecture document for guidance how to use and update it.
 *
 * WTPRespMachine data structure includes current state of WTP responder state 
 * machine for a specific transaction. This means all data needed to handle at
 * least two incoming events of a certain transaction. Its fields can be 
 * grouped following way:
 *
 * General: wtp responder machine state 
 *
 * Fields telling the service required: 
 *               a) transaction class (is transaction confirmed or not) 
 *               b) user acknowledgement flag (do we wait for response primit-
 *                  ive of WTP user (for instance, WSP) or not)
 *
 * Machine identification: address four-tuple and transaction identifier
 * 
 * Field required for tid verification: 
 *               a) packed wsp invoke indication, which is required by the 
 *                  protocol
 *
 * Fields required for reliable transmission: 
 *               a) pointer to the timer of this machine in the timers list
 *               b) counters for acknowledgement waiting periods and retrans- 
 *                  missions 
 *               c) flag telling are we resending the result or not
 *               d) similar flag for acknowledgements
 *               e) packed result message, for greater effectivity
 */

#if !defined(MACHINE) 
    #error "Macro MACHINE is missing."
#elif !defined(INTEGER) 
    #error "Macro INTEGER is missing."
#elif !defined(ENUM) 
    #error "Macro ENUM is missing."
#elif !defined(TIMER) 
    #error "Macro TIMER is missing."
#elif !defined(EVENT) 
    #error "Macro EVENT is missing."
#elif !defined(LIST)
    #error "Macro LIST is missing."
#elif !defined(SARDATA)
    #error "Macro SARDATA is missing."
#elif !defined(ADDRTUPLE)
    #error "Macro ADDRTUPLE is missing."
#endif

MACHINE(ENUM(state)
		INTEGER(tid)              /* transaction identifier */
		ADDRTUPLE(addr_tuple)
		INTEGER(tcl)              /* transaction class */
		INTEGER(aec)              /* counter telling how many timer periods 
									  we have waited for acknowledgement */
		INTEGER(rcr)              /* retransmission counter */
		INTEGER(u_ack)            /* user acknowledgement flag (are user 
									  acknowledgement required) */ 
		INTEGER(rid)              /* retransmission flag, telling are we 
									  resending the result */ 
		EVENT(result)               /* packed result message - for resending */
		INTEGER(ack_pdu_sent)     /* are we resending the acknowledgement */
		TIMER(timer)              /* pointer to the timer of this machine timer
									  in the global timers list */
		EVENT(invoke_indication) /* packed wsp invoke indication - for tid
										 verification */
        EVENT(sar_invoke)     /* initial invoke for SAR, accumulate user_data */
        LIST(sar_info)
		SARDATA(sar)              /* ! NULL if were we asked for SAR */
	)

#undef MACHINE
#undef INTEGER
#undef ENUM
#undef TIMER
#undef EVENT
#undef LIST
#undef SARDATA
#undef ADDRTUPLE
