From da78376396386dd370d05ce41c32bf38f1f7d311 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 18 Feb 2009 03:29:53 +0000 Subject: [PATCH] * ensure TCH/F are activated signalling-only * add function for RSL CHANNEL MODIFY REQUEST * add missing channel activation function to header file --- include/openbsc/abis_rsl.h | 5 ++-- src/abis_rsl.c | 50 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/include/openbsc/abis_rsl.h b/include/openbsc/abis_rsl.h index 160e2807d..31094548a 100644 --- a/include/openbsc/abis_rsl.h +++ b/include/openbsc/abis_rsl.h @@ -377,8 +377,9 @@ int rsl_chan_activate(struct gsm_bts_trx *trx, u_int8_t chan_nr, struct rsl_ie_chan_ident *chan_ident, u_int8_t bs_power, u_int8_t ms_power, u_int8_t ta); -int rsl_chan_activate_tch_f(struct gsm_bts_trx_ts *ts); -int rsl_chan_activate_sdcch(struct gsm_bts_trx_ts *ts); +int rsl_chan_activate_lchan(struct gsm_lchan *lchan, u_int8_t act_type, + u_int8_t ta); +int rsl_chan_mode_modify_req(struct gsm_lchan *ts); int rsl_paging_cmd(struct gsm_bts *bts, u_int8_t paging_group, u_int8_t len, u_int8_t *ms_ident, u_int8_t chan_needed); int rsl_paging_cmd_subscr(struct gsm_bts *bts, u_int8_t chan_needed, diff --git a/src/abis_rsl.c b/src/abis_rsl.c index 2eb100912..af5c834b5 100644 --- a/src/abis_rsl.c +++ b/src/abis_rsl.c @@ -397,9 +397,10 @@ int rsl_chan_activate_lchan(struct gsm_lchan *lchan, u_int8_t act_type, cm.chan_rate = 0x00; break; case GSM_LCHAN_TCH_F: - cm.spd_ind = RSL_CMOD_SPD_SPEECH; + /* TCH/F are always activated in signalling mode first */ + cm.spd_ind = RSL_CMOD_SPD_SIGN; cm.chan_rt = RSL_CMOD_CRT_TCH_Bm; - cm.chan_rate = 0x11; /* speech coding alg version 2*/ + cm.chan_rate = 0x00; break; case GSM_LCHAN_TCH_H: DEBUGP(DRSL, "Unimplemented TCH_H activation\n"); @@ -437,6 +438,44 @@ int rsl_chan_activate_lchan(struct gsm_lchan *lchan, u_int8_t act_type, return abis_rsl_sendmsg(msg); } +/* Chapter 8.4.9 */ +int rsl_chan_mode_modify_req(struct gsm_lchan *lchan) +{ + struct abis_rsl_dchan_hdr *dh; + struct msgb *msg = rsl_msgb_alloc(); + + u_int8_t chan_nr = lchan2chan_nr(lchan); + struct rsl_ie_chan_mode cm; + + /* FIXME: what to do with data calls ? */ + cm.dtx_dtu = 0x00; + switch (lchan->type) { + case GSM_LCHAN_TCH_F: + cm.spd_ind = RSL_CMOD_SPD_SPEECH; + cm.chan_rt = RSL_CMOD_CRT_TCH_Bm; + cm.chan_rate = 0x11; /* speech coding alg version 2*/ + break; + default: + DEBUGP(DRSL, "Unimplemented channel modification\n"); + return -1; + } + + dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh)); + init_dchan_hdr(dh, RSL_MT_MODE_MODIFY_REQ); + dh->chan_nr = chan_nr; + + msgb_tlv_put(msg, RSL_IE_CHAN_MODE, sizeof(cm), + (u_int8_t *) &cm); +#if 0 + msgb_tlv_put(msg, RSL_IE_ENCR_INFO, 1, + (u_int8_t *) &encr_info); +#endif + + msg->trx = lchan->ts->trx; + + return abis_rsl_sendmsg(msg); +} + /* Chapter 9.1.7 of 04.08 */ int rsl_chan_release(struct gsm_lchan *lchan) { @@ -614,7 +653,13 @@ static int abis_rsl_rx_dchan(struct msgb *msg) lchan_free(msg->lchan); break; case RSL_MT_MODE_MODIFY_ACK: + DEBUGP(DRSL, "RSL CHANNEL MODE MODIFY ACK chan_nr=0x%02x\n", + rslh->chan_nr); + break; case RSL_MT_MODE_MODIFY_NACK: + DEBUGP(DRSL, "RSL CHANNEL MODE MODIFY NACK chan_nr=0x%02x\n", + rslh->chan_nr); + break; case RSL_MT_PHY_CONTEXT_CONF: case RSL_MT_PREPROC_MEAS_RES: case RSL_MT_TALKER_DET: @@ -907,6 +952,7 @@ int rsl_ipacc_connect(struct gsm_lchan *lchan, u_int32_t ip, u_int16_t port, u_i att_ip[2] = ip >> 16; att_ip[3] = ip >> 8; att_ip[4] = ip & 0xff; + //att_ip[4] = 11; att_port = msgb_put(msg, sizeof(port)+1); att_port[0] = RSL_IE_IPAC_REMOTE_PORT;