mirror of https://gerrit.osmocom.org/libosmocore
add gsm0808 channel enum to IE val conversion functions
Add: - gsm0808_current_channel_type_1() - gsm0808_permitted_speech() - gsm0808_chosen_channel() - gsm0808_channel_type_name() gsm0808_permitted_speech() is moved from osmo-bsc's bssap_speech_from_lchan(); gsm0808_chosen_channel() is moved from osmo-bsc's lchan_to_chosen_channel(); Rationale: will be re-used by inter-BSC handover, makes sense to keep with the other gsm0808 utils. Related: OS#2283 (inter-BSC handover, BSC side) Change-Id: I8a3cc5d4548e9a78d945d54c69ccced251edcec9
This commit is contained in:
parent
1284c3e961
commit
afacc2be9f
|
@ -26,7 +26,9 @@
|
|||
struct sockaddr_storage;
|
||||
|
||||
#include <osmocom/gsm/protocol/gsm_08_08.h>
|
||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||
#include <osmocom/gsm/gsm23003.h>
|
||||
#include <osmocom/gsm/gsm_utils.h>
|
||||
|
||||
/*! (225-1)/2 is the maximum number of elements in a cell identifier list. */
|
||||
#define GSM0808_CELL_ID_LIST2_MAXLEN 127
|
||||
|
@ -102,4 +104,109 @@ int gsm0808_chan_type_to_speech_codec(uint8_t perm_spch);
|
|||
int gsm0808_speech_codec_from_chan_type(struct gsm0808_speech_codec *sc,
|
||||
uint8_t perm_spch);
|
||||
|
||||
/*! Return 3GPP TS 48.008 3.2.2.49 Current Channel Type 1 from enum gsm_chan_t. */
|
||||
static inline uint8_t gsm0808_current_channel_type_1(enum gsm_chan_t type)
|
||||
{
|
||||
switch (type) {
|
||||
default:
|
||||
return 0;
|
||||
case GSM_LCHAN_SDCCH:
|
||||
return 0x01;
|
||||
case GSM_LCHAN_TCH_F:
|
||||
return 0x18;
|
||||
case GSM_LCHAN_TCH_H:
|
||||
return 0x19;
|
||||
}
|
||||
}
|
||||
|
||||
/*! Return 3GPP TS 48.008 3.2.2.51 Speech Version aka permitted speech version indication in 3.2.2.11
|
||||
* Channel Type. */
|
||||
static inline enum gsm0808_permitted_speech gsm0808_permitted_speech(enum gsm_chan_t type,
|
||||
enum gsm48_chan_mode mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case GSM48_CMODE_SPEECH_V1:
|
||||
switch (type) {
|
||||
case GSM_LCHAN_TCH_F:
|
||||
return GSM0808_PERM_FR1;
|
||||
case GSM_LCHAN_TCH_H:
|
||||
return GSM0808_PERM_HR1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
case GSM48_CMODE_SPEECH_EFR:
|
||||
switch (type) {
|
||||
case GSM_LCHAN_TCH_F:
|
||||
return GSM0808_PERM_FR2;
|
||||
case GSM_LCHAN_TCH_H:
|
||||
return GSM0808_PERM_HR2;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
case GSM48_CMODE_SPEECH_AMR:
|
||||
switch (type) {
|
||||
case GSM_LCHAN_TCH_F:
|
||||
return GSM0808_PERM_HR3;
|
||||
case GSM_LCHAN_TCH_H:
|
||||
return GSM0808_PERM_HR3;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*! Return 3GPP TS 48.008 3.2.2.33 Chosen Channel. */
|
||||
static inline uint8_t gsm0808_chosen_channel(enum gsm_chan_t type, enum gsm48_chan_mode mode)
|
||||
{
|
||||
uint8_t channel_mode = 0, channel = 0;
|
||||
|
||||
switch (mode) {
|
||||
case GSM48_CMODE_SPEECH_V1:
|
||||
case GSM48_CMODE_SPEECH_EFR:
|
||||
case GSM48_CMODE_SPEECH_AMR:
|
||||
channel_mode = 0x9;
|
||||
break;
|
||||
case GSM48_CMODE_SIGN:
|
||||
channel_mode = 0x8;
|
||||
break;
|
||||
case GSM48_CMODE_DATA_14k5:
|
||||
channel_mode = 0xe;
|
||||
break;
|
||||
case GSM48_CMODE_DATA_12k0:
|
||||
channel_mode = 0xb;
|
||||
break;
|
||||
case GSM48_CMODE_DATA_6k0:
|
||||
channel_mode = 0xc;
|
||||
break;
|
||||
case GSM48_CMODE_DATA_3k6:
|
||||
channel_mode = 0xd;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case GSM_LCHAN_NONE:
|
||||
channel = 0x0;
|
||||
break;
|
||||
case GSM_LCHAN_SDCCH:
|
||||
channel = 0x1;
|
||||
break;
|
||||
case GSM_LCHAN_TCH_F:
|
||||
channel = 0x8;
|
||||
break;
|
||||
case GSM_LCHAN_TCH_H:
|
||||
channel = 0x9;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return channel_mode << 4 | channel;
|
||||
}
|
||||
|
||||
const char *gsm0808_channel_type_name(const struct gsm0808_channel_type *ct);
|
||||
|
||||
/*! @} */
|
||||
|
|
|
@ -1273,4 +1273,13 @@ const char *gsm0808_cell_id_list_name(const struct gsm0808_cell_id_list2 *cil)
|
|||
#undef APPEND_STR
|
||||
#undef APPEND_CELL_ID_U
|
||||
|
||||
const char *gsm0808_channel_type_name(const struct gsm0808_channel_type *ct)
|
||||
{
|
||||
static char buf[128];
|
||||
snprintf(buf, sizeof(buf), "ch_indctr=0x%x ch_rate_type=0x%x perm_spch=%s",
|
||||
ct->ch_indctr, ct->ch_rate_type,
|
||||
osmo_hexdump(ct->perm_spch, ct->perm_spch_len));
|
||||
return buf;
|
||||
}
|
||||
|
||||
/*! @} */
|
||||
|
|
|
@ -188,6 +188,7 @@ gsm0808_cell_id_u_name;
|
|||
gsm0808_chan_type_to_speech_codec;
|
||||
gsm0808_speech_codec_from_chan_type;
|
||||
gsm0808_speech_codec_type_names;
|
||||
gsm0808_channel_type_name;
|
||||
|
||||
gsm0858_rsl_ul_meas_enc;
|
||||
|
||||
|
|
Loading…
Reference in New Issue