fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/41658?usp=email )
Change subject: bts-trx: get rid of static variables in trx_if_send_burst() ......................................................................
bts-trx: get rid of static variables in trx_if_send_burst()
Change-Id: I431964d6fe02e53771cc0514ac930348f0a86aa1 Related: OS#1579 --- M src/osmo-bts-trx/l1_if.h M src/osmo-bts-trx/trx_if.c 2 files changed, 28 insertions(+), 22 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/58/41658/1
diff --git a/src/osmo-bts-trx/l1_if.h b/src/osmo-bts-trx/l1_if.h index 7cc82ad..0180499 100644 --- a/src/osmo-bts-trx/l1_if.h +++ b/src/osmo-bts-trx/l1_if.h @@ -126,6 +126,13 @@ /* Whether the l1h->trx_ctrl_list was flushed by the callback handling a received message */ bool flushed_while_in_trx_ctrl_read_cb;
+ struct { + /* the Tx buffer used by trx_if_send_burst() */ + struct msgb *sndbuf; + /* number of PDUs in the Tx buffer */ + unsigned int sndbuf_num_pdus; + } data; + //struct gsm_bts_trx *trx; struct phy_instance *phy_inst;
diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c index a76e9eb..510bf4a 100644 --- a/src/osmo-bts-trx/trx_if.c +++ b/src/osmo-bts-trx/trx_if.c @@ -1110,9 +1110,8 @@ int trx_if_send_burst(struct trx_l1h *l1h, const struct trx_dl_burst_req *br) { uint8_t pdu_ver = l1h->config.trxd_pdu_ver_use; - static struct msgb *trx_data_last_msg = NULL; - static unsigned int pdu_num = 0; - uint8_t *buf; + struct msgb *sndbuf = NULL; + uint8_t *buf = NULL; int rc;
/* Make sure that the PHY is powered on */ @@ -1122,33 +1121,33 @@ return -ENODEV; }
- if (!trx_data_last_msg) { - trx_data_last_msg = msgb_alloc(TRXD_MSG_BUF_SIZE, "tx_trxd"); - OSMO_ASSERT(trx_data_last_msg); - buf = msgb_data(trx_data_last_msg); + if (l1h->data.sndbuf == NULL) { + l1h->data.sndbuf = msgb_alloc_c(l1h, TRXD_MSG_BUF_SIZE, "tx_trxd"); + OSMO_ASSERT(l1h->data.sndbuf); } + sndbuf = l1h->data.sndbuf;
/* Burst batching breaker */ if (br == NULL) { - if (pdu_num > 0) + if (l1h->data.sndbuf_num_pdus > 0) goto sendall; return -ENOMSG; }
- /* l2h holds Pointer to the last encoded PDU */ - trx_data_last_msg->l2h = trx_data_last_msg->tail; + /* l2h points to the last encoded PDU */ + sndbuf->l2h = sndbuf->tail;
switch (pdu_ver) { /* Both versions have the same PDU format */ case 0: /* TRXDv0 */ case 1: /* TRXDv1 */ - buf = (uint8_t *)msgb_put(trx_data_last_msg, 6); + buf = (uint8_t *)msgb_put(sndbuf, 6); buf[0] = ((pdu_ver & 0x0f) << 4) | br->tn; osmo_store32be(br->fn, buf + 1); buf[5] = br->att; break; case 2: /* TRXDv2 */ - buf = (uint8_t *)msgb_put(trx_data_last_msg, 8); + buf = (uint8_t *)msgb_put(sndbuf, 8); buf[0] = br->tn; /* BATCH.ind will be unset in the last PDU */ buf[1] = (br->trx_num & 0x3f) | (1 << 7); @@ -1159,9 +1158,9 @@ buf[4] = (uint8_t) br->scpir; buf[5] = buf[6] = buf[7] = 0x00; /* Spare */ /* Some fields are not present in batched PDUs */ - if (pdu_num == 0) { + if (l1h->data.sndbuf_num_pdus == 0) { buf[0] |= (pdu_ver & 0x0f) << 4; - osmo_store32be(br->fn, (uint8_t *)msgb_put(trx_data_last_msg, 4)); + msgb_put_u32(sndbuf, br->fn); } break; default: @@ -1170,10 +1169,10 @@ }
/* copy ubits {0,1} */ - memcpy(msgb_put(trx_data_last_msg, br->burst_len), br->burst, br->burst_len); + memcpy(msgb_put(sndbuf, br->burst_len), br->burst, br->burst_len);
/* One more PDU in the buffer */ - pdu_num++; + l1h->data.sndbuf_num_pdus++;
/* TRXDv2: wait for the batching breaker */ if (pdu_ver >= 2) @@ -1182,23 +1181,23 @@ sendall: LOGPPHI(l1h->phy_inst, DTRX, LOGL_DEBUG, "Tx TRXDv%u datagram with %u PDU(s)\n", - pdu_ver, pdu_num); + pdu_ver, l1h->data.sndbuf_num_pdus);
/* TRXDv2: unset BATCH.ind in the last PDU */ if (pdu_ver >= 2) - trx_data_last_msg->l2h[1] &= ~(1 << 7); + sndbuf->l2h[1] &= ~(1 << 7);
- rc = osmo_iofd_write_msgb(l1h->trx_data_iofd, trx_data_last_msg); + rc = osmo_iofd_write_msgb(l1h->trx_data_iofd, sndbuf); if (OSMO_UNLIKELY(rc < 0)) { char errbuf[256]; strerror_r(errno, errbuf, sizeof(errbuf)); LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR, "send() failed on TRXD with rc=%d (%s)\n", rc, errbuf); - msgb_free(trx_data_last_msg); + msgb_free(sndbuf); } - trx_data_last_msg = NULL; - pdu_num = 0; + l1h->data.sndbuf = NULL; + l1h->data.sndbuf_num_pdus = 0;
return 0; }