dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/31126 )
Change subject: abis_rsl: add ericsson specific paging group IE to rsl_ericsson_imm_assign_cmd ......................................................................
abis_rsl: add ericsson specific paging group IE to rsl_ericsson_imm_assign_cmd
The immediate assign command used with ericsson BTSs supports a proprietary paging group IE, which is required for GPRS support.
Change-Id: I4452f4973d1ec69c96aad527b057226e8a6edf99 Related: OS#5198 --- M include/osmocom/bsc/abis_rsl.h M src/osmo-bsc/abis_rsl.c M src/osmo-bsc/pcu_sock.c 3 files changed, 35 insertions(+), 6 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/26/31126/1
diff --git a/include/osmocom/bsc/abis_rsl.h b/include/osmocom/bsc/abis_rsl.h index dcae348..0a9cfdc 100644 --- a/include/osmocom/bsc/abis_rsl.h +++ b/include/osmocom/bsc/abis_rsl.h @@ -65,7 +65,7 @@ int rsl_relase_request(struct gsm_lchan *lchan, uint8_t link_id);
/* Ericcson vendor specific RSL extensions */ -int rsl_ericsson_imm_assign_cmd(struct gsm_bts *bts, uint32_t tlli, uint8_t len, uint8_t *val); +int rsl_ericsson_imm_assign_cmd(struct gsm_bts *bts, uint32_t tlli, uint8_t len, uint8_t *val, uint8_t pag_grp);
/* Siemens vendor-specific RSL extensions */ int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci); diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c index 6a7a900..ea9fd2e 100644 --- a/src/osmo-bsc/abis_rsl.c +++ b/src/osmo-bsc/abis_rsl.c @@ -964,12 +964,16 @@ }
/* Chapter 8.5.6 Immediate Assignment Command (with Ericcson vendor specific RSL extension) */ -int rsl_ericsson_imm_assign_cmd(struct gsm_bts *bts, uint32_t tlli, uint8_t len, uint8_t *val) +int rsl_ericsson_imm_assign_cmd(struct gsm_bts *bts, uint32_t tlli, uint8_t len, uint8_t *val, uint8_t pag_grp) { struct msgb *msg = rsl_imm_assign_cmd_common(bts, len, val); if (!msg) return 1;
+ /* Append ericsson proprietary paging group IE */ + msgb_put_u8(msg, RSL_IE_ERIC_PAGING_GROUP); + msgb_put_u8(msg, pag_grp); + /* ericsson can handle a reference at the end of the message which is used in * the confirm message. The confirm message is only sent if the trailer is present */ msgb_put_u8(msg, RSL_IE_ERIC_MOBILE_ID); diff --git a/src/osmo-bsc/pcu_sock.c b/src/osmo-bsc/pcu_sock.c index def2df0..e9bd7ad 100644 --- a/src/osmo-bsc/pcu_sock.c +++ b/src/osmo-bsc/pcu_sock.c @@ -405,6 +405,27 @@ return rc; }
+/* Helper function for pcu_rx_data_req() to extract paging group info */ +static uint8_t extract_paging_group(struct gsm_bts *bts, uint8_t *data) +{ + char imsi_digit_buf[4]; + uint8_t pag_grp; + + /* the first three bytes are the last three digits of + * the IMSI, which we need to compute the paging group */ + imsi_digit_buf[0] = data[0]; + imsi_digit_buf[1] = data[1]; + imsi_digit_buf[2] = data[2]; + imsi_digit_buf[3] = '\0'; + + pag_grp = gsm0502_calc_paging_group(&bts->si_common.chan_desc, + str_to_imsi(imsi_digit_buf)); + + LOGP(DPCU, LOGL_DEBUG, "Calculating paging group: imsi_digit_buf=%s ==> pag_grp=0x%02x\n", imsi_digit_buf, pag_grp); + + return pag_grp; +} + static int pcu_rx_data_req(struct gsm_bts *bts, uint8_t msg_type, struct gsm_pcu_if_data *data_req) { @@ -455,17 +476,21 @@ break; } memcpy(&tlli, data_req->data, 4); + pag_grp = extract_paging_group(bts, data_req->data + 4);
- msg = msgb_alloc(data_req->len - 4, "pcu_agch"); + msg = msgb_alloc(data_req->len - 7, "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); + msg->l3h = msgb_put(msg, data_req->len - 7); + memcpy(msg->l3h, data_req->data + 7, data_req->len - 7); + + LOGP(DPCU, LOGL_DEBUG, "PCU Sends immediate assignment via PCH (tlli=0x%08x, pag_grp=0x%02x)\n", + tlli, pag_grp);
if (bts->type == GSM_BTS_TYPE_RBS2000) - rc = rsl_ericsson_imm_assign_cmd(bts, tlli, msg->len, msg->data); + rc = rsl_ericsson_imm_assign_cmd(bts, tlli, msg->len, msg->data, pag_grp); else rc = rsl_imm_assign_cmd(bts, msg->len, msg->data);