aboutsummaryrefslogtreecommitdiffstats
path: root/src/abis_rsl.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2009-02-18 03:29:53 +0000
committerHarald Welte <laforge@gnumonks.org>2009-02-18 03:29:53 +0000
commitda78376396386dd370d05ce41c32bf38f1f7d311 (patch)
tree051b22a7e7c8ca7d21e1d75c3e50a44fc62c1296 /src/abis_rsl.c
parent8e4ae95e0b274de32fb45912a00128525d3c2080 (diff)
* ensure TCH/F are activated signalling-only
* add function for RSL CHANNEL MODIFY REQUEST * add missing channel activation function to header file
Diffstat (limited to 'src/abis_rsl.c')
-rw-r--r--src/abis_rsl.c50
1 files changed, 48 insertions, 2 deletions
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;