/* lchan release handling */ void msc_release_connection(struct gsm_subscriber_connection *conn) { /* skip when we are in release, e.g. due an error */ if (conn->in_release) return; /* skip releasing of silent calls as they have no transaction */ if (conn->silent_call) return; /* check if there is a pending operation */ if (conn->loc_operation || conn->sec_operation || conn->anch_operation) return; if (trans_has_conn(conn)) return; /* no more connections, asking to release the channel */ /* * We had stopped the LU expire timer T3212. Now we are about * to send the MS back to the idle state and this should lead * to restarting the timer. Set the new expiration time. */ if (conn->expire_timer_stopped) subscr_update_expire_lu(conn->subscr, conn->bts); conn->in_release = 1; gsm0808_clear(conn); if (conn->put_channel) { conn->put_channel = 0; subscr_put_channel(conn->subscr); } subscr_con_free(conn); }
static int msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg, uint16_t chosen_channel) { gsm0408_new_conn(conn); gsm0408_dispatch(conn, msg); /* TODO: do better */ if (conn->silent_call) return BSC_API_CONN_POL_ACCEPT; if (conn->loc_operation || conn->sec_operation || conn->anch_operation) return BSC_API_CONN_POL_ACCEPT; if (trans_has_conn(conn)) return BSC_API_CONN_POL_ACCEPT; return BSC_API_CONN_POL_REJECT; }
static int msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg, uint16_t chosen_channel) { gsm0408_new_conn(conn); gsm0408_dispatch(conn, msg); /* * If this is a silent call we want the channel to remain open as long as * possible and this is why we accept this connection regardless of any * pending transaction or ongoing operation. */ if (conn->silent_call) return BSC_API_CONN_POL_ACCEPT; if (conn->loc_operation || conn->sec_operation || conn->anch_operation) return BSC_API_CONN_POL_ACCEPT; if (trans_has_conn(conn)) return BSC_API_CONN_POL_ACCEPT; LOGP(DRR, LOGL_INFO, "MSC Complete L3: Rejecting connection.\n"); return BSC_API_CONN_POL_REJECT; }