aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2019-10-05 22:22:08 +0700
committerVadim Yanitskiy <axilirator@gmail.com>2019-11-17 02:58:31 +0700
commit78f58618f36dfc1df022f7c19fee7087d9ef3958 (patch)
tree749e0ed860c2e3089c2d95f2bba47c6f3945f01b /src
parentbd0dac3783a27023b0aaaa2c7db99c021866b7b5 (diff)
PTCCH: properly handle RTS.req for PCU_IF_SAPI_PTCCH
Diffstat (limited to 'src')
-rw-r--r--src/osmo-bts-litecell15/lc15_l1_if.c5
-rw-r--r--src/osmo-bts-oc2g/oc2g_l1_if.c5
-rw-r--r--src/osmo-bts-sysmo/sysmo_l1_if.c5
-rw-r--r--src/pcu_l1_if.cpp43
-rw-r--r--src/pcu_l1_if.h7
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);