File: cc_qsig_monitor.fsm

package info (click to toggle)
libpri 1.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid
  • size: 2,696 kB
  • sloc: ansic: 39,045; makefile: 159; sh: 66
file content (249 lines) | stat: -rw-r--r-- 6,407 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/*
 * FSM pseudo code used in the design/implementation of the CC Q.SIG monitor.
 */
FSM CC_QSIG_Monitor
{
	State CC_STATE_IDLE {
		Init {
		}
		Prolog {
			Action Set_Selfdestruct;
		}
		Stimulus CC_EVENT_AVAILABLE {
			/*
			 * LibPRI will determine if CC will be offered based upon
			 * if it is even possible.
			 * Essentially:
			 * 1) The call must not have been redirected in this link's
			 * setup.
			 * 2) Received an ALERTING or received a
			 * DISCONNECT(busy/congestion).
			 */
			Action Pass_Up_CC_Available;
			Next_State CC_STATE_AVAILABLE;
		}
		Stimulus CC_EVENT_CANCEL {
			Action Set_Selfdestruct;
		}
	}
	State CC_STATE_AVAILABLE {
		/*
		 * The upper layer is responsible for canceling the CC available
		 * offering.
		 */
		Stimulus CC_EVENT_CC_REQUEST {
			/*
			 * Before event is posted:
			 *   cc_record->is_ccnr is set.
			 *   The signaling connection call record is created.
			 */
			Action Queue_CC_Request;
			/* Start QSIG_CC_T1. */
			Action Start_T_ACTIVATE;
			Next_State CC_STATE_REQUESTED;
		}
		Stimulus CC_EVENT_CANCEL {
			Next_State CC_STATE_IDLE;
		}
	}
	State CC_STATE_REQUESTED {
		Stimulus CC_EVENT_CC_REQUEST_ACCEPT {
			/*
			 * Received ccbsRequest/ccnrRequest response
			 * Before event is posted:
			 *   Negotiated CC retention setting saved
			 *   Negotiated signaling link retention setting saved
			 */
			Action Stop_T_ACTIVATE;
			Test = Get_msgtype;
			Test == Q931_RELEASE {
				Action Disassociate_Signaling_Link;
				Test = Get_Retain_Signaling_Link;
				Test == TRUE {
					/*
					 * The far end did not honor the
					 * signaling link retention requirement.
					 * ECMA-186 Section 6.5.2.2.1
					 */
					Action Pass_Up_CC_Req_Rsp_Timeout;
					Action Pass_Up_CC_Cancel;
					Action Send_CC_Cancel;
					Next_State CC_STATE_IDLE;
				}
			}
			Action Pass_Up_CC_Req_Rsp_Success;
			Next_State CC_STATE_ACTIVATED;
		}
		Stimulus CC_EVENT_CC_REQUEST_FAIL {
			Action Stop_T_ACTIVATE;
			Action Pass_Up_CC_Req_Rsp_Fail(error/reject, code);
			Action Pass_Up_CC_Cancel;
			/*
			 * If this request fail comes in with the RELEASE message
			 * then the post action will never get a chance to run.
			 * It will be aborted because the CC_EVENT_SIGNALING_GONE
			 * will be processed first.
			 */
			Action Post_HANGUP_SIGNALING;
			Next_State CC_STATE_WAIT_DESTRUCTION;
		}
		Stimulus CC_EVENT_TIMEOUT_T_ACTIVATE {
			Action Stop_T_ACTIVATE;
			Action Pass_Up_CC_Req_Rsp_Timeout;
			Action Pass_Up_CC_Cancel;
			Action Hangup_Signaling_Link;
			Next_State CC_STATE_IDLE;
		}
		Stimulus CC_EVENT_SIGNALING_GONE {
			Action Stop_T_ACTIVATE;
			/* Claim it was a timeout */
			Action Pass_Up_CC_Req_Rsp_Timeout;
			Action Pass_Up_CC_Cancel;
			Next_State CC_STATE_IDLE;
		}
		Stimulus CC_EVENT_CANCEL {
			Next_State CC_STATE_WAIT_DESTRUCTION;
		}
	}
	State CC_STATE_WAIT_DESTRUCTION {
		/*
		 * Delayed disconnect of the signaling link to allow subcmd events
		 * from the signaling link to be passed up.
		 */
		Stimulus CC_EVENT_CC_REQUEST_ACCEPT {
			/*
			 * Received ccbsRequest/ccnrRequest response
			 * Before event is posted:
			 *   Negotiated CC retention setting saved
			 *   Negotiated signaling link retention setting saved
			 */
			Action Stop_T_ACTIVATE;
			Test = Get_msgtype;
			Test == Q931_RELEASE {
				Action Disassociate_Signaling_Link;
			}
			Action Send_CC_Cancel;
			Next_State CC_STATE_IDLE;
		}
		Stimulus CC_EVENT_CC_REQUEST_FAIL {
			Action Stop_T_ACTIVATE;
			/*
			 * If this request fail comes in with the RELEASE message
			 * then the post action will never get a chance to run.
			 * It will be aborted because the CC_EVENT_SIGNALING_GONE
			 * will be processed first.
			 */
			Action Post_HANGUP_SIGNALING;
		}
		Stimulus CC_EVENT_TIMEOUT_T_ACTIVATE {
			Action Stop_T_ACTIVATE;
			Action Hangup_Signaling_Link;
			Next_State CC_STATE_IDLE;
		}
		Stimulus CC_EVENT_SIGNALING_GONE {
			/* Signaling link cleared. */
			Action Stop_T_ACTIVATE;
			Next_State CC_STATE_IDLE;
		}
		Stimulus CC_EVENT_HANGUP_SIGNALING {
			//Action Stop_T_ACTIVATE;
			Action Hangup_Signaling_Link;
			Next_State CC_STATE_IDLE;
		}
	}
	State CC_STATE_ACTIVATED {
		Prolog {
			Action Reset_A_Status;
		}
		Stimulus CC_EVENT_REMOTE_USER_FREE {
			/* Received ccExecPossible */
			Action Pass_Up_Remote_User_Free;
			/*
			 * ECMA-186 Section 6.5.2.1.7
			 * Implied switch to retain-signaling-link.
			 */
			Action Set_Retain_Signaling_Link;
			Test = Get_msgtype;
			Test == Q931_SETUP {
				/* Send Q931_CALL_PROCEEDING message on signaling link. */
				Action Send_Call_Proceeding;
			}
			Test = Get_A_Status;
			Test == Busy {
				Next_State CC_STATE_SUSPENDED;
			}
			Next_State CC_STATE_WAIT_CALLBACK;
		}
		Stimulus CC_EVENT_SUSPEND {
			Action Set_A_Status_Busy;
		}
		Stimulus CC_EVENT_RESUME {
			Action Reset_A_Status;
		}
	}
	State CC_STATE_WAIT_CALLBACK {
		Prolog {
			/* Start QSIG_CC_T3 */
			Action Start_T_RECALL;
		}
		Epilog {
			Action Stop_T_RECALL;
		}
		Stimulus CC_EVENT_RECALL {
			/* The original call parameters have already been set. */
			Action Queue_SETUP_Recall;
			Next_State CC_STATE_CALLBACK;
		}
		Stimulus CC_EVENT_SUSPEND {
			Next_State CC_STATE_SUSPENDED;
		}
		Stimulus CC_EVENT_TIMEOUT_T_RECALL {
			Action Pass_Up_CC_Cancel;
			Action Send_CC_Cancel;
			Next_State CC_STATE_IDLE;
		}
	}
	State CC_STATE_CALLBACK {
	}
	State CC_STATE_SUSPENDED {
		Prolog {
			/*
			 * The ccSuspend will be sent in a FACILITY or CONNECT
			 * message depending upon the CIS call state.
			 */
			Action Send_CC_Suspend;
		}
		Stimulus CC_EVENT_RESUME {
			Action Send_CC_Resume;
			Next_State CC_STATE_ACTIVATED;
		}
	}
	Superstate CC_ACTIVE(CC_STATE_ACTIVATED, CC_STATE_WAIT_CALLBACK, CC_STATE_CALLBACK, CC_STATE_SUSPENDED) {
		Prolog {
			/* Start QSIG_CCBS_T2/QSIG_CCNR_T2 depending upon CC mode. */
			Action Start_T_SUPERVISION;
		}
		Epilog {
			Action Stop_T_SUPERVISION;
		}
		Stimulus CC_EVENT_TIMEOUT_T_SUPERVISION {
			Action Pass_Up_CC_Cancel;
			Action Send_CC_Cancel;
			Next_State CC_STATE_IDLE;
		}
		Stimulus CC_EVENT_SIGNALING_GONE {
			/* Signaling link cleared. */
			Action Disassociate_Signaling_Link;
		}
		Stimulus CC_EVENT_LINK_CANCEL {
			/* Received ccCancel */
			Action Pass_Up_CC_Cancel;
			Action Post_HANGUP_SIGNALING;
			Next_State CC_STATE_WAIT_DESTRUCTION;
		}
		Stimulus CC_EVENT_CANCEL {
			Action Send_CC_Cancel;
			Next_State CC_STATE_IDLE;
		}
	}
}