diff options
author | Vadim Yanitskiy <axilirator@gmail.com> | 2019-10-05 22:22:08 +0700 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2019-11-17 02:58:31 +0700 |
commit | 78f58618f36dfc1df022f7c19fee7087d9ef3958 (patch) | |
tree | 749e0ed860c2e3089c2d95f2bba47c6f3945f01b | |
parent | bd0dac3783a27023b0aaaa2c7db99c021866b7b5 (diff) |
PTCCH: properly handle RTS.req for PCU_IF_SAPI_PTCCH
Change-Id: Ib204acce1a7e33f6651b9da2a7b4a9b9ae461093
Related: OS#1545
-rw-r--r-- | src/osmo-bts-litecell15/lc15_l1_if.c | 5 | ||||
-rw-r--r-- | src/osmo-bts-oc2g/oc2g_l1_if.c | 5 | ||||
-rw-r--r-- | src/osmo-bts-sysmo/sysmo_l1_if.c | 5 | ||||
-rw-r--r-- | src/pcu_l1_if.cpp | 43 | ||||
-rw-r--r-- | src/pcu_l1_if.h | 7 |
5 files changed, 44 insertions, 21 deletions
diff --git a/src/osmo-bts-litecell15/lc15_l1_if.c b/src/osmo-bts-litecell15/lc15_l1_if.c index 1df79418..670263fc 100644 --- a/src/osmo-bts-litecell15/lc15_l1_if.c +++ b/src/osmo-bts-litecell15/lc15_l1_if.c @@ -161,8 +161,11 @@ static int handle_ph_readytosend_ind(struct lc15l1_hdl *fl1h, case GsmL1_Sapi_Pacch: rc = pcu_rx_rts_req_pdtch(fl1h->trx_no, rts_ind->u8Tn, rts_ind->u32Fn, rts_ind->u8BlockNbr); + break; case GsmL1_Sapi_Ptcch: - // FIXME + rc = pcu_rx_rts_req_ptcch(fl1h->trx_no, rts_ind->u8Tn, + rts_ind->u32Fn, rts_ind->u8BlockNbr); + break; default: break; } diff --git a/src/osmo-bts-oc2g/oc2g_l1_if.c b/src/osmo-bts-oc2g/oc2g_l1_if.c index f9768aef..a02e9629 100644 --- a/src/osmo-bts-oc2g/oc2g_l1_if.c +++ b/src/osmo-bts-oc2g/oc2g_l1_if.c @@ -162,8 +162,11 @@ static int handle_ph_readytosend_ind(struct oc2gl1_hdl *fl1h, case GsmL1_Sapi_Pacch: rc = pcu_rx_rts_req_pdtch(fl1h->trx_no, rts_ind->u8Tn, rts_ind->u32Fn, rts_ind->u8BlockNbr); + break; case GsmL1_Sapi_Ptcch: - // FIXME + rc = pcu_rx_rts_req_ptcch(fl1h->trx_no, rts_ind->u8Tn, + rts_ind->u32Fn, rts_ind->u8BlockNbr); + break; default: break; } diff --git a/src/osmo-bts-sysmo/sysmo_l1_if.c b/src/osmo-bts-sysmo/sysmo_l1_if.c index 5d127dd5..9b310cc5 100644 --- a/src/osmo-bts-sysmo/sysmo_l1_if.c +++ b/src/osmo-bts-sysmo/sysmo_l1_if.c @@ -144,8 +144,11 @@ static int handle_ph_readytosend_ind(struct femtol1_hdl *fl1h, case GsmL1_Sapi_Pacch: rc = pcu_rx_rts_req_pdtch(fl1h->trx_no, rts_ind->u8Tn, rts_ind->u32Fn, rts_ind->u8BlockNbr); + break; case GsmL1_Sapi_Ptcch: - // FIXME + rc = pcu_rx_rts_req_ptcch(fl1h->trx_no, rts_ind->u8Tn, + rts_ind->u32Fn, rts_ind->u8BlockNbr); + break; default: break; } diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp index 883cb224..9c7724ce 100644 --- a/src/pcu_l1_if.cpp +++ b/src/pcu_l1_if.cpp @@ -185,24 +185,21 @@ void pcu_l1if_tx_pdtch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn, msgb_free(msg); } -void pcu_l1if_tx_ptcch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn, - uint32_t fn, uint8_t block_nr) +void pcu_l1if_tx_ptcch(uint8_t trx, uint8_t ts, uint16_t arfcn, + uint32_t fn, uint8_t block_nr, + uint8_t *data, size_t data_len) { struct gprs_rlcmac_bts *bts = bts_main_data(); if (bts->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_PTCCH)) - gsmtap_send(bts->gsmtap, arfcn, ts, GSMTAP_CHANNEL_PTCCH, 0, fn, 0, 0, msg->data, msg->len); + gsmtap_send(bts->gsmtap, arfcn, ts, GSMTAP_CHANNEL_PTCCH, 0, fn, 0, 0, data, data_len); #ifdef ENABLE_DIRECT_PHY if (bts->trx[trx].fl1h) { - l1if_pdch_req(bts->trx[trx].fl1h, ts, 1, fn, arfcn, block_nr, - msg->data, msg->len); - msgb_free(msg); + l1if_pdch_req(bts->trx[trx].fl1h, ts, 1, fn, arfcn, block_nr, data, data_len); return; } #endif - pcu_tx_data_req(trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, - msg->data, msg->len); - msgb_free(msg); + pcu_tx_data_req(trx, ts, PCU_IF_SAPI_PTCCH, arfcn, fn, block_nr, data, data_len); } void pcu_l1if_tx_agch(bitvec * block, int plen) @@ -361,6 +358,25 @@ extern "C" int pcu_rx_rts_req_pdtch(uint8_t trx, uint8_t ts, return gprs_rlcmac_rcv_rts_block(bts_main_data(), trx, ts, fn, block_nr); } +extern "C" int pcu_rx_rts_req_ptcch(uint8_t trx, uint8_t ts, + uint32_t fn, uint8_t block_nr) +{ + struct gprs_rlcmac_bts *bts = bts_main_data(); + struct gprs_rlcmac_pdch *pdch; + + /* Prevent buffer overflow */ + if (trx >= ARRAY_SIZE(bts->trx) || ts >= 8) + return -EINVAL; + + /* Make sure PDCH time-slot is enabled */ + pdch = &bts->trx[trx].pdch[ts]; + if (!pdch->m_is_enabled) + return -EAGAIN; + + pcu_l1if_tx_ptcch(trx, ts, bts->trx[trx].arfcn, fn, block_nr, + pdch->ptcch_msg, GSM_MACBLOCK_LEN); + return 0; +} static int pcu_rx_rts_req(struct gsm_pcu_if_rts_req *rts_req) { @@ -377,13 +393,8 @@ static int pcu_rx_rts_req(struct gsm_pcu_if_rts_req *rts_req) rts_req->fn, rts_req->block_nr); break; case PCU_IF_SAPI_PTCCH: - /* FIXME */ - { - struct msgb *msg = msgb_alloc(GSM_MACBLOCK_LEN, "l1_prim"); - memset(msgb_put(msg, GSM_MACBLOCK_LEN), 0x2b, GSM_MACBLOCK_LEN); - pcu_l1if_tx_ptcch(msg, rts_req->trx_nr, rts_req->ts_nr, - rts_req->arfcn, rts_req->fn, rts_req->block_nr); - } + pcu_rx_rts_req_ptcch(rts_req->trx_nr, rts_req->ts_nr, + rts_req->fn, rts_req->block_nr); break; default: LOGP(DL1IF, LOGL_ERROR, "Received PCU RTS request with " diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h index cb2a6dff..888ad284 100644 --- a/src/pcu_l1_if.h +++ b/src/pcu_l1_if.h @@ -154,8 +154,9 @@ struct pcu_l1_meas { #ifdef __cplusplus void pcu_l1if_tx_pdtch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn, uint32_t fn, uint8_t block_nr); -void pcu_l1if_tx_ptcch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn, - uint32_t fn, uint8_t block_nr); +void pcu_l1if_tx_ptcch(uint8_t trx, uint8_t ts, uint16_t arfcn, + uint32_t fn, uint8_t block_nr, + uint8_t *data, size_t data_len); void pcu_l1if_tx_agch(bitvec * block, int len); void pcu_l1if_tx_pch(bitvec * block, int plen, const char *imsi); @@ -174,6 +175,8 @@ extern "C" { #endif int pcu_rx_rts_req_pdtch(uint8_t trx, uint8_t ts, uint32_t fn, uint8_t block_nr); +int pcu_rx_rts_req_ptcch(uint8_t trx, uint8_t ts, + uint32_t fn, uint8_t block_nr); int pcu_rx_data_ind_pdtch(uint8_t trx, uint8_t ts, uint8_t *data, uint8_t len, uint32_t fn, struct pcu_l1_meas *meas); |