mncc: Send "Dest OOO" cause in case of a link radio failure.
Previously we were sending a generic "Resource unavailable" cause code making it impossible to distinguish real error cases from a regular radio link failure. This was the reason for many "unknown" call errors we've seen at Rhizomatica installations. Now they are properly classified as non-erroneous call failures.
This commit is contained in:
parent
e98086dad5
commit
45450b9214
|
@ -70,6 +70,7 @@ struct gsm_trans *trans_alloc(struct gsm_network *net,
|
||||||
struct gsm_subscriber *subscr,
|
struct gsm_subscriber *subscr,
|
||||||
uint8_t protocol, uint8_t trans_id,
|
uint8_t protocol, uint8_t trans_id,
|
||||||
uint32_t callref);
|
uint32_t callref);
|
||||||
|
void trans_free_cause(struct gsm_trans *trans, int gsm0808_cause);
|
||||||
void trans_free(struct gsm_trans *trans);
|
void trans_free(struct gsm_trans *trans);
|
||||||
|
|
||||||
int trans_assign_trans_id(struct gsm_network *net, struct gsm_subscriber *subscr,
|
int trans_assign_trans_id(struct gsm_network *net, struct gsm_subscriber *subscr,
|
||||||
|
|
|
@ -816,7 +816,7 @@ static void handle_release(struct gsm_subscriber_connection *conn,
|
||||||
|
|
||||||
/* clear the connection now */
|
/* clear the connection now */
|
||||||
if (bsc->clear_request)
|
if (bsc->clear_request)
|
||||||
destruct = bsc->clear_request(conn, 0);
|
destruct = bsc->clear_request(conn, GSM0808_CAUSE_RADIO_INTERFACE_FAILURE);
|
||||||
|
|
||||||
/* now give up all channels */
|
/* now give up all channels */
|
||||||
if (conn->lchan == lchan)
|
if (conn->lchan == lchan)
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
|
|
||||||
#include <osmocom/gsm/gsm48.h>
|
#include <osmocom/gsm/gsm48.h>
|
||||||
#include <osmocom/gsm/gsm0480.h>
|
#include <osmocom/gsm/gsm0480.h>
|
||||||
|
#include <osmocom/gsm/protocol/gsm_08_08.h>
|
||||||
#include <osmocom/gsm/gsm_utils.h>
|
#include <osmocom/gsm/gsm_utils.h>
|
||||||
#include <osmocom/core/msgb.h>
|
#include <osmocom/core/msgb.h>
|
||||||
#include <osmocom/core/talloc.h>
|
#include <osmocom/core/talloc.h>
|
||||||
|
@ -407,7 +408,7 @@ void gsm0408_clear_request(struct gsm_subscriber_connection *conn, uint32_t caus
|
||||||
restart:
|
restart:
|
||||||
llist_for_each_entry_safe(trans, temp, &conn->bts->network->trans_list, entry) {
|
llist_for_each_entry_safe(trans, temp, &conn->bts->network->trans_list, entry) {
|
||||||
if (trans->conn == conn) {
|
if (trans->conn == conn) {
|
||||||
trans_free(trans);
|
trans_free_cause(trans, cause);
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1396,16 +1397,21 @@ int mncc_release_ind(struct gsm_network *net, struct gsm_trans *trans,
|
||||||
|
|
||||||
/* Call Control Specific transaction release.
|
/* Call Control Specific transaction release.
|
||||||
* gets called by trans_free, DO NOT CALL YOURSELF! */
|
* gets called by trans_free, DO NOT CALL YOURSELF! */
|
||||||
void _gsm48_cc_trans_free(struct gsm_trans *trans)
|
void _gsm48_cc_trans_free(struct gsm_trans *trans, int gsm0808_cause)
|
||||||
{
|
{
|
||||||
gsm48_stop_cc_timer(trans);
|
gsm48_stop_cc_timer(trans);
|
||||||
|
|
||||||
/* send release to L4, if callref still exists */
|
/* send release to L4, if callref still exists */
|
||||||
if (trans->callref) {
|
if (trans->callref) {
|
||||||
/* Ressource unavailable */
|
/* Release CC connection */
|
||||||
|
int cc_cause = GSM48_CC_CAUSE_RESOURCE_UNAVAIL;
|
||||||
|
if (gsm0808_cause == GSM0808_CAUSE_RADIO_INTERFACE_FAILURE)
|
||||||
|
{
|
||||||
|
cc_cause = GSM48_CC_CAUSE_DEST_OOO;
|
||||||
|
}
|
||||||
mncc_release_ind(trans->net, trans, trans->callref,
|
mncc_release_ind(trans->net, trans, trans->callref,
|
||||||
GSM48_CAUSE_LOC_PRN_S_LU,
|
GSM48_CAUSE_LOC_PRN_S_LU,
|
||||||
GSM48_CC_CAUSE_RESOURCE_UNAVAIL);
|
cc_cause);
|
||||||
}
|
}
|
||||||
if (trans->cc.state != GSM_CSTATE_NULL)
|
if (trans->cc.state != GSM_CSTATE_NULL)
|
||||||
new_cc_state(trans, GSM_CSTATE_NULL);
|
new_cc_state(trans, GSM_CSTATE_NULL);
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
void *tall_trans_ctx;
|
void *tall_trans_ctx;
|
||||||
|
|
||||||
void _gsm48_cc_trans_free(struct gsm_trans *trans);
|
void _gsm48_cc_trans_free(struct gsm_trans *trans, int gsm0808_cause);
|
||||||
|
|
||||||
struct gsm_trans *trans_find_by_id(struct gsm_subscriber_connection *conn,
|
struct gsm_trans *trans_find_by_id(struct gsm_subscriber_connection *conn,
|
||||||
uint8_t proto, uint8_t trans_id)
|
uint8_t proto, uint8_t trans_id)
|
||||||
|
@ -88,10 +88,15 @@ struct gsm_trans *trans_alloc(struct gsm_network *net,
|
||||||
}
|
}
|
||||||
|
|
||||||
void trans_free(struct gsm_trans *trans)
|
void trans_free(struct gsm_trans *trans)
|
||||||
|
{
|
||||||
|
trans_free_cause(trans, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void trans_free_cause(struct gsm_trans *trans, int gsm0808_cause)
|
||||||
{
|
{
|
||||||
switch (trans->protocol) {
|
switch (trans->protocol) {
|
||||||
case GSM48_PDISC_CC:
|
case GSM48_PDISC_CC:
|
||||||
_gsm48_cc_trans_free(trans);
|
_gsm48_cc_trans_free(trans, gsm0808_cause);
|
||||||
break;
|
break;
|
||||||
case GSM48_PDISC_SMS:
|
case GSM48_PDISC_SMS:
|
||||||
_gsm411_sms_trans_free(trans);
|
_gsm411_sms_trans_free(trans);
|
||||||
|
|
Reference in New Issue