aboutsummaryrefslogtreecommitdiffstats
path: root/src/abis_rsl.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2008-12-27 19:46:06 +0000
committerHarald Welte <laforge@gnumonks.org>2008-12-27 19:46:06 +0000
commit2d5b638bd373eeb88e0d1c9bd10dd14e4d0b6405 (patch)
tree733cd59d841046e33637b66d3bd74d6754b40c38 /src/abis_rsl.c
parente30dbb3fa35c301ef9116eac91a4b7f04a972a61 (diff)
* fix sending of wrong message discriminator for dedicated channel RSL msgs
* remove dead old code for TCH/SDCCH activation * fix RF CHANNEL RELEASE logic + integration with lchan_alloc/free * use Page Mode SAME and not NORMAL
Diffstat (limited to 'src/abis_rsl.c')
-rw-r--r--src/abis_rsl.c78
1 files changed, 14 insertions, 64 deletions
diff --git a/src/abis_rsl.c b/src/abis_rsl.c
index 914517360..60713785b 100644
--- a/src/abis_rsl.c
+++ b/src/abis_rsl.c
@@ -49,7 +49,7 @@ static u_int8_t mdisc_by_msgtype(u_int8_t msg_type)
else
return ABIS_RSL_MDISC_COM_CHAN;
}
- if ((msg_type & 0xc) == 0x00)
+ if ((msg_type & 0xe0) == 0x20)
return ABIS_RSL_MDISC_DED_CHAN;
return ABIS_RSL_MDISC_LOC;
@@ -290,52 +290,6 @@ int rsl_chan_activate(struct gsm_bts *bts, u_int8_t chan_nr,
#define TSC 7
-int rsl_chan_activate_tch_f(struct gsm_bts_trx_ts *ts)
-{
- u_int8_t chan_nr = rsl_enc_chan_nr(RSL_CHAN_Bm_ACCHs, 0, ts->nr);
- u_int16_t arfcn = ts->trx->arfcn;
- struct rsl_ie_chan_mode cm;
- struct rsl_ie_chan_ident ci;
-
- cm.dtx_dtu = 0;
- cm.spd_ind = RSL_CMOD_SPD_SPEECH;
- cm.chan_rt = RSL_CMOD_CRT_TCH_Bm;
- cm.chan_rate = RSL_CMOD_SP_GSM1;
-
- ci.chan_desc.iei = 0x64;
- ci.chan_desc.chan_nr = chan_nr;
- /* FIXME: this doesn't support hopping */
- ci.chan_desc.oct3 = (TSC << 5) | ((arfcn & 0x3ff) >> 8);
- ci.chan_desc.oct4 = arfcn & 0xff;
-#if 0
- ci.mobile_alloc.tag = 0x72;
- ci.mobile_alloc.len = 0; /* as per Section 9.3.5 */
-#endif
-
- return rsl_chan_activate(ts->trx->bts, chan_nr, 0x01, &cm, &ci, 0x01, 0x0f, 0x00);
-}
-
-int rsl_chan_activate_sdcch4(struct gsm_bts_trx_ts *ts, int subslot)
-{
- u_int8_t chan_nr = rsl_enc_chan_nr(RSL_CHAN_SDCCH4_ACCH, subslot, ts->nr);
- u_int16_t arfcn = ts->trx->arfcn;
- struct rsl_ie_chan_mode cm;
- struct rsl_ie_chan_ident ci;
-
- cm.dtx_dtu = 0x00;
- cm.spd_ind = RSL_CMOD_SPD_SIGN;
- cm.chan_rt = RSL_CMOD_CRT_SDCCH;
- cm.chan_rate = 0x00;
-
- ci.chan_desc.iei = 0x64;
- ci.chan_desc.chan_nr = chan_nr;
- ci.chan_desc.oct3 = (TSC << 5) | ((arfcn & 0x3ff) >> 8);
- ci.chan_desc.oct4 = arfcn & 0xff;
-
- /* FIXME: we're sending BS power IE, which Abissim doesn't */
- return rsl_chan_activate(ts->trx->bts, chan_nr, 0x00, &cm, &ci, 0x01, 0x0f, 0x00);
-}
-
int rsl_chan_activate_lchan(struct gsm_lchan *lchan, u_int8_t act_type, u_int8_t ta)
{
struct abis_rsl_dchan_hdr *dh;
@@ -404,6 +358,8 @@ int rsl_chan_release(struct gsm_lchan *lchan)
msg->lchan = lchan;
msg->trx = lchan->ts->trx;
+ DEBUGP(DRSL, "Channel Release CMD, chan_nr=0x%02x\n", dh->chan_nr);
+
return abis_rsl_sendmsg(msg);
}
@@ -542,19 +498,21 @@ static int abis_rsl_rx_dchan(struct msgb *msg)
rc = rsl_rx_chan_act_nack(msg);
break;
case RSL_MT_CONN_FAIL:
- DEBUGP(DRSL, "rsl_rx_dchan: Connection Fail, release channel\n");
+ DEBUGP(DRSL, "Connection Fail, release channel\n");
rc = rsl_chan_release(msg->lchan);
- /* FIXME: only free it after channel release ACK */
- lchan_free(msg->lchan);
+ /* only free it after channel release ACK */
break;
case RSL_MT_MEAS_RES:
- DEBUGP(DRSL, "rsl_rx_dchan: Measurement Result\n");
+ DEBUGP(DRSL, "Measurement Result\n");
+ break;
+ case RSL_MT_RF_CHAN_REL_ACK:
+ DEBUGP(DRSL, "RF CHANNEL RELEASE ACK chan_nr=0x%02x\n", rslh->chan_nr);
+ lchan_free(msg->lchan);
break;
case RSL_MT_MODE_MODIFY_ACK:
case RSL_MT_MODE_MODIFY_NACK:
case RSL_MT_PHY_CONTEXT_CONF:
case RSL_MT_PREPROC_MEAS_RES:
- case RSL_MT_RF_CHAN_REL_ACK:
case RSL_MT_TALKER_DET:
case RSL_MT_LISTENER_DET:
case RSL_MT_REMOTE_CODEC_CONF_REP:
@@ -655,22 +613,14 @@ static int rsl_rx_chan_rqd(struct msgb *msg)
DEBUGP(DRSL, "Activating ARFCN(%u) TS(%u) SS(%u) lctype %u\n",
arfcn, ts_number, subch, lchan->type);
-#if 0
- /* send CHANNEL ACTIVATION on RSL to BTS */
- if (lchan->ts->pchan == GSM_PCHAN_CCCH_SDCCH4)
- rsl_chan_activate_sdcch4(lchan->ts, subch);
- else
- rsl_chan_activate_tch_f(lchan->ts);
-#else
rsl_chan_activate_lchan(lchan, 0x00, rqd_ta);
-#endif
/* create IMMEDIATE ASSIGN 04.08 messge */
memset(&ia, 0, sizeof(ia));
ia.l2_plen = 0x2d;
ia.proto_discr = GSM48_PDISC_RR;
ia.msg_type = GSM48_MT_RR_IMM_ASS;
- ia.page_mode = GSM48_PM_NORMAL;
+ ia.page_mode = GSM48_PM_SAME;
ia.chan_desc.chan_nr = lchan2chan_nr(lchan);
ia.chan_desc.h0.h = 0;
ia.chan_desc.h0.arfcn_high = arfcn >> 8;
@@ -753,9 +703,9 @@ static int abis_rsl_rx_rll(struct msgb *msg)
break;
case RSL_MT_REL_IND:
DEBUGP(DRLL, "RELEASE INDICATION chan_nr=0x%02x\n", rllh->chan_nr);
- rc = rsl_chan_release(msg->lchan);
- /* FIXME: only free it after channel release ACK */
- lchan_free(msg->lchan);
+ break;
+ case RSL_MT_REL_CONF:
+ DEBUGP(DRLL, "RELEASE CONFIRMATION chan_nr=0x%02x\n", rllh->chan_nr);
break;
case RSL_MT_ERROR_IND:
rc = rsl_rx_rll_err_ind(msg);