[svn-commits] rmudgett: branch group/ccss r1434 - in /team/group/ccss: ./ doc/
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Jan 20 14:02:50 CST 2010
Author: rmudgett
Date: Wed Jan 20 14:02:48 2010
New Revision: 1434
URL: http://svnview.digium.com/svn/libpri?view=rev&rev=1434
Log:
Make PTMP agent be more tollerant of no response to CCBSStatusRequest.
Do not cancel CC if we simply get no responses to a CCBSStatusRequest. We
will cancel if we do not get any responses for RAW_STATUS_COUNT_MAX times.
Modified:
team/group/ccss/doc/cc_ptmp_agent.fsm
team/group/ccss/doc/cc_ptmp_agent_flattened.fsm
team/group/ccss/pri_cc.c
team/group/ccss/pri_internal.h
Modified: team/group/ccss/doc/cc_ptmp_agent.fsm
URL: http://svnview.digium.com/svn/libpri/team/group/ccss/doc/cc_ptmp_agent.fsm?view=diff&rev=1434&r1=1433&r2=1434
==============================================================================
--- team/group/ccss/doc/cc_ptmp_agent.fsm (original)
+++ team/group/ccss/doc/cc_ptmp_agent.fsm Wed Jan 20 14:02:48 2010
@@ -87,6 +87,7 @@
State CC_STATE_ACTIVATED {
Prolog {
Action Reset_A_Status;
+ Action Raw_Status_Count_Reset;
}
Stimulus CC_EVENT_RECALL {
Action Send_Error_Recall(ROSE_ERROR_CCBS_NotReadyForCall);
@@ -128,6 +129,7 @@
}
}
Stimulus CC_EVENT_A_FREE {
+ Action Raw_Status_Count_Reset;
Action Set_Raw_A_Status_Free;
Action Promote_Raw_A_Status;
Action Pass_Up_Status_Rsp_A;
@@ -140,18 +142,25 @@
Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
Action Promote_Raw_A_Status;
Test = Get_A_Status;
+ Test != Invalid {
+ /* Only received User A busy. */
+ Action Raw_Status_Count_Reset;
+ }
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;
+ /* Did not get any responses. */
+ Action Raw_Status_Count_Increment;
+ Test = Get_Raw_Status_Count;
+ Test >= RAW_STATUS_COUNT_MAX {
+ /* 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;
+ Action Raw_Status_Count_Reset;
}
}
State CC_STATE_B_AVAILABLE {
@@ -193,20 +202,28 @@
}
Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
Test = Get_Raw_A_Status;
+ Test != Invalid {
+ /* Only received User A is busy. */
+ Action Raw_Status_Count_Reset;
+ Action Send_CCBSBFree;
+ Action Promote_Raw_A_Status;
+ Action Pass_Up_A_Status;
+ Next_State CC_STATE_SUSPENDED;
+ }
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_Raw_A_Status;
- Action Pass_Up_A_Status;
- Next_State CC_STATE_SUSPENDED;
+ /* Did not get any responses. */
+ Action Raw_Status_Count_Increment;
+ Test = Get_Raw_Status_Count;
+ Test >= RAW_STATUS_COUNT_MAX {
+ /* User A no longer present. */
+ Action Send_CCBSErase(Normal_Unspecified);
+ Action Pass_Up_CC_Cancel;
+ Next_State CC_STATE_IDLE;
+ }
+ //Action Reset_Raw_A_Status;
+ Action Send_CCBSStatusRequest;
+ Action Start_T_CCBS1;
+ }
}
}
State CC_STATE_SUSPENDED {
@@ -248,16 +265,21 @@
}
Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
Test = Get_Raw_A_Status;
+ Test != Invalid {
+ /* Only received User A is busy. */
+ Action Raw_Status_Count_Reset;
+ }
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. */
+ /* Did not get any responses. */
+ Action Raw_Status_Count_Increment;
+ Test = Get_Raw_Status_Count;
+ Test >= RAW_STATUS_COUNT_MAX {
+ /* User A no longer present. */
+ Action Send_CCBSErase(Normal_Unspecified);
+ Action Pass_Up_CC_Cancel;
+ Next_State CC_STATE_IDLE;
+ }
+ }
Action Reset_Raw_A_Status;
Action Send_CCBSStatusRequest;
Action Start_T_CCBS1;
Modified: 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=diff&rev=1434&r1=1433&r2=1434
==============================================================================
--- team/group/ccss/doc/cc_ptmp_agent_flattened.fsm (original)
+++ team/group/ccss/doc/cc_ptmp_agent_flattened.fsm Wed Jan 20 14:02:48 2010
@@ -62,6 +62,7 @@
/* Start T_CCBS2 or T_CCNR2 depending upon CC mode. */
Action Start_T_SUPERVISION;
Action Reset_A_Status;
+ Action Raw_Status_Count_Reset;
Next_State CC_STATE_ACTIVATED;
}
Stimulus CC_EVENT_CANCEL {
@@ -143,6 +144,7 @@
}
}
Stimulus CC_EVENT_A_FREE {
+ Action Raw_Status_Count_Reset;
Action Set_Raw_A_Status_Free;
Action Promote_Raw_A_Status;
Action Pass_Up_Status_Rsp_A;
@@ -155,22 +157,29 @@
Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
Action Promote_Raw_A_Status;
Test = Get_A_Status;
+ Test != Invalid {
+ /* Only received User A busy. */
+ Action Raw_Status_Count_Reset;
+ }
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_SUPERVISION;
- Action Set_Selfdestruct;
- Next_State CC_STATE_IDLE;
+ /* Did not get any responses. */
+ Action Raw_Status_Count_Increment;
+ Test = Get_Raw_Status_Count;
+ Test >= RAW_STATUS_COUNT_MAX {
+ /* 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_SUPERVISION;
+ Action Set_Selfdestruct;
+ Next_State CC_STATE_IDLE;
+ }
}
}
Stimulus CC_EVENT_TIMEOUT_EXTENDED_T_CCBS1 {
Action Reset_A_Status;
+ Action Raw_Status_Count_Reset;
}
Stimulus CC_EVENT_TIMEOUT_T_SUPERVISION {
Action Pass_Up_CC_Cancel;
@@ -234,32 +243,40 @@
}
Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
Test = Get_Raw_A_Status;
+ Test != Invalid {
+ /* Only received User A is busy. */
+ Action Raw_Status_Count_Reset;
+ Action Send_CCBSBFree;
+ Action Promote_Raw_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;
+ }
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_SUPERVISION;
- Action Set_Selfdestruct;
- Next_State CC_STATE_IDLE;
- }
- /* Only received User A is busy. */
- Action Send_CCBSBFree;
- Action Promote_Raw_A_Status;
- Action Pass_Up_A_Status;
- /* Optimization due to flattening. */
- //Test = Get_T_CCBS1_Status;
- //Test != Active
- {
- Action Reset_Raw_A_Status;
+ /* Did not get any responses. */
+ Action Raw_Status_Count_Increment;
+ Test = Get_Raw_Status_Count;
+ Test >= RAW_STATUS_COUNT_MAX {
+ /* 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_SUPERVISION;
+ Action Set_Selfdestruct;
+ Next_State CC_STATE_IDLE;
+ }
+ //Action Reset_Raw_A_Status;
Action Send_CCBSStatusRequest;
Action Start_T_CCBS1;
}
- Next_State CC_STATE_SUSPENDED;
}
Stimulus CC_EVENT_TIMEOUT_T_SUPERVISION {
Action Pass_Up_CC_Cancel;
@@ -309,6 +326,7 @@
Action Stop_T_CCBS1;
Action Stop_Extended_T_CCBS1;
Action Reset_A_Status;
+ Action Raw_Status_Count_Reset;
Next_State CC_STATE_ACTIVATED;
}
Stimulus CC_EVENT_A_BUSY {
@@ -320,20 +338,25 @@
}
Stimulus CC_EVENT_TIMEOUT_T_CCBS1 {
Test = Get_Raw_A_Status;
+ Test != Invalid {
+ /* Only received User A is busy. */
+ Action Raw_Status_Count_Reset;
+ }
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_SUPERVISION;
- Action Set_Selfdestruct;
- Next_State CC_STATE_IDLE;
- }
- /* Only received User A is busy. */
+ /* Did not get any responses. */
+ Action Raw_Status_Count_Increment;
+ Test = Get_Raw_Status_Count;
+ Test >= RAW_STATUS_COUNT_MAX {
+ /* 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_SUPERVISION;
+ Action Set_Selfdestruct;
+ Next_State CC_STATE_IDLE;
+ }
+ }
Action Reset_Raw_A_Status;
Action Send_CCBSStatusRequest;
Action Start_T_CCBS1;
@@ -386,6 +409,7 @@
}
Action Stop_T_RECALL;
Action Reset_A_Status;
+ Action Raw_Status_Count_Reset;
Next_State CC_STATE_ACTIVATED;
}
Stimulus CC_EVENT_RECALL {
Modified: team/group/ccss/pri_cc.c
URL: http://svnview.digium.com/svn/libpri/team/group/ccss/pri_cc.c?view=diff&rev=1434&r1=1433&r2=1434
==============================================================================
--- team/group/ccss/pri_cc.c (original)
+++ team/group/ccss/pri_cc.c Wed Jan 20 14:02:48 2010
@@ -43,6 +43,8 @@
//#define CC_SANITY_CHECKS 1
#define CC_SANITY_CHECKS 1// BUGBUG
+/*! Maximum times CCBSStatusRequest can have no response before canceling CC. */
+#define RAW_STATUS_COUNT_MAX 3
/* ------------------------------------------------------------------- */
@@ -3597,6 +3599,36 @@
/*!
* \internal
+ * \brief FSM action to reset the raw A status request no response count.
+ *
+ * \param ctrl D channel controller.
+ * \param cc_record Call completion record to process event.
+ *
+ * \return Nothing
+ */
+static void pri_cc_act_raw_status_count_reset(struct pri *ctrl, struct pri_cc_record *cc_record)
+{
+ PRI_CC_ACT_DEBUG_OUTPUT(ctrl, cc_record->record_id);
+ cc_record->fsm.ptmp.party_a_status_count = 0;
+}
+
+/*!
+ * \internal
+ * \brief FSM action to increment the raw A status request no response count.
+ *
+ * \param ctrl D channel controller.
+ * \param cc_record Call completion record to process event.
+ *
+ * \return Nothing
+ */
+static void pri_cc_act_raw_status_count_increment(struct pri *ctrl, struct pri_cc_record *cc_record)
+{
+ PRI_CC_ACT_DEBUG_OUTPUT(ctrl, cc_record->record_id);
+ ++cc_record->fsm.ptmp.party_a_status_count;
+}
+
+/*!
+ * \internal
* \brief FSM action to reset raw A status.
*
* \param ctrl D channel controller.
@@ -4367,6 +4399,7 @@
pri_cc_act_release_link_id(ctrl, cc_record);
pri_cc_act_start_t_supervision(ctrl, cc_record);
pri_cc_act_reset_a_status(ctrl, cc_record);
+ pri_cc_act_raw_status_count_reset(ctrl, cc_record);
cc_record->state = CC_STATE_ACTIVATED;
break;
case CC_EVENT_CANCEL:
@@ -4446,6 +4479,7 @@
}
break;
case CC_EVENT_A_FREE:
+ pri_cc_act_raw_status_count_reset(ctrl, cc_record);
pri_cc_act_set_raw_a_status_free(ctrl, cc_record);
pri_cc_act_promote_raw_a_status(ctrl, cc_record);
pri_cc_act_pass_up_a_status(ctrl, cc_record);
@@ -4457,22 +4491,27 @@
break;
case CC_EVENT_TIMEOUT_T_CCBS1:
pri_cc_act_promote_raw_a_status(ctrl, cc_record);
- if (cc_record->party_a_status == CC_PARTY_A_AVAILABILITY_INVALID) {
- /*
- * Did not get any responses.
- * User A no longer present.
- */
- pri_cc_act_send_ccbs_erase(ctrl, cc_record, 0 /* normal-unspecified */);
- pri_cc_act_pass_up_cc_cancel(ctrl, cc_record);
- pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
- pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
- pri_cc_act_stop_t_supervision(ctrl, cc_record);
- pri_cc_act_set_self_destruct(ctrl, cc_record);
- cc_record->state = CC_STATE_IDLE;
+ if (cc_record->party_a_status != CC_PARTY_A_AVAILABILITY_INVALID) {
+ /* Only received User A busy. */
+ pri_cc_act_raw_status_count_reset(ctrl, cc_record);
+ } else {
+ /* Did not get any responses. */
+ pri_cc_act_raw_status_count_increment(ctrl, cc_record);
+ if (cc_record->fsm.ptmp.party_a_status_count >= RAW_STATUS_COUNT_MAX) {
+ /* User A no longer present. */
+ pri_cc_act_send_ccbs_erase(ctrl, cc_record, 0 /* normal-unspecified */);
+ pri_cc_act_pass_up_cc_cancel(ctrl, cc_record);
+ pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
+ pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
+ pri_cc_act_stop_t_supervision(ctrl, cc_record);
+ pri_cc_act_set_self_destruct(ctrl, cc_record);
+ cc_record->state = CC_STATE_IDLE;
+ }
}
break;
case CC_EVENT_TIMEOUT_EXTENDED_T_CCBS1:
pri_cc_act_reset_a_status(ctrl, cc_record);
+ pri_cc_act_raw_status_count_reset(ctrl, cc_record);
break;
case CC_EVENT_TIMEOUT_T_SUPERVISION:
pri_cc_act_pass_up_cc_cancel(ctrl, cc_record);
@@ -4548,32 +4587,38 @@
}
break;
case CC_EVENT_TIMEOUT_T_CCBS1:
- if (cc_record->fsm.ptmp.party_a_status_acc == CC_PARTY_A_AVAILABILITY_INVALID) {
- /*
- * Did not get any responses.
- * User A no longer present.
- */
- pri_cc_act_send_ccbs_erase(ctrl, cc_record, 0 /* normal-unspecified */);
- pri_cc_act_pass_up_cc_cancel(ctrl, cc_record);
- pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
- pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
- pri_cc_act_stop_t_supervision(ctrl, cc_record);
- pri_cc_act_set_self_destruct(ctrl, cc_record);
- cc_record->state = CC_STATE_IDLE;
- break;
- }
- /* Only received User A busy. */
- pri_cc_act_send_ccbs_b_free(ctrl, cc_record);
- pri_cc_act_promote_raw_a_status(ctrl, cc_record);
- pri_cc_act_pass_up_a_status(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);
+ if (cc_record->fsm.ptmp.party_a_status_acc != CC_PARTY_A_AVAILABILITY_INVALID) {
+ /* Only received User A busy. */
+ pri_cc_act_raw_status_count_reset(ctrl, cc_record);
+ pri_cc_act_send_ccbs_b_free(ctrl, cc_record);
+ pri_cc_act_promote_raw_a_status(ctrl, cc_record);
+ pri_cc_act_pass_up_a_status(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;
+ } else {
+ /* Did not get any responses. */
+ pri_cc_act_raw_status_count_increment(ctrl, cc_record);
+ if (cc_record->fsm.ptmp.party_a_status_count >= RAW_STATUS_COUNT_MAX) {
+ /* User A no longer present. */
+ pri_cc_act_send_ccbs_erase(ctrl, cc_record, 0 /* normal-unspecified */);
+ pri_cc_act_pass_up_cc_cancel(ctrl, cc_record);
+ pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
+ pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
+ pri_cc_act_stop_t_supervision(ctrl, cc_record);
+ pri_cc_act_set_self_destruct(ctrl, cc_record);
+ cc_record->state = CC_STATE_IDLE;
+ break;
+ }
+ //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_SUPERVISION:
pri_cc_act_pass_up_cc_cancel(ctrl, cc_record);
@@ -4639,6 +4684,7 @@
pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
pri_cc_act_reset_a_status(ctrl, cc_record);
+ pri_cc_act_raw_status_count_reset(ctrl, cc_record);
cc_record->state = CC_STATE_ACTIVATED;
break;
case CC_EVENT_A_BUSY:
@@ -4648,21 +4694,24 @@
}
break;
case CC_EVENT_TIMEOUT_T_CCBS1:
- if (cc_record->fsm.ptmp.party_a_status_acc == CC_PARTY_A_AVAILABILITY_INVALID) {
- /*
- * Did not get any responses.
- * User A no longer present.
- */
- pri_cc_act_send_ccbs_erase(ctrl, cc_record, 0 /* normal-unspecified */);
- pri_cc_act_pass_up_cc_cancel(ctrl, cc_record);
- pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
- pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
- pri_cc_act_stop_t_supervision(ctrl, cc_record);
- pri_cc_act_set_self_destruct(ctrl, cc_record);
- cc_record->state = CC_STATE_IDLE;
- break;
+ if (cc_record->fsm.ptmp.party_a_status_acc != CC_PARTY_A_AVAILABILITY_INVALID) {
+ /* Only received User A busy. */
+ pri_cc_act_raw_status_count_reset(ctrl, cc_record);
+ } else {
+ /* Did not get any responses. */
+ pri_cc_act_raw_status_count_increment(ctrl, cc_record);
+ if (cc_record->fsm.ptmp.party_a_status_count >= RAW_STATUS_COUNT_MAX) {
+ /* User A no longer present. */
+ pri_cc_act_send_ccbs_erase(ctrl, cc_record, 0 /* normal-unspecified */);
+ pri_cc_act_pass_up_cc_cancel(ctrl, cc_record);
+ pri_cc_act_stop_t_ccbs1(ctrl, cc_record);
+ pri_cc_act_stop_extended_t_ccbs1(ctrl, cc_record);
+ pri_cc_act_stop_t_supervision(ctrl, cc_record);
+ pri_cc_act_set_self_destruct(ctrl, cc_record);
+ cc_record->state = CC_STATE_IDLE;
+ break;
+ }
}
- /* Only received User A busy. */
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);
@@ -4731,6 +4780,7 @@
}
pri_cc_act_stop_t_recall(ctrl, cc_record);
pri_cc_act_reset_a_status(ctrl, cc_record);
+ pri_cc_act_raw_status_count_reset(ctrl, cc_record);
cc_record->state = CC_STATE_ACTIVATED;
break;
case CC_EVENT_RECALL:
Modified: team/group/ccss/pri_internal.h
URL: http://svnview.digium.com/svn/libpri/team/group/ccss/pri_internal.h?view=diff&rev=1434&r1=1433&r2=1434
==============================================================================
--- team/group/ccss/pri_internal.h (original)
+++ team/group/ccss/pri_internal.h Wed Jan 20 14:02:48 2010
@@ -774,6 +774,8 @@
int extended_t_ccbs1;
/*! Invoke id for the CCBSStatusRequest message to find if T_CCBS1 still running. */
int t_ccbs1_invoke_id;
+ /*! Number of times party A status request got no responses. */
+ int party_a_status_count;
/*! Accumulating party A availability status */
enum CC_PARTY_A_AVAILABILITY party_a_status_acc;
} ptmp;
More information about the svn-commits
mailing list