From ecf9dd0d9680882b7c9df5e9bdfdb3dd58a069ac Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 4 Mar 2010 14:27:48 +0100 Subject: add new rsl_dec_chan_nr() function --- include/osmocore/rsl.h | 2 ++ src/rsl.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/osmocore/rsl.h b/include/osmocore/rsl.h index 0da05206..4c5f75b8 100644 --- a/include/osmocore/rsl.h +++ b/include/osmocore/rsl.h @@ -13,6 +13,8 @@ extern const struct tlv_definition rsl_att_tlvdef; /* encode channel number as per Section 9.3.1 */ uint8_t rsl_enc_chan_nr(uint8_t type, uint8_t subch, uint8_t timeslot); +/* decode channel number as per Section 9.3.1 */ +int rsl_dec_chan_nr(uint8_t chan_nr, uint8_t *type, uint8_t *subch, uint8_t *timeslot); const struct value_string rsl_rlm_cause_strs[]; diff --git a/src/rsl.c b/src/rsl.c index 58afc9de..ca2f7dea 100644 --- a/src/rsl.c +++ b/src/rsl.c @@ -21,6 +21,9 @@ * */ +#include +#include + #include #include @@ -142,6 +145,37 @@ uint8_t rsl_enc_chan_nr(uint8_t type, uint8_t subch, uint8_t timeslot) return ret; } +int rsl_dec_chan_nr(uint8_t chan_nr, uint8_t *type, uint8_t *subch, uint8_t *timeslot) +{ + *timeslot = chan_nr & 0x7; + + if ((chan_nr & 0xf8) == RSL_CHAN_Bm_ACCHs) { + *type = RSL_CHAN_Bm_ACCHs; + *subch = 0; + } else if ((chan_nr & 0xf0) == RSL_CHAN_Lm_ACCHs) { + *type = RSL_CHAN_Lm_ACCHs; + *subch = (chan_nr >> 3) & 0x1; + } else if ((chan_nr & 0xe0) == RSL_CHAN_SDCCH4_ACCH) { + *type = RSL_CHAN_SDCCH4_ACCH; + *subch = (chan_nr >> 3) & 0x3; + } else if ((chan_nr & 0xc0) == RSL_CHAN_SDCCH8_ACCH) { + *type = RSL_CHAN_SDCCH8_ACCH; + *subch = (chan_nr >> 3) & 0x7; + } else if (chan_nr == 0x10) { + *type = RSL_CHAN_BCCH; + *subch = 0; + } else if (chan_nr == 0x11) { + *type = RSL_CHAN_RACH; + *subch = 0; + } else if (chan_nr == 0x12) { + *type = RSL_CHAN_PCH_AGCH; + *subch = 0; + } else + return -EINVAL; + + return 0; +} + /* FIXME: convert to value_string */ static const char *rsl_err_vals[0xff] = { [RSL_ERR_RADIO_IF_FAIL] = "Radio Interface Failure", -- cgit v1.2.3