diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c index bca9e1f87..4d6521f83 100644 --- a/src/osmo-bsc/bsc_subscr_conn_fsm.c +++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c @@ -651,14 +651,36 @@ void gscon_lchan_releasing(struct gsm_subscriber_connection *conn, struct gsm_lc /* An lchan was deallocated. */ void gscon_forget_lchan(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan) { + const char *detach_label = NULL; + if (!conn) + return; if (!lchan) return; - if (conn->assignment.new_lchan == lchan) + + if (conn->assignment.new_lchan == lchan) { conn->assignment.new_lchan = NULL; - if (conn->ho.new_lchan == lchan) + detach_label = "assignment.new_lchan"; + } + if (conn->ho.new_lchan == lchan) { conn->ho.new_lchan = NULL; - if (conn->lchan == lchan) + detach_label = "ho.new_lchan"; + } + if (conn->lchan == lchan) { conn->lchan = NULL; + detach_label = "primary lchan"; + } + + /* Log for both lchan FSM and conn FSM to ease reading the log in case of problems */ + if (detach_label) { + if (conn->fi) + LOGPFSML(conn->fi, LOGL_DEBUG, "conn detaches lchan %s\n", + lchan->fi? osmo_fsm_inst_name(lchan->fi) : gsm_lchan_name(lchan)); + + if (lchan->fi) + LOGPFSML(lchan->fi, LOGL_DEBUG, "conn %s detaches lchan (%s)\n", + conn->fi? osmo_fsm_inst_name(conn->fi) : "(conn without FSM)", + detach_label); + } if (conn->fi->state != ST_CLEARING && !conn->lchan diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c index d95620fe0..726a5bb15 100644 --- a/src/osmo-bsc/lchan_fsm.c +++ b/src/osmo-bsc/lchan_fsm.c @@ -1356,8 +1356,21 @@ void lchan_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause) /* The conn is deallocating, just forget all about it */ void lchan_forget_conn(struct gsm_lchan *lchan) { + struct gsm_subscriber_connection *conn; if (!lchan) return; + + conn = lchan->conn; + if (conn) { + /* Log for both lchan FSM and conn FSM to ease reading the log in case of problems */ + if (lchan->fi) + LOGPFSML(lchan->fi, LOGL_DEBUG, "lchan detaches from conn %s\n", + conn->fi? osmo_fsm_inst_name(conn->fi) : "(conn without FSM)"); + if (conn->fi) + LOGPFSML(conn->fi, LOGL_DEBUG, "lchan %s detaches from conn\n", + lchan->fi? osmo_fsm_inst_name(lchan->fi) : gsm_lchan_name(lchan)); + } + lchan_forget_mgw_endpoint(lchan); lchan->conn = NULL; }