Review at  https://gerrit.osmocom.org/7844

add gsm0808 channel enum to IE val conversion functions

Add:
- gsm0808_current_channel_type_1()
- gsm0808_permitted_speech()
- gsm0808_chosen_channel()

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
---
M include/osmocom/gsm/gsm0808_utils.h
1 file changed, 104 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/44/7844/1

diff --git a/include/osmocom/gsm/gsm0808_utils.h 
b/include/osmocom/gsm/gsm0808_utils.h
index c007c28..95bb315 100644
--- a/include/osmocom/gsm/gsm0808_utils.h
+++ b/include/osmocom/gsm/gsm0808_utils.h
@@ -27,6 +27,7 @@
 
 #include <osmocom/gsm/protocol/gsm_08_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
@@ -101,4 +102,107 @@
 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;
+}
+
 /*! @} */

-- 
To view, visit https://gerrit.osmocom.org/7844
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8a3cc5d4548e9a78d945d54c69ccced251edcec9
Gerrit-PatchSet: 1
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: Neels Hofmeyr <[email protected]>

Reply via email to