fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/43106?usp=email )
Change subject: libosmo-trx/trxc: enlarge the params buffer ......................................................................
libosmo-trx/trxc: enlarge the params buffer
The SETFH command (implemented by trxcon and fake_trx) carries the whole Mobile Allocation as pairs of Rx/Tx frequencies in kHz:
CMD SETFH <HSN> <MAIO> <RXF1> <TXF1> [... <RXFN> <TXFN>]
With up to 64 ARFCNs in the Mobile Allocation, the parameters string alone can exceed 1000 characters, far beyond the old 128 byte limit.
Derive OSMO_TRXC_PARAMS_LEN_MAX from OSMO_TRXC_MSG_BUF_SIZE, so that any message ("RSP " + verb + status + params) still fits the recommended socket buffer size. Also add the OSMO_TRXC_CMD_SETFH verb constant and a regression test doing a round-trip of a maximum size SETFH command (64 ARFCNs).
Change-Id: I2f65b213f5ada499eea4abae87d3727057e03e22 --- M libosmo-trx/include/osmocom/trx/trxc.h M tests/libosmo-trx/trxc_test.c M tests/libosmo-trx/trxc_test.ok 3 files changed, 56 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/06/43106/1
diff --git a/libosmo-trx/include/osmocom/trx/trxc.h b/libosmo-trx/include/osmocom/trx/trxc.h index ee7935a..6f6891e 100644 --- a/libosmo-trx/include/osmocom/trx/trxc.h +++ b/libosmo-trx/include/osmocom/trx/trxc.h @@ -7,10 +7,13 @@
/*! Maximum length of a command verb (incl. '\0') */ #define OSMO_TRXC_CMD_LEN_MAX 32 -/*! Maximum length of the parameters string (incl. '\0') */ -#define OSMO_TRXC_PARAMS_LEN_MAX 128 /*! Recommended TRXC socket read/send buffer size */ #define OSMO_TRXC_MSG_BUF_SIZE 1500 +/*! Maximum length of the parameters string (incl. '\0'). Must be large + * enough for SETFH, which carries the whole Mobile Allocation as pairs of + * Rx/Tx frequencies in kHz (over 1000 characters for 64 ARFCNs). Sized so + * that any message ("RSP " + verb + status) still fits the buffer above. */ +#define OSMO_TRXC_PARAMS_LEN_MAX (OSMO_TRXC_MSG_BUF_SIZE - OSMO_TRXC_CMD_LEN_MAX - 32)
enum osmo_trxc_msg_type { OSMO_TRXC_MT_CMD, /*!< "CMD <verb> [<params>]" (L1 -> TRX) */ @@ -52,6 +55,7 @@ #define OSMO_TRXC_CMD_HANDOVER "HANDOVER" #define OSMO_TRXC_CMD_NOHANDOVER "NOHANDOVER" #define OSMO_TRXC_CMD_RFMUTE "RFMUTE" +#define OSMO_TRXC_CMD_SETFH "SETFH" #define OSMO_TRXC_CMD_ERR "ERR" /*!< verb of a reject response */
/* Clock socket: "IND CLOCK <fn>" */ diff --git a/tests/libosmo-trx/trxc_test.c b/tests/libosmo-trx/trxc_test.c index 82676a7..93eea83 100644 --- a/tests/libosmo-trx/trxc_test.c +++ b/tests/libosmo-trx/trxc_test.c @@ -114,6 +114,50 @@ OSMO_ASSERT(rc == 2 && tn == 3 && ts_type == 7); }
+/* SETFH (trxcon dialect) carries the whole Mobile Allocation as pairs of + * Rx/Tx frequencies in kHz, so its parameters can be over 1000 characters + * long (up to 64 ARFCNs). Ensure that such messages survive a round-trip. */ +static void test_long_params(void) +{ + char buf[OSMO_TRXC_MSG_BUF_SIZE]; + struct osmo_trxc_msg msg = { + .type = OSMO_TRXC_MT_CMD, + .cmd = OSMO_TRXC_CMD_SETFH, + }; + struct osmo_trxc_msg parsed; + size_t len; + int rc; + + printf("=== %s ===\n", __func__); + + /* HSN=32 MAIO=5, then 64 pairs of DCS1800 Rx/Tx frequencies */ + len = snprintf(msg.params, sizeof(msg.params), "32 5"); + for (unsigned int i = 0; i < 64; i++) { + len += snprintf(msg.params + len, sizeof(msg.params) - len, + " %u %u", 1805200 + i * 200, 1710200 + i * 200); + } + printf("SETFH params_len=%zu\n", len); + OSMO_ASSERT(len < sizeof(msg.params)); + + rc = osmo_trxc_msg_build(buf, sizeof(buf), &msg); + printf("build: rc=%d\n", rc); + OSMO_ASSERT(rc > 0); + + rc = osmo_trxc_msg_parse(&parsed, buf, rc); + printf("parse: rc=%d cmd='%s' params_len=%zu\n", + rc, parsed.cmd, strlen(parsed.params)); + OSMO_ASSERT(rc == 0); + OSMO_ASSERT(strcmp(parsed.params, msg.params) == 0); + + /* parameters longer than OSMO_TRXC_PARAMS_LEN_MAX shall be rejected */ + len = strlen(buf); + memset(buf + len, '6', sizeof(buf) - len - 1); + buf[sizeof(buf) - 1] = '\0'; + rc = osmo_trxc_msg_parse(&parsed, buf, strlen(buf)); + printf("parse oversized params: rc=%d\n", rc); + OSMO_ASSERT(rc < 0); +} + static void test_clk_ind(void) { static const char * const messages[] = { @@ -155,6 +199,7 @@ test_msg_parse(); test_msg_build(); test_params_scan(); + test_long_params(); test_clk_ind();
printf("Done\n"); diff --git a/tests/libosmo-trx/trxc_test.ok b/tests/libosmo-trx/trxc_test.ok index 9422d19..845d4da 100644 --- a/tests/libosmo-trx/trxc_test.ok +++ b/tests/libosmo-trx/trxc_test.ok @@ -38,6 +38,11 @@ build into a too small buffer: rc=-90 === test_params_scan === '3 7' -> rc=2 tn=3 ts_type=7 +=== test_long_params === +SETFH params_len=1028 +build: rc=1038 +parse: rc=0 cmd='SETFH' params_len=1028 +parse oversized params: rc=-90 === test_clk_ind === 'IND CLOCK 402312' -> fn=402312 'IND CLOCK 0' -> fn=0