lists.osmocom.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

gerrit-log

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
gerrit-log@lists.osmocom.org

July 2023

  • 1 participants
  • 3051 discussions
[M] Change in osmo-bts[master]: csd_v110_rtp_encode(): properly set E1/E2/E3 bits
by fixeria 31 Jul '23

31 Jul '23
fixeria has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/33934 ) Change subject: csd_v110_rtp_encode(): properly set E1/E2/E3 bits ...................................................................... csd_v110_rtp_encode(): properly set E1/E2/E3 bits The E1/E2/E3 bits are set based on out-of-band knowledge of the current user data rate. The actual bit values are defined in 3GPP TS 44.021, Figure 4 "Coding of data rates". TODO: this is only valid for transparent services, for non-transparent services see 3GPP TS 48.020. TODO: lchan->csd_mode is never set to the actual CSD mode... Change-Id: I1a14597dff746cf975140b294400a2cc05badccd Related: OS#1572 --- M include/osmo-bts/lchan.h M src/common/csd_v110.c M tests/csd/csd_test.c M tests/csd/csd_test.err 4 files changed, 64 insertions(+), 19 deletions(-) Approvals: Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve pespin: Looks good to me, approved diff --git a/include/osmo-bts/lchan.h b/include/osmo-bts/lchan.h index a0e99bf..05c395a 100644 --- a/include/osmo-bts/lchan.h +++ b/include/osmo-bts/lchan.h @@ -75,15 +75,17 @@ }; enum lchan_csd_mode { - LCHAN_CSD_M_NT, + LCHAN_CSD_M_NT = 0, LCHAN_CSD_M_T_1200_75, LCHAN_CSD_M_T_600, LCHAN_CSD_M_T_1200, LCHAN_CSD_M_T_2400, + LCHAN_CSD_M_T_4800, LCHAN_CSD_M_T_9600, LCHAN_CSD_M_T_14400, LCHAN_CSD_M_T_29000, LCHAN_CSD_M_T_32000, + _LCHAN_CSD_M_NUM, }; /* State of the SAPIs in the lchan */ diff --git a/src/common/csd_v110.c b/src/common/csd_v110.c index 6800761..9fc7ad3 100644 --- a/src/common/csd_v110.c +++ b/src/common/csd_v110.c @@ -58,6 +58,21 @@ }, }; +/* 3GPP TS 44.021, Figure 4: Coding of data rates (E1/E2/E3 bits) */ +static const uint8_t e1e2e3_map[_LCHAN_CSD_M_NUM][3] = { + [LCHAN_CSD_M_T_600] = { 1, 0, 0 }, + [LCHAN_CSD_M_T_1200] = { 0, 1, 0 }, + [LCHAN_CSD_M_T_2400] = { 1, 1, 0 }, + [LCHAN_CSD_M_T_4800] = { 0, 1, 1 }, + [LCHAN_CSD_M_T_9600] = { 0, 1, 1 }, +#if 0 + [LCHAN_CSD_M_T_19200] = { 0, 1, 1 }, + [LCHAN_CSD_M_T_38400] = { 0, 1, 1 }, + [LCHAN_CSD_M_T_14400] = { 1, 0, 1 }, + [LCHAN_CSD_M_T_28800] = { 1, 0, 1 }, +#endif +}; + int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp, const uint8_t *data, size_t data_len) { @@ -86,8 +101,10 @@ else /* desc->num_bits == 36 */ osmo_csd_3k6_decode_frame(&df, &data[i * 36], 36); - /* FIXME: E1 .. E3 must be set by out-of-band knowledge! */ - memset(&df.e_bits[0], 0, 3); + /* E1 .. E3 must set by out-of-band knowledge */ + df.e_bits[0] = e1e2e3_map[lchan->csd_mode][0]; + df.e_bits[1] = e1e2e3_map[lchan->csd_mode][1]; + df.e_bits[2] = e1e2e3_map[lchan->csd_mode][2]; osmo_v110_encode_frame(&ra_bits[i * 80], 80, &df); } diff --git a/tests/csd/csd_test.c b/tests/csd/csd_test.c index 16995b1..f24331d 100644 --- a/tests/csd/csd_test.c +++ b/tests/csd/csd_test.c @@ -37,6 +37,7 @@ const char *name; enum gsm_chan_t lchan_type; enum gsm48_chan_mode tch_mode; + enum lchan_csd_mode csd_mode; }; static const struct test_case tests[] = { @@ -44,31 +45,37 @@ .name = "TCH/F14.4", .lchan_type = GSM_LCHAN_TCH_F, .tch_mode = GSM48_CMODE_DATA_14k5, + .csd_mode = LCHAN_CSD_M_T_14400, }, { .name = "TCH/F9.6", .lchan_type = GSM_LCHAN_TCH_F, .tch_mode = GSM48_CMODE_DATA_12k0, + .csd_mode = LCHAN_CSD_M_T_9600, }, { .name = "TCH/F4.8", .lchan_type = GSM_LCHAN_TCH_F, .tch_mode = GSM48_CMODE_DATA_6k0, + .csd_mode = LCHAN_CSD_M_T_4800, }, { .name = "TCH/H4.8", .lchan_type = GSM_LCHAN_TCH_H, .tch_mode = GSM48_CMODE_DATA_6k0, + .csd_mode = LCHAN_CSD_M_T_4800, }, { .name = "TCH/F2.4", .lchan_type = GSM_LCHAN_TCH_F, .tch_mode = GSM48_CMODE_DATA_3k6, + .csd_mode = LCHAN_CSD_M_T_2400, }, { .name = "TCH/H2.4", .lchan_type = GSM_LCHAN_TCH_H, .tch_mode = GSM48_CMODE_DATA_3k6, + .csd_mode = LCHAN_CSD_M_T_600, }, }; @@ -99,6 +106,7 @@ struct gsm_lchan lchan = { .type = tc->lchan_type, .tch_mode = tc->tch_mode, + .csd_mode = tc->csd_mode, }; /* populate the data_enc[] buffer with some bits */ diff --git a/tests/csd/csd_test.err b/tests/csd/csd_test.err index bc9747c..94505dc 100644 --- a/tests/csd/csd_test.err +++ b/tests/csd/csd_test.err @@ -2,65 +2,65 @@ [i] Testing 'TCH/F9.6' (bitnum=240) [i] csd_v110_rtp_encode() returns 160 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf - ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf - ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf - ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf - ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f [i] csd_v110_rtp_decode() returns 240 [i] Testing 'TCH/F4.8' (bitnum=120) [i] csd_v110_rtp_encode() returns 160 7f 7f 7f 7f 7f 7f 7f 7f ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f - ff ff 7f ff 7f ff 7f ff ff 7f 7f 7f 7f ff 7f ff + ff ff 7f ff 7f ff 7f ff ff 7f ff ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f 7f 7f 7f 7f 7f 7f 7f ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f - ff ff 7f ff 7f ff 7f ff ff 7f 7f 7f 7f ff 7f ff + ff ff 7f ff 7f ff 7f ff ff 7f ff ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff [i] csd_v110_rtp_decode() returns 120 [i] Testing 'TCH/H4.8' (bitnum=240) [i] csd_v110_rtp_encode() returns 160 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf - ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf - ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf - ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf - ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf ff 7f 7f bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f [i] csd_v110_rtp_decode() returns 240 [i] Testing 'TCH/F2.4' (bitnum=72) [i] csd_v110_rtp_encode() returns 160 7f 7f 7f 7f 7f 7f 7f 7f ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff - ff 7f 7f ff ff 7f 7f ff ff 7f 7f 7f 7f ff 7f ff + ff 7f 7f ff ff 7f 7f ff ff ff ff 7f 7f ff 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff 7f 7f 7f 7f 7f 7f 7f 7f ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff - ff 7f 7f ff ff 7f 7f ff ff 7f 7f 7f 7f ff 7f ff + ff 7f 7f ff ff 7f 7f ff ff ff ff 7f 7f ff 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff [i] csd_v110_rtp_decode() returns 72 [i] Testing 'TCH/H2.4' (bitnum=144) [i] csd_v110_rtp_encode() returns 160 3f 3f 3f 3f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f - bf 7f bf 7f bf 3f 7f 7f bf 7f bf 7f bf 7f bf 7f + bf 7f bf 7f ff 3f 7f 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f 3f 3f 3f 3f bf 7f bf 7f - bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 3f 7f 7f + bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f ff 3f 7f 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f 3f 3f 3f 3f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f - bf 7f bf 7f bf 3f 7f 7f bf 7f bf 7f bf 7f bf 7f + bf 7f bf 7f ff 3f 7f 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f 3f 3f 3f 3f bf 7f bf 7f - bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 3f 7f 7f + bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f ff 3f 7f 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f [i] csd_v110_rtp_decode() returns 144 -- To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/33934 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I1a14597dff746cf975140b294400a2cc05badccd Gerrit-Change-Number: 33934 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[L] Change in osmo-bts[master]: l1sap: proper rate adaptation for CSD (RFC4040 'clearmode')
by fixeria 31 Jul '23

31 Jul '23
fixeria has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/33832 ) Change subject: l1sap: proper rate adaptation for CSD (RFC4040 'clearmode') ...................................................................... l1sap: proper rate adaptation for CSD (RFC4040 'clearmode') Since 95407f3f osmo-bts-trx supports scheduling all CSD specific channel rates, however the rate adaptation was missing. On the radio interface we deal with CSD-modified V.110 frames, which need to be converted to normal 80-bit V.110 frames (RA1'/RA1), which in turn need to be batched and sent in RFC4040 "clearmode" 160 octet RTP payloads (RA1/RA2 as per I.460). Note that this patch comments out TCH/F14.4 in bts_supports_cm_data(), so that all channel allocations for this mode would be NACKed. The reason for this is that the rate adaptation functions for TCH/F14.4 are different than the RA1'/RA1 and the RA1/RA2. For more information, see: * 3GPP TS 44.021, section 8 (functions RA1'/RA1) * ITU-T I.460, section 1.1 "Rate adaption of 8, 16 and 32 kbit/s streams" Change-Id: I5e3701ad52d5d428fd02caff037881045f2d0a02 Related: OS#1572 --- M .gitignore M configure.ac M include/osmo-bts/Makefile.am A include/osmo-bts/csd_v110.h M src/common/Makefile.am M src/common/bts.c A src/common/csd_v110.c M src/common/l1sap.c M tests/Makefile.am A tests/csd/Makefile.am A tests/csd/csd_test.c A tests/csd/csd_test.err M tests/testsuite.at 13 files changed, 503 insertions(+), 14 deletions(-) Approvals: Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve pespin: Looks good to me, but someone else must approve fixeria: Looks good to me, approved diff --git a/.gitignore b/.gitignore index bf0f844..34d55b8 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ tests/atconfig tests/package.m4 tests/amr/amr_test +tests/csd/csd_test tests/agch/agch_test tests/paging/paging_test tests/cipher/cipher_test diff --git a/configure.ac b/configure.ac index 82074d4..b2b651a 100644 --- a/configure.ac +++ b/configure.ac @@ -445,6 +445,7 @@ tests/power/Makefile tests/meas/Makefile tests/amr/Makefile + tests/csd/Makefile doc/Makefile doc/examples/Makefile doc/manuals/Makefile diff --git a/include/osmo-bts/Makefile.am b/include/osmo-bts/Makefile.am index 0b4058d..cbd0fc3 100644 --- a/include/osmo-bts/Makefile.am +++ b/include/osmo-bts/Makefile.am @@ -24,6 +24,7 @@ tx_power.h \ control_if.h \ cbch.h \ + csd_v110.h \ l1sap.h \ lchan.h \ power_control.h \ diff --git a/include/osmo-bts/csd_v110.h b/include/osmo-bts/csd_v110.h new file mode 100644 index 0000000..f6be0ae --- /dev/null +++ b/include/osmo-bts/csd_v110.h @@ -0,0 +1,23 @@ +#pragma once + +/* RFC4040 "clearmode" RTP payload length */ +#define RFC4040_RTP_PLEN 160 + +struct gsm_lchan; + +struct csd_v110_frame_desc { + uint16_t num_blocks; + uint16_t num_bits; +}; + +struct csd_v110_lchan_desc { + struct csd_v110_frame_desc fr; + struct csd_v110_frame_desc hr; +}; + +extern const struct csd_v110_lchan_desc csd_v110_lchan_desc[256]; + +int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp, + const uint8_t *data, size_t data_len); +int csd_v110_rtp_decode(const struct gsm_lchan *lchan, uint8_t *data, + const uint8_t *rtp, size_t rtp_len); diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 5cd7909..d13415d 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -51,6 +51,7 @@ bts_ctrl_commands.c \ bts_ctrl_lookup.c \ bts_shutdown_fsm.c \ + csd_v110.c \ l1sap.c \ cbch.c \ power_control.c \ diff --git a/src/common/bts.c b/src/common/bts.c index 7257f37..1f0040c 100644 --- a/src/common/bts.c +++ b/src/common/bts.c @@ -875,7 +875,7 @@ switch (bts->variant) { case BTS_OSMO_TRX: switch (cm->chan_rate) { - case RSL_CMOD_CSD_T_14k4: + /* TODO: RSL_CMOD_CSD_T_14k4 */ case RSL_CMOD_CSD_T_9k6: if (cm->chan_rt != RSL_CMOD_CRT_TCH_Bm) return false; /* invalid */ diff --git a/src/common/csd_v110.c b/src/common/csd_v110.c new file mode 100644 index 0000000..6800761 --- /dev/null +++ b/src/common/csd_v110.c @@ -0,0 +1,157 @@ +/* + * (C) 2023 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de> + * Author: Vadim Yanitskiy <vyanitskiy(a)sysmocom.de> + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <stdint.h> +#include <errno.h> + +#include <osmocom/core/bits.h> +#include <osmocom/core/utils.h> +#include <osmocom/gsm/gsm44021.h> +#include <osmocom/gsm/gsm_utils.h> +#include <osmocom/gsm/protocol/gsm_04_08.h> +#include <osmocom/isdn/v110.h> + +#include <osmo-bts/csd_v110.h> +#include <osmo-bts/lchan.h> + +/* key is enum gsm48_chan_mode, so assuming a value in range 0..255 */ +const struct csd_v110_lchan_desc csd_v110_lchan_desc[256] = { +#if 0 + [GSM48_CMODE_DATA_14k5] = { + /* TCH/F14.4: 290 bits every 20 ms (14.5 kbit/s) */ + .fr = { .num_blocks = 1, .num_bits = 290 }, + }, +#endif + [GSM48_CMODE_DATA_12k0] = { + /* TCH/F9.6: 4 * 60 bits every 20 ms (12.0 kbit/s) */ + .fr = { .num_blocks = 4, .num_bits = 60 }, + }, + [GSM48_CMODE_DATA_6k0] = { + /* TCH/F4.8: 2 * 60 bits every 20 ms (6.0 kbit/s) */ + .fr = { .num_blocks = 2, .num_bits = 60 }, + /* TCH/H4.8: 4 * 60 bits every 40 ms (6.0 kbit/s) */ + .hr = { .num_blocks = 4, .num_bits = 60 }, + }, + [GSM48_CMODE_DATA_3k6] = { + /* TCH/F2.4: 2 * 36 bits every 20 ms (3.6 kbit/s) */ + .fr = { .num_blocks = 2, .num_bits = 36 }, + /* TCH/H2.4: 4 * 36 bits every 40 ms (3.6 kbit/s) */ + .hr = { .num_blocks = 4, .num_bits = 36 }, + }, +}; + +int csd_v110_rtp_encode(const struct gsm_lchan *lchan, uint8_t *rtp, + const uint8_t *data, size_t data_len) +{ + const struct csd_v110_frame_desc *desc; + ubit_t ra_bits[80 * 4]; + + OSMO_ASSERT(lchan->tch_mode < ARRAY_SIZE(csd_v110_lchan_desc)); + if (lchan->type == GSM_LCHAN_TCH_F) + desc = &csd_v110_lchan_desc[lchan->tch_mode].fr; + else + desc = &csd_v110_lchan_desc[lchan->tch_mode].hr; + if (OSMO_UNLIKELY(desc->num_blocks == 0)) + return -ENOTSUP; + + /* handle empty/incomplete frames gracefully */ + if (OSMO_UNLIKELY(data_len < (desc->num_blocks * desc->num_bits))) + return -ENODATA; + + /* RA1'/RA1: convert to an intermediate data rate */ + for (unsigned int i = 0; i < desc->num_blocks; i++) { + struct osmo_v110_decoded_frame df; + + /* convert modified V.110 frames to normal V.110 frames */ + if (desc->num_bits == 60) + osmo_csd_12k_6k_decode_frame(&df, &data[i * 60], 60); + else /* desc->num_bits == 36 */ + osmo_csd_3k6_decode_frame(&df, &data[i * 36], 36); + + /* FIXME: E1 .. E3 must be set by out-of-band knowledge! */ + memset(&df.e_bits[0], 0, 3); + + osmo_v110_encode_frame(&ra_bits[i * 80], 80, &df); + } + + /* RA1/RA2: convert from an intermediate rate to 64 kbit/s */ + if (desc->num_blocks == 4) { + /* 4 * 80 bits (16 kbit/s) => 2 bits per octet */ + for (unsigned int i = 0, j = 0; i < RFC4040_RTP_PLEN; i++) { + rtp[i] = (0xff >> 2); + rtp[i] |= (ra_bits[j++] << 7); + rtp[i] |= (ra_bits[j++] << 6); + } + } else { + /* 2 * 80 bits (8 kbit/s) => 1 bit per octet */ + for (unsigned int i = 0; i < RFC4040_RTP_PLEN; i++) { + rtp[i] = (0xff >> 1); + rtp[i] |= (ra_bits[i] << 7); + } + } + + return RFC4040_RTP_PLEN; +} + +int csd_v110_rtp_decode(const struct gsm_lchan *lchan, uint8_t *data, + const uint8_t *rtp, size_t rtp_len) +{ + const struct csd_v110_frame_desc *desc; + ubit_t ra_bits[80 * 4]; + + OSMO_ASSERT(lchan->tch_mode < ARRAY_SIZE(csd_v110_lchan_desc)); + if (lchan->type == GSM_LCHAN_TCH_F) + desc = &csd_v110_lchan_desc[lchan->tch_mode].fr; + else + desc = &csd_v110_lchan_desc[lchan->tch_mode].hr; + if (OSMO_UNLIKELY(desc->num_blocks == 0)) + return -ENOTSUP; + + if (OSMO_UNLIKELY(rtp_len != RFC4040_RTP_PLEN)) + return -EINVAL; + + /* RA1/RA2: convert from 64 kbit/s to an intermediate rate */ + if (desc->num_blocks == 4) { + /* 4 * 80 bits (16 kbit/s) => 2 bits per octet */ + for (unsigned int i = 0, j = 0; i < RFC4040_RTP_PLEN; i++) { + ra_bits[j++] = (rtp[i] >> 7); + ra_bits[j++] = (rtp[i] >> 6) & 0x01; + } + } else { + /* 2 * 80 bits (8 kbit/s) => 1 bit per octet */ + for (unsigned int i = 0; i < RFC4040_RTP_PLEN; i++) + ra_bits[i] = (rtp[i] >> 7); + } + + /* RA1'/RA1: convert to an intermediate data rate */ + for (unsigned int i = 0; i < desc->num_blocks; i++) { + struct osmo_v110_decoded_frame df; + + /* convert modified V.110 frames to normal V.110 frames */ + osmo_v110_decode_frame(&df, &ra_bits[i * 80], 80); + if (desc->num_bits == 60) + osmo_csd_12k_6k_encode_frame(&data[i * 60], 60, &df); + else /* desc->num_bits == 36 */ + osmo_csd_3k6_encode_frame(&data[i * 36], 36, &df); + } + + return desc->num_blocks * desc->num_bits; +} diff --git a/src/common/l1sap.c b/src/common/l1sap.c index 61fb3ee..13d271e 100644 --- a/src/common/l1sap.c +++ b/src/common/l1sap.c @@ -58,6 +58,7 @@ #include <osmo-bts/pcuif_proto.h> #include <osmo-bts/cbch.h> #include <osmo-bts/asci.h> +#include <osmo-bts/csd_v110.h> /* determine the CCCH block number based on the frame number */ unsigned int l1sap_fn2ccch_block(uint32_t fn) @@ -1829,9 +1830,27 @@ return 1; } +static void send_ul_rtp_packet_data(struct gsm_lchan *lchan, uint32_t fn, + const uint8_t *data, uint16_t data_len) +{ + uint8_t rtp_pl[RFC4040_RTP_PLEN]; + int rc; + + rc = csd_v110_rtp_encode(lchan, &rtp_pl[0], data, data_len); + if (rc < 0) + return; + + osmo_rtp_send_frame_ext(lchan->abis_ip.rtp_socket, + &rtp_pl[0], sizeof(rtp_pl), + fn_ms_adj(fn, lchan), + lchan->rtp_tx_marker); + /* Only clear the marker bit once we have sent a RTP packet with it */ + lchan->rtp_tx_marker = false; +} + /* a helper function for the logic in l1sap_tch_ind() */ -static void send_ul_rtp_packet(struct gsm_lchan *lchan, uint32_t fn, - const uint8_t *rtp_pl, uint16_t rtp_pl_len) +static void send_ul_rtp_packet_speech(struct gsm_lchan *lchan, uint32_t fn, + const uint8_t *rtp_pl, uint16_t rtp_pl_len) { if (lchan->abis_ip.osmux.use) { lchan_osmux_send_frame(lchan, rtp_pl, rtp_pl_len, @@ -1859,7 +1878,7 @@ else toc = 0x00; msgb_push_u8(msg, toc); - send_ul_rtp_packet(lchan, fn, msg->data, msg->len); + send_ul_rtp_packet_speech(lchan, fn, msg->data, msg->len); } /* A helper function for l1sap_tch_ind(): handling BFI @@ -1884,7 +1903,7 @@ /* did it actually give us some output? */ if (rc > 0) { /* yes, send it out in RTP */ - send_ul_rtp_packet(lchan, fn, ecu_out, rc); + send_ul_rtp_packet_speech(lchan, fn, ecu_out, rc); return; } } @@ -1892,7 +1911,7 @@ /* Are we in rtp continuous-streaming special mode? If so, send out * a BFI packet as zero-length RTP payload. */ if (lchan->ts->trx->bts->rtp_nogaps_mode) { - send_ul_rtp_packet(lchan, fn, NULL, 0); + send_ul_rtp_packet_speech(lchan, fn, NULL, 0); return; } @@ -1948,11 +1967,21 @@ if (lchan->ecu_state) osmo_ecu_frame_in(lchan->ecu_state, false, msg->data, msg->len); /* hand msg to RTP code for transmission */ - if (bts->emit_hr_rfc5993 && lchan->type == GSM_LCHAN_TCH_H && - lchan->tch_mode == GSM48_CMODE_SPEECH_V1) - send_rtp_rfc5993(lchan, fn, msg); - else - send_ul_rtp_packet(lchan, fn, msg->data, msg->len); + switch (lchan->rsl_cmode) { + case RSL_CMOD_SPD_SPEECH: + if (bts->emit_hr_rfc5993 && lchan->type == GSM_LCHAN_TCH_H && + lchan->tch_mode == GSM48_CMODE_SPEECH_V1) + send_rtp_rfc5993(lchan, fn, msg); + else + send_ul_rtp_packet_speech(lchan, fn, msg->data, msg->len); + break; + case RSL_CMOD_SPD_DATA: + send_ul_rtp_packet_data(lchan, fn, msg->data, msg->len); + break; + case RSL_CMOD_SPD_SIGN: + default: /* shall not happen */ + OSMO_ASSERT(0); + } /* if loopback is enabled, also queue received RTP data */ if (lchan->loopback) { /* add new frame to queue, make sure the queue doesn't get too long */ @@ -2247,10 +2276,23 @@ OSMO_ASSERT(0); } - msg = l1sap_msgb_alloc(rtp_pl_len); + msg = l1sap_msgb_alloc(512); if (!msg) return; - memcpy(msgb_put(msg, rtp_pl_len), rtp_pl, rtp_pl_len); + + if (lchan->rsl_cmode == RSL_CMOD_SPD_DATA) { + int rc = csd_v110_rtp_decode(lchan, msg->tail, + rtp_pl, rtp_pl_len); + if (rc > 0) { + msgb_put(msg, rc); + } else { + msgb_free(msg); + return; + } + } else { + memcpy(msgb_put(msg, rtp_pl_len), rtp_pl, rtp_pl_len); + } + msgb_pull(msg, sizeof(struct osmo_phsap_prim)); /* Store RTP header Marker bit in control buffer */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 100c5d4..8d175be 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = paging cipher agch misc handover tx_power power meas ta_control amr +SUBDIRS = paging cipher agch misc handover tx_power power meas ta_control amr csd if ENABLE_SYSMOBTS SUBDIRS += sysmobts diff --git a/tests/csd/Makefile.am b/tests/csd/Makefile.am new file mode 100644 index 0000000..2041dd7 --- /dev/null +++ b/tests/csd/Makefile.am @@ -0,0 +1,25 @@ +AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include +AM_CFLAGS = \ + -Wall \ + $(LIBOSMOCORE_CFLAGS) \ + $(LIBOSMOGSM_CFLAGS) \ + $(LIBOSMOCODEC_CFLAGS) \ + $(LIBOSMOABIS_CFLAGS) \ + $(LIBOSMOTRAU_CFLAGS) \ + $(LIBOSMONETIF_CFLAGS) \ + $(NULL) +AM_LDFLAGS = -no-install +LDADD = \ + $(LIBOSMOCORE_LIBS) \ + $(LIBOSMOGSM_LIBS) \ + $(LIBOSMOCODEC_LIBS) \ + $(LIBOSMOTRAU_LIBS) \ + $(LIBOSMOABIS_LIBS) \ + $(LIBOSMONETIF_LIBS) \ + $(NULL) + +check_PROGRAMS = csd_test +EXTRA_DIST = csd_test.err + +csd_test_SOURCES = csd_test.c +csd_test_LDADD = $(top_builddir)/src/common/libbts.a $(LDADD) diff --git a/tests/csd/csd_test.c b/tests/csd/csd_test.c new file mode 100644 index 0000000..16995b1 --- /dev/null +++ b/tests/csd/csd_test.c @@ -0,0 +1,138 @@ +/* + * (C) 2023 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de> + * Author: Vadim Yanitskiy <vyanitskiy(a)sysmocom.de> + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <stdint.h> +#include <errno.h> + +#include <osmocom/core/bits.h> +#include <osmocom/core/utils.h> +#include <osmocom/gsm/gsm_utils.h> +#include <osmocom/gsm/protocol/gsm_04_08.h> +#include <osmocom/isdn/v110.h> + +#include <osmo-bts/csd_v110.h> +#include <osmo-bts/lchan.h> + +#define BBUF_MAX 290 + +struct test_case { + const char *name; + enum gsm_chan_t lchan_type; + enum gsm48_chan_mode tch_mode; +}; + +static const struct test_case tests[] = { + { + .name = "TCH/F14.4", + .lchan_type = GSM_LCHAN_TCH_F, + .tch_mode = GSM48_CMODE_DATA_14k5, + }, + { + .name = "TCH/F9.6", + .lchan_type = GSM_LCHAN_TCH_F, + .tch_mode = GSM48_CMODE_DATA_12k0, + }, + { + .name = "TCH/F4.8", + .lchan_type = GSM_LCHAN_TCH_F, + .tch_mode = GSM48_CMODE_DATA_6k0, + }, + { + .name = "TCH/H4.8", + .lchan_type = GSM_LCHAN_TCH_H, + .tch_mode = GSM48_CMODE_DATA_6k0, + }, + { + .name = "TCH/F2.4", + .lchan_type = GSM_LCHAN_TCH_F, + .tch_mode = GSM48_CMODE_DATA_3k6, + }, + { + .name = "TCH/H2.4", + .lchan_type = GSM_LCHAN_TCH_H, + .tch_mode = GSM48_CMODE_DATA_3k6, + }, +}; + +static void exec_test_case(const struct test_case *tc) +{ + const struct csd_v110_frame_desc *desc; + uint8_t rtp[RFC4040_RTP_PLEN] = { 0 }; + ubit_t data_enc[BBUF_MAX]; + ubit_t data_dec[BBUF_MAX]; + int rc; + + /* obtain a V.110 frame description for the given channel type/rate */ + OSMO_ASSERT(tc->tch_mode < ARRAY_SIZE(csd_v110_lchan_desc)); + if (tc->lchan_type == GSM_LCHAN_TCH_F) + desc = &csd_v110_lchan_desc[tc->tch_mode].fr; + else + desc = &csd_v110_lchan_desc[tc->tch_mode].hr; + + /* total number of bits carried by a radio interface block */ + const unsigned int bit_num = desc->num_bits * desc->num_blocks; + if (bit_num == 0) { + fprintf(stderr, "[i] Skipping '%s' (not implemented)\n", tc->name); + return; + } + + fprintf(stderr, "[i] Testing '%s' (bitnum=%u)\n", tc->name, bit_num); + + struct gsm_lchan lchan = { + .type = tc->lchan_type, + .tch_mode = tc->tch_mode, + }; + + /* populate the data_enc[] buffer with some bits */ + OSMO_ASSERT(bit_num <= BBUF_MAX); + for (unsigned int i = 0; i < bit_num; i++) + data_enc[i] = i & 0x01; + + /* encode an RTP frame and print it */ + rc = csd_v110_rtp_encode(&lchan, &rtp[0], &data_enc[0], bit_num); + fprintf(stderr, "[i] csd_v110_rtp_encode() returns %d\n", rc); + if (rc != RFC4040_RTP_PLEN) + return; + /* print the encoded RTP frame (16 bytes per row) */ + for (unsigned int i = 0; i < sizeof(rtp) / 16; i++) + fprintf(stderr, " %s\n", osmo_hexdump(&rtp[i * 16], 16)); + + /* decode the encoded RTP frame */ + rc = csd_v110_rtp_decode(&lchan, &data_dec[0], &rtp[0], sizeof(rtp)); + fprintf(stderr, "[i] csd_v110_rtp_decode() returns %d\n", rc); + if (rc != bit_num) + return; + /* compare data_dec[] vs data_enc[] */ + for (unsigned int i = 0; i < bit_num; i++) { + if (data_dec[i] == data_enc[i]) + continue; + fprintf(stderr, "[!] Data mismatch @ %03u: D%u vs E%u\n", + i, data_dec[i], data_enc[i]); + } +} + +int main(int argc, char **argv) +{ + for (unsigned int i = 0; i < ARRAY_SIZE(tests); i++) + exec_test_case(&tests[i]); + + return 0; +} diff --git a/tests/csd/csd_test.err b/tests/csd/csd_test.err new file mode 100644 index 0000000..bc9747c --- /dev/null +++ b/tests/csd/csd_test.err @@ -0,0 +1,66 @@ +[i] Skipping 'TCH/F14.4' (not implemented) +[i] Testing 'TCH/F9.6' (bitnum=240) +[i] csd_v110_rtp_encode() returns 160 + 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf + ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f + 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf + ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f +[i] csd_v110_rtp_decode() returns 240 +[i] Testing 'TCH/F4.8' (bitnum=120) +[i] csd_v110_rtp_encode() returns 160 + 7f 7f 7f 7f 7f 7f 7f 7f ff 7f ff 7f ff 7f ff 7f + ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f + ff ff 7f ff 7f ff 7f ff ff 7f 7f 7f 7f ff 7f ff + ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff + ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff + 7f 7f 7f 7f 7f 7f 7f 7f ff 7f ff 7f ff 7f ff 7f + ff ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff 7f + ff ff 7f ff 7f ff 7f ff ff 7f 7f 7f 7f ff 7f ff + ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff + ff 7f ff 7f ff 7f ff 7f ff ff 7f ff 7f ff 7f ff +[i] csd_v110_rtp_decode() returns 120 +[i] Testing 'TCH/H4.8' (bitnum=240) +[i] csd_v110_rtp_encode() returns 160 + 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf + ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f + 3f 3f 3f 3f bf bf bf bf ff 7f 7f 7f bf bf bf bf + ff 7f 7f 7f bf 3f 7f 7f bf bf bf bf ff 7f 7f 7f + bf bf bf bf ff 7f 7f 7f 3f 3f 3f 3f bf bf bf bf + ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f bf 3f 7f 7f + bf bf bf bf ff 7f 7f 7f bf bf bf bf ff 7f 7f 7f +[i] csd_v110_rtp_decode() returns 240 +[i] Testing 'TCH/F2.4' (bitnum=72) +[i] csd_v110_rtp_encode() returns 160 + 7f 7f 7f 7f 7f 7f 7f 7f ff 7f 7f ff ff 7f 7f ff + ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff + ff 7f 7f ff ff 7f 7f ff ff 7f 7f 7f 7f ff 7f ff + ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff + ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff + 7f 7f 7f 7f 7f 7f 7f 7f ff 7f 7f ff ff 7f 7f ff + ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff + ff 7f 7f ff ff 7f 7f ff ff 7f 7f 7f 7f ff 7f ff + ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff + ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff ff 7f 7f ff +[i] csd_v110_rtp_decode() returns 72 +[i] Testing 'TCH/H2.4' (bitnum=144) +[i] csd_v110_rtp_encode() returns 160 + 3f 3f 3f 3f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f + bf 7f bf 7f bf 3f 7f 7f bf 7f bf 7f bf 7f bf 7f + bf 7f bf 7f bf 7f bf 7f 3f 3f 3f 3f bf 7f bf 7f + bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 3f 7f 7f + bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f + 3f 3f 3f 3f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f + bf 7f bf 7f bf 3f 7f 7f bf 7f bf 7f bf 7f bf 7f + bf 7f bf 7f bf 7f bf 7f 3f 3f 3f 3f bf 7f bf 7f + bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 3f 7f 7f + bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f bf 7f +[i] csd_v110_rtp_decode() returns 144 diff --git a/tests/testsuite.at b/tests/testsuite.at index 7e6ec4b..a7012b1 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -70,3 +70,9 @@ cat $abs_srcdir/amr/amr_test.err > experr AT_CHECK([$abs_top_builddir/tests/amr/amr_test], [], [expout], [experr]) AT_CLEANUP + +AT_SETUP([csd]) +AT_KEYWORDS([csd]) +cat $abs_srcdir/csd/csd_test.err > experr +AT_CHECK([$abs_top_builddir/tests/csd/csd_test], [], [ignore], [experr]) +AT_CLEANUP -- To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/33832 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I5e3701ad52d5d428fd02caff037881045f2d0a02 Gerrit-Change-Number: 33832 Gerrit-PatchSet: 5 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[L] Change in osmo-bts[master]: l1sap: proper rate adaptation for CSD (RFC4040 'clearmode')
by fixeria 31 Jul '23

31 Jul '23
Attention is currently required from: osmith, pespin. fixeria has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/33832 ) Change subject: l1sap: proper rate adaptation for CSD (RFC4040 'clearmode') ...................................................................... Patch Set 5: Code-Review+2 (1 comment) File src/common/csd_v110.c: https://gerrit.osmocom.org/c/osmo-bts/+/33832/comment/2ff03e02_0e95c64b PS5, Line 90: memset(&df.e_bits[0], 0, 3); > vty command? Nope, see next commit. -- To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/33832 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I5e3701ad52d5d428fd02caff037881045f2d0a02 Gerrit-Change-Number: 33832 Gerrit-PatchSet: 5 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Attention: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Mon, 31 Jul 2023 09:28:08 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: Yes Comment-In-Reply-To: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: comment
1 0
0 0
[M] Change in osmo-bts[master]: csd_v110_rtp_encode(): properly set E1/E2/E3 bits
by pespin 31 Jul '23

31 Jul '23
Attention is currently required from: fixeria. pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/33934 ) Change subject: csd_v110_rtp_encode(): properly set E1/E2/E3 bits ...................................................................... Patch Set 2: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/33934 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I1a14597dff746cf975140b294400a2cc05badccd Gerrit-Change-Number: 33934 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Comment-Date: Mon, 31 Jul 2023 09:26:48 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
1 0
0 0
[L] Change in osmo-bts[master]: l1sap: proper rate adaptation for CSD (RFC4040 'clearmode')
by pespin 31 Jul '23

31 Jul '23
Attention is currently required from: osmith, fixeria. pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-bts/+/33832 ) Change subject: l1sap: proper rate adaptation for CSD (RFC4040 'clearmode') ...................................................................... Patch Set 5: Code-Review+1 (1 comment) File src/common/csd_v110.c: https://gerrit.osmocom.org/c/osmo-bts/+/33832/comment/1cff9af8_7ef366f6 PS5, Line 90: memset(&df.e_bits[0], 0, 3); vty command? -- To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/33832 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bts Gerrit-Branch: master Gerrit-Change-Id: I5e3701ad52d5d428fd02caff037881045f2d0a02 Gerrit-Change-Number: 33832 Gerrit-PatchSet: 5 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Comment-Date: Mon, 31 Jul 2023 09:26:16 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
1 0
0 0
[S] Change in osmo-bsc[master]: bsc (WIP): Make socket queue max. length configurable
by pespin 31 Jul '23

31 Jul '23
Attention is currently required from: arehbein. pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/33892 ) Change subject: bsc (WIP): Make socket queue max. length configurable ...................................................................... Patch Set 4: (2 comments) File src/osmo-bsc/bsc_vty.c: https://gerrit.osmocom.org/c/osmo-bsc/+/33892/comment/75d5d4f9_f3c3c43d PS1, Line 2491: } > I suppose it's possible to check if the current wqueue length is larger than the new maximum right i […] If you set a maximum len on a queue, you definettly don't want your queue to be in a state where the len is over that maximum. File src/osmo-bsc/bsc_vty.c: https://gerrit.osmocom.org/c/osmo-bsc/+/33892/comment/4999ce07_f3d8c2ba PS4, Line 2486: net->pcu_state->upqueue.max_length = net->pcu_sock_wqueue_len_max; use wqueue API which internally drops enqueued messages > max -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/33892 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Change-Id: Ic5f19f4613bccaf582997a4d02b689adee083a0b Gerrit-Change-Number: 33892 Gerrit-PatchSet: 4 Gerrit-Owner: arehbein <arehbein(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-CC: pespin <pespin(a)sysmocom.de> Gerrit-Attention: arehbein <arehbein(a)sysmocom.de> Gerrit-Comment-Date: Mon, 31 Jul 2023 09:23:47 +0000 Gerrit-HasComments: Yes Gerrit-Has-Labels: No Comment-In-Reply-To: arehbein <arehbein(a)sysmocom.de> Comment-In-Reply-To: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: comment
1 0
0 0
[S] Change in osmo-ci[master]: jobs/osmocom-release-{manuals,tarballs}: set node
by osmith 31 Jul '23

31 Jul '23
osmith has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ci/+/34017 ) Change subject: jobs/osmocom-release-{manuals,tarballs}: set node ...................................................................... jobs/osmocom-release-{manuals,tarballs}: set node Set node to osmocom-master, so these jobs don't run on any node. Change-Id: I3142b0463f7c61d47991822bf592f49ab4a421f7 --- M jobs/osmocom-release-manuals.yml M jobs/osmocom-release-tarballs.yml 2 files changed, 13 insertions(+), 0 deletions(-) Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved diff --git a/jobs/osmocom-release-manuals.yml b/jobs/osmocom-release-manuals.yml index 0628377..a120127 100644 --- a/jobs/osmocom-release-manuals.yml +++ b/jobs/osmocom-release-manuals.yml @@ -6,6 +6,7 @@ - job: name: 'Osmocom-release-manuals' + node: osmocom-master project-type: freestyle defaults: global description: | diff --git a/jobs/osmocom-release-tarballs.yml b/jobs/osmocom-release-tarballs.yml index 17b7c58..2e6bb04 100644 --- a/jobs/osmocom-release-tarballs.yml +++ b/jobs/osmocom-release-tarballs.yml @@ -6,6 +6,7 @@ - job-template: name: 'Osmocom-release-tarballs' + node: osmocom-master project-type: freestyle defaults: global description: | -- To view, visit https://gerrit.osmocom.org/c/osmo-ci/+/34017 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ci Gerrit-Branch: master Gerrit-Change-Id: I3142b0463f7c61d47991822bf592f49ab4a421f7 Gerrit-Change-Number: 34017 Gerrit-PatchSet: 1 Gerrit-Owner: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
[S] Change in osmo-ci[master]: update obs-mirror include list
by pespin 31 Jul '23

31 Jul '23
Attention is currently required from: laforge. pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-ci/+/34015 ) Change subject: update obs-mirror include list ...................................................................... Patch Set 1: Code-Review+1 -- To view, visit https://gerrit.osmocom.org/c/osmo-ci/+/34015 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ci Gerrit-Branch: master Gerrit-Change-Id: I4f4103732a6dc3d73ada85482c6a2f806b4100aa Gerrit-Change-Number: 34015 Gerrit-PatchSet: 1 Gerrit-Owner: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: laforge <laforge(a)osmocom.org> Gerrit-Comment-Date: Mon, 31 Jul 2023 09:16:29 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
1 0
0 0
[S] Change in osmo-ci[master]: jobs/osmocom-release-{manuals,tarballs}: set node
by pespin 31 Jul '23

31 Jul '23
Attention is currently required from: osmith. pespin has posted comments on this change. ( https://gerrit.osmocom.org/c/osmo-ci/+/34017 ) Change subject: jobs/osmocom-release-{manuals,tarballs}: set node ...................................................................... Patch Set 1: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ci/+/34017 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ci Gerrit-Branch: master Gerrit-Change-Id: I3142b0463f7c61d47991822bf592f49ab4a421f7 Gerrit-Change-Number: 34017 Gerrit-PatchSet: 1 Gerrit-Owner: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: osmith <osmith(a)sysmocom.de> Gerrit-Comment-Date: Mon, 31 Jul 2023 09:15:20 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes Gerrit-MessageType: comment
1 0
0 0
[M] Change in osmo-ttcn3-hacks[master]: pcu: Introduce test TC_dl_multislot_tbf_ms_class_unknown
by pespin 31 Jul '23

31 Jul '23
pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/34004 ) Change subject: pcu: Introduce test TC_dl_multislot_tbf_ms_class_unknown ...................................................................... pcu: Introduce test TC_dl_multislot_tbf_ms_class_unknown Related: OS#6118 Change-Id: I9af8792fe4c44b5dd1aab5a2d4b7d3c2a2366d12 --- M pcu/PCU_Tests.ttcn M pcu/expected-results.xml 2 files changed, 86 insertions(+), 0 deletions(-) Approvals: laforge: Looks good to me, but someone else must approve fixeria: Looks good to me, approved Jenkins Builder: Verified diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn index e381c59..d844736 100644 --- a/pcu/PCU_Tests.ttcn +++ b/pcu/PCU_Tests.ttcn @@ -3252,6 +3252,75 @@ f_shutdown(__BFILE__, __LINE__, final := true); } +/* Test DL TBF assignment over PACCH if Multislot class is unknown both at PCU + * and SGSN (eg. because MS started 1-phase access and SGSN answered back). + * Since the msclass is unknown, it shouldn't assign multiple timeslots since + * the MS may not support it. Related OS#6118. */ +testcase TC_dl_multislot_tbf_ms_class_unknown() runs on RAW_PCU_Test_CT +{ + var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS)); + var RlcmacDlBlock dl_block; + var octetstring payload; + var template (value) LlcBlockHdr blk_hdr; + var template (value) LlcBlocks blocks; + var uint32_t sched_fn; + var uint32_t dl_fn; + var template RlcmacDlBlock acknack_tmpl; + var GprsMS ms; + var octetstring data := f_rnd_octstring(10); + + /* Initialize NS/BSSGP side */ + f_init_bssgp(); + + /* Only 1 TRX with 8 PDCH */ + f_PCUIF_PDCHMask_set(info_ind, '11111111'B, 0); + f_PCUIF_PDCHMask_set(info_ind, '00000000'B, (1 .. 7)); + + /* Initialize GPRS MS side */ + f_init_gprs_ms(); + ms := g_ms[0]; /* We only use first MS in this test */ + + /* Initialize the PCU interface abstraction */ + f_init_raw(testcasename(), info_ind); + + /* Establish BSSGP connection to the PCU */ + f_bssgp_establish(); + f_bssgp_client_llgmm_assign(TLLI_UNUSED, ms.tlli); + + /* Establish an Uplink TBF. 1 TS is assigned over AGCH. */ + f_ms_establish_ul_tbf(ms); + + /* Wait until PCU starts requesting for UL block on this TBF: */ + dl_fn := f_ms_wait_usf(ms, nr := f_ms_tx_TsTrxBtsNum(ms)); + sched_fn := f_next_pdch_block(dl_fn); + + /* Send one UL block (with TLLI since we are in One-Phase Access + * contention resolution) and make sure it is ACKED fine. */ + payload := f_rnd_octstring(16); /* 16 bytes fills the llc block (because TLLI takes 4 bytes) */ + blk_hdr := t_RLCMAC_LLCBLOCK_HDR(length_ind := lengthof(payload), + more := false, e := true); + blocks := { t_RLCMAC_LLCBLOCK(payload, blk_hdr) }; + /* Set CV = 15 to signal there's still more than BS_CV_MAX blocks to be sent */ + f_ms_tx_ul_data_blocks_gprs(ms, blocks, cv := 15, with_tlli := true, fn := sched_fn, nr := f_ms_tx_TsTrxBtsNum(ms)); + + /* UL block should be received in SGSN */ + BSSGP[0].receive(tr_BSSGP_UL_UD(ms.tlli, mp_gb_cfg.bvc[0].cell_id)); + + acknack_tmpl := tr_RLCMAC_UL_ACK_NACK_GPRS(ms.ul_tbf.tfi, + tr_UlAckNackGprs(ms.tlli, + tr_AckNackDescription(final_ack := '0'B))) + f_rx_rlcmac_dl_block_exp_ack_nack(dl_block, sched_fn, acknack_tmpl, nr := f_ms_tx_TsTrxBtsNum(ms)); + + BSSGP[0].send(ts_BSSGP_DL_UD(ms.tlli, data, racap := omit)); + dl_block := f_ms_rx_pkt_ass_pacch(ms, sched_fn, tr_RLCMAC_DL_PACKET_ASS, nr := f_ms_tx_TsTrxBtsNum(ms)); + if (f_dltbf_num_slots(ms.dl_tbf) != 1) { + setverdict(fail, "Expected 1 PDCH slots allocated but got ", f_dltbf_num_slots(ms.dl_tbf)); + f_shutdown(__BFILE__, __LINE__); + } + + f_shutdown(__BFILE__, __LINE__, final := true); +} + testcase TC_dl_multislot_tbf_ms_class_from_2phase() runs on RAW_PCU_Test_CT { var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default(c_PCUIF_Flags_noMCS)); var RlcmacDlBlock dl_block; @@ -7436,6 +7505,7 @@ execute( TC_pcuif_fh_pkt_ass_dl() ); execute( TC_multitrx_multims_alloc() ); execute( TC_dl_multislot_tbf_ms_class_from_sgsn() ); + execute( TC_dl_multislot_tbf_ms_class_unknown() ); execute( TC_dl_multislot_tbf_ms_class_from_2phase() ); execute( TC_ul_multislot_tbf_ms_class_from_2phase() ); execute( TC_ul_tbf_reestablish_with_pkt_resource_req() ); diff --git a/pcu/expected-results.xml b/pcu/expected-results.xml index eccff6f..2a25934 100644 --- a/pcu/expected-results.xml +++ b/pcu/expected-results.xml @@ -93,6 +93,12 @@ PCU_Tests.ttcn:MASKED TC_dl_multislot_tbf_ms_class_from_sgsn testcase </failure> </testcase> + <testcase classname='PCU_Tests' name='TC_dl_multislot_tbf_ms_class_unknown' time='MASKED'> + <failure type='fail-verdict'>Expected 1 PDCH slots allocated but got 4 + PCU_Tests.ttcn:MASKED PCU_Tests control part + PCU_Tests.ttcn:MASKED TC_dl_multislot_tbf_ms_class_unknown testcase + </failure> + </testcase> <testcase classname='PCU_Tests' name='TC_dl_multislot_tbf_ms_class_from_2phase' time='MASKED'/> <testcase classname='PCU_Tests' name='TC_ul_multislot_tbf_ms_class_from_2phase' time='MASKED'/> <testcase classname='PCU_Tests' name='TC_ul_tbf_reestablish_with_pkt_resource_req' time='MASKED'/> -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/34004 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I9af8792fe4c44b5dd1aab5a2d4b7d3c2a2366d12 Gerrit-Change-Number: 34004 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-MessageType: merged
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • ...
  • 306
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.