diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/abis/abis_test.c | 1 | ||||
-rw-r--r-- | tests/bsc/Makefile.am | 13 | ||||
-rw-r--r-- | tests/bsc/bsc_test.c | 4 | ||||
-rw-r--r-- | tests/codec_pref/codec_pref_test.c | 4 | ||||
-rw-r--r-- | tests/codec_pref/codec_pref_test.ok | 12 | ||||
-rw-r--r-- | tests/gsm0408/gsm0408_test.c | 2 | ||||
-rw-r--r-- | tests/handover/Makefile.am | 15 | ||||
-rw-r--r-- | tests/handover/handover_test.c | 186 | ||||
-rw-r--r-- | tests/handover/neighbor_ident_test.c | 8 | ||||
-rw-r--r-- | tests/nanobts_omlattr/nanobts_omlattr_test.c | 2 |
10 files changed, 149 insertions, 98 deletions
diff --git a/tests/abis/abis_test.c b/tests/abis/abis_test.c index c6f29f577..5102aea6b 100644 --- a/tests/abis/abis_test.c +++ b/tests/abis/abis_test.c @@ -188,3 +188,4 @@ struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *ne } bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts) { return true; } +void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {} diff --git a/tests/bsc/Makefile.am b/tests/bsc/Makefile.am index ce973be19..c8ad0e40a 100644 --- a/tests/bsc/Makefile.am +++ b/tests/bsc/Makefile.am @@ -11,6 +11,8 @@ AM_CFLAGS = \ $(LIBOSMOABIS_CFLAGS) \ $(LIBOSMOLEGACYMGCP_CFLAGS) \ $(LIBOSMOSIGTRAN_CFLAGS) \ + $(LIBOSMOMGCPCLIENT_CFLAGS) \ + $(LIBOSMOSIGTRAN_CFLAGS) \ $(COVERAGE_CFLAGS) \ $(NULL) @@ -32,26 +34,15 @@ bsc_test_SOURCES = \ bsc_test_LDADD = \ $(top_builddir)/src/osmo-bsc/abis_nm.o \ - $(top_builddir)/src/osmo-bsc/abis_rsl.o \ $(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \ - $(top_builddir)/src/osmo-bsc/bsc_api.o \ - $(top_builddir)/src/osmo-bsc/bsc_dyn_ts.o \ $(top_builddir)/src/osmo-bsc/osmo_bsc_filter.o \ - $(top_builddir)/src/osmo-bsc/bsc_rll.o \ $(top_builddir)/src/osmo-bsc/bsc_subscriber.o \ - $(top_builddir)/src/osmo-bsc/chan_alloc.o \ - $(top_builddir)/src/osmo-bsc/gsm_04_08_rr.o \ - $(top_builddir)/src/osmo-bsc/gsm_04_80_utils.o \ $(top_builddir)/src/osmo-bsc/gsm_data.o \ $(top_builddir)/src/osmo-bsc/gsm_timers.o \ $(top_builddir)/src/osmo-bsc/handover_cfg.o \ $(top_builddir)/src/osmo-bsc/handover_logic.o \ $(top_builddir)/src/osmo-bsc/neighbor_ident.o \ $(top_builddir)/src/osmo-bsc/net_init.o \ - $(top_builddir)/src/osmo-bsc/paging.o \ - $(top_builddir)/src/osmo-bsc/pcu_sock.o \ - $(top_builddir)/src/osmo-bsc/rest_octets.o \ - $(top_builddir)/src/osmo-bsc/system_information.o \ $(LIBOSMOCORE_LIBS) \ $(LIBOSMOGSM_LIBS) \ $(LIBOSMOVTY_LIBS) \ diff --git a/tests/bsc/bsc_test.c b/tests/bsc/bsc_test.c index e4a5ed587..8e88ba82f 100644 --- a/tests/bsc/bsc_test.c +++ b/tests/bsc/bsc_test.c @@ -248,7 +248,7 @@ int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause) void bsc_cm_update(struct gsm_subscriber_connection *conn, const uint8_t *cm2, uint8_t cm2_len, const uint8_t *cm3, uint8_t cm3_len) {} -void bsc_mr_config(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan, int full_rate) {} void gscon_submit_rsl_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg, int link_id, int allow_sacch) {} -void gscon_dtap_queue_flush(struct gsm_subscriber_connection *conn, int send) {} +void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {} +void lchan_activate(struct gsm_lchan *lchan, void *info) {} diff --git a/tests/codec_pref/codec_pref_test.c b/tests/codec_pref/codec_pref_test.c index 385854f12..0f908e591 100644 --- a/tests/codec_pref/codec_pref_test.c +++ b/tests/codec_pref/codec_pref_test.c @@ -329,7 +329,7 @@ static int test_match_codec_pref(const struct gsm0808_channel_type *ct, const st { int rc; unsigned int i; - int full_rate; + bool full_rate; enum gsm48_chan_mode chan_mode; printf("Determining channel mode and rate:\n"); @@ -355,7 +355,7 @@ static int test_match_codec_pref(const struct gsm0808_channel_type *ct, const st printf(" codec->efr=%u\n", bts->codec.efr); printf(" codec->amr=%u\n", bts->codec.amr); - rc = match_codec_pref(&full_rate, &chan_mode, ct, scl, msc, bts); + rc = match_codec_pref(&chan_mode, &full_rate, ct, scl, msc->audio_support, msc->audio_length, &bts->codec); printf(" * result: rc=%i, full_rate=%i, chan_mode=%s\n", rc, full_rate, gsm48_chan_mode_name(chan_mode)); printf("\n"); diff --git a/tests/codec_pref/codec_pref_test.ok b/tests/codec_pref/codec_pref_test.ok index d3cd0285b..3b36ea1c4 100644 --- a/tests/codec_pref/codec_pref_test.ok +++ b/tests/codec_pref/codec_pref_test.ok @@ -932,7 +932,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (1 items): @@ -949,7 +949,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (1 items): @@ -965,7 +965,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (1 items): @@ -981,7 +981,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (1 items): @@ -996,7 +996,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (5 items): @@ -1016,6 +1016,6 @@ Determining channel mode and rate: codec->hr=0 codec->efr=0 codec->amr=1 - * result: rc=-1, full_rate=-1, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, chan_mode=SIGNALLING Testing execution completed. diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c index 9552fb11d..bc2777d3c 100644 --- a/tests/gsm0408/gsm0408_test.c +++ b/tests/gsm0408/gsm0408_test.c @@ -852,3 +852,5 @@ bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts) { return true; } + +void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {} diff --git a/tests/handover/Makefile.am b/tests/handover/Makefile.am index 6f0fed66c..107a234eb 100644 --- a/tests/handover/Makefile.am +++ b/tests/handover/Makefile.am @@ -32,8 +32,9 @@ handover_test_SOURCES = \ handover_test.c \ $(NULL) -handover_test_LDFLAGS =\ - -Wl,--wrap=abis_rsl_sendmsg,--wrap=mgcp_conn_modify,--wrap=mgcp_conn_delete\ +handover_test_LDFLAGS = \ + -Wl,--wrap=abis_rsl_sendmsg \ + -Wl,--wrap=mgw_endpoint_ci_request \ $(NULL) handover_test_LDADD = \ @@ -41,8 +42,8 @@ handover_test_LDADD = \ $(top_builddir)/src/osmo-bsc/abis_nm.o \ $(top_builddir)/src/osmo-bsc/abis_rsl.o \ $(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \ + $(top_builddir)/src/osmo-bsc/assignment_fsm.o \ $(top_builddir)/src/osmo-bsc/bsc_api.o \ - $(top_builddir)/src/osmo-bsc/bsc_dyn_ts.o \ $(top_builddir)/src/osmo-bsc/bsc_init.o \ $(top_builddir)/src/osmo-bsc/bsc_rll.o \ $(top_builddir)/src/osmo-bsc/bsc_subscr_conn_fsm.o \ @@ -51,6 +52,7 @@ handover_test_LDADD = \ $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \ $(top_builddir)/src/osmo-bsc/bts_sysmobts.o \ $(top_builddir)/src/osmo-bsc/chan_alloc.o \ + $(top_builddir)/src/osmo-bsc/codec_pref.o \ $(top_builddir)/src/osmo-bsc/gsm_04_08_rr.o \ $(top_builddir)/src/osmo-bsc/gsm_04_80_utils.o \ $(top_builddir)/src/osmo-bsc/gsm_data.o \ @@ -58,16 +60,21 @@ handover_test_LDADD = \ $(top_builddir)/src/osmo-bsc/handover_cfg.o \ $(top_builddir)/src/osmo-bsc/handover_decision.o \ $(top_builddir)/src/osmo-bsc/handover_decision_2.o \ + $(top_builddir)/src/osmo-bsc/handover_fsm.o \ $(top_builddir)/src/osmo-bsc/handover_logic.o \ + $(top_builddir)/src/osmo-bsc/lchan_fsm.o \ + $(top_builddir)/src/osmo-bsc/lchan_select.o \ $(top_builddir)/src/osmo-bsc/meas_rep.o \ + $(top_builddir)/src/osmo-bsc/mgw_endpoint_fsm.o \ $(top_builddir)/src/osmo-bsc/neighbor_ident.o \ - $(top_builddir)/src/osmo-bsc/osmo_bsc_lcls.o \ $(top_builddir)/src/osmo-bsc/net_init.o \ + $(top_builddir)/src/osmo-bsc/osmo_bsc_lcls.o \ $(top_builddir)/src/osmo-bsc/paging.o \ $(top_builddir)/src/osmo-bsc/pcu_sock.o \ $(top_builddir)/src/osmo-bsc/penalty_timers.o \ $(top_builddir)/src/osmo-bsc/rest_octets.o \ $(top_builddir)/src/osmo-bsc/system_information.o \ + $(top_builddir)/src/osmo-bsc/timeslot_fsm.o \ $(LIBOSMOCORE_LIBS) \ $(LIBOSMOGSM_LIBS) \ $(LIBOSMOABIS_LIBS) \ diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c index 769fd069e..3a5748e5a 100644 --- a/tests/handover/handover_test.c +++ b/tests/handover/handover_test.c @@ -32,67 +32,45 @@ #include <osmocom/bsc/abis_rsl.h> #include <osmocom/bsc/debug.h> #include <osmocom/bsc/bsc_subscriber.h> -#include <osmocom/bsc/chan_alloc.h> +#include <osmocom/bsc/lchan_select.h> +#include <osmocom/bsc/lchan_fsm.h> #include <osmocom/bsc/handover_decision.h> #include <osmocom/bsc/system_information.h> +#include <osmocom/bsc/handover.h> #include <osmocom/bsc/handover_cfg.h> #include <osmocom/bsc/handover_decision_2.h> #include <osmocom/bsc/bss.h> #include <osmocom/bsc/bsc_api.h> #include <osmocom/bsc/osmo_bsc.h> #include <osmocom/bsc/bsc_subscr_conn_fsm.h> +#include <osmocom/bsc/timeslot_fsm.h> +#include <osmocom/bsc/lchan_fsm.h> +#include <osmocom/bsc/mgw_endpoint_fsm.h> +#include <osmocom/bsc/handover_fsm.h> +#include <osmocom/bsc/bsc_msc_data.h> void *ctx; struct gsm_network *bsc_gsmnet; -/* override, requires '-Wl,--wrap=mgcp_conn_modify'. +/* override, requires '-Wl,--wrap=mgw_endpoint_ci_request'. * Catch modification of an MGCP connection. */ -int __real_mgcp_conn_modify(struct osmo_fsm_inst *fi, uint32_t parent_evt, struct mgcp_conn_peer *conn_peer); -int __wrap_mgcp_conn_modify(struct osmo_fsm_inst *fi, uint32_t parent_evt, struct mgcp_conn_peer *conn_peer) +void __real_mgw_endpoint_ci_request(struct mgwep_ci *ci, + enum mgcp_verb verb, const struct mgcp_conn_peer *verb_info, + struct osmo_fsm_inst *notify, + uint32_t event_success, uint32_t event_failure, + void *notify_data); +void __wrap_mgw_endpoint_ci_request(struct mgwep_ci *ci, + enum mgcp_verb verb, const struct mgcp_conn_peer *verb_info, + struct osmo_fsm_inst *notify, + uint32_t event_success, uint32_t event_failure, + void *notify_data) { - /* CAUTION HACK: - * - * The pointer fi is misused to pass a reference to GSCON FSM ! - * - * This function is called from gscon_fsm_wait_ho_compl() from - * bsc_subscr_conn_fsm.c when GSCON_EV_HO_COMPL is dispatched to the - * GSCON FSM. By then, the GSCON FSM has already changed to the state - * ST_WAIT_MDCX_BTS_HO (see gscon_fsm_wait_mdcx_bts_ho()) and waits for - * GSCON_EV_MGW_MDCX_RESP_BTS. The signal GSCON_EV_MGW_MDCX_RESP_BTS - * is sent to this function using the parameter parent_evt. So we - * implicitly know the event that is needed to simulate a successful - * MGW negotiation to the GSCON FSM. All we need to do is to dispatch - * parent_evt back to the GSCON FSM in order to make it think that the - * MGW negotiation is done. - * - * Unfortunately, there is a problem with this test implementation. - * in order to simplfy the test we do not allocate any MGCP Client - * FSM but the GSCON FSM will call this function with the fi pointer - * pointing to the MGCP Client FSM. This means we get a nullpointer - * here and there is no way to distinguish which GSCON FSM called - * the function at all (normally we would know through the parent - * pointer). - * - * To get around this problem we populate the fi pointer with the - * reference to the GSCON FSM itsself, so we can know who called the - * function. This is a misuse of the pointer since it normally would - * hold an MGCP Client FSM instead of a GSCON FSM. - * - * See also note in function create_conn() */ - - osmo_fsm_inst_dispatch(fi, parent_evt, NULL); - return 0; -} - -/* override, requires '-Wl,--wrap=mgcp_conn_delete'. - * Catch deletion of an MGCP connection. */ -int __real_mgcp_conn_delete(struct osmo_fsm_inst *fi); -int __wrap_mgcp_conn_delete(struct osmo_fsm_inst *fi) -{ - /* Just do nothing and pretend that everything went well. - * We never have allocatec any MGCP connections. */ - return 0; + struct mgcp_conn_peer fake_data = {}; + /* All MGCP shall be successful */ + if (!notify) + return; + osmo_fsm_inst_dispatch(notify, event_success, &fake_data); } /* measurement report */ @@ -225,36 +203,34 @@ static struct gsm_bts *create_bts(int arfcn) /* 4 full rate and 4 half rate channels */ for (i = 1; i <= 6; i++) { - bts->c0->ts[i].pchan = - (i < 5) ? GSM_PCHAN_TCH_F : GSM_PCHAN_TCH_H; + bts->c0->ts[i].pchan_from_config = (i < 5) ? GSM_PCHAN_TCH_F : GSM_PCHAN_TCH_H; bts->c0->ts[i].mo.nm_state.operational = NM_OPSTATE_ENABLED; bts->c0->ts[i].mo.nm_state.availability = NM_AVSTATE_OK; - bts->c0->ts[i].lchan[0].type = GSM_LCHAN_NONE; - bts->c0->ts[i].lchan[0].state = LCHAN_S_NONE; - bts->c0->ts[i].lchan[1].type = GSM_LCHAN_NONE; - bts->c0->ts[i].lchan[1].state = LCHAN_S_NONE; + } + + for (i = 0; i < ARRAY_SIZE(bts->c0->ts); i++) { + /* make sure ts->lchans[] get initialized */ + osmo_fsm_inst_dispatch(bts->c0->ts[i].fi, TS_EV_OML_READY, 0); } return bts; } void create_conn(struct gsm_lchan *lchan) { + static struct bsc_msc_data fake_msc_data = {}; static unsigned int next_imsi = 0; char imsi[sizeof(lchan->conn->bsub->imsi)]; struct gsm_network *net = lchan->ts->trx->bts->network; struct gsm_subscriber_connection *conn; + struct mgcp_client *fake_mgcp_client = (void*)talloc_zero(net, int); conn = bsc_subscr_con_allocate(net); - /* CAUTION HACK: When __real_mgcp_conn_modify() is called by the GSCON - * FSM, then we need to know the reference to caller FSM (GSCON FSM). - * Unfortunately the function __real_mgcp_conn_modify() is called with - * fi_bts, which is unpopulated in this setup. The real function would - * perform the communication with the MGW and then dispatch a signal - * back to the parent FSM. Since we do not have all that in this setup - * we populate the fi_bts pointer with a reference to the GSCON FSM in - * order to have it available later in __real_mgcp_conn_modify(). */ - conn->user_plane.fi_bts = conn->fi; + conn->user_plane.mgw_endpoint = mgw_endpoint_alloc(conn->fi, + GSCON_EV_FORGET_MGW_ENDPOINT, + fake_mgcp_client, "test", + "fake endpoint"); + conn->sccp.msc = &fake_msc_data; lchan->conn = conn; conn->lchan = lchan; @@ -274,13 +250,17 @@ struct gsm_lchan *create_lchan(struct gsm_bts *bts, int full_rate, char *codec) { struct gsm_lchan *lchan; - lchan = lchan_alloc(bts, - (full_rate) ? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H, 0); + lchan = lchan_select_by_type(bts, (full_rate) ? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H); if (!lchan) { printf("No resource for lchan\n"); exit(EXIT_FAILURE); } - lchan->state = LCHAN_S_ACTIVE; + + /* serious hack into osmo_fsm */ + lchan->fi->state = LCHAN_ST_ESTABLISHED; + lchan->ts->fi->state = TS_ST_IN_USE; + LOG_LCHAN(lchan, LOGL_DEBUG, "activated by handover_test.c\n"); + create_conn(lchan); if (!strcasecmp(codec, "FR") && full_rate) lchan->tch_mode = GSM48_CMODE_SPEECH_V1; @@ -305,7 +285,6 @@ struct gsm_lchan *create_lchan(struct gsm_bts *bts, int full_rate, char *codec) }, .len = 5, }; - lchan->conn->codec_list_present = true; return lchan; } @@ -382,6 +361,27 @@ static void send_chan_act_ack(struct gsm_lchan *lchan, int act) abis_rsl_rcvmsg(msg); } +/* Send RLL Est Ind for SAPI[0] */ +static void send_est_ind(struct gsm_lchan *lchan) +{ + struct msgb *msg = msgb_alloc_headroom(256, 64, "RSL"); + struct abis_rsl_rll_hdr *rh; + uint8_t chan_nr = gsm_lchan2chan_nr(lchan); + + rh = (struct abis_rsl_rll_hdr *) msgb_put(msg, sizeof(*rh)); + rh->c.msg_discr = ABIS_RSL_MDISC_RLL; + rh->c.msg_type = RSL_MT_EST_IND; + rh->ie_chan = RSL_IE_CHAN_NR; + rh->chan_nr = chan_nr; + rh->ie_link_id = RSL_IE_LINK_IDENT; + rh->link_id = 0x00; + + msg->dst = lchan->ts->trx->bts->c0->rsl_link; + msg->l2h = (unsigned char *)rh; + + abis_rsl_rcvmsg(msg); +} + /* send handover complete */ static void send_ho_complete(struct gsm_lchan *lchan, bool success) { @@ -392,6 +392,8 @@ static void send_ho_complete(struct gsm_lchan *lchan, bool success) struct gsm48_hdr *gh; struct gsm48_ho_cpl *hc; + send_est_ind(lchan); + rh = (struct abis_rsl_rll_hdr *) msgb_put(msg, sizeof(*rh)); rh->c.msg_discr = ABIS_RSL_MDISC_RLL; rh->c.msg_type = RSL_MT_DATA_IND; @@ -1336,6 +1338,18 @@ static const struct log_info_cat log_categories[] = { .color = "\033[1;35m", .enabled = 1, .loglevel = LOGL_DEBUG, }, + [DRR] = { + .name = "DRR", + .description = "RR", + .color = "\033[1;35m", + .enabled = 1, .loglevel = LOGL_DEBUG, + }, + [DRLL] = { + .name = "DRLL", + .description = "RLL", + .color = "\033[1;35m", + .enabled = 1, .loglevel = LOGL_DEBUG, + }, [DMSC] = { .name = "DMSC", .description = "Mobile Switching Center", @@ -1380,11 +1394,18 @@ int main(int argc, char **argv) log_set_print_category(osmo_stderr_target, 1); log_set_print_category_hex(osmo_stderr_target, 0); log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_BASENAME); + osmo_fsm_log_addr(false); bsc_network_alloc(); if (!bsc_gsmnet) exit(1); + ts_fsm_init(); + lchan_fsm_init(); + mgw_endpoint_fsm_init(bsc_gsmnet->T_defs); + bsc_subscr_conn_fsm_init(); + handover_fsm_init(); + ho_set_algorithm(bsc_gsmnet->ho, 2); ho_set_ho_active(bsc_gsmnet->ho, true); ho_set_hodec2_as_active(bsc_gsmnet->ho, true); @@ -1429,7 +1450,7 @@ int main(int argc, char **argv) for (i = 0; i < n; i++) bts[bts_num + i] = create_bts(arfcn++); for (i = 0; i < n; i++) { - if (gsm_generate_si(bts[bts_num + i], SYSINFO_TYPE_2)) + if (gsm_generate_si(bts[bts_num + i], SYSINFO_TYPE_2) <= 0) fprintf(stderr, "Error generating SI2\n"); } bts_num += n; @@ -1670,6 +1691,27 @@ int main(int argc, char **argv) *test_case); return EXIT_FAILURE; } + + { + /* Help the lchan out of releasing states */ + struct gsm_bts *bts; + llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) { + struct gsm_bts_trx *trx; + llist_for_each_entry(trx, &bts->trx_list, list) { + int ts_nr; + for (ts_nr = 0; ts_nr < TRX_NR_TS; ts_nr++) { + struct gsm_lchan *lchan; + ts_for_each_lchan(lchan, &trx->ts[ts_nr]) { + + if (lchan->fi && lchan->fi->state == LCHAN_ST_WAIT_BEFORE_RF_RELEASE) { + osmo_fsm_inst_state_chg(lchan->fi, LCHAN_ST_WAIT_RF_RELEASE_ACK, 0, 0); + osmo_fsm_inst_dispatch(lchan->fi, LCHAN_EV_RSL_RF_CHAN_REL_ACK, 0); + } + } + } + } + } + } } for (i = 0; i < lchan_num; i++) { @@ -1677,7 +1719,6 @@ int main(int argc, char **argv) lchan[i]->conn = NULL; conn->lchan = NULL; osmo_fsm_inst_term(conn->fi, OSMO_FSM_TERM_REGULAR, NULL); - lchan_free(lchan[i]); } fprintf(stderr, "--------------------\n"); @@ -1708,10 +1749,17 @@ int bsc_compl_l3(struct gsm_subscriber_connection *conn, struct msgb *msg, uint1 { return 0; } void bsc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id, struct msgb *msg) {} void bsc_assign_compl(struct gsm_subscriber_connection *conn, uint8_t rr_cause) {} -void bsc_assign_fail(struct gsm_subscriber_connection *conn, uint8_t cause, uint8_t *rr_cause) {} int bsc_clear_request(struct gsm_subscriber_connection *conn, uint32_t cause) { return 0; } void bsc_cm_update(struct gsm_subscriber_connection *conn, const uint8_t *cm2, uint8_t cm2_len, const uint8_t *cm3, uint8_t cm3_len) {} -void bsc_mr_config(struct gsm_subscriber_connection *conn, struct gsm_lchan *lchan, int full_rate) {} +struct gsm0808_handover_required; +int bsc_tx_bssmap_ho_required(struct gsm_lchan *lchan, const struct gsm0808_cell_id_list2 *target_cells) +{ return 0; } +int bsc_tx_bssmap_ho_request_ack(struct gsm_subscriber_connection *conn, struct msgb *rr_ho_command) +{ return 0; } +int bsc_tx_bssmap_ho_detect(struct gsm_subscriber_connection *conn) { return 0; } +enum handover_result bsc_tx_bssmap_ho_complete(struct gsm_subscriber_connection *conn, + struct gsm_lchan *lchan) { return HO_RESULT_OK; } +void bsc_tx_bssmap_ho_failure(struct gsm_subscriber_connection *conn) {} diff --git a/tests/handover/neighbor_ident_test.c b/tests/handover/neighbor_ident_test.c index 4eddd4a08..9acbea035 100644 --- a/tests/handover/neighbor_ident_test.c +++ b/tests/handover/neighbor_ident_test.c @@ -28,7 +28,7 @@ #include <osmocom/bsc/neighbor_ident.h> -struct neighbor_ident_list *nil; +static struct neighbor_ident_list *nil; static const struct neighbor_ident_key *k(int from_bts, uint16_t arfcn, uint8_t bsic) { @@ -105,7 +105,7 @@ static const struct gsm0808_cell_id_list2 lac2 = { }, }; -void print_cil(const struct gsm0808_cell_id_list2 *cil) +static void print_cil(const struct gsm0808_cell_id_list2 *cil) { unsigned int i; if (!cil) { @@ -132,7 +132,7 @@ void print_cil(const struct gsm0808_cell_id_list2 *cil) static int print_nil_i; -bool nil_cb(const struct neighbor_ident_key *key, const struct gsm0808_cell_id_list2 *val, +static bool nil_cb(const struct neighbor_ident_key *key, const struct gsm0808_cell_id_list2 *val, void *cb_data) { printf(" %2d: %s\n", print_nil_i++, neighbor_ident_key_name(key)); @@ -140,7 +140,7 @@ bool nil_cb(const struct neighbor_ident_key *key, const struct gsm0808_cell_id_l return true; } -void print_nil() +static void print_nil() { print_nil_i = 0; neighbor_ident_iter(nil, nil_cb, NULL); diff --git a/tests/nanobts_omlattr/nanobts_omlattr_test.c b/tests/nanobts_omlattr/nanobts_omlattr_test.c index 7a3a80e2d..38729ac35 100644 --- a/tests/nanobts_omlattr/nanobts_omlattr_test.c +++ b/tests/nanobts_omlattr/nanobts_omlattr_test.c @@ -317,3 +317,5 @@ struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *ne bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts) { return true; } + +void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {} |