pcu_sock: implement direct tlli on AGCH

Ericsson allows to attach a reference to immediate assignments. A
confirmation of the transmission is then sent back, but only containing
the reference, not the whole RLC packet.

Change-Id: I945f49e62e2a74a7906e2d49940927773edd04a9
This commit is contained in:
Alexander Couzens 2016-12-02 18:27:01 +01:00 committed by Harald Welte
parent 872671e01b
commit f14cb3535c
2 changed files with 33 additions and 1 deletions

View File

@ -1,7 +1,7 @@
#ifndef _PCUIF_PROTO_H
#define _PCUIF_PROTO_H
#define PCU_IF_VERSION 0x07
#define PCU_IF_VERSION 0x08
/* msg_type */
#define PCU_IF_MSG_DATA_REQ 0x00 /* send data to given channel */
@ -22,6 +22,7 @@
#define PCU_IF_SAPI_PDTCH 0x05 /* packet data/control/ccch block */
#define PCU_IF_SAPI_PRACH 0x06 /* packet random access channel */
#define PCU_IF_SAPI_PTCCH 0x07 /* packet TA control channel */
#define PCU_IF_SAPI_AGCH_DT 0x08 /* assignment on AGCH but with additional TLLI */
/* flags */
#define PCU_IF_FLAG_ACTIVE (1 << 0)/* BTS is active */

View File

@ -56,6 +56,7 @@ static const char *sapi_string[] = {
[PCU_IF_SAPI_PDTCH] = "PDTCH",
[PCU_IF_SAPI_PRACH] = "PRACH",
[PCU_IF_SAPI_PTCCH] = "PTCCH",
[PCU_IF_SAPI_AGCH_DT] = "AGCH_DT",
};
/* Check if BTS has a PCU connection */
@ -326,6 +327,7 @@ static int pcu_rx_data_req(struct gsm_bts *bts, uint8_t msg_type,
struct gsm_bts_trx_ts *ts;
struct msgb *msg;
char imsi_digit_buf[4];
uint32_t tlli = -1;
uint8_t pag_grp;
int rc = 0;
@ -342,6 +344,7 @@ static int pcu_rx_data_req(struct gsm_bts *bts, uint8_t msg_type,
imsi_digit_buf[1] = data_req->data[1];
imsi_digit_buf[2] = data_req->data[2];
imsi_digit_buf[3] = '\0';
LOGP(DPCU, LOGL_DEBUG, "SAPI PCH imsi %s", imsi_digit_buf);
pag_grp = gsm0502_calc_paging_group(&bts->si_common.chan_desc,
str_to_imsi(imsi_digit_buf));
pcu_rx_rr_paging(bts, pag_grp, data_req->data+3);
@ -360,6 +363,34 @@ static int pcu_rx_data_req(struct gsm_bts *bts, uint8_t msg_type,
rc = -EIO;
}
break;
case PCU_IF_SAPI_AGCH_DT:
/* DT = direct tlli. A tlli is prefixed */
if (data_req->len < 5) {
LOGP(DPCU, LOGL_ERROR, "Received PCU data request with "
"invalid/small length %d\n", data_req->len);
break;
}
tlli = *((uint32_t *)data_req->data);
msg = msgb_alloc(data_req->len - 4, "pcu_agch");
if (!msg) {
rc = -ENOMEM;
break;
}
msg->l3h = msgb_put(msg, data_req->len - 4);
memcpy(msg->l3h, data_req->data + 4, data_req->len - 4);
if (bts->type == GSM_BTS_TYPE_RBS2000)
rc = rsl_ericsson_imm_assign_cmd(bts, tlli, msg->len, msg->data);
else
rc = rsl_imm_assign_cmd(bts, msg->len, msg->data);
if (rc) {
msgb_free(msg);
rc = -EIO;
}
break;
default:
LOGP(DPCU, LOGL_ERROR, "Received PCU data request with "
"unsupported sapi %d\n", data_req->sapi);