diff options
Diffstat (limited to 'src/common/rsl.c')
-rw-r--r-- | src/common/rsl.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/common/rsl.c b/src/common/rsl.c index 000c1797..ff9833d4 100644 --- a/src/common/rsl.c +++ b/src/common/rsl.c @@ -1,7 +1,7 @@ /* GSM TS 08.58 RSL, BTS Side */ /* (C) 2011 by Andreas Eversberg <jolly@eversberg.eu> - * (C) 2011-2013 by Harald Welte <laforge@gnumonks.org> + * (C) 2011-2014 by Harald Welte <laforge@gnumonks.org> * * All Rights Reserved * @@ -46,6 +46,7 @@ #include <osmo-bts/measurement.h> #include <osmo-bts/pcu_if.h> #include <osmo-bts/handover.h> +#include <osmo-bts/cbch.h> //#define FAKE_CIPH_MODE_COMPL @@ -414,6 +415,26 @@ static int rsl_rx_paging_cmd(struct gsm_bts_trx *trx, struct msgb *msg) return 0; } +/* 8.5.8 SMS BROADCAST COMMAND */ +static int rsl_rx_sms_bcast_cmd(struct gsm_bts_trx *trx, struct msgb *msg) +{ + struct tlv_parsed tp; + struct rsl_ie_cb_cmd_type *cb_cmd_type; + + rsl_tlv_parse(&tp, msgb_l3(msg), msgb_l3len(msg)); + + if (!TLVP_PRESENT(&tp, RSL_IE_CB_CMD_TYPE) || + !TLVP_PRESENT(&tp, RSL_IE_SMSCB_MSG)) + return rsl_tx_error_report(trx, RSL_ERR_MAND_IE_ERROR); + + cb_cmd_type = (struct rsl_ie_cb_cmd_type *) + TLVP_VAL(&tp, RSL_IE_CB_CMD_TYPE); + + return bts_process_smscb_cmd(trx->bts, *cb_cmd_type, + TLVP_LEN(&tp, RSL_IE_SMSCB_MSG), + TLVP_VAL(&tp, RSL_IE_SMSCB_MSG)); +} + /* 8.6.2 SACCH FILLING */ static int rsl_rx_sacch_fill(struct gsm_bts_trx *trx, struct msgb *msg) { @@ -1688,8 +1709,10 @@ static int rsl_rx_cchan(struct gsm_bts_trx *trx, struct msgb *msg) case RSL_MT_PAGING_CMD: ret = rsl_rx_paging_cmd(trx, msg); break; - case RSL_MT_SMS_BC_REQ: case RSL_MT_SMS_BC_CMD: + ret = rsl_rx_sms_bcast_cmd(trx, msg); + break; + case RSL_MT_SMS_BC_REQ: case RSL_MT_NOT_CMD: LOGP(DRSL, LOGL_NOTICE, "unimplemented RSL cchan msg_type %s\n", rsl_msg_name(cch->c.msg_type)); |