[libpri-commits] rmudgett: branch group/ccss r1386 - in /team/group/ccss: ./ doc/

SVN commits to the libpri project libpri-commits at lists.digium.com
Mon Dec 14 16:13:49 CST 2009


Author: rmudgett
Date: Mon Dec 14 16:13:46 2009
New Revision: 1386

URL: http://svnview.digium.com/svn/libpri?view=rev&rev=1386
Log:
Change to the CC API with corresponding changes to pri_cc_fsm_ptmp_agent FSM.

*  Added PRI_SUBCMD_B_FREE/pri_cc_b_free().
*  Added pri_cc_stop_alerting().
*  Removed busy flag from PRI_SUBCMD_REMOTE_USER_FREE.  Now taken care of
by PRI_SUBCMD_B_FREE.
*  Added CC PTMP agent FSM pseudo code document files in the doc directory.

Added:
    team/group/ccss/doc/
    team/group/ccss/doc/cc_ptmp_agent.fsm   (with props)
    team/group/ccss/doc/cc_ptmp_agent_flattened.fsm   (with props)
Modified:
    team/group/ccss/libpri.h
    team/group/ccss/pri_cc.c
    team/group/ccss/pri_internal.h

Added: team/group/ccss/doc/cc_ptmp_agent.fsm
URL: http://svnview.digium.com/svn/libpri/team/group/ccss/doc/cc_ptmp_agent.fsm?view=auto&rev=1386
==============================================================================
--- team/group/ccss/doc/cc_ptmp_agent.fsm (added)
+++ team/group/ccss/doc/cc_ptmp_agent.fsm Mon Dec 14 16:13:46 2009
@@ -1,0 +1,339 @@
+/*
+ * FSM pseudo code used in the design/implementation of the CC PTMP agent.
+ */
+FSM CC_PTMP_Agent
+{
+	State CC_STATE_IDLE {
+		Init {
+		}
+		Prolog {
+			Action Set_Selfdestruct;
+		}
+		Stimulus CC_EVENT_AVAILABLE {
+			Next_State CC_STATE_PENDING_AVAILABLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Set_Selfdestruct;
+		}
+	}
+	State CC_STATE_PENDING_AVAILABLE {
+		Stimulus CC_EVENT_MSG_ALERTING {
+			Action Send_CC_Available(Q931_ALERTING);
+			Next_State CC_STATE_AVAILABLE;
+		}
+		Stimulus CC_EVENT_MSG_DISCONNECT {
+			Action Send_CC_Available(Q931_DISCONNECT);
+			Next_State CC_STATE_AVAILABLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	State CC_STATE_AVAILABLE {
+		Epilog {
+			Action Stop_T_RETENTION;
+		}
+		Stimulus CC_EVENT_MSG_RELEASE {
+			Action Stop_T_RETENTION;
+			Action Start_T_RETENTION;
+		}
+		Stimulus CC_EVENT_MSG_RELEASE_COMPLETE {
+			Action Stop_T_RETENTION;
+			Action Start_T_RETENTION;
+		}
+		Stimulus CC_EVENT_CC_REQUEST {
+			Action Pass_Up_CC_Request;
+			Next_State CC_STATE_REQUESTED;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_RETENTION {
+			Action Send_EraseCallLinkageID;
+			Action Relese_LinkID;
+			Action Pass_Up_CC_Cancel;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_EraseCallLinkageID;
+			Action Relese_LinkID;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	State CC_STATE_REQUESTED {
+		Epilog {
+			Action Send_EraseCallLinkageID;
+			Action Relese_LinkID;
+		}
+		Stimulus CC_EVENT_CC_REQUEST_ACCEPT {
+			Next_State CC_STATE_ACTIVATED;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Next_State CC_STATE_IDLE;
+		}
+	}
+/*
+ * Pass_Up_A_Status passes up the current final status of A.
+ * Does nothing if status is invalid.
+ *
+ * Pass_Up_Status_Rsp_A passes up the current accumulated status of A.
+ * Does nothing if status is invalid.
+ *
+ * Pass_Up_Status_Rsp_A_Indirect is the same as Pass_Up_Status_Rsp_A but
+ * sets a timer to expire immediately to pass up the event.
+ * Does nothing if status is invalid.
+ */
+	State CC_STATE_ACTIVATED {
+		Prolog {
+			Action Reset_A_Status;
+		}
+		Stimulus CC_EVENT_RECALL {
+			Action Send_Error_Recall(ROSE_ERROR_CCBS_NotReadyForCall);
+			Action Set_Call_To_Hangup;
+		}
+		Stimulus CC_EVENT_B_FREE {
+			Action Send_CCBSBFree;
+		}
+		Stimulus CC_EVENT_REMOTE_USER_FREE {
+			Test = Get_A_Status;
+			Test == Invalid {
+				Next_State CC_STATE_B_AVAILABLE;
+			}
+			Test == Busy {
+				Action Pass_Up_A_Status;
+				Action Send_CCBSBFree;
+				Next_State CC_STATE_SUSPENDED;
+			}
+			Test == Free {
+				//Action Pass_Up_A_Status;
+				Action Send_RemoteUserFree;
+				Next_State CC_STATE_WAIT_CALLBACK;
+			}
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Test = Get_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A_Indirect;
+				Next_State $;
+			}
+			Test != Active {
+				Action Reset_A_Status;
+				Action Reset_Raw_A_Status;
+				Action Send_CCBSStatusRequest;
+				Action Start_T_CCBS1;
+				Action Stop_Extended_T_CCBS1;
+				Action Start_Extended_T_CCBS1;
+				Next_State $;
+			}
+		}
+		Stimulus CC_EVENT_A_FREE {
+			Action Set_Raw_A_Status_Free;
+			Action Promote_A_Status;
+			Action Pass_Up_Status_Rsp_A;
+			Action Stop_T_CCBS1;
+		}
+		Stimulus CC_EVENT_A_BUSY {
+			Action Add_Raw_A_Status_Busy;
+			Action Pass_Up_Status_Rsp_A;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
+			Action Promote_A_Status;
+			Test = Get_A_Status;
+			Test == Invalid {
+				/*
+				 * Did not get any responses.
+				 * User A no longer present.
+				 */
+				Action Send_CCBSErase(Normal_Unspecified);
+				Action Pass_Up_CC_Cancel;
+				Next_State CC_STATE_IDLE;
+			}
+		}
+		Stimulus CC_EVENT_TIMEOUT_EXTENDED_T_CCBS1 {
+			Action Reset_A_Status;
+		}
+	}
+	State CC_STATE_B_AVAILABLE {
+		/* A status is always invalid on entry. */
+		Prolog {
+			Test = Get_T_CCBS1_Status;
+			Test != Active {
+				Action Reset_Raw_A_Status;
+				Action Send_CCBSStatusRequest;
+				Action Start_T_CCBS1;
+			}
+		}
+		Stimulus CC_EVENT_RECALL {
+			Action Send_Error_Recall(ROSE_ERROR_CCBS_NotReadyForCall);
+			Action Set_Call_To_Hangup;
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Action Stop_Extended_T_CCBS1;
+			Action Start_Extended_T_CCBS1;
+			Action Pass_Up_Status_Rsp_A_Indirect;
+		}
+		Stimulus CC_EVENT_A_FREE {
+			Action Send_RemoteUserFree;
+			Action Set_Raw_A_Status_Free;
+			//Action Promote_A_Status;
+			//Action Pass_Up_A_Status;
+			Test = Get_Extended_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A;
+			}
+			Next_State CC_STATE_WAIT_CALLBACK;
+		}
+		Stimulus CC_EVENT_A_BUSY {
+			Action Add_Raw_A_Status_Busy;
+			Test = Get_Extended_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A;
+			}
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
+			Test = Get_Raw_A_Status;
+			Test == Invalid {
+				/*
+				 * Did not get any responses.
+				 * User A no longer present.
+				 */
+				Action Send_CCBSErase(Normal_Unspecified);
+				Action Pass_Up_CC_Cancel;
+				Next_State CC_STATE_IDLE;
+			}
+			/* Only received User A is busy. */
+			Action Send_CCBSBFree;
+			Action Promote_A_Status;
+			Action Pass_Up_A_Status;
+			Next_State CC_STATE_SUSPENDED;
+		}
+	}
+	State CC_STATE_SUSPENDED {
+		Prolog {
+			Test = Get_T_CCBS1_Status;
+			Test != Active {
+				Action Reset_Raw_A_Status;
+				Action Send_CCBSStatusRequest;
+				Action Start_T_CCBS1;
+			}
+		}
+		Stimulus CC_EVENT_RECALL {
+			Action Send_Error_Recall(ROSE_ERROR_CCBS_NotReadyForCall);
+			Action Set_Call_To_Hangup;
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Action Stop_Extended_T_CCBS1;
+			Action Start_Extended_T_CCBS1;
+			Action Pass_Up_Status_Rsp_A_Indirect;
+		}
+		Stimulus CC_EVENT_A_FREE {
+			Action Set_Raw_A_Status_Free;
+			Action Promote_A_Status;
+			Action Pass_Up_A_Status;
+			Test = Get_Extended_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A;
+			}
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Next_State CC_STATE_ACTIVATED;
+		}
+		Stimulus CC_EVENT_A_BUSY {
+			Action Add_Raw_A_Status_Busy;
+			Test = Get_Extended_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A;
+			}
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
+			Test = Get_Raw_A_Status;
+			Test == Invalid {
+				/*
+				 * Did not get any responses.
+				 * User A no longer present.
+				 */
+				Action Send_CCBSErase(Normal_Unspecified);
+				Action Pass_Up_CC_Cancel;
+				Next_State CC_STATE_IDLE;
+			}
+			/* Only received User A is busy. */
+			Action Reset_Raw_A_Status;
+			Action Send_CCBSStatusRequest;
+			Action Start_T_CCBS1;
+		}
+	}
+	State CC_STATE_WAIT_CALLBACK {
+		Prolog {
+			Action Start_T_CCBS3;
+		}
+		Epilog {
+			Action Stop_T_CCBS3;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS3 {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(T_CCBS3_TIMEOUT);
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_STOP_ALERTING {
+			/*
+			 * If an earlier link can send us this event then we
+			 * really should be configured for globalRecall like
+			 * the earlier link.
+			 */
+			Test = Get_Recall_Mode;
+			Test == globalRecall {
+				Action Send_CCBSStopAlerting;
+			}
+			Next_State CC_STATE_ACTIVATED;
+		}
+		Stimulus CC_EVENT_RECALL {
+			Action Pass_Up_CC_Call;
+			Action Set_Original_Call_Parameters;
+			Test = Get_Recall_Mode;
+			Test == globalRecall {
+				Action Send_CCBSStopAlerting;
+			}
+			Next_State CC_STATE_CALLBACK;
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Action Set_Raw_A_Status_Free;
+			Action Pass_Up_Status_Rsp_A_Indirect;
+		}
+	}
+	State CC_STATE_CALLBACK {
+		Stimulus CC_EVENT_RECALL {
+			Action Send_Error_Recall(ROSE_ERROR_CCBS_AlreadyAccepted);
+			Action Set_Call_To_Hangup;
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Action Set_Raw_A_Status_Free;
+			Action Pass_Up_Status_Rsp_A_Indirect;
+		}
+	}
+	Superstate CC_ACTIVE(CC_STATE_ACTIVATED, CC_STATE_B_AVAILABLE, CC_STATE_SUSPENDED, CC_STATE_WAIT_CALLBACK, CC_STATE_CALLBACK) {
+		Prolog {
+			/* Start T_CCBS2 or T_CCNR2 depending upon CC mode. */
+			Action Start_T_CCBS2;
+		}
+		Epilog {
+			Action Stop_T_CCBS2;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS2 {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(T_CCBS2_TIMEOUT);
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_LINK_CANCEL {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(Normal_Unspecified);
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_CCBSErase(Normal_Unspecified);
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	Superstate CC_STATUS(CC_STATE_ACTIVATED, CC_STATE_B_AVAILABLE, CC_STATE_SUSPENDED) {
+		Epilog {
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+		}
+	}
+}

Propchange: team/group/ccss/doc/cc_ptmp_agent.fsm
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/group/ccss/doc/cc_ptmp_agent.fsm
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/group/ccss/doc/cc_ptmp_agent.fsm
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: team/group/ccss/doc/cc_ptmp_agent_flattened.fsm
URL: http://svnview.digium.com/svn/libpri/team/group/ccss/doc/cc_ptmp_agent_flattened.fsm?view=auto&rev=1386
==============================================================================
--- team/group/ccss/doc/cc_ptmp_agent_flattened.fsm (added)
+++ team/group/ccss/doc/cc_ptmp_agent_flattened.fsm Mon Dec 14 16:13:46 2009
@@ -1,0 +1,453 @@
+/*
+ * FSM pseudo code used in the design/implementation of the CC PTMP agent.
+ */
+FSM CC_PTMP_Agent
+{
+	State CC_STATE_IDLE {
+		Stimulus CC_EVENT_AVAILABLE {
+			Next_State CC_STATE_PENDING_AVAILABLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Set_Selfdestruct;
+		}
+	}
+	State CC_STATE_PENDING_AVAILABLE {
+		Stimulus CC_EVENT_MSG_ALERTING {
+			Action Send_CC_Available(Q931_ALERTING);
+			Next_State CC_STATE_AVAILABLE;
+		}
+		Stimulus CC_EVENT_MSG_DISCONNECT {
+			Action Send_CC_Available(Q931_DISCONNECT);
+			Next_State CC_STATE_AVAILABLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	State CC_STATE_AVAILABLE {
+		Stimulus CC_EVENT_MSG_RELEASE {
+			Action Stop_T_RETENTION;
+			Action Start_T_RETENTION;
+		}
+		Stimulus CC_EVENT_MSG_RELEASE_COMPLETE {
+			Action Stop_T_RETENTION;
+			Action Start_T_RETENTION;
+		}
+		Stimulus CC_EVENT_CC_REQUEST {
+			Action Pass_Up_CC_Request;
+			Action Stop_T_RETENTION;
+			Next_State CC_STATE_REQUESTED;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_RETENTION {
+			Action Send_EraseCallLinkageID;
+			Action Relese_LinkID;
+			Action Pass_Up_CC_Cancel;
+			Action Stop_T_RETENTION;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_EraseCallLinkageID;
+			Action Relese_LinkID;
+			Action Stop_T_RETENTION;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	State CC_STATE_REQUESTED {
+		Stimulus CC_EVENT_CC_REQUEST_ACCEPT {
+			Action Send_EraseCallLinkageID;
+			Action Relese_LinkID;
+			/* Start T_CCBS2 or T_CCNR2 depending upon CC mode. */
+			Action Start_T_CCBS2;
+			Action Reset_A_Status;
+			Next_State CC_STATE_ACTIVATED;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_EraseCallLinkageID;
+			Action Relese_LinkID;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+/*
+ * Pass_Up_A_Status passes up the current final status of A.
+ * Does nothing if status is invalid.
+ *
+ * Pass_Up_Status_Rsp_A passes up the current accumulated status of A.
+ * Does nothing if status is invalid.
+ *
+ * Pass_Up_Status_Rsp_A_Indirect is the same as Pass_Up_Status_Rsp_A but
+ * sets a timer to expire immediately to pass up the event.
+ * Does nothing if status is invalid.
+ */
+	State CC_STATE_ACTIVATED {
+		Stimulus CC_EVENT_RECALL {
+			Action Send_Error_Recall(ROSE_ERROR_CCBS_NotReadyForCall);
+			Action Set_Call_To_Hangup;
+		}
+		Stimulus CC_EVENT_B_FREE {
+			Action Send_CCBSBFree;
+		}
+		Stimulus CC_EVENT_REMOTE_USER_FREE {
+			Test = Get_A_Status;
+			Test == Invalid {
+				Test = Get_T_CCBS1_Status;
+				Test != Active {
+					Action Reset_Raw_A_Status;
+					Action Send_CCBSStatusRequest;
+					Action Start_T_CCBS1;
+				}
+				Next_State CC_STATE_B_AVAILABLE;
+			}
+			Test == Busy {
+				Action Pass_Up_A_Status;
+				Action Send_CCBSBFree;
+				Test = Get_T_CCBS1_Status;
+				Test != Active {
+					Action Reset_Raw_A_Status;
+					Action Send_CCBSStatusRequest;
+					Action Start_T_CCBS1;
+				}
+				Next_State CC_STATE_SUSPENDED;
+			}
+			Test == Free {
+				//Action Pass_Up_A_Status;
+				Action Send_RemoteUserFree;
+				Action Stop_T_CCBS1;
+				Action Stop_Extended_T_CCBS1;
+				Action Start_T_CCBS3;
+				Next_State CC_STATE_WAIT_CALLBACK;
+			}
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Test = Get_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A_Indirect;
+				Next_State $;
+			}
+			Test != Active {
+				Action Reset_A_Status;
+				Action Reset_Raw_A_Status;
+				Action Send_CCBSStatusRequest;
+				Action Start_T_CCBS1;
+				Action Stop_Extended_T_CCBS1;
+				Action Start_Extended_T_CCBS1;
+				Next_State $;
+			}
+		}
+		Stimulus CC_EVENT_A_FREE {
+			Action Set_Raw_A_Status_Free;
+			Action Promote_A_Status;
+			Action Pass_Up_Status_Rsp_A;
+			Action Stop_T_CCBS1;
+		}
+		Stimulus CC_EVENT_A_BUSY {
+			Action Add_Raw_A_Status_Busy;
+			Action Pass_Up_Status_Rsp_A;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
+			Action Promote_A_Status;
+			Test = Get_A_Status;
+			Test == Invalid {
+				/*
+				 * Did not get any responses.
+				 * User A no longer present.
+				 */
+				Action Send_CCBSErase(Normal_Unspecified);
+				Action Pass_Up_CC_Cancel;
+				Action Stop_T_CCBS1;
+				Action Stop_Extended_T_CCBS1;
+				Action Stop_T_CCBS2;
+				Action Set_Selfdestruct;
+				Next_State CC_STATE_IDLE;
+			}
+		}
+		Stimulus CC_EVENT_TIMEOUT_EXTENDED_T_CCBS1 {
+			Action Reset_A_Status;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS2 {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(T_CCBS2_TIMEOUT);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_LINK_CANCEL {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	State CC_STATE_B_AVAILABLE {
+		/* A status is always invalid on entry. */
+		Stimulus CC_EVENT_RECALL {
+			Action Send_Error_Recall(ROSE_ERROR_CCBS_NotReadyForCall);
+			Action Set_Call_To_Hangup;
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Action Stop_Extended_T_CCBS1;
+			Action Start_Extended_T_CCBS1;
+			Action Pass_Up_Status_Rsp_A_Indirect;
+		}
+		Stimulus CC_EVENT_A_FREE {
+			Action Send_RemoteUserFree;
+			Action Set_Raw_A_Status_Free;
+			//Action Promote_A_Status;
+			//Action Pass_Up_A_Status;
+			Test = Get_Extended_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A;
+			}
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Start_T_CCBS3;
+			Next_State CC_STATE_WAIT_CALLBACK;
+		}
+		Stimulus CC_EVENT_A_BUSY {
+			Action Add_Raw_A_Status_Busy;
+			Test = Get_Extended_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A;
+			}
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
+			Test = Get_Raw_A_Status;
+			Test == Invalid {
+				/*
+				 * Did not get any responses.
+				 * User A no longer present.
+				 */
+				Action Send_CCBSErase(Normal_Unspecified);
+				Action Pass_Up_CC_Cancel;
+				Action Stop_T_CCBS1;
+				Action Stop_Extended_T_CCBS1;
+				Action Stop_T_CCBS2;
+				Action Set_Selfdestruct;
+				Next_State CC_STATE_IDLE;
+			}
+			/* Only received User A is busy. */
+			Action Send_CCBSBFree;
+			Action Promote_A_Status;
+			Action Pass_Up_A_Status;
+			/* Optimization due to flattening. */
+			//Test = Get_T_CCBS1_Status;
+			//Test != Active
+			{
+				Action Reset_Raw_A_Status;
+				Action Send_CCBSStatusRequest;
+				Action Start_T_CCBS1;
+			}
+			Next_State CC_STATE_SUSPENDED;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS2 {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(T_CCBS2_TIMEOUT);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_LINK_CANCEL {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	State CC_STATE_SUSPENDED {
+		Stimulus CC_EVENT_RECALL {
+			Action Send_Error_Recall(ROSE_ERROR_CCBS_NotReadyForCall);
+			Action Set_Call_To_Hangup;
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Action Stop_Extended_T_CCBS1;
+			Action Start_Extended_T_CCBS1;
+			Action Pass_Up_Status_Rsp_A_Indirect;
+		}
+		Stimulus CC_EVENT_A_FREE {
+			Action Set_Raw_A_Status_Free;
+			Action Promote_A_Status;
+			Action Pass_Up_A_Status;
+			Test = Get_Extended_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A;
+			}
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Reset_A_Status;
+			Next_State CC_STATE_ACTIVATED;
+		}
+		Stimulus CC_EVENT_A_BUSY {
+			Action Add_Raw_A_Status_Busy;
+			Test = Get_Extended_T_CCBS1_Status;
+			Test == Active {
+				Action Pass_Up_Status_Rsp_A;
+			}
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
+			Test = Get_Raw_A_Status;
+			Test == Invalid {
+				/*
+				 * Did not get any responses.
+				 * User A no longer present.
+				 */
+				Action Send_CCBSErase(Normal_Unspecified);
+				Action Pass_Up_CC_Cancel;
+				Action Stop_T_CCBS1;
+				Action Stop_Extended_T_CCBS1;
+				Action Stop_T_CCBS2;
+				Action Set_Selfdestruct;
+				Next_State CC_STATE_IDLE;
+			}
+			/* Only received User A is busy. */
+			Action Reset_Raw_A_Status;
+			Action Send_CCBSStatusRequest;
+			Action Start_T_CCBS1;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS2 {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(T_CCBS2_TIMEOUT);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_LINK_CANCEL {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS1;
+			Action Stop_Extended_T_CCBS1;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	State CC_STATE_WAIT_CALLBACK {
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS3 {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(T_CCBS3_TIMEOUT);
+			Action Stop_T_CCBS3;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_STOP_ALERTING {
+			/*
+			 * If an earlier link can send us this event then we
+			 * really should be configured for globalRecall like
+			 * the earlier link.
+			 */
+			Test = Get_Recall_Mode;
+			Test == globalRecall {
+				Action Send_CCBSStopAlerting;
+			}
+			Action Stop_T_CCBS3;
+			Action Reset_A_Status;
+			Next_State CC_STATE_ACTIVATED;
+		}
+		Stimulus CC_EVENT_RECALL {
+			Action Pass_Up_CC_Call;
+			Action Set_Original_Call_Parameters;
+			Test = Get_Recall_Mode;
+			Test == globalRecall {
+				Action Send_CCBSStopAlerting;
+			}
+			Action Stop_T_CCBS3;
+			Next_State CC_STATE_CALLBACK;
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Action Set_Raw_A_Status_Free;
+			Action Pass_Up_Status_Rsp_A_Indirect;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS2 {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(T_CCBS2_TIMEOUT);
+			Action Stop_T_CCBS3;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_LINK_CANCEL {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS3;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS3;
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+	State CC_STATE_CALLBACK {
+		Stimulus CC_EVENT_RECALL {
+			Action Send_Error_Recall(ROSE_ERROR_CCBS_AlreadyAccepted);
+			Action Set_Call_To_Hangup;
+		}
+		Stimulus CC_EVENT_A_STATUS {
+			Action Set_Raw_A_Status_Free;
+			Action Pass_Up_Status_Rsp_A_Indirect;
+		}
+		Stimulus CC_EVENT_TIMEOUT_T_CCBS2 {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(T_CCBS2_TIMEOUT);
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_LINK_CANCEL {
+			Action Pass_Up_CC_Cancel;
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+		Stimulus CC_EVENT_CANCEL {
+			Action Send_CCBSErase(Normal_Unspecified);
+			Action Stop_T_CCBS2;
+			Action Set_Selfdestruct;
+			Next_State CC_STATE_IDLE;
+		}
+	}
+}

Propchange: team/group/ccss/doc/cc_ptmp_agent_flattened.fsm
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: team/group/ccss/doc/cc_ptmp_agent_flattened.fsm
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: team/group/ccss/doc/cc_ptmp_agent_flattened.fsm
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: team/group/ccss/libpri.h
URL: http://svnview.digium.com/svn/libpri/team/group/ccss/libpri.h?view=diff&rev=1386&r1=1385&r2=1386
==============================================================================
--- team/group/ccss/libpri.h (original)
+++ team/group/ccss/libpri.h Mon Dec 14 16:13:46 2009
@@ -521,13 +521,14 @@
 #define PRI_SUBCMD_CC_AVAILABLE				6	/*!< Indicate that CC is available */
 #define PRI_SUBCMD_CC_REQ					7	/*!< CC activation request */
 #define PRI_SUBCMD_CC_REQ_RSP				8	/*!< CC activation request response */
-#define PRI_SUBCMD_CC_REMOTE_USER_FREE		9	/*!< Indicate that CC party B is available */
-#define PRI_SUBCMD_CC_STATUS_REQ			10	/*!< Request/prod to receive updates of CC party A status */
-#define PRI_SUBCMD_CC_STATUS_REQ_RSP		11	/*!< Requested update of CC party A status */
-#define PRI_SUBCMD_CC_STATUS				12	/*!< Unsolicited update of CC party A status */
-#define PRI_SUBCMD_CC_CALL					13	/*!< Indicate that this call is a CC callback */
-#define PRI_SUBCMD_CC_CANCEL				14	/*!< Unsolicited indication that CC is canceled */
-#define PRI_SUBCMD_CC_STOP_ALERTING			15	/*!< Indicate that someone else has responed to remote user free */
+#define PRI_SUBCMD_CC_REMOTE_USER_FREE		9	/*!< Indicate that CC party B is available, party A is considered free. */
+#define PRI_SUBCMD_CC_B_FREE				10	/*!< Indicate that CC party B is available, party A is considered busy. */
+#define PRI_SUBCMD_CC_STATUS_REQ			11	/*!< Request/prod to receive updates of CC party A status */
+#define PRI_SUBCMD_CC_STATUS_REQ_RSP		12	/*!< Requested update of CC party A status */
+#define PRI_SUBCMD_CC_STATUS				13	/*!< Unsolicited update of CC party A status */
+#define PRI_SUBCMD_CC_CALL					14	/*!< Indicate that this call is a CC callback */
+#define PRI_SUBCMD_CC_CANCEL				15	/*!< Unsolicited indication that CC is canceled */
+#define PRI_SUBCMD_CC_STOP_ALERTING			16	/*!< Indicate that someone else has responed to remote user free */
 
 struct pri_subcmd_status_request {
 	/*!
@@ -600,16 +601,6 @@
 	 * \brief TRUE if negotiated to retain CC service if B busy again.
 	 */
 	int retain_service;
-};
-
-struct pri_subcmd_cc_b_free {
-	/*! \brief Call-Completion record id */
-	long cc_id;
-	/*!
-	 * \brief TRUE if Party A is CCBS busy.
-	 * \note PTMP received CCBSBFree message because party A was busy or CCBS busy.
-	 */
-	int busy;
 };
 
 struct pri_subcmd_cc_status {
@@ -638,13 +629,14 @@
 		struct pri_subcmd_cc_id cc_available;
 		struct pri_subcmd_cc_request cc_request;
 		struct pri_subcmd_cc_request_rsp cc_request_rsp;
-		struct pri_subcmd_cc_b_free cc_remote_user_free;
+		struct pri_subcmd_cc_id cc_remote_user_free;
+		struct pri_subcmd_cc_id cc_b_free;
+		struct pri_subcmd_cc_id cc_stop_alerting;
 		struct pri_subcmd_cc_id cc_status_req;
 		struct pri_subcmd_cc_status cc_status_req_rsp;
 		struct pri_subcmd_cc_status cc_status;
 		struct pri_subcmd_cc_id cc_call;
 		struct pri_subcmd_cc_id cc_cancel;
-		struct pri_subcmd_cc_id cc_stop_alerting;
 	} u;
 };
 
@@ -1454,7 +1446,9 @@
 long pri_cc_available(struct pri *ctrl, q931_call *call);
 int pri_cc_req(struct pri *ctrl, long cc_id, int mode);
 int pri_cc_req_rsp(struct pri *ctrl, long cc_id, int status);
-int pri_cc_remote_user_free(struct pri *ctrl, long cc_id, int is_ccbs_busy);
+void pri_cc_remote_user_free(struct pri *ctrl, long cc_id);
+void pri_cc_b_free(struct pri *ctrl, long cc_id);
+void pri_cc_stop_alerting(struct pri *ctrl, long cc_id);
 int pri_cc_status_req(struct pri *ctrl, long cc_id);
 void pri_cc_status_req_rsp(struct pri *ctrl, long cc_id, int status);
 void pri_cc_status(struct pri *ctrl, long cc_id, int status);

Modified: team/group/ccss/pri_cc.c
URL: http://svnview.digium.com/svn/libpri/team/group/ccss/pri_cc.c?view=diff&rev=1386&r1=1385&r2=1386
==============================================================================
--- team/group/ccss/pri_cc.c (original)
+++ team/group/ccss/pri_cc.c Mon Dec 14 16:13:46 2009
@@ -1369,6 +1369,9 @@
 	case CC_EVENT_B_FREE:
 		str = "CC_EVENT_B_FREE";
 		break;
+	case CC_EVENT_STOP_ALERTING:
+		str = "CC_EVENT_STOP_ALERTING";
+		break;
 	case CC_EVENT_A_STATUS:
 		str = "CC_EVENT_A_STATUS";
 		break;
@@ -2378,14 +2381,10 @@
 		pri_cc_act_send_error_recall(ctrl, cc_record, ROSE_ERROR_CCBS_NotReadyForCall);
 		pri_cc_act_set_call_to_hangup(ctrl, call);
 		break;
+	case CC_EVENT_B_FREE:
+		pri_cc_act_send_ccbs_b_free(ctrl, cc_record);
+		break;
 	case CC_EVENT_REMOTE_USER_FREE:
-		if (cc_record->fsm.ptmp.is_ccbs_busy) {
-			pri_cc_act_send_ccbs_b_free(ctrl, cc_record);
-			pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
-			pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
-			cc_record->state = CC_STATE_SUSPENDED;
-			break;
-		}
 		switch (cc_record->fsm.ptmp.party_a_status) {
 		case CC_PARTY_A_AVAILABILITY_INVALID:
 			if (!pri_cc_get_t_ccbs1_status(cc_record)) {
@@ -2507,18 +2506,6 @@
 		pri_cc_act_send_error_recall(ctrl, cc_record, ROSE_ERROR_CCBS_NotReadyForCall);
 		pri_cc_act_set_call_to_hangup(ctrl, call);
 		break;
-	case CC_EVENT_REMOTE_USER_FREE:
-		if (cc_record->fsm.ptmp.is_ccbs_busy) {
-			pri_cc_act_send_ccbs_b_free(ctrl, cc_record);
-			pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
-			if (cc_record->fsm.ptmp.extended_t_ccbs1) {
-				pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
-				pri_cc_act_add_raw_a_status_busy(ctrl, cc_record);
-				pri_cc_act_pass_up_status_rsp_a_indirect(ctrl, cc_record);
-			}
-			cc_record->state = CC_STATE_SUSPENDED;
-		}
-		break;
 	case CC_EVENT_A_STATUS:
 		pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
 		pri_cc_act_start_extended_t_ccbs1(ctrl, cc_record);
@@ -2562,9 +2549,13 @@
 		pri_cc_act_send_ccbs_b_free(ctrl, cc_record);
 		pri_cc_act_promote_a_status(ctrl, cc_record);
 		pri_cc_act_pass_up_a_status(ctrl, cc_record);
-		pri_cc_act_reset_raw_a_status(ctrl, cc_record);
-		pri_cc_act_send_ccbs_status_request(ctrl, cc_record);
-		//pri_cc_act_start_t_ccbs1(ctrl, cc_record);
+		/* Optimization due to flattening. */
+		//if (!pri_cc_get_t_ccbs1_status(cc_record))
+		{
+			pri_cc_act_reset_raw_a_status(ctrl, cc_record);
+			pri_cc_act_send_ccbs_status_request(ctrl, cc_record);
+			//pri_cc_act_start_t_ccbs1(ctrl, cc_record);
+		}
 		cc_record->state = CC_STATE_SUSPENDED;
 		break;
 	case CC_EVENT_TIMEOUT_T_CCBS2:
@@ -2616,30 +2607,9 @@
 		pri_cc_act_send_error_recall(ctrl, cc_record, ROSE_ERROR_CCBS_NotReadyForCall);
 		pri_cc_act_set_call_to_hangup(ctrl, call);
 		break;
-	case CC_EVENT_REMOTE_USER_FREE:
-		if (cc_record->fsm.ptmp.is_ccbs_busy) {
-			pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
-			if (cc_record->fsm.ptmp.extended_t_ccbs1) {
-				pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
-				pri_cc_act_add_raw_a_status_busy(ctrl, cc_record);
-				pri_cc_act_pass_up_status_rsp_a_indirect(ctrl, cc_record);
-			}
-		} else {
-			if (!pri_cc_get_t_ccbs1_status(cc_record)) {
-				pri_cc_act_reset_raw_a_status(ctrl, cc_record);
-				pri_cc_act_send_ccbs_status_request(ctrl, cc_record);
-				//pri_cc_act_start_t_ccbs1(ctrl, cc_record);
-			}
-		}
-		break;
 	case CC_EVENT_A_STATUS:
-		/* Upper layer should not send when CCBS busy. */
-		if (cc_record->fsm.ptmp.is_ccbs_busy) {
-			pri_cc_act_add_raw_a_status_busy(ctrl, cc_record);
-		} else {
-			pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
-			pri_cc_act_start_extended_t_ccbs1(ctrl, cc_record);
-		}
+		pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
+		pri_cc_act_start_extended_t_ccbs1(ctrl, cc_record);
 		pri_cc_act_pass_up_status_rsp_a_indirect(ctrl, cc_record);
 		break;
 	case CC_EVENT_A_FREE:
@@ -2732,6 +2702,19 @@
 		pri_cc_act_stop_t_ccbs2(ctrl, cc_record);
 		pri_cc_act_set_self_destruct(ctrl, cc_record);
 		cc_record->state = CC_STATE_IDLE;
+		break;
+	case CC_EVENT_STOP_ALERTING:
+		/*
+		 * If an earlier link can send us this event then we
+		 * really should be configured for globalRecall like
+		 * the earlier link.
+		 */
+		if (cc_record->option.recall_mode == 0 /* globalRecall */) {
+			pri_cc_act_send_ccbs_stop_alerting(ctrl, cc_record);
+		}
+		pri_cc_act_stop_t_ccbs3(ctrl, cc_record);
+		pri_cc_act_reset_a_status(ctrl, cc_record);
+		cc_record->state = CC_STATE_ACTIVATED;
 		break;
 	case CC_EVENT_RECALL:
 		pri_cc_act_pass_up_cc_call(ctrl, cc_record);
@@ -3277,46 +3260,70 @@
 
 /*!
  * \brief Indicate that the remote user (Party B) is free to call.
+ * The upper layer considers Party A is free.
  *
  * \param ctrl D channel controller.
  * \param cc_id CC record ID to activate.
- * \param is_ccbs_busy TRUE if the span does not have any B channels
- * available for a recall call.
- *
- * \retval TRUE if is_ccbs_busy is used in the current CC mode.
- *
- * \note
- * If returned TRUE then this call must be called again when a B channel
- * becomes available.
- */
-int pri_cc_remote_user_free(struct pri *ctrl, long cc_id, int is_ccbs_busy)
-{
-	int is_ccbs_busy_used;
+ *
+ * \return Nothing
+ */
+void pri_cc_remote_user_free(struct pri *ctrl, long cc_id)
+{
 	struct pri_cc_record *cc_record;
 
 	cc_record = pri_cc_find_by_id(ctrl, cc_id);
 	if (!cc_record) {
-		return 0;
-	}
-
-	is_ccbs_busy_used = 0;
-	switch (ctrl->switchtype) {
-	case PRI_SWITCH_QSIG:
-		/*! \todo BUGBUG pri_cc_remote_user_free(Q.SIG) not written */
-		break;
-	case PRI_SWITCH_EUROISDN_E1:
-	case PRI_SWITCH_EUROISDN_T1:
-		if (q931_is_ptmp(ctrl)) {
-			cc_record->fsm.ptmp.is_ccbs_busy = is_ccbs_busy ? 1 : 0;
-			is_ccbs_busy_used = 1;
-		}
-		pri_cc_event(ctrl, cc_record->signaling, cc_record, CC_EVENT_REMOTE_USER_FREE);
-		break;
-	default:
-		break;
-	}
-
-	return is_ccbs_busy_used;
+		return;
+	}
+
+	pri_cc_event(ctrl, cc_record->signaling, cc_record, CC_EVENT_REMOTE_USER_FREE);
+}
+
+/*!
+ * \brief Indicate that the remote user (Party B) is free to call.
+ * However, the upper layer considers Party A is busy.
+ *
+ * \details
+ * Party B is free, but Party A is considered busy for some reason.
+ * This is mainly due to the upper layer experiencing congestion.
+ * The upper layer will be monitoring Party A until it considers
+ * Party A free again.
+ *
+ * \param ctrl D channel controller.
+ * \param cc_id CC record ID to activate.
+ *
+ * \return Nothing
+ */
+void pri_cc_b_free(struct pri *ctrl, long cc_id)
+{
+	struct pri_cc_record *cc_record;
+
+	cc_record = pri_cc_find_by_id(ctrl, cc_id);
+	if (!cc_record) {
+		return;
+	}
+
+	pri_cc_event(ctrl, cc_record->signaling, cc_record, CC_EVENT_B_FREE);
+}
+
+/*!
+ * \brief Indicate that some other Party A has responed to the CC recall.
+ *
+ * \param ctrl D channel controller.
+ * \param cc_id CC record ID to activate.
+ *
+ * \return Nothing
+ */
+void pri_cc_stop_alerting(struct pri *ctrl, long cc_id)
+{
+	struct pri_cc_record *cc_record;
+
+	cc_record = pri_cc_find_by_id(ctrl, cc_id);
+	if (!cc_record) {
+		return;
+	}
+
+	pri_cc_event(ctrl, cc_record->signaling, cc_record, CC_EVENT_STOP_ALERTING);
 }
 
 /*!

Modified: team/group/ccss/pri_internal.h
URL: http://svnview.digium.com/svn/libpri/team/group/ccss/pri_internal.h?view=diff&rev=1386&r1=1385&r2=1386
==============================================================================
--- team/group/ccss/pri_internal.h (original)
+++ team/group/ccss/pri_internal.h Mon Dec 14 16:13:46 2009
@@ -652,10 +652,12 @@
 	CC_EVENT_CC_REQUEST_ACCEPT,
 	/*! Requesting CC activation failed (error/reject received). */
 	CC_EVENT_CC_REQUEST_FAIL,
-	/*! CC party B is available. */
+	/*! CC party B is available, party A is considered free. */
 	CC_EVENT_REMOTE_USER_FREE,
 	/*! CC party B is available, party A is busy or CCBS busy. */
 	CC_EVENT_B_FREE,
+	/*! Someone else responded to the CC recall. */
+	CC_EVENT_STOP_ALERTING,
 	/*! CC poll/prompt for party A status. */
 	CC_EVENT_A_STATUS,
 	/*! CC party A is free/available for recall. */
@@ -750,8 +752,6 @@
 			enum CC_PARTY_A_AVAILABILITY party_a_status_acc;
 			/*! Party A availability status */
 			enum CC_PARTY_A_AVAILABILITY party_a_status;
-			/*! TRUE if no B channels available for recall call. */
-			unsigned char is_ccbs_busy;
 		} ptmp;
 		/*! PTP FSM parameters. */
 		struct {




More information about the libpri-commits mailing list