diff --git a/TODO-RELEASE b/TODO-RELEASE index 8ccfa491e..8ecd7a699 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -7,3 +7,4 @@ # If any interfaces have been added since the last public release: c:r:a + 1. # If any interfaces have been removed or changed since the last public release: c:r:0. #library what description / commit summary line +libosmogsm new header osmocom/gsm/protocol/gsm_44_060.h \ No newline at end of file diff --git a/include/osmocom/gprs/gprs_rlc.h b/include/osmocom/gprs/gprs_rlc.h index b74f9e401..060424ae8 100644 --- a/include/osmocom/gprs/gprs_rlc.h +++ b/include/osmocom/gprs/gprs_rlc.h @@ -1,54 +1,4 @@ -/*! \file gprs_rlc.h */ - #pragma once -#include - -/*! Structure for CPS coding and puncturing scheme (TS 04.60 10.4.8a) */ -struct egprs_cps { - uint8_t bits; - uint8_t mcs; - uint8_t p[2]; -}; - -/*! CPS puncturing table selection (TS 04.60 10.4.8a) */ -enum egprs_cps_punc { - EGPRS_CPS_P1, - EGPRS_CPS_P2, - EGPRS_CPS_P3, - EGPRS_CPS_NONE = -1, -}; - -/*! EGPRS header types (TS 04.60 10.0a.2) */ -enum egprs_hdr_type { - EGPRS_HDR_TYPE1, - EGPRS_HDR_TYPE2, - EGPRS_HDR_TYPE3, -}; - -enum osmo_gprs_cs { - OSMO_GPRS_CS_NONE, - OSMO_GPRS_CS1, - OSMO_GPRS_CS2, - OSMO_GPRS_CS3, - OSMO_GPRS_CS4, - OSMO_GPRS_MCS1, - OSMO_GPRS_MCS2, - OSMO_GPRS_MCS3, - OSMO_GPRS_MCS4, - OSMO_GPRS_MCS5, - OSMO_GPRS_MCS6, - OSMO_GPRS_MCS7, - OSMO_GPRS_MCS8, - OSMO_GPRS_MCS9, - _NUM_OSMO_GPRS_CS -}; - -int egprs_get_cps(struct egprs_cps *cps, uint8_t type, uint8_t bits); - -int osmo_gprs_ul_block_size_bits(enum osmo_gprs_cs cs); -int osmo_gprs_dl_block_size_bits(enum osmo_gprs_cs cs); -int osmo_gprs_ul_block_size_bytes(enum osmo_gprs_cs cs); -int osmo_gprs_dl_block_size_bytes(enum osmo_gprs_cs cs); -enum osmo_gprs_cs osmo_gprs_ul_cs_by_block_bytes(uint8_t block_size); -enum osmo_gprs_cs osmo_gprs_dl_cs_by_block_bytes(uint8_t block_size); +#pragma message "Header osmocom/gprs/gprs_rlc.h is deprecated, include osmocom/gsm/protocol/gsm_44_060.h instead" +#include diff --git a/include/osmocom/gprs/protocol/gsm_04_60.h b/include/osmocom/gprs/protocol/gsm_04_60.h index 8e096179f..c2c11a7d9 100644 --- a/include/osmocom/gprs/protocol/gsm_04_60.h +++ b/include/osmocom/gprs/protocol/gsm_04_60.h @@ -1,202 +1,4 @@ -/*! \file gsm_04_60.h - * General Packet Radio Service (GPRS). - * Radio Link Control / Medium Access Control (RLC/MAC) protocol - * 3GPP TS 04.60 version 8.27.0 Release 1999 - */ - #pragma once -#include -#include - -/* TS 04.60 10.3a.4.1.1 */ -struct gprs_rlc_ul_header_egprs_1 { -#if OSMO_IS_LITTLE_ENDIAN - uint8_t r:1, - si:1, - cv:4, - tfi_hi:2; - uint8_t tfi_lo:3, - bsn1_hi:5; - uint8_t bsn1_lo:6, - bsn2_hi:2; - uint8_t bsn2_lo:8; - uint8_t cps:5, - rsb:1, - pi:1, - spare_hi:1; - uint8_t spare_lo:6, - dummy:2; -#elif OSMO_IS_BIG_ENDIAN -/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ - uint8_t tfi_hi:2, cv:4, si:1, r:1; - uint8_t bsn1_hi:5, tfi_lo:3; - uint8_t bsn2_hi:2, bsn1_lo:6; - uint8_t bsn2_lo:8; - uint8_t spare_hi:1, pi:1, rsb:1, cps:5; - uint8_t dummy:2, spare_lo:6; -#endif -} __attribute__ ((packed)); - -/* TS 04.60 10.3a.4.2.1 */ -struct gprs_rlc_ul_header_egprs_2 { -#if OSMO_IS_LITTLE_ENDIAN - uint8_t r:1, - si:1, - cv:4, - tfi_hi:2; - uint8_t tfi_lo:3, - bsn1_hi:5; - uint8_t bsn1_lo:6, - cps_hi:2; - uint8_t cps_lo:1, - rsb:1, - pi:1, - spare_hi:5; - uint8_t spare_lo:5, - dummy:3; -#elif OSMO_IS_BIG_ENDIAN -/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ - uint8_t tfi_hi:2, cv:4, si:1, r:1; - uint8_t bsn1_hi:5, tfi_lo:3; - uint8_t cps_hi:2, bsn1_lo:6; - uint8_t spare_hi:5, pi:1, rsb:1, cps_lo:1; - uint8_t dummy:3, spare_lo:5; -#endif -} __attribute__ ((packed)); - -/* TS 04.60 10.3a.4.3.1 */ -struct gprs_rlc_ul_header_egprs_3 { -#if OSMO_IS_LITTLE_ENDIAN - uint8_t r:1, - si:1, - cv:4, - tfi_hi:2; - uint8_t tfi_lo:3, - bsn1_hi:5; - uint8_t bsn1_lo:6, - cps_hi:2; - uint8_t cps_lo:2, - spb:2, - rsb:1, - pi:1, - spare:1, - dummy:1; -#elif OSMO_IS_BIG_ENDIAN -/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ - uint8_t tfi_hi:2, cv:4, si:1, r:1; - uint8_t bsn1_hi:5, tfi_lo:3; - uint8_t cps_hi:2, bsn1_lo:6; - uint8_t dummy:1, spare:1, pi:1, rsb:1, spb:2, cps_lo:2; -#endif -} __attribute__ ((packed)); - -struct gprs_rlc_dl_header_egprs_1 { -#if OSMO_IS_LITTLE_ENDIAN - uint8_t usf:3, - es_p:2, - rrbp:2, - tfi_hi:1; - uint8_t tfi_lo:4, - pr:2, - bsn1_hi:2; - uint8_t bsn1_mid:8; - uint8_t bsn1_lo:1, - bsn2_hi:7; - uint8_t bsn2_lo:3, - cps:5; -#elif OSMO_IS_BIG_ENDIAN -/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ - uint8_t tfi_hi:1, rrbp:2, es_p:2, usf:3; - uint8_t bsn1_hi:2, pr:2, tfi_lo:4; - uint8_t bsn1_mid:8; - uint8_t bsn2_hi:7, bsn1_lo:1; - uint8_t cps:5, bsn2_lo:3; -#endif -} __attribute__ ((packed)); - -struct gprs_rlc_dl_header_egprs_2 { -#if OSMO_IS_LITTLE_ENDIAN - uint8_t usf:3, - es_p:2, - rrbp:2, - tfi_hi:1; - uint8_t tfi_lo:4, - pr:2, - bsn1_hi:2; - uint8_t bsn1_mid:8; - uint8_t bsn1_lo:1, - cps:3, - dummy:4; -#elif OSMO_IS_BIG_ENDIAN -/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ - uint8_t tfi_hi:1, rrbp:2, es_p:2, usf:3; - uint8_t bsn1_hi:2, pr:2, tfi_lo:4; - uint8_t bsn1_mid:8; - uint8_t dummy:4, cps:3, bsn1_lo:1; -#endif -} __attribute__ ((packed)); - -struct gprs_rlc_dl_header_egprs_3 { -#if OSMO_IS_LITTLE_ENDIAN - uint8_t usf:3, - es_p:2, - rrbp:2, - tfi_hi:1; - uint8_t tfi_lo:4, - pr:2, - bsn1_hi:2; - uint8_t bsn1_mid:8; - uint8_t bsn1_lo:1, - cps:4, - spb:2, - dummy:1; -#elif OSMO_IS_BIG_ENDIAN -/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ - uint8_t tfi_hi:1, rrbp:2, es_p:2, usf:3; - uint8_t bsn1_hi:2, pr:2, tfi_lo:4; - uint8_t bsn1_mid:8; - uint8_t dummy:1, spb:2, cps:4, bsn1_lo:1; -#endif -} __attribute__ ((packed)); - -/* TS 44.060 Table 12.24.2 -* Meaning of values documented in TS 23.060 Chapter 6.3.3.1: Network Mode of Operation */ -enum osmo_gprs_nmo { - GPRS_NMO_I = 0, /* CS pagin on GPRS paging or traffic channel */ - GPRS_NMO_II = 1, /* all paging on CCCH */ - GPRS_NMO_III = 2, /* no paging coordination */ -}; - -/* TS 44.060 12.24 */ -struct osmo_gprs_cell_options { - enum osmo_gprs_nmo nmo; - /* T3168: wait for packet uplink assignment message */ - uint32_t t3168; /* in milliseconds */ - /* T3192: wait for release of the TBF after reception of the final block */ - uint32_t t3192; /* in milliseconds */ - uint32_t drx_timer_max;/* in seconds */ - uint32_t bs_cv_max; - uint8_t supports_egprs_11bit_rach; - bool ctrl_ack_type_use_block; /* use PACKET CONTROL ACKNOWLEDGMENT */ - - uint8_t ext_info_present; - struct { - uint8_t egprs_supported; - uint8_t use_egprs_p_ch_req; - uint8_t bep_period; - uint8_t pfc_supported; - uint8_t dtm_supported; - uint8_t bss_paging_coordination; - bool ccn_active; - } ext_info; -}; - -/* TS 04.60 Table 12.9.2 */ -struct osmo_gprs_power_ctrl_pars { - uint8_t alpha; - uint8_t t_avg_w; - uint8_t t_avg_t; - uint8_t pc_meas_chan; - uint8_t n_avg_i; -}; +#pragma message "Header osmocom/gprs/protocol/gsm_04_60.h is deprecated, include osmocom/gsm/protocol/gsm_44_060.h instead" +#include diff --git a/include/osmocom/gsm/gsm48_rest_octets.h b/include/osmocom/gsm/gsm48_rest_octets.h index f2958249f..c8d63b21b 100644 --- a/include/osmocom/gsm/gsm48_rest_octets.h +++ b/include/osmocom/gsm/gsm48_rest_octets.h @@ -2,7 +2,7 @@ #include #include -#include +#include /* 16 is the max. number of SI2quater messages according to 3GPP TS 44.018 Table 10.5.2.33b.1: 4-bit index is used (2#1111 = 10#15) */ diff --git a/include/osmocom/gsm/protocol/Makefile.am b/include/osmocom/gsm/protocol/Makefile.am index 2ce3139de..5c8e2a686 100644 --- a/include/osmocom/gsm/protocol/Makefile.am +++ b/include/osmocom/gsm/protocol/Makefile.am @@ -17,6 +17,7 @@ osmogsmproto_HEADERS = \ gsm_25_415.h \ gsm_29_118.h \ gsm_44_004.h \ + gsm_44_060.h \ gsm_44_318.h \ gsm_48_049.h \ gsm_48_071.h \ diff --git a/include/osmocom/gsm/protocol/gsm_44_060.h b/include/osmocom/gsm/protocol/gsm_44_060.h new file mode 100644 index 000000000..1df2f800a --- /dev/null +++ b/include/osmocom/gsm/protocol/gsm_44_060.h @@ -0,0 +1,252 @@ +/*! \file gsm_44_060.h + * General Packet Radio Service (GPRS). + * Radio Link Control / Medium Access Control (RLC/MAC) protocol + * 3GPP TS 44.060 + */ + +#pragma once + +#include +#include + +/* TS 44.060 10.3a.4.1.1 */ +struct gprs_rlc_ul_header_egprs_1 { +#if OSMO_IS_LITTLE_ENDIAN + uint8_t r:1, + si:1, + cv:4, + tfi_hi:2; + uint8_t tfi_lo:3, + bsn1_hi:5; + uint8_t bsn1_lo:6, + bsn2_hi:2; + uint8_t bsn2_lo:8; + uint8_t cps:5, + rsb:1, + pi:1, + spare_hi:1; + uint8_t spare_lo:6, + dummy:2; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ + uint8_t tfi_hi:2, cv:4, si:1, r:1; + uint8_t bsn1_hi:5, tfi_lo:3; + uint8_t bsn2_hi:2, bsn1_lo:6; + uint8_t bsn2_lo:8; + uint8_t spare_hi:1, pi:1, rsb:1, cps:5; + uint8_t dummy:2, spare_lo:6; +#endif +} __attribute__ ((packed)); + +/* TS 44.060 10.3a.4.2.1 */ +struct gprs_rlc_ul_header_egprs_2 { +#if OSMO_IS_LITTLE_ENDIAN + uint8_t r:1, + si:1, + cv:4, + tfi_hi:2; + uint8_t tfi_lo:3, + bsn1_hi:5; + uint8_t bsn1_lo:6, + cps_hi:2; + uint8_t cps_lo:1, + rsb:1, + pi:1, + spare_hi:5; + uint8_t spare_lo:5, + dummy:3; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ + uint8_t tfi_hi:2, cv:4, si:1, r:1; + uint8_t bsn1_hi:5, tfi_lo:3; + uint8_t cps_hi:2, bsn1_lo:6; + uint8_t spare_hi:5, pi:1, rsb:1, cps_lo:1; + uint8_t dummy:3, spare_lo:5; +#endif +} __attribute__ ((packed)); + +/* TS 44.060 10.3a.4.3.1 */ +struct gprs_rlc_ul_header_egprs_3 { +#if OSMO_IS_LITTLE_ENDIAN + uint8_t r:1, + si:1, + cv:4, + tfi_hi:2; + uint8_t tfi_lo:3, + bsn1_hi:5; + uint8_t bsn1_lo:6, + cps_hi:2; + uint8_t cps_lo:2, + spb:2, + rsb:1, + pi:1, + spare:1, + dummy:1; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ + uint8_t tfi_hi:2, cv:4, si:1, r:1; + uint8_t bsn1_hi:5, tfi_lo:3; + uint8_t cps_hi:2, bsn1_lo:6; + uint8_t dummy:1, spare:1, pi:1, rsb:1, spb:2, cps_lo:2; +#endif +} __attribute__ ((packed)); + +struct gprs_rlc_dl_header_egprs_1 { +#if OSMO_IS_LITTLE_ENDIAN + uint8_t usf:3, + es_p:2, + rrbp:2, + tfi_hi:1; + uint8_t tfi_lo:4, + pr:2, + bsn1_hi:2; + uint8_t bsn1_mid:8; + uint8_t bsn1_lo:1, + bsn2_hi:7; + uint8_t bsn2_lo:3, + cps:5; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ + uint8_t tfi_hi:1, rrbp:2, es_p:2, usf:3; + uint8_t bsn1_hi:2, pr:2, tfi_lo:4; + uint8_t bsn1_mid:8; + uint8_t bsn2_hi:7, bsn1_lo:1; + uint8_t cps:5, bsn2_lo:3; +#endif +} __attribute__ ((packed)); + +struct gprs_rlc_dl_header_egprs_2 { +#if OSMO_IS_LITTLE_ENDIAN + uint8_t usf:3, + es_p:2, + rrbp:2, + tfi_hi:1; + uint8_t tfi_lo:4, + pr:2, + bsn1_hi:2; + uint8_t bsn1_mid:8; + uint8_t bsn1_lo:1, + cps:3, + dummy:4; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ + uint8_t tfi_hi:1, rrbp:2, es_p:2, usf:3; + uint8_t bsn1_hi:2, pr:2, tfi_lo:4; + uint8_t bsn1_mid:8; + uint8_t dummy:4, cps:3, bsn1_lo:1; +#endif +} __attribute__ ((packed)); + +struct gprs_rlc_dl_header_egprs_3 { +#if OSMO_IS_LITTLE_ENDIAN + uint8_t usf:3, + es_p:2, + rrbp:2, + tfi_hi:1; + uint8_t tfi_lo:4, + pr:2, + bsn1_hi:2; + uint8_t bsn1_mid:8; + uint8_t bsn1_lo:1, + cps:4, + spb:2, + dummy:1; +#elif OSMO_IS_BIG_ENDIAN +/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ + uint8_t tfi_hi:1, rrbp:2, es_p:2, usf:3; + uint8_t bsn1_hi:2, pr:2, tfi_lo:4; + uint8_t bsn1_mid:8; + uint8_t dummy:1, spb:2, cps:4, bsn1_lo:1; +#endif +} __attribute__ ((packed)); + +/* TS 44.060 Table 12.24.2 +* Meaning of values documented in TS 23.060 Chapter 6.3.3.1: Network Mode of Operation */ +enum osmo_gprs_nmo { + GPRS_NMO_I = 0, /* CS pagin on GPRS paging or traffic channel */ + GPRS_NMO_II = 1, /* all paging on CCCH */ + GPRS_NMO_III = 2, /* no paging coordination */ +}; + +/* TS 44.060 12.24 */ +struct osmo_gprs_cell_options { + enum osmo_gprs_nmo nmo; + /* T3168: wait for packet uplink assignment message */ + uint32_t t3168; /* in milliseconds */ + /* T3192: wait for release of the TBF after reception of the final block */ + uint32_t t3192; /* in milliseconds */ + uint32_t drx_timer_max;/* in seconds */ + uint32_t bs_cv_max; + uint8_t supports_egprs_11bit_rach; + bool ctrl_ack_type_use_block; /* use PACKET CONTROL ACKNOWLEDGMENT */ + + uint8_t ext_info_present; + struct { + uint8_t egprs_supported; + uint8_t use_egprs_p_ch_req; + uint8_t bep_period; + uint8_t pfc_supported; + uint8_t dtm_supported; + uint8_t bss_paging_coordination; + bool ccn_active; + } ext_info; +}; + +/* TS 44.060 Table 12.9.2 */ +struct osmo_gprs_power_ctrl_pars { + uint8_t alpha; + uint8_t t_avg_w; + uint8_t t_avg_t; + uint8_t pc_meas_chan; + uint8_t n_avg_i; +}; + + +/*! Structure for CPS coding and puncturing scheme (TS 44.060 10.4.8a) */ +struct egprs_cps { + uint8_t bits; + uint8_t mcs; + uint8_t p[2]; +}; + +/*! CPS puncturing table selection (TS 44.060 10.4.8a) */ +enum egprs_cps_punc { + EGPRS_CPS_P1, + EGPRS_CPS_P2, + EGPRS_CPS_P3, + EGPRS_CPS_NONE = -1, +}; + +/*! EGPRS header types (TS 44.060 10.0a.2) */ +enum egprs_hdr_type { + EGPRS_HDR_TYPE1, + EGPRS_HDR_TYPE2, + EGPRS_HDR_TYPE3, +}; + +enum osmo_gprs_cs { + OSMO_GPRS_CS_NONE, + OSMO_GPRS_CS1, + OSMO_GPRS_CS2, + OSMO_GPRS_CS3, + OSMO_GPRS_CS4, + OSMO_GPRS_MCS1, + OSMO_GPRS_MCS2, + OSMO_GPRS_MCS3, + OSMO_GPRS_MCS4, + OSMO_GPRS_MCS5, + OSMO_GPRS_MCS6, + OSMO_GPRS_MCS7, + OSMO_GPRS_MCS8, + OSMO_GPRS_MCS9, + _NUM_OSMO_GPRS_CS +}; + +int egprs_get_cps(struct egprs_cps *cps, uint8_t type, uint8_t bits); + +int osmo_gprs_ul_block_size_bits(enum osmo_gprs_cs cs); +int osmo_gprs_dl_block_size_bits(enum osmo_gprs_cs cs); +int osmo_gprs_ul_block_size_bytes(enum osmo_gprs_cs cs); +int osmo_gprs_dl_block_size_bytes(enum osmo_gprs_cs cs); +enum osmo_gprs_cs osmo_gprs_ul_cs_by_block_bytes(uint8_t block_size); +enum osmo_gprs_cs osmo_gprs_dl_cs_by_block_bytes(uint8_t block_size); diff --git a/src/coding/gsm0503_coding.c b/src/coding/gsm0503_coding.c index 6f33b78a3..f2b018034 100644 --- a/src/coding/gsm0503_coding.c +++ b/src/coding/gsm0503_coding.c @@ -31,9 +31,7 @@ #include #include -#include -#include - +#include #include #include #include diff --git a/src/gsm/gprs_rlc.c b/src/gsm/gprs_rlc.c index bdfc8eac2..4f02a7a99 100644 --- a/src/gsm/gprs_rlc.c +++ b/src/gsm/gprs_rlc.c @@ -13,9 +13,8 @@ #include #include -#include #include -#include +#include #define EGPRS_CPS_TYPE1_TBL_SZ 29 #define EGPRS_CPS_TYPE2_TBL_SZ 8