void srslte_pdsch_free(srslte_pdsch_t *q) { for (int i = 0; i < SRSLTE_MAX_CODEWORDS; i++) { if (q->e[i]) { free(q->e[i]); } if (q->d[i]) { free(q->d[i]); } if (q->csi[i]) { free(q->csi[i]); } } /* Free sch objects */ srslte_sch_free(&q->dl_sch); for (int i = 0; i < SRSLTE_MAX_PORTS; i++) { if (q->x[i]) { free(q->x[i]); } if (q->symbols[i]) { free(q->symbols[i]); } if (q->is_ue) { for (int j = 0; j < SRSLTE_MAX_PORTS; j++) { if (q->ce[i][j]) { free(q->ce[i][j]); } } } } if (q->users) { if (q->is_ue) { srslte_pdsch_free_rnti(q, 0); } else { for (int u=0;u<=SRSLTE_SIRNTI;u++) { if (q->users[u]) { srslte_pdsch_free_rnti(q, u); } } } free(q->users); } srslte_sequence_free(&q->tmp_seq); for (int i = 0; i < 4; i++) { srslte_modem_table_free(&q->mod[i]); } bzero(q, sizeof(srslte_pdsch_t)); }
/* Precalculate the PDSCH scramble sequences for a given RNTI. This function takes a while * to execute, so shall be called once the final C-RNTI has been allocated for the session. */ int srslte_pdsch_set_rnti(srslte_pdsch_t *q, uint16_t rnti) { uint32_t rnti_idx = q->is_ue?0:rnti; if (!q->users[rnti_idx] || q->is_ue) { if (!q->users[rnti_idx]) { q->users[rnti_idx] = calloc(1, sizeof(srslte_pdsch_user_t)); if(!q->users[rnti_idx]) { perror("calloc"); return -1; } } for (int i = 0; i < SRSLTE_NSUBFRAMES_X_FRAME; i++) { for (int j = 0; j < SRSLTE_MAX_CODEWORDS; j++) { if (srslte_sequence_pdsch(&q->users[rnti_idx]->seq[j][i], rnti, j, 2 * i, q->cell.id, q->max_re * srslte_mod_bits_x_symbol(SRSLTE_MOD_64QAM))) { fprintf(stderr, "Error initializing PDSCH scrambling sequence\n"); srslte_pdsch_free_rnti(q, rnti); return SRSLTE_ERROR; } } } q->ue_rnti = rnti; q->users[rnti_idx]->cell_id = q->cell.id; q->users[rnti_idx]->sequence_generated = true; } else { fprintf(stderr, "Error generating PDSCH sequence: rnti=0x%x already generated\n", rnti); } return SRSLTE_SUCCESS; }
void srslte_enb_dl_rem_rnti(srslte_enb_dl_t* q, uint16_t rnti) { srslte_pdsch_free_rnti(&q->pdsch, rnti); }