doc: add call graphs from MSC to BSC or HNB-GW (wip)

This commit is contained in:
Neels Hofmeyr
2015-12-26 03:02:20 +01:00
parent 8440c9f04b
commit a234287d09

View File

@@ -0,0 +1,608 @@
gprs_iu_tx
-- WORK IN PROGRESS --
This is an incomplete collection of call graphs between MSC and Osmo-BSC,
partly including Osmo-BTS. These traces helped understanding the separation of
the BSC part from Osmo-NITB. The aim: obtain a clearly separated "A" interface
towards the BSC, and have an Iu-CS interface to operate with HNB-GW and hNodeB.
The working title for the result is Osmo-CSCN (Circuit Switched Core Network),
combining an MSC with various other core network components, but without the
BSC parts.
Some Specs and Overview
0408: Radio interface
0411: PP-SMS on Radio interface
0802: A Interface MSC<->BSS (BSS = BSC + BTS)
0804: A Interface L1 MSC<->BSS
0806: A Interface L2 MSC<->BSS
0808: A Interface L3 MSC<->BSS
0808: Figure 1: A MSC<->BSS
0820: RA (Rate Adaption) MSC<->BSS
0851,0852: A-bis general BSC<->BTS
1221: A-bis NM BSC<->BTS
1201: Figure 9: A-bis BSC<->BTS
MS <-> BTS <-> BSC <-> MSC <-> cn
| | | | |
|<-------0408=DTAP----->| |
|<-------0411---------->| |
| | |<--0808>| |
| | |<BSSMAP>| |
| | | | |
| Abis | A |
MS <-> hNodeB <-> HNB-GW <-> MSC <-> cn
| | | | |
|<-0408->|<--Iu--->|<-Iu-cs->| |
|<-0411->| | | |
| | | | |
Entry/Exit points
Osmo-BSC <--A--> MSC or Osmo-CSCN
format: BSSAP/SCCP (where BSSAP = DTAP + BSSMAP)
Osmo-BSC
read from MSC: sccp_system_incoming_ctx()
write to MSC: sccp_connection_write() <-- osmo-bsc/osmo_bsc_sccp.c:bsc_queue_for_msc()
MSC:
third party
Osmo-CSCN:
read: does not exist yet
write: does not exist yet
HNB-GW <--Iu-CS--> Osmo-CSCN
format: CC+MM/RANAP/SUA
HNB-GW:
read: does not exist yet
write: does not exist yet
Osmo-CSCN:
read: does not exist yet
write: does not exist yet
Osmo-BTS <-Abis-> Osmo-BSC
Osmo-BSC:
read: libbsc/abis_rsl.c:abis_rsl_rcvmsg(msg)
write: libosmo-abis/src/e1_input.c:abis_sendmsg() (e1inp_sign_link*)msg->dst;
Osmo-BTS <-Abis-> Osmo-NITB
Osmo-NITB:
read:
osmo_signal_dispatch():
from on_dso_load_token() libmsc/token_auth.c
SS_SUBSCR: token_subscr_cb() libmsc/token_auth.c
SS_SMS: token_sms_cb() libmsc/token_auth.c
from subscr_sig_cb() libmsc/rrlp.c
SS_SUBSCR: subscr_sig_cb() libmsc/rrlp.c
SS_PAGING: paging_sig_cb() libmsc/rrlp.c
from on_dso_load_ho_dec() libbsc/handover_decision.c
SS_LCHAN: ho_dec_sig_cb() libbsc/handover_decision.c
from e1inp_init() libosmo-abis/src/e1_input.c
SS_L_GLOBAL: e1i_sig_cb() libosmo-abis/src/e1_input.c
bts_model_bs11_init();
bts_model_rbs2k_init();
bts_model_nanobts_init();
bts_model_nokia_site_init();
bts_model_sysmobts_init();
bsc_bootstrap_network():
osmo_signal_register_handler(SS_NM, nm_sig_cb, NULL);
osmo_signal_register_handler(SS_L_INPUT, inp_sig_cb, NULL);
Call Trees
- A Interface
Osmo-BSC sends to MSC:
sccp_connection_write(conn->sccp, msg);
^ bsc_queue_for_msc()
^
| osmo-bsc/osmo_bsc_api.c:
| bsc_clear_request()
| queue_msg_or_return() osmo-bsc/osmo_bsc_api.c
| ^ bsc_sapi_n_reject()
| | ^send_sapi_reject()
| | ^ gsm0808_submit_dtap() libbsc/bsc_api.c
| | | ^ gsm48_conn_sendmsg() libmsc/gsm_04_08.c
| | | | ^ gsm48_cc_tx_notify_ss() libmsc/gsm_04_08.c
| | | | | mm_tx_identity_req() libmsc/gsm_04_08.c
| | | | | gsm48_tx_mm_info() libmsc/gsm_04_08.c
| | | | | gsm48_tx_mm_auth_req()
| | | | | gsm48_send_rr_app_info()
| | | | | gsm48_cc_tx_status()
| | | | | gsm48_tx_simple()
| | | | | ^ gsm48_tx_mm_auth_rej()
| | | | | gsm48_cc_tx_setup()
| | | | | gsm48_cc_tx_call_proc()
| | | | | gsm48_cc_tx_alerting()
| | | | | gsm48_cc_tx_progress()
| | | | | gsm48_cc_tx_connect()
| | | | | gsm48_cc_tx_connect_ack()
| | | | | gsm48_cc_tx_disconnect()
| | | | | gsm48_cc_tx_release()
| | | | | gsm48_cc_tx_release_compl()
| | | | | gsm48_cc_tx_facility()
| | | | | gsm48_cc_tx_hold_ack()
| | | | | gsm48_cc_tx_hold_rej()
| | | | | gsm48_cc_tx_retrieve_ack()
| | | | | gsm48_cc_tx_retrieve_rej()
| | | | | gsm48_cc_tx_start_dtmf_ack()
| | | | | gsm48_cc_tx_start_dtmf_rej()
| | | | | gsm48_cc_tx_stop_dtmf_ack()
| | | | | gsm48_cc_tx_modify()
| | | | | gsm48_cc_tx_modify_complete()
| | | | | gsm48_cc_tx_modify_reject()
| | | | | gsm48_cc_tx_notify()
| | | | | gsm48_cc_tx_userinfo()
| | | |
| | | | gsm0480_send_ussd_response() libmsc/gsm_04_80.c
| | | | gsm0480_send_ussd_reject() libmsc/gsm_04_80.c
| | | | gsm0480_send_ussdNotify() libmsc/gsm_04_80.c
| | | | ^ bsc_send_ussd_no_srv() osmo-bsc/osmo_bsc_api.c
| | | | gsm0480_send_releaseComplete() libmsc/gsm_04_80.c
| | | | ^ bsc_send_ussd_no_srv() osmo-bsc/osmo_bsc_api.c
| | | |
| | | | gsm411_sendmsg() libmsc/gsm_04_11.c
| | | |
| | | | bsc_maybe_lu_reject() osmo-bsc/osmo_bsc_api.c
| | | | ^ complete_layer3()
| | | | | bsc_dtap()
| | | |
| | | | dtap_rcvmsg() osmo-bsc/osmo_bsc_bssap.c
| | | |
| | | | gsm48_tx_mm_serv_ack() libbsc/gsm_04_08_utils.c
| | | | ^ _gsm48_rx_mm_serv_req_sec_cb()
| | | | | bsc_send_ussd_no_srv() osmo-bsc/osmo_bsc_api.c
| | | |
| | | | gsm48_tx_mm_serv_rej() libbsc/gsm_04_08_utils.c
| | |
| | | bsc_rll_req.cb = rll_ind_cb() from rll_establish() from gsm0808_submit_dtap()
| | | ^ complete_rllr() libbsc/bsc_rll.c
| | | | ^ timer_cb() libbsc/bsc_rll.c
| | | | | rll_indication() libbsc/bsc_rll.c
| | | | | rll_lchan_signal() libbsc/bsc_rll.c
| |
| | bsc_cipher_mode_compl()
| | ^ bsc_api.cipher_mode_compl()
| | | dispatch_dtap() (2)
| | | with GSM48_MT_RR_CIPH_M_COMPL
| |
| | bsc_dtap()
| | ^ cb from osmo-bsc/osmo_bsc_api.c
| | bsc_api.dtap()
| | ^ libbsc/bsc_api.c:
| | | dispatch_dtap() (2)
| | | case GSM48_MT_RR_APP_INFO
| | | case unknown 04.08 RR
| |
| | bsc_assign_compl()
| | ^ osmo-bsc/osmo_bsc_api.c
| | bsc_api.assign_compl()
| | ^ libbsc/bsc_api.c:
| | | dispatch_dtap() (2)
| | | case GSM48_MT_RR_CHAN_MODE_MODIF_ACK
| | | handle_ass_compl()
| | | ^ dispatch_dtap() (2)
| | | | case GSM48_MT_RR_ASS_COMPL
| |
| | bsc_assign_fail()
| |
| | bsc_cm_update()
|
| osmo-bsc/osmo_bsc_bssap.c:
| bssmap_handle_clear_command()
| bssmap_handle_cipher_mode()
| bssmap_handle_assignm_req()
|
Osmo-BSC receives from MSC:
sccp_system_incoming_ctx() (libosmo-sccp)
| L2 type:
v SCCP_MSG_TYPE_CR: _sccp_handle_connection_request(msgb, ctx);
SCCP_MSG_TYPE_RLSD: _sccp_handle_connection_released(msgb);
SCCP_MSG_TYPE_CREF: _sccp_handle_connection_refused(msgb);
SCCP_MSG_TYPE_CC: _sccp_handle_connection_confirm(msgb);
SCCP_MSG_TYPE_RLC: _sccp_handle_connection_release_complete(msgb);
SCCP_MSG_TYPE_DT1: _sccp_handle_connection_dt1(msgb);
Note: a dt1 target entry was created during one of:
- bsc_open_connection() (SCCP connections are established by the BSC, exclusively)
sccp_connection_connect()
_sccp_send_connection_request()
llist_add_tail(&connection->list, &sccp_connections);
- sccp_system_incoming_ctx()
SCCP_MSG_TYPE_CR:
_sccp_handle_connection_request(struct msgb *msgb, void *ctx)
cb->accept_cb() = msc_sccp_accept()
SCCP_MSG_TYPE_UDT: _sccp_handle_read(msgb) --read_cb--> osmo-bsc/osmo_bsc_sccp.c:msc_sccp_read()
msc_sccp_read()
| bsc_handle_udt() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_bssap.c:494
v bssmap_rcvmsg_udt() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_bssap.c:387
gsm0808_bssmap_name() ./libosmocore/src/gsm/gsm0808.c:535
bssmap_handle_reset_ack() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_bssap.c:91
LOGP()
bssmap_handle_paging() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_bssap.c:99
GSM0808_IE_IMSI
GSM0808_IE_CELL_IDENTIFIER_LIST
GSM0808_IE_TMSI
CELL_IDENT_LAC
CELL_IDENT_BSS
GSM0808_IE_CHANNEL_NEEDED
GSM0808_IE_EMLPP_PRIORITY
subscr_get_or_create() ./openbsc/openbsc/src/libcommon/gsm_subscriber_base.c:101
subscr_group
LOGL_INFO
bsc_grace_paging_request() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_grace.c:87
normal_paging() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_grace.c:37
if (msc->core_lac != -1)
paging_request_bts() ./openbsc/openbsc/src/libbsc/paging.c:307
trx_is_usable() ./openbsc/openbsc/src/libbsc/chan_alloc.c:49
if is_ipaccess_bts() and nm_is_running(): 0
else: 1
paging_init_if_needed() ./openbsc/openbsc/src/libbsc/paging.c:224
LAUNCH TIMER:
bts->paging.work_timer.cb = paging_worker;
paging_worker() ./openbsc/openbsc/src/libbsc/paging.c:217
paging_handle_pending_requests() ./openbsc/openbsc/src/libbsc/paging.c:169 (R):
paging_give_credit() ./openbsc/openbsc/src/libbsc/paging.c:107 (R):
recurse paging_handle_pending_requests()
can_send_pag_req() ./openbsc/openbsc/src/libbsc/paging.c:116
page_ms() ./openbsc/openbsc/src/libbsc/paging.c:69
gsm0808_page() ./openbsc/openbsc/src/libbsc/bsc_api.c:415
rsl_paging_cmd() ./openbsc/openbsc/src/libbsc/abis_rsl.c:751
abis_rsl_dchan_hdr
RSL_MT_PAGING_CMD
RSL_CHAN_PCH_AGCH
init_dchan_hdr() ./openbsc/openbsc/src/libbsc/abis_rsl.c:99
mdisc_by_msgtype() ./openbsc/openbsc/src/libbsc/abis_rsl.c:80
ABIS_RSL_MDISC_RLL
ABIS_RSL_MDISC_TRX
ABIS_RSL_MDISC_COM_CHAN
ABIS_RSL_MDISC_DED_CHAN
ABIS_RSL_MDISC_LOC
RSL_IE_CHAN_NR
RSL_IE_PAGING_GROUP
RSL_IE_MS_IDENTITY
RSL_IE_CHAN_NEEDED
abis_rsl_sendmsg() ./libosmo-abis/src/e1_input.c:258
_paging_request() ./openbsc/openbsc/src/libbsc/paging.c:279
llist_add_tail(&req->entry, &bts_entry->pending_requests);
paging_schedule_if_needed() ./openbsc/openbsc/src/libbsc/paging.c:96
if (msc->core_lac == -1)
paging_request()
gsm_bts_by_lac() ./openbsc/openbsc/src/libcommon/gsm_data.c:135
paging_request_bts() ./openbsc/openbsc/src/libbsc/paging.c:307
(see above)
if err
paging_request_stop()
(see below)
locked_paging() ./openbsc/openbsc/src/osmo-bsc/osmo_bsc_grace.c:54
paging_request_bts() ./openbsc/openbsc/src/libbsc/paging.c:307
(see above)
- A-bis Interface
Osmo-BSC to BTS:
abis_sendmsg()
^
| libosmo-abis/src/e1_input.c:abis_rsl_sendmsg()
| ^
| | libbsc/abis_rsl.c: 23 callers
| | rsl_bcch_info()
| | rsl_sacch_filling()
| | rsl_sacch_info_modify()
| | rsl_chan_bs_power_ctrl()
| | rsl_chan_ms_power_ctrl()
| | rsl_chan_activate_lchan()
| | rsl_chan_mode_modify_req()
| | rsl_encryption_cmd()
| | rsl_deact_sacch()
| | rsl_rf_chan_release()
| | rsl_paging_cmd()
| | rsl_imm_assign_cmd()
| | rsl_siemens_mrpci()
| | rsl_data_request()
| | rsl_establish_request()
| | rsl_release_request()
| | rsl_ipacc_crcx()
| | rsl_ipacc_mdcx()
| | rsl_ipacc_pdch_activate()
| | rsl_sms_cb_command()
| | rsl_nokia_si_begin()
| | rsl_nokia_si_end()
| | rsl_bs_power_control()
|
| libbsc/bts_nokia_site.c:nokia_abis_nm_queue_send_next()
|
| libbsc/abis_nm.c:_abis_nm_sendmsg()
| ^ abis_nm_sendmsg()
| | abis_nm_sendmsg_direct()
|
| osmo-bts/src/common/abis.c:abis_oml_sendmsg()
| osmo-bts/src/common/abis.c:abis_bts_rsl_sendmsg()
libbsc/e1_config.c:bts_isdn_e1inp_line_ops.sign_link =
libbsc/e1_config.c:bts_isdn_sign_link(struct msgb *msg)
case E1INP_SIGN_RSL:
libbsc/abis_rsl.c:abis_rsl_rcvmsg(msg) (1)
case E1INP_SIGN_OML:
ret = bts->model->oml_rcvmsg(msg);
libbsc/bts_ipaccess_nanobts.c:ipaccess_e1inp_line_ops.sign_link =
ipaccess_sign_link(struct msgb *msg)
case E1INP_SIGN_RSL:
libbsc/abis_rsl.c:abis_rsl_rcvmsg(msg) (1)
case E1INP_SIGN_OML:
libbsc/abis_nm.c:abis_nm_rcvmsg(msg);
(1)
libbsc/abis_rsl.c:abis_rsl_rcvmsg(msg)
case ABIS_RSL_MDISC_RLL:
libbsc/abis_rsl.c:abis_rsl_rx_rll(msg)
case DATA_IND, EST_IND:
libbsc/bsc_api.c:gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id)
msg->lchan->ts->trx->bts->network->bsc_api;
if (lchan->conn)
libbsc/bsc_api.c:dispatch_dtap() (2)
else
lchan->conn = subscr_con_allocate(msg->lchan);
rc = api->compl_l3(lchan->conn, msg, 0); (3)
case ABIS_RSL_MDISC_DED_CHAN:
rc = abis_rsl_rx_dchan(msg);
case ABIS_RSL_MDISC_COM_CHAN:
rc = abis_rsl_rx_cchan(msg);
case ABIS_RSL_MDISC_TRX:
rc = abis_rsl_rx_trx(msg);
case ABIS_RSL_MDISC_IPACCESS:
rc = abis_rsl_rx_ipacc(msg);
break;
case ABIS_RSL_MDISC_LOC:
LOGP(DRSL, LOGL_NOTICE, "unimplemented RSL msg disc 0x%02x\n",
(2)
libbsc/bsc_api.c:dispatch_dtap()
struct bsc_api *api = msg->lchan->ts->trx->bts->network->bsc_api;
default:
if (api->dtap)
api->dtap(conn, link_id, msg); (5)
case GSM48_PDISC_RR:
case GSM48_MT_RR_HANDO_COMPL:
handle_rr_ho_compl(msg);
case GSM48_MT_RR_HANDO_FAIL:
handle_rr_ho_fail(msg);
case GSM48_MT_RR_CIPH_M_COMPL:
if (api->cipher_mode_compl)
api->cipher_mode_compl(conn, msg, (4)
conn->lchan->encr.alg_id);
case GSM48_MT_RR_ASS_COMPL:
handle_ass_compl(conn, msg);
case GSM48_MT_RR_ASS_FAIL:
handle_ass_fail(conn, msg);
case GSM48_MT_RR_CHAN_MODE_MODIF_ACK:
rc = gsm48_rx_rr_modif_ack(msg);
if (rc < 0) {
api->assign_fail(conn, GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE)
else
api->assign_compl()
case GSM48_MT_RR_CLSM_CHG:
handle_classmark_chg(conn, msg);
case GSM48_MT_RR_APP_INFO:
if (api->dtap)
api->dtap(conn, link_id, msg); (5)
default:
if (api->dtap)
api->dtap(conn, link_id, msg); (5)
case GSM48_MT_RR_GPRS_SUSP_REQ:
DEBUGP(DRR, "GRPS SUSPEND REQUEST\n");
case GSM48_MT_RR_STATUS:
LOGP(DRR, LOGL_NOTICE, "RR STATUS (cause: %s)\n",
case GSM48_MT_RR_MEAS_REP:
LOGP(DMEAS, LOGL_ERROR, "DIRECT GSM48 MEASUREMENT REPORT ?!? ");
(3)[0]
msc_bsc_api().compl_l3 =
libmsc/osmo_msc.c: msc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg,
libmsc/gsm0408.c: gsm0408_dispatch() (6)
(3)[1]
osmo_bsc_api().compl_l3 =
osmo-bsc/osmo_bsc_api.c:bsc_compl_l3()
msc = bsc_find_msc(conn, msg);
complete_layer3(conn, msg, msc)
bsc_filter_initial(msc->network->bsc_data, msc, conn, msg,
&imsi, &con_type, &lu_cause);
bsc_create_new_connection(conn, msc, send_ping);
sccp->state_cb = msc_outgoing_sccp_state()
sccp->data_cb = msc_outgoing_sccp_data()
bsc_con->send_ping = send_ping()
bsc_con->sccp_it_timeout.cb = sccp_it_timeout()
bsc_con->sccp_cc_timeout.cb = sccp_cc_timeout()
bsc_scan_bts_msg(conn, msg); (7)
resp = gsm0808_create_layer3(msg, network_code, country_code, lac, ci);
(5)[0]
msc_bsc_api().dtap =
libmsc/osmo_msc.c: msc_dtap(conn, link_id, msg)
gsm0408_dispatch(conn, msg) (6)
(5)[1]
osmo_bsc_api().dtap =
osmo-bsc/osmo_bsc_api.c: bsc_dtap(conn, link_id, msg)
if (handle_cc_setup(conn, msg) >= 1) return;
if (bsc_filter_data(conn, msg, &lu_cause) < 0)
bsc_maybe_lu_reject()
return;
bsc_scan_bts_msg(conn, msg); (7)
resp = gsm0808_create_dtap(msg, link_id);
queue_msg_or_return(resp);
(7)
bsc_scan_bts_msg() <osmo-bsc/osmo_bsc_filter.c:212>:
if GSM48_PDISC_MM, GSM48_MT_MM_LOC_UPD_REQUEST
handle_lu_request() <osmo-bsc/osmo_bsc_filter.c:29>:
gsm48_generate_lai()
if GSM48_PDISC_RR, GSM48_MT_RR_PAG_RESP
handle_page_resp() <osmo-bsc/osmo_bsc_filter.c:97>:
extract_sub() <osmo-bsc/osmo_bsc_filter.c:57>
paging_request_stop() <libbsc/paging.c:390>:
log_set_context()
_paging_request_stop() <libbsc/paging.c:359>:
paging_init_if_needed() <libbsc/paging.c:224>:
paging_worker() <libbsc/paging.c:217>:
paging_handle_pending_requests() <libbsc/paging.c:169> (R):
cb()
paging_give_credit() <libbsc/paging.c:107> (R):
paging_handle_pending_requests() <libbsc/paging.c:169> (recursive: see 37)
can_send_pag_req() <libbsc/paging.c:116>:
page_ms() <libbsc/paging.c:69>:
gsm0808_page() <libbsc/bsc_api.c:415>:
rsl_paging_cmd() <libbsc/abis_rsl.c:751>:
abis_rsl_dchan_hdr = RSL_IE_CHAN_NR
mdisc_by_msgtype() <libbsc/abis_rsl.c:80>:
ABIS_RSL_MDISC_RLL
ABIS_RSL_MDISC_TRX
ABIS_RSL_MDISC_COM_CHAN
ABIS_RSL_MDISC_DED_CHAN
ABIS_RSL_MDISC_LOC
msgb_tv_put(msg, RSL_IE_PAGING_GROUP, paging_group);
msgb_tlv_put(msg, RSL_IE_MS_IDENTITY, len-2, ms_ident+2);
msgb_tv_put(msg, RSL_IE_CHAN_NEEDED, chan_needed);
rsl_link
abis_rsl_sendmsg()
cbfn() (8)
paging_remove_request() <libbsc/paging.c:60>:
subscr_put() <libcommon/gsm_subscriber_base.c:89>
subscr_put() <libcommon/gsm_subscriber_base.c:89>
(8)[0]
libmsc/gsm_04_08.c:mncc_tx_to_cc()
req->cbfn =
libmsc/gsm_04_08.c:setup_trig_pag_evt
(8)[1]
libmsc/gsm_04_11.c:gsm411_send_sms_subscr()
req->cbfn =
libmsc/gsm_04_11.c:paging_cb_send_sms
(9)
bsc_scan_msc_msg() ./osmo-bsc/osmo_bsc_filter.c:330
gsm48_hdr
send_welcome_ussd() ./osmo-bsc/osmo_bsc_filter.c:229
LOGP()
DMSC
LOGL_DEBUG
ussd_welcome_txt
BSS_SEND_USSD
GSM48_MT_MM_INFO
bsc_patch_mm_info() ./osmo-bsc/osmo_bsc_filter.c:255
uint8_t
tzbsd
dst
tlv_parse()
gsm48_mm_att_tlvdef
override
hr
mn
TLVP_PRESENT()
GSM48_IE_UTC
LOGP()
DMSC
LOGL_DEBUG
TLVP_VAL()
GSM48_IE_NET_TIME_TZ
GSM48_IE_NET_DST
(6)
libmsc/gsm0408.c: gsm0408_dispatch() (MSC rx from BSC)
if (silent_call_reroute(conn, msg))
return silent_call_rx(conn, msg);
case gsm48_pdisc_cc:
rc = gsm0408_rcv_cc(conn, msg);
case gsm48_pdisc_mm:
rc = gsm0408_rcv_mm(conn, msg);
case gsm48_pdisc_rr:
rc = gsm0408_rcv_rr(conn, msg);
case gsm48_pdisc_sms:
rc = gsm0411_rcv_sms(conn, msg);
case gsm48_pdisc_nc_ss:
rc = handle_rcv_ussd(conn, msg);
case gsm48_pdisc_mm_gprs:
case gsm48_pdisc_sm_gprs:
logp(drll, logl_notice, "unimplemented "
msc_bsc_api().assign_compl =
msc_assign_compl()
nothing
(4)[0]
libmsc/osmo_msc.c:msc_bsc_api().cipher_mode_compl =
msc_ciph_m_compl(conn, msg, alg_id)
conn->sec_operation->cb(GSM_HOOK_RR_SECURITY, GSM_SECURITY_SUCCEEDED,
NULL, conn, conn->sec_operation->cb_data)
release_security_operation(conn);
msc_release_connection(conn)
bsc_api.c:gsm0808_clear(conn)
libbsc/handover_logic.c:bsc_clear_handover(conn, 1)
libbsc/chan_alloc.c:lchan_release(ho->new_lchan, 0, RSL_REL_LOCAL_END);
libbsc/chan_alloc.c:lchan_release(conn->secondary_lchan, 0, RSL_REL_LOCAL_END),
(conn->lchan, 1, RSL_REL_NORMAL)
bsc_api.c:subscr_con_free(conn)
libcommon/gsm_subscriber_base.c:subscr_put(conn->subscr);
(4)[1]
osmo-bsc/osmo_bsc_api.c:osmo_bsc_api().cipher_mode_compl =
bsc_cipher_mode_compl()
queue_msg_or_return() osmo-bsc/osmo_bsc_api.c
bsc_queue_for_msc()
libbsc/abis_nm.c:abis_nm_rcvmsg(msg);
case ABIS_OM_MDISC_FOM:
rc = abis_nm_rcvmsg_fom(msg);
case ABIS_OM_MDISC_MANUF:
rc = abis_nm_rcvmsg_manuf(msg);
case ABIS_OM_MDISC_MMI:
case ABIS_OM_MDISC_TRAU:
LOGP(DNM, LOGL_ERROR, "unimplemented ABIS OML message discriminator 0x%x\n",