diff options
author | Philipp Maier <pmaier@sysmocom.de> | 2016-12-02 19:04:34 +0100 |
---|---|---|
committer | Alexander Couzens <lynxis@fe80.eu> | 2016-12-02 19:09:21 +0100 |
commit | 5812639b89871be3319bf730fa33bbabfb074be0 (patch) | |
tree | 103625c3aa99ae66b8b0b101c15877f9de351d73 | |
parent | 31c516e7d5210b73f16e41decb37b8fe57b5af5a (diff) |
Draft implementation to catch the Immedaiate assign messign
message and forward it to the PCU
Change-Id: Ice099c4ed7008200ed179e581aba1899c6c29455
-rw-r--r-- | openbsc/include/openbsc/pcu_if.h | 4 | ||||
-rw-r--r-- | openbsc/include/openbsc/pcuif_proto.h | 17 | ||||
-rw-r--r-- | openbsc/src/libbsc/abis_rsl.c | 14 | ||||
-rw-r--r-- | openbsc/src/libbsc/pcu_sock.c | 21 |
4 files changed, 56 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/pcu_if.h b/openbsc/include/openbsc/pcu_if.h index 9d1b5b1c7..d8ee1c7ba 100644 --- a/openbsc/include/openbsc/pcu_if.h +++ b/openbsc/include/openbsc/pcu_if.h @@ -31,6 +31,10 @@ int pcu_tx_data_ind(struct gsm_bts *bts, struct gsm_bts_trx_ts *ts, uint8_t is_p int pcu_tx_pag_req(struct gsm_bts *bts, const uint8_t *identity_lv, uint8_t chan_needed); int pcu_tx_pch_data_cnf(struct gsm_bts *bts, uint32_t fn, uint8_t *data, uint8_t len); + +/* Confirm the sending of an immediate assignment to the pcu */ +int pcu_tx_imm_ass_sent(struct gsm_bts *bts, uint32_t tlli); + /* Open connection to PCU */ int pcu_sock_init(const char *path, struct gsm_bts *bts); diff --git a/openbsc/include/openbsc/pcuif_proto.h b/openbsc/include/openbsc/pcuif_proto.h index 60f57613c..1b391c741 100644 --- a/openbsc/include/openbsc/pcuif_proto.h +++ b/openbsc/include/openbsc/pcuif_proto.h @@ -6,6 +6,7 @@ /* msg_type */ #define PCU_IF_MSG_DATA_REQ 0x00 /* send data to given channel */ #define PCU_IF_MSG_DATA_CNF 0x01 /* confirm (e.g. transmission on PCH) */ +#define PCU_IF_MSG_DATA_CNF_DT 0x11 /* confirm (with direct tlli) */ #define PCU_IF_MSG_DATA_IND 0x02 /* receive data from given channel */ #define PCU_IF_MSG_RTS_REQ 0x10 /* ready to send request */ #define PCU_IF_MSG_RACH_IND 0x22 /* receive RACH */ @@ -56,6 +57,21 @@ struct gsm_pcu_if_data { int16_t lqual_cb; /* !< \brief Link quality in centiBel */ } __attribute__ ((packed)); +/* data confirmation with direct tlli (instead of raw mac block with tlli) */ +struct gsm_pcu_if_data_cnf_dt { + uint8_t sapi; + uint32_t tlli; + uint32_t fn; + uint16_t arfcn; + uint8_t trx_nr; + uint8_t ts_nr; + uint8_t block_nr; + int8_t rssi; + uint16_t ber10k; /*!< \brief BER in units of 0.01% */ + int16_t ta_offs_qbits; /* !< \brief Burst TA Offset in quarter bits */ + int16_t lqual_cb; /* !< \brief Link quality in centiBel */ +} __attribute__ ((packed)); + struct gsm_pcu_if_rts_req { uint8_t sapi; uint8_t spare[3]; @@ -146,6 +162,7 @@ struct gsm_pcu_if { union { struct gsm_pcu_if_data data_req; struct gsm_pcu_if_data data_cnf; + struct gsm_pcu_if_data_cnf_dt data_cnf_dt; struct gsm_pcu_if_data data_ind; struct gsm_pcu_if_rts_req rts_req; struct gsm_pcu_if_rach_ind rach_ind; diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c index 415721b44..c45daddf8 100644 --- a/openbsc/src/libbsc/abis_rsl.c +++ b/openbsc/src/libbsc/abis_rsl.c @@ -1970,6 +1970,7 @@ static int abis_rsl_rx_cchan(struct msgb *msg) struct e1inp_sign_link *sign_link = msg->dst; struct abis_rsl_dchan_hdr *rslh = msgb_l2(msg); int rc = 0; + uint32_t tlli; msg->lchan = lchan_lookup(sign_link->trx, rslh->chan_nr, "Abis RSL rx CCHAN: "); @@ -1990,6 +1991,19 @@ static int abis_rsl_rx_cchan(struct msgb *msg) LOGP(DRSL, LOGL_NOTICE, "Unimplemented Abis RSL TRX message " "type 0x%02x\n", rslh->c.msg_type); break; + case 0x10: /* Ericsson specific: Immediate Assign Sent */ + LOGP(DRSL, LOGL_INFO, "IMM.ass sent\n"); + if(msg->len < 8) + LOGP(DRSL, LOGL_ERROR, "short IMM.ass sent message!\n"); + else { + tlli = msg->data[8]; + tlli |= msg->data[7] << 8; + tlli |= msg->data[6] << 16; + tlli |= msg->data[5] << 24; + printf("==================>%s\n",osmo_hexdump_nospc(msg->data,msg->len)); + pcu_tx_imm_ass_sent(sign_link->trx->bts, tlli); + } + break; default: LOGP(DRSL, LOGL_NOTICE, "Unknown Abis RSL TRX message type " "0x%02x\n", rslh->c.msg_type); diff --git a/openbsc/src/libbsc/pcu_sock.c b/openbsc/src/libbsc/pcu_sock.c index 37a7304e9..b26a12d95 100644 --- a/openbsc/src/libbsc/pcu_sock.c +++ b/openbsc/src/libbsc/pcu_sock.c @@ -400,6 +400,27 @@ int pcu_tx_pch_data_cnf(struct gsm_bts *bts, uint32_t fn, uint8_t *data, uint8_t return pcu_sock_send(bts, msg); } +/* Confirm the sending of an immediate assignment to the pcu */ +int pcu_tx_imm_ass_sent(struct gsm_bts *bts, uint32_t tlli) +{ + printf("======================================> GOT TLLI! %x\n", tlli); + struct msgb *msg; + struct gsm_pcu_if *pcu_prim; + struct gsm_pcu_if_data_cnf_dt *data_cnf_dt; + + LOGP(DPCU, LOGL_INFO, "Sending PCH confirm with direct TLLI\n"); + + msg = pcu_msgb_alloc(PCU_IF_MSG_DATA_CNF_DT, bts->nr); + if (!msg) + return -ENOMEM; + pcu_prim = (struct gsm_pcu_if *) msg->data; + data_cnf_dt = &pcu_prim->u.data_cnf_dt; + + data_cnf_dt->sapi = PCU_IF_SAPI_PCH; + data_cnf_dt->tlli = tlli; + + return pcu_sock_send(bts, msg); +} /* we need to decode the raw RR paging messsage (see PCU code * Encoding::write_paging_request) and extract the mobile identity |