diff options
author | Vadim Yanitskiy <axilirator@gmail.com> | 2017-12-16 16:21:05 +0700 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2017-12-16 16:21:05 +0700 |
commit | a9c2ef2638523d62f1f9eecb1c6c326f4c6519b6 (patch) | |
tree | 50c9dcaae8c9c1888f75a225097f451a275fad25 /src/host/trxcon/sched_lchan_common.c | |
parent | 9b511668a48b2c7ef7646278b1d2cbdc19441490 (diff) |
host/trxcon/scheduler: inform L2&3 about decoding errors
Previously, we used to drop a frame if decoding wasn't successful.
This way, the higher layers didn't even know about that, so the
local counters and Measurement Reports were incomplete.
This change makes scheduler to forward L2 frames in any case,
setting the num_biterr for each of them. In case of decoding
error, a dummy (payload filled by 0x00) L2 frame will be sent.
Change-Id: I31011d8f3ca8b9a12474cd0bc653faed18391033
Diffstat (limited to 'src/host/trxcon/sched_lchan_common.c')
-rw-r--r-- | src/host/trxcon/sched_lchan_common.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/host/trxcon/sched_lchan_common.c b/src/host/trxcon/sched_lchan_common.c index 6d75533d..c6b287a9 100644 --- a/src/host/trxcon/sched_lchan_common.c +++ b/src/host/trxcon/sched_lchan_common.c @@ -26,6 +26,7 @@ #include <string.h> #include <talloc.h> #include <stdint.h> +#include <stdbool.h> #include <arpa/inet.h> @@ -80,7 +81,8 @@ const uint8_t sched_nb_training_bits[8][26] = { }; int sched_send_data_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, + bool dec_failed, int bit_error_count) { const struct trx_lchan_desc *lchan_desc; struct l1ctl_info_dl *data; @@ -99,14 +101,18 @@ int sched_send_data_ind(struct trx_instance *trx, struct trx_ts *ts, data->band_arfcn = htons(trx->band_arfcn); data->frame_nr = htonl(lchan->rx_first_fn); data->rx_level = -(lchan->meas.rssi_sum / lchan->meas.rssi_num); + data->num_biterr = bit_error_count; /* FIXME: set proper values */ - data->num_biterr = 0; - data->fire_crc = 0; data->snr = 0; - /* Fill in the payload */ - memcpy(data->payload, l2, l2_len); + if (dec_failed) { + /* Mark frame as broken */ + data->fire_crc = 2; + } else { + /* Fill in the payload */ + memcpy(data->payload, l2, l2_len); + } /* Put a packet to higher layers */ l1ctl_tx_data_ind(trx->l1l, data, l2_len == GSM_MACBLOCK_LEN ? |