[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