lchan: Introduce a BROKEN state for the lchan

If the CHAN ACTIV is NACKED we set the state backto NONE. This is
problematic as our channel allocator will allocate from the front
or from the back and if the channel is early in the list it might
cause permanent failures. Introduce a BROKEN state and use it when
the channel activation is failing for an unknown reason. Copy the
cause so it can be inspected later.
This commit is contained in:
Holger Hans Peter Freyther 2012-12-06 19:25:06 +01:00
parent 9d50a27695
commit 638da51a78
3 changed files with 6 additions and 4 deletions

View File

@ -120,6 +120,7 @@ enum gsm_lchan_state {
LCHAN_S_ACTIVE, /* channel is active and operational */
LCHAN_S_REL_REQ, /* channel release has been requested */
LCHAN_S_REL_ERR, /* channel is in an error state */
LCHAN_S_BROKEN, /* channel is somehow unusable */
LCHAN_S_INACTIVE, /* channel is set inactive */
};
@ -219,6 +220,7 @@ struct gsm_lchan {
struct osmo_timer_list T3111;
struct osmo_timer_list error_timer;
struct osmo_timer_list act_timer;
uint8_t error_cause;
/* table of neighbor cell measurements */
struct neigh_meas_proc neigh_meas[MAX_NEIGH_MEAS];

View File

@ -935,19 +935,18 @@ static int rsl_rx_chan_act_nack(struct msgb *msg)
const uint8_t *cause = TLVP_VAL(&tp, RSL_IE_CAUSE);
print_rsl_cause(LOGL_ERROR, cause,
TLVP_LEN(&tp, RSL_IE_CAUSE));
msg->lchan->error_cause = *cause;
if (*cause != RSL_ERR_RCH_ALR_ACTV_ALLOC)
rsl_lchan_set_state(msg->lchan, LCHAN_S_NONE);
rsl_lchan_set_state(msg->lchan, LCHAN_S_BROKEN);
else
rsl_rf_chan_release(msg->lchan, 1);
} else
rsl_lchan_set_state(msg->lchan, LCHAN_S_NONE);
rsl_lchan_set_state(msg->lchan, LCHAN_S_BROKEN);
LOGPC(DRSL, LOGL_ERROR, "\n");
send_lchan_signal(S_LCHAN_ACTIVATE_NACK, msg->lchan, NULL);
lchan_free(msg->lchan);
return 0;
}

View File

@ -109,6 +109,7 @@ static const struct value_string lchan_s_names[] = {
{ LCHAN_S_INACTIVE, "INACTIVE" },
{ LCHAN_S_REL_REQ, "RELEASE REQUESTED" },
{ LCHAN_S_REL_ERR, "RELEASE DUE ERROR" },
{ LCHAN_S_BROKEN, "BROKEN UNUSABLE" },
{ 0, NULL }
};