diff --git a/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h b/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h index 38ac3611f..201216955 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h +++ b/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h @@ -5,6 +5,11 @@ #define GSM_TA_CM 55385 +#define T200_DCCH 1 /* SDCCH/FACCH */ +#define T200_DCCH_SHARED 2 /* SDCCH shares SAPI 0 and 3 */ +#define T200_ACCH 2 /* SACCH SAPI 3 */ + + /* GSM 04.07 9.1.2 */ #define GSM48_RR_EST_REQ 0x10 #define GSM48_RR_EST_IND 0x12 diff --git a/src/host/layer23/src/mobile/app_mobile.c b/src/host/layer23/src/mobile/app_mobile.c index d911ab386..dc57c3158 100644 --- a/src/host/layer23/src/mobile/app_mobile.c +++ b/src/host/layer23/src/mobile/app_mobile.c @@ -167,6 +167,12 @@ int mobile_init(struct osmocom_ms *ms) gsm_settings_arfcn(ms); lapdm_channel_init(&ms->lapdm_channel, LAPDM_MODE_MS); + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI3].dl.t200_sec = + T200_DCCH_SHARED; + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI3].dl.t200_usec = 0; + ms->lapdm_channel.lapdm_acch.datalink[DL_SAPI3].dl.t200_sec = + T200_ACCH; + ms->lapdm_channel.lapdm_acch.datalink[DL_SAPI3].dl.t200_usec = 0; lapdm_channel_set_l1(&ms->lapdm_channel, l1ctl_ph_prim_cb, ms); gsm_sim_init(ms); diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c index bc244699d..36488606c 100644 --- a/src/host/layer23/src/mobile/gsm48_rr.c +++ b/src/host/layer23/src/mobile/gsm48_rr.c @@ -3284,6 +3284,11 @@ static int gsm48_rr_dl_est(struct osmocom_ms *ms) gsm48_rr_activate_channel(ms, &rr->cd_now, ma, ma_len); #endif + /* set T200 of SAPI 0 */ + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_sec = + T200_DCCH; + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_usec = 0; + /* start establishmnet */ return gsm48_send_rsl(ms, RSL_MT_EST_REQ, nmsg, 0); } @@ -3623,6 +3628,11 @@ static int gsm48_rr_tx_ass_cpl(struct osmocom_ms *ms, uint8_t cause) /* RR_CAUSE */ ac->rr_cause = cause; + /* set T200 of SAPI 0 */ + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_sec = + T200_DCCH; + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_usec = 0; + return gsm48_send_rsl(ms, RSL_MT_RES_REQ, nmsg, 0); } @@ -3990,6 +4000,11 @@ static int gsm48_rr_tx_hando_cpl(struct osmocom_ms *ms, uint8_t cause) // FIXME: mobile observed time + /* set T200 of SAPI 0 */ + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_sec = + T200_DCCH; + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_usec = 0; + return gsm48_send_rsl(ms, RSL_MT_RES_REQ, nmsg, 0); } @@ -5025,6 +5040,13 @@ static int gsm48_rr_estab_ind_sapi3(struct osmocom_ms *ms, struct msgb *msg) LOGP(DSUM, LOGL_INFO, "Radio link SAPI3 is established\n"); + if ((link_id & 0xf8) == 0x00) { + /* raise T200 of SAPI 0 */ + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_sec = + T200_DCCH_SHARED; + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_usec= 0; + } + /* send inication to upper layer */ nmsg = gsm48_rr_msgb_alloc(GSM48_RR_EST_IND); if (!nmsg) @@ -5101,6 +5123,11 @@ static int gsm48_rr_rel_ind_sapi3(struct osmocom_ms *ms, struct msgb *msg) LOGP(DSUM, LOGL_INFO, "Radio link SAPI3 is released\n"); + /* lower T200 of SAPI 0 */ + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_sec = + T200_DCCH; + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_usec = 0; + /* send inication to upper layer */ nmsg = gsm48_rr_msgb_alloc(GSM48_RR_REL_IND); if (!nmsg) @@ -5140,6 +5167,10 @@ static int gsm48_rr_est_req_sapi3(struct osmocom_ms *ms, struct msgb *msg) LOGP(DRR, LOGL_INFO, "Requesting DCCH link, because no TCH " "(sapi %d)\n", sapi); rr->sapi3_link_id = 0x00 | sapi; /* SAPI 3, DCCH */ + /* raise T200 of SAPI 0 */ + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_sec = + T200_DCCH_SHARED; + ms->lapdm_channel.lapdm_dcch.datalink[DL_SAPI0].dl.t200_usec= 0; } else { LOGP(DRR, LOGL_INFO, "Requesting ACCH link, because TCH " "(sapi %d)\n", sapi);