Fixed MIB decoding through ASN

This commit is contained in:
ismagom 2014-10-19 12:47:48 +02:00
parent 956a9d61dd
commit 83316aeb9a
5 changed files with 26 additions and 27 deletions

View File

@ -214,7 +214,7 @@ int cell_search(void *uhd, int force_N_id_2, lte_cell_t *cell)
{
int ret;
uint32_t nof_tx_ports;
uint8_t bch_payload[BCH_PAYLOAD_LEN], bch_payload_packed[BCH_PAYLOAD_LEN];
uint8_t bch_payload[BCH_PAYLOAD_LEN], bch_payload_unpacked[BCH_PAYLOAD_LEN];
ue_celldetect_result_t found_cells[3];
bzero(found_cells, 3*sizeof(ue_celldetect_result_t));
@ -256,9 +256,9 @@ int cell_search(void *uhd, int force_N_id_2, lte_cell_t *cell)
cell->cp = found_cells[max_peak_cell].cp;
cell->id = found_cells[max_peak_cell].cell_id;
cell->nof_ports = nof_tx_ports;
bit_pack_vector(bch_payload, bch_payload_packed, BCH_PAYLOAD_LEN);
bcch_bch_mib_unpack(bch_payload_packed, BCH_PAYLOAD_LEN, cell, NULL);
bit_unpack_vector(bch_payload, bch_payload_unpacked, BCH_PAYLOAD_LEN);
bcch_bch_mib_unpack(bch_payload_unpacked, BCH_PAYLOAD_LEN, cell, NULL);
/* set sampling frequency */
int srate = lte_sampling_freq_hz(cell->nof_prb);

View File

@ -253,13 +253,13 @@ uint32_t pbch_crc_check(pbch_t *q, uint8_t *bits, uint32_t nof_ports) {
int ret = crc_checksum(&q->crc, data, BCH_PAYLOADCRC_LEN);
if (ret == 0) {
uint32_t chkzeros=0;
for (int i=0;i<BCH_PAYLOAD_LEN && !chkzeros;i++) {
for (int i=0;i<BCH_PAYLOAD_LEN;i++) {
chkzeros += data[i];
}
if (chkzeros) {
return 0;
} else {
return -1;
return LIBLTE_ERROR;
}
} else {
return ret;
@ -290,10 +290,10 @@ int pbch_decode_frame(pbch_t *q, uint32_t src, uint32_t dst, uint32_t n,
/* FIXME: If channel estimates are zero, received LLR are NaN. Check and return error */
for (j = 0; j < BCH_ENCODED_LEN; j++) {
if (isnan(q->pbch_rm_f[j]) || isinf(q->pbch_rm_f[j])) {
return 0;
return LIBLTE_ERROR;
}
}
/* decode */
viterbi_decode_f(&q->decoder, q->pbch_rm_f, q->data, BCH_PAYLOADCRC_LEN);
@ -412,6 +412,7 @@ int pbch_decode(pbch_t *q, cf_t *slot1_symbols, cf_t *ce_slot1[MAX_PORTS],
}
if (bch_payload) {
memcpy(bch_payload, q->data, sizeof(uint8_t) * BCH_PAYLOAD_LEN);
vec_fprint_hex(stdout, bch_payload, BCH_PAYLOAD_LEN);
}
}
return ret;

View File

@ -30,6 +30,7 @@
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <time.h>
#include "liblte/phy/phy.h"
@ -109,6 +110,7 @@ int main(int argc, char **argv) {
exit(-1);
}
srand(time(NULL));
for (i=0;i<BCH_PAYLOAD_LEN;i++) {
bch_payload_tx[i] = rand()%2;
}
@ -134,17 +136,17 @@ int main(int argc, char **argv) {
free(ce[i]);
free(slot1_symbols[i]);
}
printf("Tx ports: %d - Rx ports: %d\n", cell.nof_ports, nof_rx_ports);
printf("Tx payload: ");
vec_fprint_hex(stdout, bch_payload_tx, BCH_PAYLOAD_LEN);
printf("Rx payload: ");
vec_fprint_hex(stdout, bch_payload_rx, BCH_PAYLOAD_LEN);
if (nof_rx_ports == cell.nof_ports && !memcmp(bch_payload_rx, bch_payload_tx, sizeof(uint8_t) * BCH_PAYLOAD_LEN)) {
printf("OK\n");
exit(0);
} else {
printf("Error\n");
printf("Tx ports: %d - Rx ports: %d\n", cell.nof_ports, nof_rx_ports);
printf("Tx payload: ");
vec_fprint_hex(stdout, bch_payload_tx, BCH_PAYLOAD_LEN);
printf("Rx payload: ");
vec_fprint_hex(stdout, bch_payload_rx, BCH_PAYLOAD_LEN);
exit(-1);
}
}

View File

@ -31,16 +31,15 @@
#include "liblte/phy/utils/bit.h"
void bit_pack_vector(uint8_t *bit_unpacked, uint8_t *bits_packed, int nof_bits)
void bit_pack_vector(uint8_t *bits_unpacked, uint8_t *bits_packed, int nof_bits)
{
uint32_t i, nbytes;
nbytes = nof_bits/8;
for (i=0;i<nbytes;i++) {
bit_pack(bits_packed[i], &bits_packed, 8);
bit_pack(bits_unpacked[i], &bits_packed, 8);
}
if (nof_bits%8) {
bit_pack(bits_packed[i], &bits_packed, nof_bits%8);
bit_pack(bits_unpacked[i], &bits_packed, nof_bits%8);
}
}
@ -54,15 +53,15 @@ void bit_pack(uint32_t value, uint8_t **bits, int nof_bits)
*bits += nof_bits;
}
void bit_unpack_vector(uint8_t *bits_packed, uint8_t *bit_unpacked, int nof_bits)
void bit_unpack_vector(uint8_t *bits_packed, uint8_t *bits_unpacked, int nof_bits)
{
uint32_t i, nbytes;
nbytes = nof_bits/8;
for (i=0;i<nbytes;i++) {
bits_packed[i] = bit_unpack(&bit_unpacked, 8);
bits_unpacked[i] = bit_unpack(&bits_packed, 8);
}
if (nof_bits%8) {
bits_packed[i] = bit_unpack(&bit_unpacked, nof_bits%8);
bits_unpacked[i] = bit_unpack(&bits_packed, nof_bits%8);
}
}

View File

@ -92,9 +92,7 @@ int bcch_bch_mib_pack(lte_cell_t *cell, uint32_t sfn, uint8_t *buffer, uint32_t
printf("Encoding failed.\n");
printf("Failed to encode element %s\n", n.failed_type ? n.failed_type->name : "");
return LIBLTE_ERROR;
} else {
printf("Encoding ok\n");
}
}
asn_fprint(stdout, &asn_DEF_MasterInformationBlock, &req);
return LIBLTE_SUCCESS;
}
@ -106,13 +104,12 @@ int bcch_bch_mib_unpack(uint8_t *buffer, uint32_t msg_nof_bits, lte_cell_t *cell
perror("calloc");
return LIBLTE_ERROR;
}
asn_dec_rval_t n = uper_decode(opt_codec_ctx, &asn_DEF_MasterInformationBlock, (void**) &req, &buffer, msg_nof_bits/8,0,msg_nof_bits%8);
asn_dec_rval_t n = uper_decode(opt_codec_ctx, &asn_DEF_MasterInformationBlock,
(void**) &req, buffer, msg_nof_bits/8,0,msg_nof_bits%8);
if (n.consumed == -1) {
printf("Decoding failed.\n");
return LIBLTE_ERROR;
} else {
printf("Decoding ok\n");
}
}
asn_fprint(stdout, &asn_DEF_MasterInformationBlock, req);
switch(req->dl_Bandwidth) {