|
libosmogsm 1.11.0.52-28973f
Osmocom GSM library
|
#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 <osmocom/gsm/gsm0502.h>#include <stdlib.h>#include <stdint.h>#include <string.h>#include <stdbool.h>#include <stdio.h>#include <errno.h>#include <ctype.h>#include <inttypes.h>#include <time.h>#include <unistd.h>#include "config.h"Data Structures | |
| struct | gsm_freq_range |
Macros | |
| #define | GSM_RFN_THRESHOLD (GSM_RFN_MODULUS / 2) |
Functions | |
| static int | gsm_septet_lookup (uint8_t ch) |
| uint8_t | gsm_get_octet_len (const uint8_t sept_len) |
| Compute number of octets from number of septets. More... | |
| int | gsm_7bit_decode_n_hdr (char *text, size_t n, const uint8_t *user_data, uint8_t septet_l, uint8_t ud_hdr_ind) |
| TS 03.38 7-bit Character unpacking (6.2.1) More... | |
| int | gsm_7bit_decode_n (char *text, size_t n, const uint8_t *user_data, uint8_t septet_l) |
| Decode 7bit GSM Alphabet. More... | |
| int | gsm_7bit_decode_n_ussd (char *text, size_t n, const uint8_t *user_data, uint8_t length) |
| Decode 7bit GSM Alphabet (USSD) More... | |
| int | gsm_septet_encode (uint8_t *result, const char *data) |
| Encode a ASCII characterrs as 7-bit GSM alphabet (TS 03.38) More... | |
| int | gsm_septet_pack (uint8_t *result, const uint8_t *rdata, size_t septet_len, uint8_t padding) |
| GSM Default Alphabet 7bit to octet packing. More... | |
| int | gsm_septets2octets (uint8_t *result, const uint8_t *rdata, uint8_t septet_len, uint8_t padding) |
| Backwards compatibility wrapper for gsm_septets_pack(), deprecated. More... | |
| int | gsm_7bit_encode_n (uint8_t *result, size_t n, const char *data, int *octets) |
| GSM 7-bit alphabet TS 03.38 6.2.1 Character packing. More... | |
| int | gsm_7bit_encode_n_ussd (uint8_t *result, size_t n, const char *data, int *octets) |
| Encode according to GSM 7-bit alphabet (TS 03.38 6.2.1) for USSD. More... | |
| int | osmo_get_rand_id (uint8_t *out, size_t len) |
| Generate random identifier We use /dev/urandom (default when GRND_RANDOM flag is not set). More... | |
| size_t | gsm0858_rsl_ul_meas_enc (const struct gsm_meas_rep_unidir *mru, bool dtxd_used, uint8_t *buf) |
| Build the RSL uplink measurement IE (3GPP TS 08.58 § 9.3.25) More... | |
| int | ms_class_gmsk_dbm (enum gsm_band band, int class) |
| Convert power class to dBm according to GSM TS 05.05. More... | |
| int | ms_pwr_ctl_lvl (enum gsm_band band, unsigned int dbm) |
| determine power control level for given dBm value, as indicated by the tables in chapter 4.1.1 of GSM TS 05.05 More... | |
| int | ms_pwr_dbm (enum gsm_band band, uint8_t lvl) |
| Convert TS 05.05 power level to absolute dBm value. More... | |
| int | rxlev2dbm (uint8_t rxlev) |
| Convert TS 05.08 RxLev to dBm (TS 05.08 Chapter 8.1.4) More... | |
| uint8_t | dbm2rxlev (int dbm) |
| Convert RF signal level in dBm to TS 05.08 RxLev (TS 05.08 Chapter 8.1.4) More... | |
| const char * | gsm_band_name (enum gsm_band band) |
| Return string name of a given GSM Band. More... | |
| enum gsm_band | gsm_band_parse (const char *mhz) |
| Parse string name of a GSM band. More... | |
| int | gsm_arfcn2band_rc (uint16_t arfcn, enum gsm_band *band) |
| Resolve GSM band from ARFCN. More... | |
| enum gsm_band | gsm_arfcn2band (uint16_t arfcn) |
| Resolve GSM band from ARFCN, aborts process on invalid ARFCN. More... | |
| uint16_t | gsm_arfcn2freq10 (uint16_t arfcn, int uplink) |
| Convert an ARFCN to the frequency in MHz * 10. More... | |
| uint16_t | gsm_freq102arfcn (uint16_t freq10, int uplink) |
| Convert a Frequency in MHz * 10 to ARFCN. More... | |
| void | gsm_fn2gsmtime (struct gsm_time *time, uint32_t fn) |
| Parse GSM Frame Number into struct gsm_time. More... | |
| char * | gsm_fn_as_gsmtime_str (uint32_t fn) |
| Parse GSM Frame Number into printable string. More... | |
| uint32_t | gsm_gsmtime2fn (const struct gsm_time *time) |
| Encode decoded gsm_time to Frame Number. More... | |
| char * | osmo_dump_gsmtime_buf (char *buf, size_t buf_len, const struct gsm_time *tm) |
| char * | osmo_dump_gsmtime (const struct gsm_time *tm) |
| char * | osmo_dump_gsmtime_c (const void *ctx, const struct gsm_time *tm) |
| uint32_t | gsm_rfn2fn (uint16_t rfn, uint32_t curr_fn) |
| void | bitvec_add_range1024 (struct bitvec *bv, const struct gsm48_range_1024 *r) |
| append range1024 encoded data to bit vector More... | |
| int | gprs_tlli_type (uint32_t tlli) |
| Determine GPRS TLLI Type (TS 23.003 Chapter 2.6) More... | |
| uint32_t | gprs_tlli2tmsi (uint32_t tlli) |
| Determine P-TMSI from foreign and local TLLIs. More... | |
| uint32_t | gprs_tmsi2tlli (uint32_t p_tmsi, enum gprs_tlli_type type) |
| Determine TLLI from P-TMSI. More... | |
| int | gsm_7bit_decode (char *text, const uint8_t *user_data, uint8_t septet_l) |
| int | gsm_7bit_decode_ussd (char *text, const uint8_t *user_data, uint8_t length) |
| int | gsm_7bit_encode (uint8_t *result, const char *data) |
| int | gsm_7bit_encode_ussd (uint8_t *result, const char *data, int *octets) |
| int | gsm_7bit_encode_oct (uint8_t *result, const char *data, int *octets) |
Variables | |
| static unsigned char | gsm_7bit_alphabet [] |
| static struct gsm_freq_range | gsm_ranges [] |
| const struct value_string | osmo_rat_type_names [] |
| #define GSM_RFN_THRESHOLD (GSM_RFN_MODULUS / 2) |
| uint8_t dbm2rxlev | ( | int | dbm | ) |
Convert RF signal level in dBm to TS 05.08 RxLev (TS 05.08 Chapter 8.1.4)
| [in] | dbm | RF signal level in dBm |
| uint32_t gprs_tlli2tmsi | ( | uint32_t | tlli | ) |
Determine P-TMSI from foreign and local TLLIs.
| [in] | tlli | P-TMSI |
| [in] | type | TLLI Type we want to derive from p_tmsi |
References gprs_tlli_type(), tlli, TLLI_FOREIGN, and TLLI_LOCAL.
| int gprs_tlli_type | ( | uint32_t | tlli | ) |
Determine GPRS TLLI Type (TS 23.003 Chapter 2.6)
References tlli, TLLI_AUXILIARY, TLLI_FOREIGN, TLLI_G_RNTI, TLLI_LOCAL, TLLI_RAND_G_RNTI, TLLI_RANDOM, and TLLI_RESERVED.
Referenced by gprs_tlli2tmsi().
| uint32_t gprs_tmsi2tlli | ( | uint32_t | p_tmsi, |
| enum gprs_tlli_type | type | ||
| ) |
Determine TLLI from P-TMSI.
| [in] | p_tmsi | P-TMSI |
| [in] | type | TLLI Type we want to derive from p_tmsi |
References tlli, TLLI_FOREIGN, TLLI_LOCAL, and type.
| size_t gsm0858_rsl_ul_meas_enc | ( | const struct gsm_meas_rep_unidir * | mru, |
| bool | dtxd_used, | ||
| uint8_t * | buf | ||
| ) |
Build the RSL uplink measurement IE (3GPP TS 08.58 § 9.3.25)
| [in] | mru | Unidirectional measurement report structure |
| [in] | dtxd_used | Indicates if DTXd was used during measurement report period |
| [out] | buf | Pre-allocated bufer for storing IE |
References gsm_meas_rep_unidir::full, gsm_rx_lev_qual::rx_lev, gsm_rx_lev_qual::rx_qual, and gsm_meas_rep_unidir::sub.
| int gsm_7bit_decode | ( | char * | text, |
| const uint8_t * | user_data, | ||
| uint8_t | septet_l | ||
| ) |
References gsm_7bit_decode_n(), and GSM_7BIT_LEGACY_MAX_BUFFER_SIZE.
| int gsm_7bit_decode_n | ( | char * | text, |
| size_t | n, | ||
| const uint8_t * | user_data, | ||
| uint8_t | septet_l | ||
| ) |
Decode 7bit GSM Alphabet.
Decode a sequence of GSM 03.38 encoded 7 bit characters.
References gsm_7bit_decode_n_hdr(), and n.
Referenced by gsm_7bit_decode().
| int gsm_7bit_decode_n_hdr | ( | char * | text, |
| size_t | n, | ||
| const uint8_t * | user_data, | ||
| uint8_t | septet_l, | ||
| uint8_t | ud_hdr_ind | ||
| ) |
TS 03.38 7-bit Character unpacking (6.2.1)
| [out] | text | Caller-provided output text buffer |
| [in] | n | Length of text |
| [in] | user_data | Input Data (septets) |
| [in] | septet_l | Number of septets in user_data |
| [in] | ud_hdr_ind | User Data Header present in data |
References gsm_7bit_alphabet, gsm_get_octet_len(), gsm_septet_lookup(), l, n, and OSMO_ASSERT.
Referenced by gsm_7bit_decode_n(), and gsm_7bit_decode_n_ussd().
| int gsm_7bit_decode_n_ussd | ( | char * | text, |
| size_t | n, | ||
| const uint8_t * | user_data, | ||
| uint8_t | length | ||
| ) |
Decode 7bit GSM Alphabet (USSD)
Decode a sequence of 7 bit characters (USSD encoding).
References gsm_7bit_decode_n_hdr(), gsm_get_octet_len(), length, and n.
Referenced by gsm_7bit_decode_ussd(), and parse_process_uss_req().
| int gsm_7bit_decode_ussd | ( | char * | text, |
| const uint8_t * | user_data, | ||
| uint8_t | length | ||
| ) |
References gsm_7bit_decode_n_ussd(), GSM_7BIT_LEGACY_MAX_BUFFER_SIZE, and length.
| int gsm_7bit_encode | ( | uint8_t * | result, |
| const char * | data | ||
| ) |
References data, gsm_7bit_encode_n(), and GSM_7BIT_LEGACY_MAX_BUFFER_SIZE.
| int gsm_7bit_encode_n | ( | uint8_t * | result, |
| size_t | n, | ||
| const char * | data, | ||
| int * | octets | ||
| ) |
GSM 7-bit alphabet TS 03.38 6.2.1 Character packing.
Encode a text string into GSM 03.38 encoded 7 bit characters.
| [out] | result | Caller-provided output buffer |
| [in] | n | Maximum length of result in bytes |
| [in] | data | octet-aligned string |
| [out] | octets | Number of octets encoded |
References data, gsm_septet_encode(), gsm_septet_pack(), and n.
Referenced by gsm340_gen_oa(), gsm_7bit_encode(), gsm_7bit_encode_n_ussd(), and gsm_7bit_encode_oct().
| int gsm_7bit_encode_n_ussd | ( | uint8_t * | result, |
| size_t | n, | ||
| const char * | data, | ||
| int * | octets | ||
| ) |
Encode according to GSM 7-bit alphabet (TS 03.38 6.2.1) for USSD.
Encode a text string into GSM 03.38 encoded 7 bit characters (USSD encoding).
| [out] | result | Caller-provided output buffer |
| [in] | n | Maximum length of result in bytes |
| [in] | data | octet-aligned string |
| [out] | octets | Number of octets encoded |
References data, gsm_7bit_encode_n(), and n.
Referenced by gsm0480_create_notifySS(), gsm0480_create_unstructuredSS_Notify(), gsm0480_gen_ussd_resp_7bit(), and gsm_7bit_encode_ussd().
| int gsm_7bit_encode_oct | ( | uint8_t * | result, |
| const char * | data, | ||
| int * | octets | ||
| ) |
References data, gsm_7bit_encode_n(), and GSM_7BIT_LEGACY_MAX_BUFFER_SIZE.
| int gsm_7bit_encode_ussd | ( | uint8_t * | result, |
| const char * | data, | ||
| int * | octets | ||
| ) |
References data, gsm_7bit_encode_n_ussd(), and GSM_7BIT_LEGACY_MAX_BUFFER_SIZE.
| enum gsm_band gsm_arfcn2band | ( | uint16_t | arfcn | ) |
Resolve GSM band from ARFCN, aborts process on invalid ARFCN.
In Osmocom, we use the highest bit of the arfcn to indicate PCS. DEPRECATED: Use gsm_arfcn2band_rc instead.
| [in] | arfcn | Osmocom ARFCN, highest bit determines PCS mode |
References arfcn, gsm_arfcn2band_rc(), and osmo_panic().
| int gsm_arfcn2band_rc | ( | uint16_t | arfcn, |
| enum gsm_band * | band | ||
| ) |
Resolve GSM band from ARFCN.
In Osmocom, we use the highest bit of the arfcn to indicate PCS
| [in] | arfcn | Osmocom ARFCN, highest bit determines PCS mode |
| [out] | band | GSM Band containing \arfcn if arfcn is valid, undetermined otherwise |
References arfcn, ARFCN_PCS, GSM_BAND_1800, GSM_BAND_1900, GSM_BAND_450, GSM_BAND_480, GSM_BAND_750, GSM_BAND_810, GSM_BAND_850, and GSM_BAND_900.
Referenced by gsm_arfcn2band().
| uint16_t gsm_arfcn2freq10 | ( | uint16_t | arfcn, |
| int | uplink | ||
| ) |
Convert an ARFCN to the frequency in MHz * 10.
| [in] | arfcn | GSM ARFCN to convert |
| [in] | uplink | Uplink (1) or Downlink (0) frequency |
References arfcn, gsm_freq_range::arfcn_first, ARFCN_FLAG_MASK, gsm_freq_range::arfcn_last, gsm_freq_range::flags, gsm_freq_range::freq_dl_offset, gsm_freq_range::freq_ul_first, and gsm_ranges.
| const char * gsm_band_name | ( | enum gsm_band | band | ) |
Return string name of a given GSM Band.
References GSM_BAND_1800, GSM_BAND_1900, GSM_BAND_450, GSM_BAND_480, GSM_BAND_750, GSM_BAND_810, GSM_BAND_850, and GSM_BAND_900.
| enum gsm_band gsm_band_parse | ( | const char * | mhz | ) |
Parse string name of a GSM band.
References GSM_BAND_1800, GSM_BAND_1900, GSM_BAND_450, GSM_BAND_480, GSM_BAND_750, GSM_BAND_810, GSM_BAND_850, and GSM_BAND_900.
| void gsm_fn2gsmtime | ( | struct gsm_time * | time, |
| uint32_t | fn | ||
| ) |
Parse GSM Frame Number into struct gsm_time.
| [out] | time | Caller-provided memory for gsm_time |
| [in] | fn | GSM Frame Number |
References time.
Referenced by gsm_fn_as_gsmtime_str(), l2_ph_chan_conf(), and l2_ph_rach_ind().
| char * gsm_fn_as_gsmtime_str | ( | uint32_t | fn | ) |
Parse GSM Frame Number into printable string.
| [in] | fn | GSM Frame Number |
References gsm_time::fn, gsm_fn2gsmtime(), osmo_dump_gsmtime(), and time.
| uint16_t gsm_freq102arfcn | ( | uint16_t | freq10, |
| int | uplink | ||
| ) |
Convert a Frequency in MHz * 10 to ARFCN.
| [in] | freq10 | Frequency in units of 1/10ths of MHz (100kHz) |
| [in] | uplink | Frequency is Uplink (1) or Downlink (0) |
References arfcn, gsm_freq_range::arfcn_first, gsm_freq_range::arfcn_last, ARFCN_UPLINK, gsm_freq_range::flags, gsm_freq_range::freq_dl_offset, gsm_freq_range::freq_ul_first, and gsm_ranges.
| uint8_t gsm_get_octet_len | ( | const uint8_t | sept_len | ) |
Compute number of octets from number of septets.
For instance: 47 septets need 41,125 = 42 octets.
| [in] | sept_len | Number of septets |
Referenced by gsm_7bit_decode_n_hdr(), and gsm_7bit_decode_n_ussd().
| uint32_t gsm_gsmtime2fn | ( | const struct gsm_time * | time | ) |
Encode decoded gsm_time to Frame Number.
| [in] | time | GSM Time in decoded structure |
References gsm_time::fn, GSM_MAX_FN, OSMO_MOD_FLR, and time.
| uint32_t gsm_rfn2fn | ( | uint16_t | rfn, |
| uint32_t | curr_fn | ||
| ) |
References gsm_fn2rfn(), GSM_MAX_FN, GSM_RFN_MODULUS, GSM_RFN_THRESHOLD, GSM_TDMA_FN_DIFF, GSM_TDMA_FN_SUB, GSM_TDMA_FN_SUM, and OSMO_ASSERT.
| int gsm_septet_encode | ( | uint8_t * | result, |
| const char * | data | ||
| ) |
Encode a ASCII characterrs as 7-bit GSM alphabet (TS 03.38)
This function converts a zero-terminated input string data from ASCII into octet-aligned 7-bit GSM characters. No packing is performed.
| [out] | result | caller-allocated output buffer |
| [in] | data | input data, ASCII |
References data, and gsm_7bit_alphabet.
Referenced by gsm_7bit_encode_n().
|
static |
References gsm_7bit_alphabet.
Referenced by gsm_7bit_decode_n_hdr().
| int gsm_septet_pack | ( | uint8_t * | result, |
| const uint8_t * | rdata, | ||
| size_t | septet_len, | ||
| uint8_t | padding | ||
| ) |
GSM Default Alphabet 7bit to octet packing.
| [out] | result | Caller-provided output buffer |
| [in] | rdata | Input data septets |
| [in] | septet_len | Length of rdata |
| [in] | padding | padding bits at start |
References data.
Referenced by gsm_7bit_encode_n(), and gsm_septets2octets().
| int gsm_septets2octets | ( | uint8_t * | result, |
| const uint8_t * | rdata, | ||
| uint8_t | septet_len, | ||
| uint8_t | padding | ||
| ) |
Backwards compatibility wrapper for gsm_septets_pack(), deprecated.
References gsm_septet_pack().
| int ms_class_gmsk_dbm | ( | enum gsm_band | band, |
| int | class | ||
| ) |
Convert power class to dBm according to GSM TS 05.05.
| [in] | band | GSM frequency band |
| [in] | class | GSM power class |
References GSM_BAND_1800, GSM_BAND_1900, GSM_BAND_450, GSM_BAND_480, GSM_BAND_750, GSM_BAND_810, GSM_BAND_850, and GSM_BAND_900.
| int ms_pwr_ctl_lvl | ( | enum gsm_band | band, |
| unsigned int | dbm | ||
| ) |
determine power control level for given dBm value, as indicated by the tables in chapter 4.1.1 of GSM TS 05.05
| [in] | GSM | frequency band |
| [in] | dbm | RF power value in dBm |
References GSM_BAND_1800, GSM_BAND_1900, GSM_BAND_450, GSM_BAND_480, GSM_BAND_750, GSM_BAND_810, GSM_BAND_850, and GSM_BAND_900.
| int ms_pwr_dbm | ( | enum gsm_band | band, |
| uint8_t | lvl | ||
| ) |
Convert TS 05.05 power level to absolute dBm value.
| [in] | band | GSM frequency band |
| [in] | lvl | TS 05.05 power control level |
References GSM_BAND_1800, GSM_BAND_1900, GSM_BAND_450, GSM_BAND_480, GSM_BAND_750, GSM_BAND_810, GSM_BAND_850, and GSM_BAND_900.
| char * osmo_dump_gsmtime | ( | const struct gsm_time * | tm | ) |
References osmo_dump_gsmtime_buf().
Referenced by gsm_fn_as_gsmtime_str().
| char * osmo_dump_gsmtime_buf | ( | char * | buf, |
| size_t | buf_len, | ||
| const struct gsm_time * | tm | ||
| ) |
References gsm_time::fn, gsm_time::t1, gsm_time::t2, and gsm_time::t3.
Referenced by osmo_dump_gsmtime(), and osmo_dump_gsmtime_c().
| char * osmo_dump_gsmtime_c | ( | const void * | ctx, |
| const struct gsm_time * | tm | ||
| ) |
References osmo_dump_gsmtime_buf().
| int osmo_get_rand_id | ( | uint8_t * | out, |
| size_t | len | ||
| ) |
Generate random identifier We use /dev/urandom (default when GRND_RANDOM flag is not set).
Both /dev/(u)random numbers are coming from the same CSPRNG anyway (at least on GNU/Linux >= 4.8). See also RFC4086.
| [out] | out | Buffer to be filled with random data |
| [in] | len | Number of random bytes required |
References ENOTSUP, len, and OSMO_MAX_RAND_ID_LEN.
| int rxlev2dbm | ( | uint8_t | rxlev | ) |
Convert TS 05.08 RxLev to dBm (TS 05.08 Chapter 8.1.4)
| [in] | rxlev | TS 05.08 RxLev value |
|
static |
Referenced by gsm_7bit_decode_n_hdr(), gsm_septet_encode(), and gsm_septet_lookup().
|
static |
Referenced by gsm_arfcn2freq10(), and gsm_freq102arfcn().
| const struct value_string osmo_rat_type_names[] |
Referenced by osmo_rat_type_name().