diff --git a/src/osmo-bts-litecell15/lc15_l1_if.c b/src/osmo-bts-litecell15/lc15_l1_if.c index 8f64863e..c87edaf9 100644 --- a/src/osmo-bts-litecell15/lc15_l1_if.c +++ b/src/osmo-bts-litecell15/lc15_l1_if.c @@ -195,6 +195,8 @@ static int handle_ph_data_ind(struct lc15l1_hdl *fl1h, int rc = 0; struct gprs_rlcmac_bts *bts; struct pcu_l1_meas meas = {0}; + uint8_t *data; + uint8_t data_len; DEBUGP(DL1IF, "Rx PH-DATA.ind %s (hL2 %08x): %s\n", get_value_string(lc15bts_l1sapi_names, data_ind->sapi), @@ -202,14 +204,6 @@ static int handle_ph_data_ind(struct lc15l1_hdl *fl1h, osmo_hexdump(data_ind->msgUnitParam.u8Buffer, data_ind->msgUnitParam.u8Size)); - /* - * TODO: Add proper bad frame handling here. This could be used - * to switch the used CS. Avoid a crash with the PCU right now - * feed "0 - 1" amount of data. - */ - if (data_ind->msgUnitParam.u8Size == 0) - return -1; - bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list); get_meas(&meas, &data_ind->measParam); @@ -219,16 +213,19 @@ static int handle_ph_data_ind(struct lc15l1_hdl *fl1h, switch (data_ind->sapi) { case GsmL1_Sapi_Pdtch: case GsmL1_Sapi_Pacch: - /* drop incomplete UL block */ - if (data_ind->msgUnitParam.u8Buffer[0] - != GsmL1_PdtchPlType_Full) - break; /* PDTCH / PACCH frame handling */ - rc = pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn, - data_ind->msgUnitParam.u8Buffer + 1, - data_ind->msgUnitParam.u8Size - 1, - data_ind->u32Fn, - &meas); + if (data_ind->msgUnitParam.u8Size != 0 && + data_ind->msgUnitParam.u8Buffer[0] != GsmL1_PdtchPlType_Full) { + data = data_ind->msgUnitParam.u8Buffer + 1; + data_len = data_ind->msgUnitParam.u8Size - 1; + if (data_len == 0) + data = NULL; + } else { + data = NULL; + data_len = 0; + } + pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn, data, + data_len, data_ind->u32Fn, &meas); break; default: LOGP(DL1IF, LOGL_NOTICE, "Rx PH-DATA.ind for unknown L1 SAPI %s\n", diff --git a/src/osmo-bts-oc2g/oc2g_l1_if.c b/src/osmo-bts-oc2g/oc2g_l1_if.c index d81bc4f8..5d2ce691 100644 --- a/src/osmo-bts-oc2g/oc2g_l1_if.c +++ b/src/osmo-bts-oc2g/oc2g_l1_if.c @@ -195,6 +195,8 @@ static int handle_ph_data_ind(struct oc2gl1_hdl *fl1h, int rc = 0; struct gprs_rlcmac_bts *bts; struct pcu_l1_meas meas = {0}; + uint8_t *data; + uint8_t data_len; DEBUGP(DL1IF, "Rx PH-DATA.ind %s (hL2 %08x): %s\n", get_value_string(oc2gbts_l1sapi_names, data_ind->sapi), @@ -202,14 +204,6 @@ static int handle_ph_data_ind(struct oc2gl1_hdl *fl1h, osmo_hexdump(data_ind->msgUnitParam.u8Buffer, data_ind->msgUnitParam.u8Size)); - /* - * TODO: Add proper bad frame handling here. This could be used - * to switch the used CS. Avoid a crash with the PCU right now - * feed "0 - 1" amount of data. - */ - if (data_ind->msgUnitParam.u8Size == 0) - return -1; - bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list); gsmtap_send(fl1h->gsmtap, data_ind->u16Arfcn | GSMTAP_ARFCN_F_UPLINK, @@ -224,16 +218,19 @@ static int handle_ph_data_ind(struct oc2gl1_hdl *fl1h, switch (data_ind->sapi) { case GsmL1_Sapi_Pdtch: case GsmL1_Sapi_Pacch: - /* drop incomplete UL block */ - if (data_ind->msgUnitParam.u8Buffer[0] - != GsmL1_PdtchPlType_Full) - break; /* PDTCH / PACCH frame handling */ - pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn, - data_ind->msgUnitParam.u8Buffer + 1, - data_ind->msgUnitParam.u8Size - 1, - data_ind->u32Fn, - &meas); + if (data_ind->msgUnitParam.u8Size != 0 && + data_ind->msgUnitParam.u8Buffer[0] != GsmL1_PdtchPlType_Full) { + data = data_ind->msgUnitParam.u8Buffer + 1; + data_len = data_ind->msgUnitParam.u8Size - 1; + if (data_len == 0) + data = NULL; + } else { + data = NULL; + data_len = 0; + } + pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn, data, + data_len, data_ind->u32Fn, &meas); break; default: LOGP(DL1IF, LOGL_NOTICE, "Rx PH-DATA.ind for unknown L1 SAPI %s\n", diff --git a/src/osmo-bts-sysmo/sysmo_l1_if.c b/src/osmo-bts-sysmo/sysmo_l1_if.c index f9db0b88..4faccaa2 100644 --- a/src/osmo-bts-sysmo/sysmo_l1_if.c +++ b/src/osmo-bts-sysmo/sysmo_l1_if.c @@ -177,6 +177,9 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1h, int rc = 0; struct gprs_rlcmac_bts *bts; struct pcu_l1_meas meas = {0}; + uint8_t *data; + uint8_t data_len; + DEBUGP(DL1IF, "Rx PH-DATA.ind %s (hL2 %08x): %s\n", get_value_string(femtobts_l1sapi_names, data_ind->sapi), @@ -187,14 +190,6 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1h, bts = llist_first_entry_or_null(&the_pcu->bts_list, struct gprs_rlcmac_bts, list); pcu_rx_block_time(bts, data_ind->u16Arfcn, data_ind->u32Fn, data_ind->u8Tn); - /* - * TODO: Add proper bad frame handling here. This could be used - * to switch the used CS. Avoid a crash with the PCU right now - * feed "0 - 1" amount of data. - */ - if (data_ind->msgUnitParam.u8Size == 0) - return -1; - get_meas(&meas, &data_ind->measParam); bts_update_tbf_ta(bts, "PH-DATA", data_ind->u32Fn, fl1h->trx_no, data_ind->u8Tn, sign_qta2ta(meas.bto), false); @@ -202,16 +197,19 @@ static int handle_ph_data_ind(struct femtol1_hdl *fl1h, switch (data_ind->sapi) { case GsmL1_Sapi_Pdtch: case GsmL1_Sapi_Pacch: - /* drop incomplete UL block */ - if (data_ind->msgUnitParam.u8Buffer[0] - != GsmL1_PdtchPlType_Full) - break; /* PDTCH / PACCH frame handling */ - pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn, - data_ind->msgUnitParam.u8Buffer + 1, - data_ind->msgUnitParam.u8Size - 1, - data_ind->u32Fn, - &meas); + if (data_ind->msgUnitParam.u8Size != 0 && + data_ind->msgUnitParam.u8Buffer[0] != GsmL1_PdtchPlType_Full) { + data = data_ind->msgUnitParam.u8Buffer + 1; + data_len = data_ind->msgUnitParam.u8Size - 1; + if (data_len == 0) + data = NULL; + } else { + data = NULL; + data_len = 0; + } + pcu_rx_data_ind_pdtch(bts, fl1h->trx_no, data_ind->u8Tn, data, + data_len, data_ind->u32Fn, &meas); break; default: LOGP(DL1IF, LOGL_NOTICE, "Rx PH-DATA.ind for unknown L1 SAPI %s\n",