aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2016-12-02 19:04:34 +0100
committerAlexander Couzens <lynxis@fe80.eu>2016-12-02 19:09:21 +0100
commit5812639b89871be3319bf730fa33bbabfb074be0 (patch)
tree103625c3aa99ae66b8b0b101c15877f9de351d73
parent31c516e7d5210b73f16e41decb37b8fe57b5af5a (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.h4
-rw-r--r--openbsc/include/openbsc/pcuif_proto.h17
-rw-r--r--openbsc/src/libbsc/abis_rsl.c14
-rw-r--r--openbsc/src/libbsc/pcu_sock.c21
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