aboutsummaryrefslogtreecommitdiffstats
path: root/src/common/rsl.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2012-06-15 11:07:03 +0800
committerHarald Welte <laforge@gnumonks.org>2012-06-15 11:07:03 +0800
commit821bf067e408f649bed62f10683fd44b43c0d673 (patch)
tree1240ff85da82df229f36fc051af7d06d43b905d7 /src/common/rsl.c
parentc882b85d8c867264a0fe038dfe34bf204f5e3f32 (diff)
RSL: Add CCCH LOAD INDICATION for RACH
We now count the total number of RACH slots, the number with rx level above the busy threshold, and the number of valid access bursts. This data is used to generate RSL CCCH LOAD INDICATION for the RACH.
Diffstat (limited to 'src/common/rsl.c')
-rw-r--r--src/common/rsl.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/src/common/rsl.c b/src/common/rsl.c
index 370e2f76..509d79f9 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -342,13 +342,35 @@ int rsl_tx_ccch_load_ind_pch(struct gsm_bts *bts, uint16_t paging_avail)
msg = rsl_msgb_alloc(sizeof(struct abis_rsl_common_hdr));
if (!msg)
return -ENOMEM;
- rsl_trx_push_hdr(msg, RSL_MT_CCCH_LOAD_IND);
+ rsl_cch_push_hdr(msg, RSL_MT_CCCH_LOAD_IND, RSL_CHAN_PCH_AGCH);
msgb_tv16_put(msg, RSL_IE_PAGING_LOAD, paging_avail);
msg->trx = bts->c0;
return abis_rsl_sendmsg(msg);
}
+/* 8.5.2 CCCH Load Indication (RACH) */
+int rsl_tx_ccch_load_ind_rach(struct gsm_bts *bts, uint16_t total,
+ uint16_t busy, uint16_t access)
+{
+ struct msgb *msg;
+
+ msg = rsl_msgb_alloc(sizeof(struct abis_rsl_common_hdr));
+ if (!msg)
+ return -ENOMEM;
+ rsl_cch_push_hdr(msg, RSL_MT_CCCH_LOAD_IND, RSL_CHAN_RACH);
+ /* tag and length */
+ msgb_tv_put(msg, RSL_IE_RACH_LOAD, 6);
+ /* content of the IE */
+ msgb_put_u16(msg, total);
+ msgb_put_u16(msg, busy);
+ msgb_put_u16(msg, access);
+
+ msg->trx = bts->c0;
+
+ return abis_rsl_sendmsg(msg);
+}
+
/* 8.5.5 PAGING COMMAND */
static int rsl_rx_paging_cmd(struct gsm_bts_trx *trx, struct msgb *msg)
{
@@ -379,27 +401,6 @@ static int rsl_rx_paging_cmd(struct gsm_bts_trx *trx, struct msgb *msg)
return 0;
}
-int rsl_tx_ccch_load_ind_rach(struct gsm_bts *bts, uint16_t rach_slots,
- uint16_t rach_busy, uint16_t rach_access)
-{
- struct msgb *msg;
- uint16_t payload[3];
-
- payload[0] = htons(rach_slots);
- payload[1] = htons(rach_busy);
- payload[2] = htons(rach_access);
-
- msg = rsl_msgb_alloc(sizeof(struct abis_rsl_common_hdr));
- if (!msg)
- return -ENOMEM;
-
- msgb_tlv_put(msg, RSL_IE_RACH_LOAD, 6, (uint8_t *)payload);
- rsl_trx_push_hdr(msg, RSL_MT_CCCH_LOAD_IND);
- msg->trx = bts->c0;
-
- return abis_rsl_sendmsg(msg);
-}
-
/* 8.6.2 SACCH FILLING */
static int rsl_rx_sacch_fill(struct gsm_bts_trx *trx, struct msgb *msg)
{