This has been fixed by splitting rule 3. The full machine and set of rules is as
follows:
[Initialisation] +-----+
----------------------------|Birth|
| +-----+
| tg_RawData[1]
| || rx_Message[2]
| || rx_MA-Hello[3]
| tg_RawData[5] || to_SendHello[4]
| -------- --------
| | V | V
| | V | V
| +----------+ +-----------+
---->>| Awaiting | tg_Connected[6] | Connected |
------|Connection|----------------------->>| |
| +----------+ +-----------+
| ^ |
| tg_RawData[1] ^ |
| || rx_Message[2] | |to_NoActivity[7]
| | V
| | V
| er_MAConnect[8] +-----+ to_NoHello[8] +-----------+
---------------->>|Death|<<----------------| Idle |
+-----+ | |
^ +-----------+
^ ^ |
| ^ |
--------------- --------
er_MAFailure[8] rx_MA-Hello[9]
(from all states)
Figure 8: Messaging Association State Machine
The processing rules are as follows:
Rule 1:
pass message to transport layer
(re)start NoActivity timer
(re)start SendHello
Rule 2:
pass message to Node-SM
(re)start NoActivity timer
Rule 3:
if reply requested
send MA-Hello
restart SendHello timer
Rule 4:
send MA-Hello message
restart SendHello timer
Rule 5: queue message for later transmission
Rule 6:
pass outstanding queued messages to transport layer
stop any timers controlling connection establishment
start NoActivity timer
start SendHello timer
Rule 7:
stop NoActivity timer
stop SendHello timer
start NoHello timer
Rule 8: destroy self
Rule 9:
if reply requested
send MA-Hello
restart NoHello timer |