aboutsummaryrefslogtreecommitdiffstats
path: root/src/gsm/gsm_utils.c
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2016-05-11 17:33:17 +0200
committerHolger Freyther <holger@freyther.de>2016-05-17 16:10:31 +0000
commit764b022fc69c4bb9816e12801186f8fa25f8dd72 (patch)
treeadf301660c4fbedc31c820815d763949957fb47f /src/gsm/gsm_utils.c
parentfe65fa7e36a400d362666e2c5bd0f289d45aa56a (diff)
Add function to make Uplink Measurement
It assembles RSL Uplink Measurement IE according to 3GPP TS 08.58 §9.3.25. The function is based on lchan_build_rsl_ul_meas() from OsmoBTS but optionally includes DTX information. Change-Id: Ib37107bcc9909e5105ea711de42d3fb1db7e8d9e Reviewed-on: https://gerrit.osmocom.org/44 Tested-by: Jenkins Builder Reviewed-by: Harald Welte <laforge@gnumonks.org>
Diffstat (limited to 'src/gsm/gsm_utils.c')
-rw-r--r--src/gsm/gsm_utils.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/gsm/gsm_utils.c b/src/gsm/gsm_utils.c
index 50029479..7365ab7c 100644
--- a/src/gsm/gsm_utils.c
+++ b/src/gsm/gsm_utils.c
@@ -66,11 +66,13 @@
#include <osmocom/core/utils.h>
#include <osmocom/core/bitvec.h>
#include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/gsm/meas_rep.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
+#include <stdbool.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
@@ -335,6 +337,24 @@ int gsm_7bit_encode_n_ussd(uint8_t *result, size_t n, const char *data, int *oct
return y;
}
+/*! \brief Build the RSL uplink measurement IE (3GPP TS 08.58 § 9.3.25)
+ * \param[in] mru Unidirectional measurement report structure
+ * \param[in] dtxd_used Indicates if DTXd was used during measurement report
+ * period
+ * \param[out] buf Pre-allocated bufer for storing IE
+ * \returns Number of bytes filled in buf
+ */
+size_t gsm0858_rsl_ul_meas_enc(struct gsm_meas_rep_unidir *mru, bool dtxd_used,
+ uint8_t *buf)
+{
+ buf[0] = dtxd_used ? (1 << 6) : 0;
+ buf[0] |= (mru->full.rx_lev & 0x3f);
+ buf[1] = (mru->sub.rx_lev & 0x3f);
+ buf[2] = ((mru->full.rx_qual & 7) << 3) | (mru->sub.rx_qual & 7);
+
+ return 3;
+}
+
/* convert power class to dBm according to GSM TS 05.05 */
unsigned int ms_class_gmsk_dbm(enum gsm_band band, int class)
{