libosmogsm 1.11.0.26-c59d.202505152026
Osmocom GSM library
|
GSM utility functions, e.g. More...
#include <stddef.h>
#include <stdint.h>
#include <osmocom/core/defs.h>
#include <osmocom/core/utils.h>
Go to the source code of this file.
Data Structures | |
struct | gsm_time |
Macros | |
#define | ADD_MODULO(sum, delta, modulo) |
#define | GSM_MAX_FN (26*51*2048) |
#define | GSM_FN_UNSET 0xFFFFFFFF |
#define | OSMO_MAX_RAND_ID_LEN 16 |
#define | ARFCN_PCS 0x8000 |
#define | ARFCN_UPLINK 0x4000 |
#define | ARFCN_FLAG_MASK 0xf000 /* Reserve the upper 5 bits for flags */ |
#define | GSM_RFN_MODULUS 42432 |
#define | GSM_PCHAN_TCH_F_TCH_H_PDCH GSM_PCHAN_OSMO_DYN |
#define | GSM_7BIT_LEGACY_MAX_BUFFER_SIZE 0x10000 |
Enumerations | |
enum | gsm_band { GSM_BAND_850 = 1 , GSM_BAND_900 = 2 , GSM_BAND_1800 = 4 , GSM_BAND_1900 = 8 , GSM_BAND_450 = 0x10 , GSM_BAND_480 = 0x20 , GSM_BAND_750 = 0x40 , GSM_BAND_810 = 0x80 } |
enum | gprs_tlli_type { TLLI_LOCAL , TLLI_FOREIGN , TLLI_RANDOM , TLLI_AUXILIARY , TLLI_RESERVED , TLLI_G_RNTI , TLLI_RAND_G_RNTI } |
enum | gsm_phys_chan_config { GSM_PCHAN_NONE , GSM_PCHAN_CCCH , GSM_PCHAN_CCCH_SDCCH4 , GSM_PCHAN_TCH_F , GSM_PCHAN_TCH_H , GSM_PCHAN_SDCCH8_SACCH8C , GSM_PCHAN_PDCH , GSM_PCHAN_TCH_F_PDCH , GSM_PCHAN_UNKNOWN , GSM_PCHAN_CCCH_SDCCH4_CBCH , GSM_PCHAN_SDCCH8_SACCH8C_CBCH , GSM_PCHAN_OSMO_DYN , _GSM_PCHAN_MAX } |
enum | gsm_chan_t { GSM_LCHAN_NONE , GSM_LCHAN_SDCCH , GSM_LCHAN_TCH_F , GSM_LCHAN_TCH_H , GSM_LCHAN_UNKNOWN , GSM_LCHAN_CCCH , GSM_LCHAN_PDTCH , GSM_LCHAN_CBCH , _GSM_LCHAN_MAX } |
enum | osmo_rat_type { OSMO_RAT_UNKNOWN = 0 , OSMO_RAT_GERAN_A , OSMO_RAT_UTRAN_IU , OSMO_RAT_EUTRAN_SGS , OSMO_RAT_COUNT } |
Variables | |
const struct value_string | gsm_chan_t_names [] |
const struct value_string | osmo_rat_type_names [] |
GSM utility functions, e.g.
coding and decoding.
#define ARFCN_PCS 0x8000 |
#define ARFCN_UPLINK 0x4000 |
#define GSM_7BIT_LEGACY_MAX_BUFFER_SIZE 0x10000 |
#define GSM_FN_UNSET 0xFFFFFFFF |
#define GSM_MAX_FN (26*51*2048) |
#define GSM_PCHAN_TCH_F_TCH_H_PDCH GSM_PCHAN_OSMO_DYN |
#define GSM_RFN_MODULUS 42432 |
#define OSMO_MAX_RAND_ID_LEN 16 |
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 |
References len.
Determine P-TMSI from foreign and local TLLIs.
[in] | tlli | P-TMSI |
[in] | type | TLLI Type we want to derive from p_tmsi |
References len, 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.
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 len, tlli, TLLI_FOREIGN, TLLI_LOCAL, and type.
References gsm_7bit_decode_n(), GSM_7BIT_LEGACY_MAX_BUFFER_SIZE, and len.
Decode a sequence of GSM 03.38 encoded 7 bit characters.
decoded | The destination buffer for the decoded characters. |
n | A maximum of n chars is written (incl. terminating \0). Requires n >= 1. |
user_data | A pointer to the start of the packed 7bit character sequence. |
length | The length of the input sequence in septets, for example pass octet_length*8/7. |
Decode a sequence of GSM 03.38 encoded 7 bit characters.
References gsm_7bit_decode_n_hdr(), len, 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, len, n, and OSMO_ASSERT.
Referenced by gsm_7bit_decode_n(), and gsm_7bit_decode_n_ussd().
Decode a sequence of 7 bit characters (USSD encoding).
Decode a sequence of 7 bit characters (USSD encoding).
References gsm_7bit_decode_n_hdr(), gsm_get_octet_len(), len, length, and n.
Referenced by gsm_7bit_decode_ussd(), and parse_process_uss_req().
References gsm_7bit_decode_n_ussd(), GSM_7BIT_LEGACY_MAX_BUFFER_SIZE, and length.
References data, gsm_7bit_encode_n(), GSM_7BIT_LEGACY_MAX_BUFFER_SIZE, and len.
Encode a text string into GSM 03.38 encoded 7 bit characters.
result | The destination buffer for the packed 7 bit sequence. |
n | A maximum of n octets is written. |
data | A pointer to the start of the \0 terminated 8 bit character string. |
octets_written | Iff not NULL, *octets_written will be set to the number of octets written to the result buffer. |
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(), len, and n.
Referenced by gsm340_gen_oa(), gsm_7bit_encode(), gsm_7bit_encode_n_ussd(), and gsm_7bit_encode_oct().
Encode a text string into GSM 03.38 encoded 7 bit characters (USSD encoding).
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(), len, and n.
Referenced by gsm0480_create_notifySS(), gsm0480_create_unstructuredSS_Notify(), gsm0480_gen_ussd_resp_7bit(), and gsm_7bit_encode_ussd().
References data, gsm_7bit_encode_n(), GSM_7BIT_LEGACY_MAX_BUFFER_SIZE, and len.
References data, gsm_7bit_encode_n_ussd(), GSM_7BIT_LEGACY_MAX_BUFFER_SIZE, and len.
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(), len, and osmo_panic().
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, GSM_BAND_900, and len.
Referenced by gsm_arfcn2band().
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, ARFCN_FLAG_MASK, gsm_freq_range::arfcn_last, gsm_freq_range::flags, gsm_freq_range::freq_ul_first, gsm_ranges, and len.
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, GSM_BAND_900, and len.
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, GSM_BAND_900, and len.
|
inlinestatic |
References get_value_string(), and gsm_chan_t_names.
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().
References GSM_RFN_MODULUS.
Referenced by gsm_rfn2fn().
Parse GSM Frame Number into printable string.
[in] | fn | GSM Frame Number |
References gsm_time::fn, gsm_fn2gsmtime(), osmo_dump_gsmtime(), and time.
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, ARFCN_UPLINK, gsm_freq_range::freq_ul_first, gsm_ranges, and len.
Compute number of octets from number of septets.
For instance: 47 septets need 41,125 = 42 octets.
[in] | sept_len | Number of septets |
References len.
Referenced by gsm_7bit_decode_n_hdr(), and gsm_7bit_decode_n_ussd().
Encode decoded gsm_time to Frame Number.
[in] | time | GSM Time in decoded structure |
References gsm_time::fn, GSM_MAX_FN, len, OSMO_MOD_FLR, and time.
References gsm_fn2rfn(), GSM_MAX_FN, GSM_RFN_MODULUS, GSM_RFN_THRESHOLD, GSM_TDMA_FN_DIFF, GSM_TDMA_FN_SUB, GSM_TDMA_FN_SUM, len, and OSMO_ASSERT.
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, gsm_7bit_alphabet, and len.
Referenced by gsm_7bit_encode_n().
int use gsm_septet_pack | ( | ) |
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 | ||
) |
References OSMO_DEPRECATED.
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, GSM_BAND_900, and len.
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, GSM_BAND_900, and len.
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, GSM_BAND_900, and len.
References len, and osmo_dump_gsmtime_buf().
Referenced by gsm_fn_as_gsmtime_str().
References len.
Referenced by osmo_dump_gsmtime(), and osmo_dump_gsmtime_c().
References len, and osmo_dump_gsmtime_buf().
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.
|
inlinestatic |
References get_value_string(), and osmo_rat_type_names.
Referenced by osmo_gsup_encode().
Convert TS 05.08 RxLev to dBm (TS 05.08 Chapter 8.1.4)
[in] | rxlev | TS 05.08 RxLev value |
References len.
|
extern |
Referenced by osmo_rat_type_name().