fapi_l1.c 51 KB
Newer Older
1 2 3 4 5
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

/*! \file fapi_l1.c
 * \brief functions for FAPI L1 interface
 * \author R. Knopp
 * \date 2017
 * \version 0.1
 * \company Eurecom
 * \email: knopp@eurecom.fr
 * \note
 * \warning
 */

33 34 35
#include "PHY/defs_eNB.h"
#include "PHY/LTE_TRANSPORT/transport_proto.h"
#include "SCHED/sched_eNB.h"
frtabu's avatar
frtabu committed
36
#include "nfapi/oai_integration/vendor_ext.h"
37
#include "nfapi_pnf_interface.h"
38 39
#include "fapi_l1.h"

40 41 42 43 44 45
int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req);
int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req);
int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req);
int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req);


Cedric Roux's avatar
Cedric Roux committed
46
void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB,
47
                             int frame, int subframe,
48
                             L1_rxtx_proc_t *proc,
frtabu's avatar
frtabu committed
49
                             nfapi_dl_config_request_pdu_t *dl_config_pdu) {
50
  int idx                         = subframe&1;
51 52 53
  LTE_eNB_PDCCH *pdcch_vars       = &eNB->pdcch_vars[idx];
  nfapi_dl_config_dci_dl_pdu *pdu = &dl_config_pdu->dci_dl_pdu;

frtabu's avatar
frtabu committed
54
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
55

frtabu's avatar
frtabu committed
56 57
  LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populating pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",frame,subframe, pdcch_vars->num_dci, proc->subframe_tx,
        idx, pdcch_vars->num_dci);
58
  // copy dci configuration into eNB structure
59
  fill_dci_and_dlsch(eNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],pdu);
frtabu's avatar
frtabu committed
60 61
  LOG_D(PHY,"Frame %d, Subframe %d: DCI processing - populated pdcch_vars->dci_alloc[%d] proc:subframe_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->subframe_tx, pdcch_vars->num_dci,
        proc->subframe_tx, idx, pdcch_vars->num_dci);
62 63
}

64
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
65

Cedric Roux's avatar
Cedric Roux committed
66
void handle_nfapi_mpdcch_pdu(PHY_VARS_eNB *eNB,
67
                             L1_rxtx_proc_t *proc,
frtabu's avatar
frtabu committed
68
                             nfapi_dl_config_request_pdu_t *dl_config_pdu) {
Cedric Roux's avatar
Cedric Roux committed
69
  int idx                         = proc->subframe_tx&1;
70 71 72
  LTE_eNB_MPDCCH *mpdcch_vars     = &eNB->mpdcch_vars[idx];
  nfapi_dl_config_mpdcch_pdu *pdu = &dl_config_pdu->mpdcch_pdu;

frtabu's avatar
frtabu committed
73
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
74

75
  LOG_D(PHY,"Frame %d, Subframe %d: MDCI processing\n",proc->frame_tx,proc->subframe_tx);
76 77 78 79
  // copy dci configuration into eNB structure
  fill_mdci_and_dlsch(eNB,proc,&mpdcch_vars->mdci_alloc[mpdcch_vars->num_dci],pdu);
}

80
#endif
81

82
void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
frtabu's avatar
frtabu committed
83
                                  nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) {
84
  int idx                         = subframe&1;
85
  LTE_eNB_PDCCH *pdcch_vars       = &eNB->pdcch_vars[idx];
86

frtabu's avatar
frtabu committed
87
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
88

89
  //LOG_D(PHY,"%s() SFN/SF:%04d%d Before num_dci:%d\n", __FUNCTION__,frame,subframe,pdcch_vars->num_dci);
90
  // copy dci configuration in to eNB structure
91
  fill_dci0(eNB,frame,subframe,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci], &hi_dci0_config_pdu->dci_pdu);
92 93
}

94

95 96

void handle_nfapi_hi_dci0_mpdcch_dci_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
frtabu's avatar
frtabu committed
97
    nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) {
sharma's avatar
sharma committed
98
  int idx                         = proc->subframe_tx&1;
99
  LTE_eNB_MPDCCH *pdcch_vars      = &eNB->mpdcch_vars[idx];
frtabu's avatar
frtabu committed
100 101

  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
102

sharma's avatar
sharma committed
103
  // copy dci configuration in to eNB structure
104
  fill_mpdcch_dci0(eNB,proc,&pdcch_vars->mdci_alloc[pdcch_vars->num_dci], &hi_dci0_config_pdu->mpdcch_dci_pdu);
sharma's avatar
sharma committed
105 106
}

107

108
void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
frtabu's avatar
frtabu committed
109
                                 nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu) {
110
  LTE_eNB_PHICH *phich = &eNB->phich_vars[subframe&1];
111

frtabu's avatar
frtabu committed
112
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
113

114
  // copy dci configuration in to eNB structure
115
  LOG_D(PHY,"Received HI PDU with value %d (rbstart %d,cshift %d)\n",
Cedric Roux's avatar
Cedric Roux committed
116 117 118
        hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value,
        hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start,
        hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms);
119
  // DJP - TODO FIXME - transmission power ignored
120 121 122 123 124 125 126
  phich->config[phich->num_hi].hi       = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.hi_value;
  phich->config[phich->num_hi].first_rb = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.resource_block_start;
  phich->config[phich->num_hi].n_DMRS   = hi_dci0_config_pdu->hi_pdu.hi_pdu_rel8.cyclic_shift_2_for_drms;
  phich->num_hi++;
  AssertFatal(phich->num_hi<32,"Maximum number of phich reached in subframe\n");
}

127
void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
128
                          nfapi_dl_config_request_pdu_t *dl_config_pdu,
frtabu's avatar
frtabu committed
129
                          uint8_t *sdu) {
130
  nfapi_dl_config_bch_pdu_rel8_t *rel8 = &dl_config_pdu->bch_pdu.bch_pdu_rel8;
Cedric Roux's avatar
Cedric Roux committed
131

frtabu's avatar
frtabu committed
132
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
133

134
  AssertFatal(rel8->length == 3, "BCH PDU has length %d != 3\n",rel8->length);
135
  //LOG_D(PHY,"bch_pdu: %x,%x,%x\n",sdu[0],sdu[1],sdu[2]);
136 137 138 139 140 141
  eNB->pbch_pdu[0] = sdu[2];
  eNB->pbch_pdu[1] = sdu[1];
  eNB->pbch_pdu[2] = sdu[0];
  // adjust transmit amplitude here based on NFAPI info
}

142
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
frtabu's avatar
frtabu committed
143 144 145 146 147 148 149 150
  extern uint32_t localRIV2alloc_LUT6[32];
  extern uint32_t localRIV2alloc_LUT25[512];
  extern uint32_t localRIV2alloc_LUT50_0[1600];
  extern uint32_t localRIV2alloc_LUT50_1[1600];
  extern uint32_t localRIV2alloc_LUT100_0[6000];
  extern uint32_t localRIV2alloc_LUT100_1[6000];
  extern uint32_t localRIV2alloc_LUT100_2[6000];
  extern uint32_t localRIV2alloc_LUT100_3[6000];
151 152
#endif

153
void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
154 155
                            nfapi_dl_config_request_pdu_t *dl_config_pdu,
                            uint8_t codeword_index,
frtabu's avatar
frtabu committed
156
                            uint8_t *sdu) {
157
  nfapi_dl_config_dlsch_pdu_rel8_t *rel8 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8;
158
#if (LTE_RRC_VERSION >= MAKE_VERSION(10, 0, 0))
159 160
  nfapi_dl_config_dlsch_pdu_rel10_t *rel10 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel10;
#endif
161
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
162 163 164 165 166 167 168
  nfapi_dl_config_dlsch_pdu_rel13_t *rel13 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel13;
#endif
  LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
  LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
  int UE_id;
  int harq_pid;

frtabu's avatar
frtabu committed
169
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
170

171
  UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
frtabu's avatar
frtabu committed
172 173

  if( (UE_id<0) || (UE_id>=NUMBER_OF_UE_MAX) ) {
Wang Tsu-Han's avatar
Wang Tsu-Han committed
174 175 176
    LOG_E(PHY,"illegal UE_id found!!! rnti %04x UE_id %d\n",rel8->rnti,UE_id);
    return;
  }
frtabu's avatar
frtabu committed
177

Wang Tsu-Han's avatar
Wang Tsu-Han committed
178 179
  //AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
  //AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
180 181
  dlsch0 = eNB->dlsch[UE_id][0];
  dlsch1 = eNB->dlsch[UE_id][1];
182
#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0))
frtabu's avatar
frtabu committed
183

haswell's avatar
haswell committed
184
  if ((rel13->pdsch_payload_type < 2) && (rel13->ue_type>0)) dlsch0->harq_ids[proc->frame_tx%2][proc->subframe_tx] = 0;
185

frtabu's avatar
frtabu committed
186
#endif
haswell's avatar
haswell committed
187
  harq_pid        = dlsch0->harq_ids[proc->frame_tx%2][proc->subframe_tx];
188
  AssertFatal((harq_pid>=0) && (harq_pid<8),"harq_pid %d not in 0...7 frame:%d subframe:%d subframe(TX):%d rnti:%x UE_id:%d dlsch0[harq_ids:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d]\n",
frtabu's avatar
frtabu committed
189 190 191 192 193 194 195 196 197 198 199 200 201 202
              harq_pid,
              frame,subframe,
              proc->subframe_tx,rel8->rnti,UE_id,
              dlsch0->harq_ids[proc->frame_tx%2][0],
              dlsch0->harq_ids[proc->frame_tx%2][1],
              dlsch0->harq_ids[proc->frame_tx%2][2],
              dlsch0->harq_ids[proc->frame_tx%2][3],
              dlsch0->harq_ids[proc->frame_tx%2][4],
              dlsch0->harq_ids[proc->frame_tx%2][5],
              dlsch0->harq_ids[proc->frame_tx%2][6],
              dlsch0->harq_ids[proc->frame_tx%2][7],
              dlsch0->harq_ids[proc->frame_tx%2][8],
              dlsch0->harq_ids[proc->frame_tx%2][9]
             );
203 204 205
  dlsch0_harq     = dlsch0->harq_processes[harq_pid];
  dlsch1_harq     = dlsch1->harq_processes[harq_pid];
  AssertFatal(dlsch0_harq!=NULL,"dlsch_harq is null\n");
206 207
  // compute DL power control parameters
  eNB->pdsch_config_dedicated[UE_id].p_a = rel8->pa;
frtabu's avatar
frtabu committed
208
#ifdef PHY_TX_THREAD
209

frtabu's avatar
frtabu committed
210
  if (dlsch0->active[proc->subframe_tx]) {
Wang Tsu-Han's avatar
Wang Tsu-Han committed
211
# else
frtabu's avatar
frtabu committed
212 213

  if (dlsch0->active) {
Wang Tsu-Han's avatar
Wang Tsu-Han committed
214
#endif
215 216
    computeRhoA_eNB(rel8->pa, dlsch0,dlsch0_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
    computeRhoB_eNB(rel8->pa,eNB->frame_parms.pdsch_config_common.p_b,eNB->frame_parms.nb_antenna_ports_eNB,dlsch0,dlsch0_harq->dl_power_off);
217
  }
frtabu's avatar
frtabu committed
218

Wang Tsu-Han's avatar
Wang Tsu-Han committed
219
#ifdef PHY_TX_THREAD
frtabu's avatar
frtabu committed
220 221

  if (dlsch1->active[proc->subframe_tx]) {
Wang Tsu-Han's avatar
Wang Tsu-Han committed
222
#else
frtabu's avatar
frtabu committed
223 224

  if (dlsch1->active) {
Wang Tsu-Han's avatar
Wang Tsu-Han committed
225
#endif
226 227
    computeRhoA_eNB(rel8->pa, dlsch1,dlsch1_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
    computeRhoB_eNB(rel8->pa,eNB->frame_parms.pdsch_config_common.p_b,eNB->frame_parms.nb_antenna_ports_eNB,dlsch1,dlsch1_harq->dl_power_off);
228 229
  }

haswell's avatar
haswell committed
230
  dlsch0_harq->pdsch_start = eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols;
231 232

  if (dlsch0_harq->round==0) {  //get pointer to SDU if this a new SDU
Wang Tsu-Han's avatar
Wang Tsu-Han committed
233
    if(sdu == NULL) {
frtabu's avatar
frtabu committed
234 235
      LOG_E(PHY,
            "NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n",
Wang Tsu-Han's avatar
Wang Tsu-Han committed
236 237 238 239 240
            frame,subframe,
            proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
            dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start);
      return;
    }
frtabu's avatar
frtabu committed
241

Wang Tsu-Han's avatar
Wang Tsu-Han committed
242 243 244 245
    //AssertFatal(sdu!=NULL,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n",
    //            frame,subframe,
    //            proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
    //            dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start);
246
    if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d\n",
frtabu's avatar
frtabu committed
247 248
                                      frame,subframe,proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid);

249 250
    if (codeword_index == 0) dlsch0_harq->pdu                    = sdu;
    else                     dlsch1_harq->pdu                    = sdu;
frtabu's avatar
frtabu committed
251
  } else {
252
    if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d, subframe %d]: programming dlsch for round %d, rnti %x, UE_id %d, harq_pid %d\n",
frtabu's avatar
frtabu committed
253 254
                                      frame,subframe,proc->frame_tx,proc->subframe_tx,dlsch0_harq->round,
                                      rel8->rnti,UE_id,harq_pid);
255
  }
Cedric Roux's avatar
Cedric Roux committed
256

257
#if (LTE_RRC_VERSION >= MAKE_VERSION(13, 0, 0))
Wang Tsu-Han's avatar
Wang Tsu-Han committed
258 259 260
#ifdef PHY_TX_THREAD
  dlsch0_harq->sib1_br_flag=0;
#else
261
  dlsch0->sib1_br_flag=0;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
262
#endif
263 264

  if ((rel13->pdsch_payload_type <2) && (rel13->ue_type>0)) { // this is a BR/CE UE and SIB1-BR/SI-BR
265
    UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
266 267 268
    AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
    AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
    dlsch0 = eNB->dlsch[UE_id][0];
frtabu's avatar
frtabu committed
269
    dlsch0->harq_mask = 1;
270 271
    dlsch0_harq     = dlsch0->harq_processes[0];
    dlsch0_harq->pdu                    = sdu;
Raymond Knopp's avatar
Raymond Knopp committed
272

273
    LOG_D(PHY,"NFAPI: frame %d, subframe %d (TX %d.%d): Programming SI-BR (%d) => %d\n",frame,subframe,proc->frame_tx,proc->subframe_tx,rel13->pdsch_payload_type,UE_id);
frtabu's avatar
frtabu committed
274

275 276
    dlsch0->rnti             = 0xFFFF;
    dlsch0->Kmimo            = 1;
Cedric Roux's avatar
Cedric Roux committed
277
    dlsch0->Mdlharq          = 4;
278 279 280
    dlsch0->Nsoft            = 25344;
    dlsch0->i0               = rel13->initial_transmission_sf_io;
    dlsch0_harq->pdsch_start = rel10->pdsch_start;
haswell's avatar
haswell committed
281
    dlsch0->harq_ids[proc->frame_tx%2][proc->subframe_rx] = 0;
Raymond Knopp's avatar
Raymond Knopp committed
282 283
    dlsch0_harq->frame       = proc->frame_tx;
    dlsch0_harq->subframe    = proc->subframe_tx;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
284
#ifdef PHY_TX_THREAD
frtabu's avatar
frtabu committed
285

Wang Tsu-Han's avatar
Wang Tsu-Han committed
286
    if (rel13->pdsch_payload_type == 0) dlsch0_harq->sib1_br_flag=1;
frtabu's avatar
frtabu committed
287

Wang Tsu-Han's avatar
Wang Tsu-Han committed
288
#else
frtabu's avatar
frtabu committed
289

290
    if (rel13->pdsch_payload_type == 0) dlsch0->sib1_br_flag=1;
frtabu's avatar
frtabu committed
291

Wang Tsu-Han's avatar
Wang Tsu-Han committed
292
#endif
293

frtabu's avatar
frtabu committed
294
    // configure PDSCH
295
    switch (eNB->frame_parms.N_RB_DL) {
frtabu's avatar
frtabu committed
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
      case 6:
        dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT6[rel8->resource_block_coding];
        break;

      case 15:
        AssertFatal(1==0,"15 PRBs not supported for now\n");
        break;

      case 25:
        dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT25[rel8->resource_block_coding];
        break;

      case 50:
        dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT50_0[rel8->resource_block_coding];
        dlsch0_harq->rb_alloc[1]      = localRIV2alloc_LUT50_1[rel8->resource_block_coding];
        break;

      case 75:
        AssertFatal(1==0,"75 PRBs not supported for now\n");
        break;

      case 100:
        dlsch0_harq->rb_alloc[0]      = localRIV2alloc_LUT100_0[rel8->resource_block_coding];
        dlsch0_harq->rb_alloc[1]      = localRIV2alloc_LUT100_1[rel8->resource_block_coding];
        dlsch0_harq->rb_alloc[2]      = localRIV2alloc_LUT100_2[rel8->resource_block_coding];
        dlsch0_harq->rb_alloc[3]      = localRIV2alloc_LUT100_3[rel8->resource_block_coding];
322 323
    }

Wang Tsu-Han's avatar
Wang Tsu-Han committed
324 325 326
#ifdef PHY_TX_THREAD
    dlsch0->active[proc->subframe_tx]= 1;
#else
327
    dlsch0->active                  = 1;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
328
#endif
Cedric Roux's avatar
Cedric Roux committed
329
    dlsch0_harq->nb_rb              = 6;
330 331 332 333 334 335 336 337 338 339
    dlsch0_harq->vrb_type           = LOCALIZED;
    dlsch0_harq->rvidx              = rel8->redundancy_version;
    dlsch0_harq->Nl                 = 1;
    dlsch0_harq->mimo_mode          = (eNB->frame_parms.nb_antenna_ports_eNB == 1) ? SISO : ALAMOUTI;
    dlsch0_harq->dl_power_off       = 1;
    dlsch0_harq->round              = 0;
    dlsch0_harq->status             = ACTIVE;
    dlsch0_harq->TBS                = rel8->length<<3;
    dlsch0_harq->Qm                 = rel8->modulation;
    dlsch0_harq->codeword           = 0;
340
    dlsch0_harq->pdsch_start        = rel10->pdsch_start;
frtabu's avatar
frtabu committed
341
  } else
342
#endif
frtabu's avatar
frtabu committed
343
  {
344 345 346 347 348
    UE_id = find_dlsch(rel8->rnti,eNB,SEARCH_EXIST_OR_FREE);
    AssertFatal(UE_id!=-1,"no free or exiting dlsch_context\n");
    AssertFatal(UE_id<NUMBER_OF_UE_MAX,"returned UE_id %d >= %d(NUMBER_OF_UE_MAX)\n",UE_id,NUMBER_OF_UE_MAX);
    dlsch0 = eNB->dlsch[UE_id][0];
    dlsch1 = eNB->dlsch[UE_id][1];
349
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
350
    dlsch0->sib1_br_flag=0;
351 352
    dlsch0->i0               = 0xFFFF;
#endif
353
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
frtabu's avatar
frtabu committed
354
    LOG_D(PHY,"dlsch->i0:%04x dlsch0_harq[pdsch_start:%d nb_rb:%d vrb_type:%d rvidx:%d Nl:%d mimo_mode:%d dl_power_off:%d round:%d status:%d TBS:%d Qm:%d codeword:%d rb_alloc:%d] rel8[length:%d]\n",
Wang Tsu-Han's avatar
Wang Tsu-Han committed
355
#ifdef PHY_TX_THREAD
frtabu's avatar
frtabu committed
356
          dlsch0_harq->i0,
Wang Tsu-Han's avatar
Wang Tsu-Han committed
357
#else
frtabu's avatar
frtabu committed
358
          dlsch0->i0,
Wang Tsu-Han's avatar
Wang Tsu-Han committed
359
#endif
frtabu's avatar
frtabu committed
360 361 362 363
          dlsch0_harq->pdsch_start, dlsch0_harq->nb_rb, dlsch0_harq->vrb_type, dlsch0_harq->rvidx, dlsch0_harq->Nl, dlsch0_harq->mimo_mode, dlsch0_harq->dl_power_off, dlsch0_harq->round, dlsch0_harq->status,
          dlsch0_harq->TBS, dlsch0_harq->Qm, dlsch0_harq->codeword, dlsch0_harq->rb_alloc[0],
          rel8->length
         );
364
#else
frtabu's avatar
frtabu committed
365 366 367 368 369
    LOG_D(PHY,"dlsch0_harq[pdsch_start:%d nb_rb:%d vrb_type:%d rvidx:%d Nl:%d mimo_mode:%d dl_power_off:%d round:%d status:%d TBS:%d Qm:%d codeword:%d rb_alloc:%d] rel8[length:%d]\n",
          dlsch0_harq->pdsch_start, dlsch0_harq->nb_rb, dlsch0_harq->vrb_type, dlsch0_harq->rvidx, dlsch0_harq->Nl, dlsch0_harq->mimo_mode, dlsch0_harq->dl_power_off, dlsch0_harq->round, dlsch0_harq->status,
          dlsch0_harq->TBS, dlsch0_harq->Qm, dlsch0_harq->codeword, dlsch0_harq->rb_alloc[0],
          rel8->length
         );
370
#endif
371
    dlsch0->active = 1;
372
    harq_pid        = dlsch0->harq_ids[frame%2][proc->subframe_tx];
373
    dlsch0->harq_mask |= (1<<harq_pid);
sharma's avatar
sharma committed
374
    AssertFatal((harq_pid>=0) && (harq_pid<8),"subframe %d: harq_pid %d not in 0...7\n",proc->subframe_tx,harq_pid);
375 376 377 378
    dlsch0_harq     = dlsch0->harq_processes[harq_pid];
    dlsch1_harq     = dlsch1->harq_processes[harq_pid];
    AssertFatal(dlsch0_harq!=NULL,"dlsch_harq is null\n");

frtabu's avatar
frtabu committed
379
    // compute DL power control parameters
380

frtabu's avatar
frtabu committed
381
    if (dlsch0->active) {
382 383
      computeRhoA_eNB(rel8->pa,dlsch0,dlsch0_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
      computeRhoB_eNB(rel8->pa,eNB->frame_parms.pdsch_config_common.p_b,eNB->frame_parms.nb_antenna_ports_eNB,dlsch0,dlsch0_harq->dl_power_off);
frtabu's avatar
frtabu committed
384 385 386
    }

    if (dlsch1->active) {
387 388
      computeRhoA_eNB(rel8->pa, dlsch1,dlsch1_harq->dl_power_off, eNB->frame_parms.nb_antenna_ports_eNB);
      computeRhoB_eNB(rel8->pa,eNB->frame_parms.pdsch_config_common.p_b,eNB->frame_parms.nb_antenna_ports_eNB,dlsch1,dlsch1_harq->dl_power_off);
389 390
    }

391
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
frtabu's avatar
frtabu committed
392

nepes's avatar
nepes committed
393 394 395
    if (rel13->ue_type>0)
      dlsch0_harq->pdsch_start = rel10->pdsch_start;
    else
396
#endif
nepes's avatar
nepes committed
397 398
      dlsch0_harq->pdsch_start = eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols;

399 400 401 402
    if (dlsch0_harq->round==0) {  //get pointer to SDU if this a new SDU
      AssertFatal(sdu!=NULL,"NFAPI: frame %d, subframe %d: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d\n",
                  proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
                  dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index);
frtabu's avatar
frtabu committed
403

sharma's avatar
sharma committed
404
      if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: frame %d, subframe %d: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d\n",
frtabu's avatar
frtabu committed
405 406
                                        proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid);

407 408
      if (codeword_index == 0) dlsch0_harq->pdu                    = sdu;
      else                     dlsch1_harq->pdu                    = sdu;
frtabu's avatar
frtabu committed
409
    } else {
sharma's avatar
sharma committed
410
      if (rel8->rnti != 0xFFFF) LOG_D(PHY,"NFAPI: frame %d, subframe %d: programming dlsch for round %d, rnti %x, UE_id %d, harq_pid %d\n",
frtabu's avatar
frtabu committed
411 412
                                        proc->frame_tx,proc->subframe_tx,dlsch0_harq->round,
                                        rel8->rnti,UE_id,harq_pid);
413 414
    }
  }
415 416
}

frtabu's avatar
frtabu committed
417
int16_t to_beta_offset_harqack[16]= {16,20,25,32,40,50,64,80,101,127,160,248,400,640,1008,8};
418

419
void handle_ulsch_harq_pdu(
frtabu's avatar
frtabu committed
420 421 422 423 424 425
  PHY_VARS_eNB                           *eNB,
  int                                     UE_id,
  nfapi_ul_config_request_pdu_t          *ul_config_pdu,
  nfapi_ul_config_ulsch_harq_information *harq_information,
  uint16_t                                frame,
  uint8_t                                 subframe) {
426 427 428 429
  nfapi_ul_config_ulsch_pdu_rel8_t *rel8 = &ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8;
  LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
  LTE_UL_eNB_HARQ_t *ulsch_harq;

frtabu's avatar
frtabu committed
430
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
431

432 433 434 435 436 437
  int harq_pid = rel8->harq_process_number;
  ulsch_harq = ulsch->harq_processes[harq_pid];
  ulsch_harq->frame                      = frame;
  ulsch_harq->subframe                   = subframe;
  ulsch_harq->O_ACK                      = harq_information->harq_information_rel10.harq_size;
  ulsch->beta_offset_harqack_times8      = to_beta_offset_harqack[harq_information->harq_information_rel10.delta_offset_harq];
frtabu's avatar
frtabu committed
438

Wang Tsu-Han's avatar
Wang Tsu-Han committed
439 440
  if (eNB->frame_parms.frame_type == TDD) {
    if (harq_information->harq_information_rel10.ack_nack_mode==0) //bundling
frtabu's avatar
frtabu committed
441 442
      ulsch->bundling = 1;
  }
443 444
}

frtabu's avatar
frtabu committed
445 446
uint16_t to_beta_offset_ri[16]= {9,13,16,20,25,32,40,50,64,80,101,127,160,0,0,0};
uint16_t to_beta_offset_cqi[16]= {0,0,9,10,11,13,14,16,18,20,23,25,28,32,40,50};
447

frtabu's avatar
frtabu committed
448
void handle_ulsch_cqi_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) {
449 450 451 452 453
  nfapi_ul_config_cqi_ri_information_rel9_t *rel9 = &ul_config_pdu->ulsch_cqi_ri_pdu.cqi_ri_information.cqi_ri_information_rel9;
  LTE_eNB_ULSCH_t *ulsch        = eNB->ulsch[UE_id];
  int harq_pid = ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number;
  LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];

frtabu's avatar
frtabu committed
454
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
455

456
  ulsch_harq->frame                       = frame;
Cedric Roux's avatar
Cedric Roux committed
457
  ulsch_harq->subframe                    = subframe;
458
  ulsch_harq->O_RI                        = rel9->aperiodic_cqi_pmi_ri_report.cc[0].ri_size;
459
  ulsch_harq->Or1                         = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0];
frtabu's avatar
frtabu committed
460

461
  if (ulsch_harq->O_RI>1) ulsch_harq->Or2 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[1];
frtabu's avatar
frtabu committed
462

463 464
  ulsch->beta_offset_ri_times8            = to_beta_offset_ri[rel9->delta_offset_ri];
  ulsch->beta_offset_cqi_times8           = to_beta_offset_cqi[rel9->delta_offset_cqi];
465
  LOG_D(PHY,"Filling ulsch_cqi_ri information for frame %d, subframe %d : O_RI %d, Or1 %d, beta_offset_cqi_times8 %d (%d)\n",
Cedric Roux's avatar
Cedric Roux committed
466 467
        frame,subframe,ulsch_harq->O_RI,ulsch_harq->Or1,ulsch->beta_offset_cqi_times8,
        rel9->delta_offset_cqi);
468 469
}

frtabu's avatar
frtabu committed
470
void handle_ulsch_cqi_harq_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) {
471 472 473 474 475 476
  nfapi_ul_config_cqi_ri_information_rel9_t *rel9 = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information.cqi_ri_information_rel9;
  LTE_eNB_ULSCH_t *ulsch        = eNB->ulsch[UE_id];
  int harq_pid = ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.harq_process_number;
  LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
  nfapi_ul_config_ulsch_harq_information *harq_information = &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information;

frtabu's avatar
frtabu committed
477
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
478

479
  ulsch_harq->frame                       = frame;
Cedric Roux's avatar
Cedric Roux committed
480
  ulsch_harq->subframe                    = subframe;
481
  ulsch_harq->O_RI                        = rel9->aperiodic_cqi_pmi_ri_report.cc[0].ri_size;
482
  ulsch_harq->Or1                         = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0];
483 484
  ulsch_harq->O_ACK                       = harq_information->harq_information_rel10.harq_size;

485
  if (ulsch_harq->O_RI>1) ulsch_harq->Or2 = rel9->aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[1];
486 487 488 489 490 491

  ulsch->beta_offset_harqack_times8       = to_beta_offset_harqack[harq_information->harq_information_rel10.delta_offset_harq];
  ulsch->beta_offset_ri_times8            = to_beta_offset_ri[rel9->delta_offset_ri];
  ulsch->beta_offset_cqi_times8           = to_beta_offset_cqi[rel9->delta_offset_cqi];
}

frtabu's avatar
frtabu committed
492 493
void handle_uci_harq_information(PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci,nfapi_ul_config_harq_information *harq_information) {
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
494

495
  if (eNB->frame_parms.frame_type == FDD) {
Cedric Roux's avatar
Cedric Roux committed
496
    uci->num_pucch_resources = harq_information->harq_information_rel9_fdd.number_of_pucch_resources;
497
    LOG_D(PHY,"Programming UCI HARQ mode %d : size %d in (%d,%d)\n",
Cedric Roux's avatar
Cedric Roux committed
498 499 500
          harq_information->harq_information_rel9_fdd.ack_nack_mode,
          harq_information->harq_information_rel9_fdd.harq_size,
          uci->frame,uci->subframe);
501 502

    if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 0) &&
Cedric Roux's avatar
Cedric Roux committed
503
        (harq_information->harq_information_rel9_fdd.harq_size == 1)) {
504 505 506
      uci->pucch_fmt =  pucch_format1a;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
frtabu's avatar
frtabu committed
507 508
    } else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 0) &&
               (harq_information->harq_information_rel9_fdd.harq_size == 2)) {
509 510 511
      uci->pucch_fmt =  pucch_format1b;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
frtabu's avatar
frtabu committed
512 513
    } else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
               (harq_information->harq_information_rel9_fdd.harq_size == 2)) {
514 515 516 517 518
      uci->pucch_fmt =  pucch_format1b_csA2;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
      uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
      uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
frtabu's avatar
frtabu committed
519 520
    } else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
               (harq_information->harq_information_rel9_fdd.harq_size == 3)) {
521 522 523 524 525 526 527
      uci->pucch_fmt =  pucch_format1b_csA3;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
      uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
      uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
      uci->n_pucch_1[2][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_2;
      uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
frtabu's avatar
frtabu committed
528 529
    } else if ((harq_information->harq_information_rel9_fdd.ack_nack_mode == 1) &&
               (harq_information->harq_information_rel9_fdd.harq_size == 4)) {
530 531 532 533 534 535 536
      uci->pucch_fmt =  pucch_format1b_csA4;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
      uci->n_pucch_1[1][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_1;
      uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
      uci->n_pucch_1[2][0] = harq_information->harq_information_rel9_fdd.n_pucch_1_2;
      uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
frtabu's avatar
frtabu committed
537
    } else if (harq_information->harq_information_rel9_fdd.ack_nack_mode == 2) {
538 539 540
      uci->pucch_fmt =  pucch_format3;
      uci->n_pucch_3[0] = harq_information->harq_information_rel9_fdd.n_pucch_1_0;
      uci->n_pucch_3[1] = harq_information->harq_information_rel11.n_pucch_2_0;
frtabu's avatar
frtabu committed
541 542
    } else AssertFatal(1==0,"unsupported FDD HARQ mode %d size %d\n",harq_information->harq_information_rel9_fdd.ack_nack_mode,harq_information->harq_information_rel9_fdd.harq_size);
  } else { // TDD
Cedric Roux's avatar
Cedric Roux committed
543
    uci->num_pucch_resources = harq_information->harq_information_rel10_tdd.number_of_pucch_resources;
544 545 546 547 548 549

    if (harq_information->harq_information_rel10_tdd.ack_nack_mode == 0) {//bundling
      uci->pucch_fmt =  harq_information->harq_information_rel10_tdd.harq_size==1 ? pucch_format1a : pucch_format1b;
      uci->tdd_bundling = 1;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
frtabu's avatar
frtabu committed
550 551
    } else if ((harq_information->harq_information_rel10_tdd.ack_nack_mode == 1) && //multiplexing
               (uci->num_pucch_resources == 1)) {
552 553 554 555
      uci->pucch_fmt = harq_information->harq_information_rel10_tdd.harq_size==1 ? pucch_format1a : pucch_format1b;
      uci->tdd_bundling = 0;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
frtabu's avatar
frtabu committed
556 557
    } else if ((harq_information->harq_information_rel10_tdd.ack_nack_mode == 1) && //multiplexing M>1
               (uci->num_pucch_resources > 1)) {
558 559 560 561 562 563 564 565 566 567
      uci->pucch_fmt = pucch_format1b;
      uci->tdd_bundling = 0;
      uci->n_pucch_1[0][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
      uci->n_pucch_1[0][1] = harq_information->harq_information_rel11.n_pucch_2_0;
      uci->n_pucch_1[1][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_1;
      uci->n_pucch_1[1][1] = harq_information->harq_information_rel11.n_pucch_2_1;
      uci->n_pucch_1[2][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_2;
      uci->n_pucch_1[2][1] = harq_information->harq_information_rel11.n_pucch_2_2;
      uci->n_pucch_1[3][0] = harq_information->harq_information_rel10_tdd.n_pucch_1_3;
      uci->n_pucch_1[3][1] = harq_information->harq_information_rel11.n_pucch_2_3;
frtabu's avatar
frtabu committed
568
    } else if (harq_information->harq_information_rel10_tdd.ack_nack_mode == 2) {
569 570 571
      uci->pucch_fmt =  pucch_format3;
      uci->n_pucch_3[0] = harq_information->harq_information_rel10_tdd.n_pucch_1_0;
      uci->n_pucch_3[1] = harq_information->harq_information_rel11.n_pucch_2_0;
frtabu's avatar
frtabu committed
572
    } else AssertFatal(1==0,"unsupported HARQ mode %d\n",harq_information->harq_information_rel10_tdd.ack_nack_mode);
573 574 575
  }
}

576 577 578 579 580 581
void handle_uci_sr_pdu(PHY_VARS_eNB *eNB,
                       int UE_id,
                       nfapi_ul_config_request_pdu_t *ul_config_pdu,
                       uint16_t frame,
                       uint8_t subframe,
                       uint8_t srs_active)
Cedric Roux's avatar
Cedric Roux committed
582
{
583 584
  LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];

frtabu's avatar
frtabu committed
585
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
586

587 588 589 590 591 592 593 594 595 596
  uci->frame               = frame;
  uci->subframe            = subframe;
  uci->rnti                = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti;
  uci->type                = SR;
  uci->pucch_fmt           = pucch_format1;
  uci->num_antenna_ports   = 1;
  uci->num_pucch_resources = 1;
  uci->n_pucch_1_0_sr[0]   = ul_config_pdu->uci_sr_pdu.sr_information.sr_information_rel8.pucch_index;
  uci->srs_active          = srs_active;
  uci->active              = 1;
597
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
sharma's avatar
sharma committed
598 599 600 601
  uci->ue_type                     = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel13.ue_type;
  uci->empty_symbols               = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel13.empty_symbols;
  uci->total_repetitions = ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel13.total_number_of_repetitions;
#endif
602
  LOG_D(PHY,"Programming UCI SR rnti %x, pucch1_0 %d for (%d,%d)\n",
603 604 605 606
        uci->rnti,
        uci->n_pucch_1_0_sr[0],
        frame,
        subframe);
607 608
}

frtabu's avatar
frtabu committed
609
void handle_uci_sr_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) {
610 611
  LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];

frtabu's avatar
frtabu committed
612
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
613

614 615 616 617 618 619
  uci->frame               = frame;
  uci->subframe            = subframe;
  uci->rnti                = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti;
  uci->type                = HARQ_SR;
  uci->num_antenna_ports   = 1;
  uci->num_pucch_resources = 1;
620
  uci->n_pucch_1_0_sr[0]   = ul_config_pdu->uci_sr_harq_pdu.sr_information.sr_information_rel8.pucch_index;
621 622
  uci->srs_active          = srs_active;
  uci->active              = 1;
623
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
sharma's avatar
sharma committed
624 625 626 627
  uci->ue_type                     = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel13.ue_type;
  uci->empty_symbols               = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel13.empty_symbols;
  uci->total_repetitions = ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel13.total_number_of_repetitions;
#endif
628 629 630
  handle_uci_harq_information(eNB,uci,&ul_config_pdu->uci_sr_harq_pdu.harq_information);
}

frtabu's avatar
frtabu committed
631
void handle_uci_harq_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe,uint8_t srs_active) {
632 633
  LTE_eNB_UCI *uci = &eNB->uci_vars[UE_id];

frtabu's avatar
frtabu committed
634
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
635

nepes's avatar
nepes committed
636
  LOG_D(PHY,"Frame %d, Subframe %d: Programming UCI_HARQ process (type %d)\n",frame,subframe,HARQ);
637 638 639 640 641 642
  uci->frame             = frame;
  uci->subframe          = subframe;
  uci->rnti              = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti;
  uci->type              = HARQ;
  uci->srs_active        = srs_active;
  uci->num_antenna_ports = ul_config_pdu->uci_harq_pdu.harq_information.harq_information_rel11.num_ant_ports;
643
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
sharma's avatar
sharma committed
644 645 646 647
  uci->ue_type                     = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.ue_type;
  uci->empty_symbols               = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.empty_symbols;
  uci->total_repetitions           = ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel13.total_number_of_repetitions;
#endif
648 649 650 651
  handle_uci_harq_information(eNB,uci,&ul_config_pdu->uci_harq_pdu.harq_information);
  uci->active=1;
}

frtabu's avatar
frtabu committed
652
void handle_srs_pdu(PHY_VARS_eNB *eNB,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe) {
653 654
  int i;

frtabu's avatar
frtabu committed
655
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
Cedric Roux's avatar
Cedric Roux committed
656

frtabu's avatar
frtabu committed
657
  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
658
    if (eNB->soundingrs_ul_config_dedicated[i].active==1) continue;
Cedric Roux's avatar
Cedric Roux committed
659

660 661 662 663 664 665 666 667 668 669
    eNB->soundingrs_ul_config_dedicated[i].active               = 1;
    eNB->soundingrs_ul_config_dedicated[i].frame                = frame;
    eNB->soundingrs_ul_config_dedicated[i].subframe             = subframe;
    eNB->soundingrs_ul_config_dedicated[i].rnti                 = ul_config_pdu->srs_pdu.srs_pdu_rel8.rnti;
    eNB->soundingrs_ul_config_dedicated[i].srs_Bandwidth        = ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_bandwidth;
    eNB->soundingrs_ul_config_dedicated[i].srs_HoppingBandwidth = ul_config_pdu->srs_pdu.srs_pdu_rel8.srs_hopping_bandwidth;
    eNB->soundingrs_ul_config_dedicated[i].freqDomainPosition   = ul_config_pdu->srs_pdu.srs_pdu_rel8.frequency_domain_position;
    eNB->soundingrs_ul_config_dedicated[i].transmissionComb     = ul_config_pdu->srs_pdu.srs_pdu_rel8.transmission_comb;
    eNB->soundingrs_ul_config_dedicated[i].srs_ConfigIndex      = ul_config_pdu->srs_pdu.srs_pdu_rel8.i_srs;
    eNB->soundingrs_ul_config_dedicated[i].cyclicShift          = ul_config_pdu->srs_pdu.srs_pdu_rel8.sounding_reference_cyclic_shift;
Cedric Roux's avatar
Cedric Roux committed
670
    break;
671
  }
frtabu's avatar
frtabu committed
672

673 674 675
  AssertFatal(i<NUMBER_OF_UE_MAX,"No room for SRS processing\n");
}

676
void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
Cedric Roux's avatar
Cedric Roux committed
677
                         nfapi_ul_config_request_pdu_t *ul_config_pdu,
frtabu's avatar
frtabu committed
678
                         uint16_t frame,uint8_t subframe,uint8_t srs_present) {
679
  nfapi_ul_config_ulsch_pdu_rel8_t *rel8 = &ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
680
  int16_t UE_id;
681

frtabu's avatar
frtabu committed
682
  if (NFAPI_MODE==NFAPI_MODE_VNF) return;
683

684 685 686
  // check if we have received a dci for this ue and ulsch descriptor is configured

  if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE) {
687
    //if (UE_id == find_ulsch(ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE)<0)
frtabu's avatar
frtabu committed
688
    //for (int i=0;i<16;i++) if (eNB->ulsch[i]->harq_mask>0) LOG_I(PHY,"rnti %x, mask %x\n",eNB->ulsch[i]->rnti,eNB->ulsch[i]->harq_mask >0);
Raymond Knopp's avatar
Raymond Knopp committed
689
    AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
Cedric Roux's avatar
Cedric Roux committed
690
                "No existing UE ULSCH for rnti %x\n",rel8->rnti);
frtabu's avatar
frtabu committed
691 692 693
    LOG_D(PHY,"Applying UL config for UE %d, rnti %x for frame %d, subframe %d, modulation %d, rvidx %d, first_rb %d, nb_rb %d\n", UE_id,rel8->rnti,frame,subframe,rel8->modulation_type,
          rel8->redundancy_version,
          rel8->resource_block_start,rel8->number_of_resource_blocks);
Wang Tsu-Han's avatar
Wang Tsu-Han committed
694
    fill_ulsch(eNB,UE_id,&ul_config_pdu->ulsch_pdu,frame,subframe);
frtabu's avatar
frtabu committed
695
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE) {
696
    AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,eNB,SEARCH_EXIST_OR_FREE))>=0,
Cedric Roux's avatar
Cedric Roux committed
697
                "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_harq_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
Wang Tsu-Han's avatar
Wang Tsu-Han committed
698
    fill_ulsch(eNB,UE_id,&ul_config_pdu->ulsch_harq_pdu.ulsch_pdu,frame,subframe);
699
    handle_ulsch_harq_pdu(eNB, UE_id, ul_config_pdu,
frtabu's avatar
frtabu committed
700 701
                          &ul_config_pdu->ulsch_harq_pdu.harq_information, frame, subframe);
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE) {
702
    AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,
Cedric Roux's avatar
Cedric Roux committed
703 704
                                    eNB,SEARCH_EXIST_OR_FREE))>=0,
                "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
Wang Tsu-Han's avatar
Wang Tsu-Han committed
705
    fill_ulsch(eNB,UE_id,&ul_config_pdu->ulsch_cqi_ri_pdu.ulsch_pdu,frame,subframe);
706
    handle_ulsch_cqi_ri_pdu(eNB,UE_id,ul_config_pdu,frame,subframe);
frtabu's avatar
frtabu committed
707
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE) {
708
    AssertFatal((UE_id = find_ulsch(ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti,
Cedric Roux's avatar
Cedric Roux committed
709 710
                                    eNB,SEARCH_EXIST_OR_FREE))>=0,
                "No available UE ULSCH for rnti %x\n",ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu.ulsch_pdu_rel8.rnti);
Wang Tsu-Han's avatar
Wang Tsu-Han committed
711
    fill_ulsch(eNB,UE_id,&ul_config_pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu,frame,subframe);
712
    handle_ulsch_cqi_harq_ri_pdu(eNB,UE_id,ul_config_pdu,frame,subframe);
713
    handle_ulsch_harq_pdu(eNB, UE_id, ul_config_pdu,
frtabu's avatar
frtabu committed
714 715
                          &ul_config_pdu->ulsch_cqi_harq_ri_pdu.harq_information, frame, subframe);
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE) {
716
    AssertFatal((UE_id = find_uci(ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti,
Cedric Roux's avatar
Cedric Roux committed
717 718
                                  proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
                "No available UE UCI for rnti %x\n",ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti);
nepes's avatar
nepes committed
719
    LOG_D(PHY,"Applying UL UCI_HARQ config for UE %d, rnti %x for frame %d, subframe %d\n",
sharma's avatar
sharma committed
720
          UE_id,ul_config_pdu->uci_harq_pdu.ue_information.ue_information_rel8.rnti,frame,subframe);
721
    handle_uci_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
frtabu's avatar
frtabu committed
722
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE) {
723
    AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE not handled yet\n");
frtabu's avatar
frtabu committed
724
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE) {
725
    AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE not handled yet\n");
frtabu's avatar
frtabu committed
726
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE) {
727
    AssertFatal(1==0,"NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE not handled yet\n");
frtabu's avatar
frtabu committed
728
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE) {
729
    AssertFatal((UE_id = find_uci(ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti,
Cedric Roux's avatar
Cedric Roux committed
730 731
                                  proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
                "No available UE UCI for rnti %x\n",ul_config_pdu->uci_sr_pdu.ue_information.ue_information_rel8.rnti);
732
    handle_uci_sr_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
frtabu's avatar
frtabu committed
733
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE) {
734
    AssertFatal((UE_id = find_uci(rel8->rnti,proc->frame_tx,proc->subframe_tx,eNB,SEARCH_EXIST_OR_FREE))>=0,
Cedric Roux's avatar
Cedric Roux committed
735
                "No available UE UCI for rnti %x\n",ul_config_pdu->uci_sr_harq_pdu.ue_information.ue_information_rel8.rnti);
736
    handle_uci_sr_harq_pdu(eNB,UE_id,ul_config_pdu,frame,subframe,srs_present);
frtabu's avatar
frtabu committed
737
  } else if (ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_SRS_PDU_TYPE) {
738 739 740 741
    handle_srs_pdu(eNB,ul_config_pdu,frame,subframe);
  }
}

frtabu's avatar
frtabu committed
742
void schedule_response(Sched_Rsp_t *Sched_INFO) {
743
  PHY_VARS_eNB *eNB;
744
  L1_rxtx_proc_t *proc;
745 746 747 748 749 750 751 752 753 754
  // copy data from L2 interface into L1 structures
  module_id_t               Mod_id       = Sched_INFO->module_id;
  uint8_t                   CC_id        = Sched_INFO->CC_id;
  nfapi_dl_config_request_t *DL_req      = Sched_INFO->DL_req;
  nfapi_hi_dci0_request_t   *HI_DCI0_req = Sched_INFO->HI_DCI0_req;
  nfapi_ul_config_request_t *UL_req      = Sched_INFO->UL_req;
  nfapi_tx_request_t        *TX_req      = Sched_INFO->TX_req;
  frame_t                   frame        = Sched_INFO->frame;
  sub_frame_t               subframe     = Sched_INFO->subframe;
  LTE_DL_FRAME_PARMS        *fp;
755
  uint8_t                   ul_subframe;
756 757 758 759 760 761 762 763
  int                       ul_frame;
  int                       harq_pid;
  LTE_UL_eNB_HARQ_t         *ulsch_harq;
  AssertFatal(RC.eNB!=NULL,"RC.eNB is null\n");
  AssertFatal(RC.eNB[Mod_id]!=NULL,"RC.eNB[%d] is null\n",Mod_id);
  AssertFatal(RC.eNB[Mod_id][CC_id]!=NULL,"RC.eNB[%d][%d] is null\n",Mod_id,CC_id);
  eNB         = RC.eNB[Mod_id][CC_id];
  fp          = &eNB->frame_parms;
Wang Tsu-Han's avatar
Wang Tsu-Han committed
764
  proc        = &eNB->proc.L1_proc;
765 766
  /* TODO: check that following line is correct - in the meantime it is disabled */
  //if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)==SF_UL)) return;
767 768
  ul_subframe = pdcch_alloc2ul_subframe(fp,subframe);
  ul_frame    = pdcch_alloc2ul_frame(fp,frame,subframe);
769 770 771 772
  // DJP - subframe assert will fail - not sure why yet
  // DJP - AssertFatal(proc->subframe_tx == subframe, "Current subframe %d != NFAPI subframe %d\n",proc->subframe_tx,subframe);
  // DJP - AssertFatal(proc->subframe_tx == subframe, "Current frame %d != NFAPI frame %d\n",proc->frame_tx,frame);
  uint8_t number_pdcch_ofdm_symbols = DL_req->dl_config_request_body.number_pdcch_ofdm_symbols;
773 774
  uint8_t number_dl_pdu             = DL_req->dl_config_request_body.number_pdu;
  uint8_t number_hi_dci0_pdu        = HI_DCI0_req->hi_dci0_request_body.number_of_dci+HI_DCI0_req->hi_dci0_request_body.number_of_hi;
775
  uint8_t number_ul_pdu             = UL_req!=NULL ? UL_req->ul_config_request_body.number_of_pdus : 0;
776 777 778 779
  nfapi_dl_config_request_pdu_t *dl_config_pdu;
  nfapi_hi_dci0_request_pdu_t   *hi_dci0_req_pdu;
  nfapi_ul_config_request_pdu_t *ul_config_pdu;
  int i;
780
  eNB->pdcch_vars[subframe&1].num_pdcch_symbols = number_pdcch_ofdm_symbols;
781 782
  eNB->pdcch_vars[subframe&1].num_dci           = 0;
  eNB->phich_vars[subframe&1].num_hi            = 0;
783
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
784 785
  eNB->mpdcch_vars[subframe&1].num_dci           = 0;
#endif
Wang Tsu-Han's avatar
Wang Tsu-Han committed
786
  LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SF:%04d%d DL_req:SFN/SF:%04d%d:dl_pdu:%d tx_req:SFN/SF:%04d%d:pdus:%d\n",
frtabu's avatar
frtabu committed
787 788 789
        frame,subframe,
        NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),number_dl_pdu,
        NFAPI_SFNSF2SFN(TX_req->sfn_sf),NFAPI_SFNSF2SF(TX_req->sfn_sf),TX_req->tx_request_body.number_of_pdus
Wang Tsu-Han's avatar
Wang Tsu-Han committed
790 791 792 793
       );
  LOG_D(PHY,"NFAPI: hi_dci0:SFN/SF:%04d%d:pdus:%d\n",
        NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),number_hi_dci0_pdu
       );
frtabu's avatar
frtabu committed
794

Wang Tsu-Han's avatar
Wang Tsu-Han committed
795 796 797 798 799
  if(UL_req!=NULL)
    LOG_D(PHY,"NFAPI: ul_cfg:SFN/SF:%04d%d:pdus:%d num_pdcch_symbols:%d\n",
          NFAPI_SFNSF2SFN(UL_req->sfn_sf),NFAPI_SFNSF2SF(UL_req->sfn_sf),number_ul_pdu,
          eNB->pdcch_vars[subframe&1].num_pdcch_symbols);

800 801
  int do_oai =0;
  int dont_send =0;
frtabu's avatar
frtabu committed
802

803 804 805
  /* TODO: check the following test - in the meantime it is put back as it was before */
  //if ((ul_subframe<10)&&
  //    (subframe_select(fp,ul_subframe)==SF_UL)) { // This means that there is an ul_subframe that can be configured here
806
  if (ul_subframe<10) { // This means that there is an ul_subframe that can be configured here
807
    LOG_D(PHY,"NFAPI: Clearing dci allocations for potential UL subframe %d\n",ul_subframe);
808 809 810
    harq_pid = subframe2harq_pid(fp,ul_frame,ul_subframe);

    // clear DCI allocation maps for new subframe
Cedric Roux's avatar
Cedric Roux committed
811

812 813
    for (i=0; i<NUMBER_OF_UE_MAX; i++) {
      if (eNB->ulsch[i]) {
Cedric Roux's avatar
Cedric Roux committed
814
        ulsch_harq = eNB->ulsch[i]->harq_processes[harq_pid];
815 816 817 818 819
        ulsch_harq->dci_alloc=0;
        ulsch_harq->rar_alloc=0;
      }
    }
  }
frtabu's avatar
frtabu committed
820 821

  for (i=0; i<number_dl_pdu; i++) {
822
    dl_config_pdu = &DL_req->dl_config_request_body.dl_config_pdu_list[i];
frtabu's avatar
frtabu committed
823

Wang Tsu-Han's avatar
Wang Tsu-Han committed
824
    //LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_config_pdu->pdu_type);
825
    switch (dl_config_pdu->pdu_type) {
frtabu's avatar
frtabu committed
826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850
      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
        handle_nfapi_dci_dl_pdu(eNB,NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),proc,dl_config_pdu);
        eNB->pdcch_vars[NFAPI_SFNSF2SF(DL_req->sfn_sf)&1].num_dci++;
        //LOG_E(PHY,"Incremented num_dci:%d but already set??? dl_config:num_dci:%d\n", eNB->pdcch_vars[subframe&1].num_dci, number_dci);
        do_oai=1;
        break;

      case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
        AssertFatal(dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index<TX_req->tx_request_body.number_of_pdus,
                    "bch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
                    dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index,
                    TX_req->tx_request_body.number_of_pdus);
        eNB->pbch_configured=1;
        do_oai=1;
        //LOG_D(PHY,"%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE TX:%d/%d RX:%d/%d TXREQ:%d/%d\n",
        //__FUNCTION__, proc->frame_tx, proc->subframe_tx, proc->frame_rx, proc->subframe_rx, NFAPI_SFNSF2SFN(TX_req->sfn_sf), NFAPI_SFNSF2SF(TX_req->sfn_sf));
        handle_nfapi_bch_pdu(eNB,proc,dl_config_pdu,
                             TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->bch_pdu.bch_pdu_rel8.pdu_index].segments[0].segment_data);
        break;

      case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
        //      handle_nfapi_mch_dl_pdu(eNB,dl_config_pdu);
        break;

      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
851 852 853 854 855
        nfapi_dl_config_dlsch_pdu_rel8_t *dlsch_pdu_rel8 = &dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8;
        uint16_t pdu_index = dlsch_pdu_rel8->pdu_index;
        uint16_t tx_pdus = TX_req->tx_request_body.number_of_pdus;
        uint16_t invalid_pdu = pdu_index == -1;
        uint8_t *sdu = invalid_pdu ? NULL : pdu_index >= tx_pdus ? NULL : TX_req->tx_request_body.tx_pdu_list[pdu_index].segments[0].segment_data;
frtabu's avatar
frtabu committed
856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893
        LOG_D(PHY,"%s() [PDU:%d] NFAPI_DL_CONFIG_DLSCH_PDU_TYPE SFN/SF:%04d%d TX:%d/%d RX:%d/%d transport_blocks:%d pdu_index:%d sdu:%p\n",
              __FUNCTION__, i,
              NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),
              proc->frame_tx, proc->subframe_tx,
              proc->frame_rx, proc->subframe_rx,
              dlsch_pdu_rel8->transport_blocks, pdu_index, sdu);
        /*
        AssertFatal(dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index<TX_req->tx_request_body.number_of_pdus,
                    "dlsch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
                    dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index,
                    TX_req->tx_request_body.number_of_pdus);
        */
        AssertFatal((dlsch_pdu_rel8->transport_blocks<3) &&
                    (dlsch_pdu_rel8->transport_blocks>0),
                    "dlsch_pdu_rel8->transport_blocks = %d not in [1,2]\n",
                    dlsch_pdu_rel8->transport_blocks);

        if (1) { //sdu != NULL)
          handle_nfapi_dlsch_pdu(eNB,NFAPI_SFNSF2SFN(DL_req->sfn_sf),NFAPI_SFNSF2SF(DL_req->sfn_sf),proc,dl_config_pdu, dlsch_pdu_rel8->transport_blocks-1, sdu);
        } else {
          dont_send=1;
          LOG_E(MAC,"%s() NFAPI_DL_CONFIG_DLSCH_PDU_TYPE sdu is NULL DL_CFG:SFN/SF:%d:pdu_index:%d TX_REQ:SFN/SF:%d:pdus:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(DL_req->sfn_sf), pdu_index,
                NFAPI_SFNSF2DEC(TX_req->sfn_sf), tx_pdus);
        }

        // Send the data first so that the DL_CONFIG can just pluck it out of the buffer
        // DJP - OAI was here - moved to bottom
        do_oai=1;
        /*
        if (dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.rnti == eNB->preamble_list[0].preamble_rel8.rnti) {// is RAR pdu

          LOG_D(PHY,"Frame %d, Subframe %d: Received LTE RAR pdu, programming based on UL Grant\n",frame,subframe);
          generate_eNB_ulsch_params_from_rar(eNB,
                                             TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->dlsch_pdu.dlsch_pdu_rel8.pdu_index].segments[0].segment_data,
                                             frame,
                                             subframe);

                                             }        */
894
      }
frtabu's avatar
frtabu committed
895
      break;
896

frtabu's avatar
frtabu committed
897 898 899
      case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
        //      handle_nfapi_pch_pdu(eNB,dl_config_pdu);
        break;
900

frtabu's avatar
frtabu committed
901 902 903
      case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
        //      handle_nfapi_prs_pdu(eNB,dl_config_pdu);
        break;
904

frtabu's avatar
frtabu committed
905 906 907
      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
        //      handle_nfapi_csi_rs_pdu(eNB,dl_config_pdu);
        break;
Cedric Roux's avatar
Cedric Roux committed
908

frtabu's avatar
frtabu committed
909 910 911
      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
        //      handle_nfapi_epdcch_pdu(eNB,dl_config_pdu);
        break;
912
#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0))
frtabu's avatar
frtabu committed
913 914 915 916 917 918

      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
        handle_nfapi_mpdcch_pdu(eNB,proc,dl_config_pdu);
        eNB->mpdcch_vars[subframe&1].num_dci++;
        break;
#endif
919 920
    }
  }
921

frtabu's avatar
frtabu committed
922 923
  if ((NFAPI_MODE!=NFAPI_MONOLITHIC) && do_oai && !dont_send) {
    oai_nfapi_tx_req(Sched_INFO->TX_req);
924 925 926
    oai_nfapi_dl_config_req(Sched_INFO->DL_req); // DJP - .dl_config_request_body.dl_config_pdu_list[0]); // DJP - FIXME TODO - yuk - only copes with 1 pdu
  }

frtabu's avatar
frtabu committed
927
  if ((NFAPI_MODE!=NFAPI_MONOLITHIC) && number_hi_dci0_pdu!=0) {
928 929 930 931
    oai_nfapi_hi_dci0_req(HI_DCI0_req);
    eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_dci=0;
    eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_pdcch_symbols=0;
  }
Cedric Roux's avatar
Cedric Roux committed
932

frtabu's avatar
frtabu committed
933
  for (i=0; i<number_hi_dci0_pdu; i++) {
934
    hi_dci0_req_pdu = &HI_DCI0_req->hi_dci0_request_body.hi_dci0_pdu_list[i];
Raymond Knopp's avatar
Raymond Knopp committed
935
    LOG_D(PHY,"NFAPI: hi_dci0_pdu %d : type %d\n",i,hi_dci0_req_pdu->pdu_type);
936 937

    switch (hi_dci0_req_pdu->pdu_type) {
frtabu's avatar
frtabu committed
938 939 940 941 942 943 944 945 946 947 948 949 950
      case NFAPI_HI_DCI0_DCI_PDU_TYPE:
        handle_nfapi_hi_dci0_dci_pdu(eNB,NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),proc,hi_dci0_req_pdu);
        eNB->pdcch_vars[NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf)&1].num_dci++;
        break;

      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
        handle_nfapi_hi_dci0_mpdcch_dci_pdu(eNB,proc,hi_dci0_req_pdu);
        eNB->mpdcch_vars[subframe&1].num_dci++;
        break;

      case NFAPI_HI_DCI0_HI_PDU_TYPE:
        handle_nfapi_hi_dci0_hi_pdu(eNB,NFAPI_SFNSF2SFN(HI_DCI0_req->sfn_sf),NFAPI_SFNSF2SF(HI_DCI0_req->sfn_sf),proc,hi_dci0_req_pdu);
        break;
951
    }
Cedric Roux's avatar
Cedric Roux committed
952
  }
953

frtabu's avatar
frtabu committed
954 955
  if (NFAPI_MODE!=NFAPI_MONOLITHIC) {
    if (number_ul_pdu>0) {
956 957 958 959 960
      //LOG_D(PHY, "UL_CONFIG to send to PNF\n");
      oai_nfapi_ul_config_req(UL_req);
      UL_req->ul_config_request_body.number_of_pdus=0;
      number_ul_pdu=0;
    }
frtabu's avatar
frtabu committed
961 962
  } else {
    for (i=0; i<number_ul_pdu; i++) {
963 964 965
      ul_config_pdu = &UL_req->ul_config_request_body.ul_config_pdu_list[i];
      LOG_D(PHY,"NFAPI: ul_pdu %d : type %d\n",i,ul_config_pdu->pdu_type);
      AssertFatal(ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_PDU_TYPE ||
frtabu's avatar
frtabu committed
966 967 968 969 970 971 972 973
                  ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE ||
                  ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE ||
                  ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE ||
                  ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE ||
                  ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE ||
                  ul_config_pdu->pdu_type == NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE
                  ,
                  "Optional UL_PDU type %d not supported\n",ul_config_pdu->pdu_type);
974 975
      handle_nfapi_ul_pdu(eNB,proc,ul_config_pdu,UL_req->sfn_sf>>4,UL_req->sfn_sf&0xf,UL_req->ul_config_request_body.srs_present);
    }
976 977
  }
}
978 979 980

/*Dummy functions*/

frtabu's avatar
frtabu committed
981 982
int memcpy_dl_config_req (nfapi_pnf_p7_config_t *pnf_p7, nfapi_dl_config_request_t *req) {
  return 0;
983 984
}

frtabu's avatar
frtabu committed
985 986
int memcpy_ul_config_req (nfapi_pnf_p7_config_t *pnf_p7, nfapi_ul_config_request_t *req) {
  return 0;
987 988
}

frtabu's avatar
frtabu committed
989 990
int memcpy_hi_dci0_req (nfapi_pnf_p7_config_t *pnf_p7, nfapi_hi_dci0_request_t *req) {
  return 0;
991 992
}

frtabu's avatar
frtabu committed
993 994
int memcpy_tx_req (nfapi_pnf_p7_config_t *pnf_p7, nfapi_tx_request_t *req) {
  return 0;
995
}