trxcon/scheduler: print completeness of the Rx burst buffers
Change-Id: Ife9f5eabc23aa2eea08b190361e10a98e890d608 Related: OS#3554
This commit is contained in:
parent
2d355c2453
commit
3f25909e10
|
@ -2,7 +2,7 @@
|
||||||
* OsmocomBB <-> SDR connection bridge
|
* OsmocomBB <-> SDR connection bridge
|
||||||
* TDMA scheduler: common routines for lchan handlers
|
* TDMA scheduler: common routines for lchan handlers
|
||||||
*
|
*
|
||||||
* (C) 2017-2019 by Vadim Yanitskiy <axilirator@gmail.com>
|
* (C) 2017-2020 by Vadim Yanitskiy <axilirator@gmail.com>
|
||||||
*
|
*
|
||||||
* All Rights Reserved
|
* All Rights Reserved
|
||||||
*
|
*
|
||||||
|
@ -84,6 +84,25 @@ const uint8_t sched_nb_training_bits[8][26] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Get a string representation of the burst buffer's completeness.
|
||||||
|
* Examples: " ****.." (incomplete, 4/6 bursts)
|
||||||
|
* " ****" (complete, all 4 bursts)
|
||||||
|
* "**.***.." (incomplete, 5/8 bursts) */
|
||||||
|
const char *burst_mask2str(const uint8_t *mask, int bits)
|
||||||
|
{
|
||||||
|
/* TODO: CSD is interleaved over 22 bursts, so the mask needs to be extended */
|
||||||
|
static char buf[8 + 1];
|
||||||
|
char *ptr = buf;
|
||||||
|
|
||||||
|
OSMO_ASSERT(bits <= 8 && bits > 0);
|
||||||
|
|
||||||
|
while (--bits >= 0)
|
||||||
|
*(ptr++) = (*mask & (1 << bits)) ? '*' : '.';
|
||||||
|
*ptr = '\0';
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
int sched_gsmtap_send(enum trx_lchan_type lchan_type, uint32_t fn, uint8_t tn,
|
int sched_gsmtap_send(enum trx_lchan_type lchan_type, uint32_t fn, uint8_t tn,
|
||||||
uint16_t band_arfcn, int8_t signal_dbm, uint8_t snr,
|
uint16_t band_arfcn, int8_t signal_dbm, uint8_t snr,
|
||||||
const uint8_t *data, size_t data_len)
|
const uint8_t *data, size_t data_len)
|
||||||
|
|
|
@ -88,8 +88,9 @@ int rx_pdtch_fn(struct trx_instance *trx, struct trx_ts *ts,
|
||||||
|
|
||||||
/* Check for complete set of bursts */
|
/* Check for complete set of bursts */
|
||||||
if ((*mask & 0xf) != 0xf) {
|
if ((*mask & 0xf) != 0xf) {
|
||||||
LOGP(DSCHD, LOGL_ERROR, "Received incomplete data frame at "
|
LOGP(DSCHD, LOGL_ERROR, "Received incomplete (%s) data frame at "
|
||||||
"fn=%u (%u/%u) for %s\n", *first_fn,
|
"fn=%u (%u/%u) for %s\n",
|
||||||
|
burst_mask2str(mask, 4), *first_fn,
|
||||||
(*first_fn) % ts->mf_layout->period,
|
(*first_fn) % ts->mf_layout->period,
|
||||||
ts->mf_layout->period,
|
ts->mf_layout->period,
|
||||||
lchan_desc->name);
|
lchan_desc->name);
|
||||||
|
|
|
@ -90,8 +90,9 @@ int rx_tchf_fn(struct trx_instance *trx, struct trx_ts *ts,
|
||||||
|
|
||||||
/* Check for complete set of bursts */
|
/* Check for complete set of bursts */
|
||||||
if ((*mask & 0xf) != 0xf) {
|
if ((*mask & 0xf) != 0xf) {
|
||||||
LOGP(DSCHD, LOGL_ERROR, "Received incomplete traffic frame at "
|
LOGP(DSCHD, LOGL_ERROR, "Received incomplete (%s) traffic frame at "
|
||||||
"fn=%u (%u/%u) for %s\n", *first_fn,
|
"fn=%u (%u/%u) for %s\n",
|
||||||
|
burst_mask2str(mask, 8), *first_fn,
|
||||||
(*first_fn) % ts->mf_layout->period,
|
(*first_fn) % ts->mf_layout->period,
|
||||||
ts->mf_layout->period,
|
ts->mf_layout->period,
|
||||||
lchan_desc->name);
|
lchan_desc->name);
|
||||||
|
|
|
@ -299,8 +299,9 @@ int rx_tchh_fn(struct trx_instance *trx, struct trx_ts *ts,
|
||||||
|
|
||||||
/* Check decoding result */
|
/* Check decoding result */
|
||||||
if (rc < 4) {
|
if (rc < 4) {
|
||||||
LOGP(DSCHD, LOGL_ERROR, "Received bad TCH frame ending at "
|
LOGP(DSCHD, LOGL_ERROR, "Received bad TCH frame (%s) ending at "
|
||||||
"fn=%u on %s (rc=%d)\n", fn, lchan_desc->name, rc);
|
"fn=%u on %s (rc=%d)\n", burst_mask2str(mask, 6),
|
||||||
|
fn, lchan_desc->name, rc);
|
||||||
|
|
||||||
/* Send BFI */
|
/* Send BFI */
|
||||||
goto bfi;
|
goto bfi;
|
||||||
|
|
|
@ -87,8 +87,9 @@ int rx_data_fn(struct trx_instance *trx, struct trx_ts *ts,
|
||||||
|
|
||||||
/* Check for complete set of bursts */
|
/* Check for complete set of bursts */
|
||||||
if ((*mask & 0xf) != 0xf) {
|
if ((*mask & 0xf) != 0xf) {
|
||||||
LOGP(DSCHD, LOGL_ERROR, "Received incomplete data frame at "
|
LOGP(DSCHD, LOGL_ERROR, "Received incomplete (%s) data frame at "
|
||||||
"fn=%u (%u/%u) for %s\n", *first_fn,
|
"fn=%u (%u/%u) for %s\n",
|
||||||
|
burst_mask2str(mask, 4), *first_fn,
|
||||||
(*first_fn) % ts->mf_layout->period,
|
(*first_fn) % ts->mf_layout->period,
|
||||||
ts->mf_layout->period,
|
ts->mf_layout->period,
|
||||||
lchan_desc->name);
|
lchan_desc->name);
|
||||||
|
|
|
@ -355,6 +355,7 @@ int sched_trx_handle_tx_burst(struct trx_instance *trx,
|
||||||
/* Shared declarations for lchan handlers */
|
/* Shared declarations for lchan handlers */
|
||||||
extern const uint8_t sched_nb_training_bits[8][26];
|
extern const uint8_t sched_nb_training_bits[8][26];
|
||||||
|
|
||||||
|
const char *burst_mask2str(const uint8_t *mask, int bits);
|
||||||
size_t sched_bad_frame_ind(uint8_t *l2, struct trx_lchan_state *lchan);
|
size_t sched_bad_frame_ind(uint8_t *l2, struct trx_lchan_state *lchan);
|
||||||
int sched_send_dt_ind(struct trx_instance *trx, struct trx_ts *ts,
|
int sched_send_dt_ind(struct trx_instance *trx, struct trx_ts *ts,
|
||||||
struct trx_lchan_state *lchan, uint8_t *l2, size_t l2_len,
|
struct trx_lchan_state *lchan, uint8_t *l2, size_t l2_len,
|
||||||
|
|
Loading…
Reference in New Issue