aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bts.cpp2
-rw-r--r--src/gprs_bssgp_pcu.c8
-rw-r--r--src/gprs_ms.c12
-rw-r--r--src/gprs_ms.h1
-rw-r--r--src/gprs_rlcmac.cpp4
-rw-r--r--src/gprs_rlcmac.h2
-rw-r--r--src/pcu_l1_if.cpp44
-rw-r--r--src/pcu_l1_if.h3
8 files changed, 16 insertions, 60 deletions
diff --git a/src/bts.cpp b/src/bts.cpp
index 504ba27d..524961d9 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -1131,7 +1131,7 @@ void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, const struct gprs_rlcmac_dl_tbf
if (the_pcu->pcu_if_version >= 0x0b)
pcu_l1if_tx_pch_dt(bts, immediate_assignment, plen, tbf->imsi(), tbf->tlli());
else
- pcu_l1if_tx_pch(bts, immediate_assignment, plen, ms_paging_group(tbf_ms(tbf)));
+ pcu_l1if_tx_pch(bts, immediate_assignment, plen, tbf->imsi());
}
bitvec_free(immediate_assignment);
diff --git a/src/gprs_bssgp_pcu.c b/src/gprs_bssgp_pcu.c
index f441437d..656342e8 100644
--- a/src/gprs_bssgp_pcu.c
+++ b/src/gprs_bssgp_pcu.c
@@ -289,7 +289,6 @@ static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, const struct tlv_parsed
struct osmo_mobile_identity mi_imsi;
struct osmo_mobile_identity paging_mi;
struct gprs_rlcmac_bts *bts;
- uint16_t pgroup;
int rc;
rate_ctr_inc(rate_ctr_group_get_ctr(the_pcu->bssgp.ctrs, SGSN_CTR_RX_PAGING_PS));
@@ -304,11 +303,6 @@ static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, const struct tlv_parsed
LOGP(DBSSGP, LOGL_NOTICE, "Failed to parse IMSI IE (rc=%d)\n", rc);
return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);
}
- pgroup = imsi2paging_group(mi_imsi.imsi);
- if (pgroup > 999) {
- LOGP(DBSSGP, LOGL_NOTICE, "Failed to compute IMSI %s paging group\n", mi_imsi.imsi);
- return bssgp_tx_status(BSSGP_CAUSE_INV_MAND_INF, NULL, msg);
- }
if ((rc = get_paging_ps_mi(&paging_mi, tp)) > 0)
return bssgp_tx_status((enum gprs_bssgp_cause) rc, NULL, msg);
@@ -320,7 +314,7 @@ static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, const struct tlv_parsed
bts_do_rate_ctr_inc(bts, CTR_PCH_REQUESTS_ALREADY);
continue;
}
- if (gprs_rlcmac_paging_request(bts, &paging_mi, pgroup) < 0)
+ if (gprs_rlcmac_paging_request(bts, &paging_mi, mi_imsi.imsi) < 0)
continue;
bts_pch_timer_start(bts, &paging_mi, mi_imsi.imsi);
}
diff --git a/src/gprs_ms.c b/src/gprs_ms.c
index eb76fa29..7ecaae4d 100644
--- a/src/gprs_ms.c
+++ b/src/gprs_ms.c
@@ -577,18 +577,6 @@ void ms_set_imsi(struct GprsMs *ms, const char *imsi)
tbf_update_state_fsm_name(dl_tbf_as_tbf(ms->dl_tbf));
}
-uint16_t ms_paging_group(struct GprsMs *ms)
-{
- uint16_t pgroup;
- if (!ms_imsi_is_valid(ms))
- return 0; /* 000 is the special "all paging" group */
- if ((pgroup = imsi2paging_group(ms_imsi(ms))) > 999) {
- LOGPMS(ms, DRLCMAC, LOGL_ERROR, "IMSI to paging group failed!\n");
- return 0;
- }
- return pgroup;
-}
-
void ms_set_ta(struct GprsMs *ms, uint8_t ta_)
{
if (ta_ == ms->ta)
diff --git a/src/gprs_ms.h b/src/gprs_ms.h
index 835ff186..9b957ac0 100644
--- a/src/gprs_ms.h
+++ b/src/gprs_ms.h
@@ -131,7 +131,6 @@ void ms_detach_tbf(struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf);
void ms_set_tlli(struct GprsMs *ms, uint32_t tlli);
bool ms_confirm_tlli(struct GprsMs *ms, uint32_t tlli);
void ms_set_imsi(struct GprsMs *ms, const char *imsi);
-uint16_t ms_paging_group(struct GprsMs *ms);
void ms_update_l1_meas(struct GprsMs *ms, const struct pcu_l1_meas *meas);
diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp
index 1ea0872d..ea7fb9af 100644
--- a/src/gprs_rlcmac.cpp
+++ b/src/gprs_rlcmac.cpp
@@ -29,7 +29,7 @@ extern "C" {
extern void *tall_pcu_ctx;
int gprs_rlcmac_paging_request(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_identity *mi,
- uint16_t pgroup)
+ const char *imsi)
{
if (log_check_level(DRLCMAC, LOGL_NOTICE)) {
char str[64];
@@ -44,7 +44,7 @@ int gprs_rlcmac_paging_request(struct gprs_rlcmac_bts *bts, const struct osmo_mo
return -1;
}
bts_do_rate_ctr_inc(bts, CTR_PCH_REQUESTS);
- pcu_l1if_tx_pch(bts, paging_request, plen, pgroup);
+ pcu_l1if_tx_pch(bts, paging_request, plen, imsi);
bitvec_free(paging_request);
return 0;
diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h
index 22a33b4a..43f50954 100644
--- a/src/gprs_rlcmac.h
+++ b/src/gprs_rlcmac.h
@@ -100,7 +100,7 @@ int gprs_rlcmac_rcv_rts_block(struct gprs_rlcmac_bts *bts,
extern "C" {
#endif
-int gprs_rlcmac_paging_request(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_identity *mi, uint16_t pgroup);
+int gprs_rlcmac_paging_request(struct gprs_rlcmac_bts *bts, const struct osmo_mobile_identity *mi, const char *imsi);
#ifdef __cplusplus
}
#endif
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index 6ec806be..84d39cb7 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -59,8 +59,6 @@ extern "C" {
extern void *tall_pcu_ctx;
-#define PAGING_GROUP_LEN 3
-
struct e1_ccu_conn_pars {
struct llist_head entry;
@@ -78,27 +76,6 @@ struct e1_ccu_conn_pars {
* when it is needed. */
static LLIST_HEAD(e1_ccu_table);
-/* returns [0,999] on success, > 999 on error */
-uint16_t imsi2paging_group(const char* imsi)
-{
- uint16_t pgroup = 0;
- size_t len;
-
- len = (imsi != NULL) ? strlen(imsi) : 0;
- if (len < PAGING_GROUP_LEN)
- return 0xFFFF;
- imsi += len - PAGING_GROUP_LEN;
-
- while (*imsi != '\0') {
- if (!isdigit(*imsi))
- return 0xFFFF;
- pgroup *= 10;
- pgroup += *imsi - '0';
- imsi++;
- }
- return pgroup;
-}
-
/*
* PCU messages
*/
@@ -286,24 +263,23 @@ void pcu_l1if_tx_agch(struct gprs_rlcmac_bts *bts, bitvec *block, int plen)
pcu_tx_data_req(bts, 0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, sizeof(data));
}
-void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec *block, int plen, uint16_t pgroup)
+#define IMSI_DIGITS_FOR_PAGING 3
+void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec *block, int plen, const char *imsi)
{
- uint8_t data[PAGING_GROUP_LEN + GSM_MACBLOCK_LEN];
- int i;
+ uint8_t data[IMSI_DIGITS_FOR_PAGING + GSM_MACBLOCK_LEN];
- /* prepend paging group */
- for (i = 0; i < PAGING_GROUP_LEN; i++) {
- data[PAGING_GROUP_LEN - 1 - i] = '0' + (char)(pgroup % 10);
- pgroup = pgroup / 10;
- }
- OSMO_ASSERT(pgroup == 0);
+ /* prepend last three IMSI digits (if present) from which BTS/BSC will calculate the paging group */
+ if (imsi && strlen(imsi) >= IMSI_DIGITS_FOR_PAGING)
+ memcpy(data, imsi + strlen(imsi) - IMSI_DIGITS_FOR_PAGING, IMSI_DIGITS_FOR_PAGING);
+ else
+ memset(data, '0', IMSI_DIGITS_FOR_PAGING);
/* block provided by upper layer comes without first byte (plen),
* prepend it manually:
*/
- OSMO_ASSERT(sizeof(data) >= PAGING_GROUP_LEN + 1 + block->data_len);
+ OSMO_ASSERT(sizeof(data) >= IMSI_DIGITS_FOR_PAGING + 1 + block->data_len);
data[3] = (plen << 2) | 0x01;
- bitvec_pack(block, data + PAGING_GROUP_LEN + 1);
+ bitvec_pack(block, data + IMSI_DIGITS_FOR_PAGING + 1);
if (the_pcu->gsmtap_categ_mask & (1 << PCU_GSMTAP_C_DL_PCH))
gsmtap_send(the_pcu->gsmtap, 0, 0, GSMTAP_CHANNEL_PCH, 0, 0, 0, 0, data + 3, GSM_MACBLOCK_LEN);
diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h
index d3d70e47..3865402a 100644
--- a/src/pcu_l1_if.h
+++ b/src/pcu_l1_if.h
@@ -148,7 +148,7 @@ void pcu_l1if_tx_ptcch(struct gprs_rlcmac_bts *bts,
uint8_t *data, size_t data_len);
void pcu_l1if_tx_agch(struct gprs_rlcmac_bts *bts, bitvec *block, int len);
-void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec *block, int plen, uint16_t pgroup);
+void pcu_l1if_tx_pch(struct gprs_rlcmac_bts *bts, bitvec *block, int plen, const char *imsi);
void pcu_l1if_tx_pch_dt(struct gprs_rlcmac_bts *bts, bitvec *block, int plen, const char *imsi, uint32_t tlli);
#endif
@@ -176,7 +176,6 @@ int pcu_rx_data_ind_pdtch(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_pdch *
uint8_t len, uint32_t fn, struct pcu_l1_meas *meas);
void pcu_rx_block_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no);
-uint16_t imsi2paging_group(const char* imsi);
struct e1_conn_pars {
/* Number of E1 line */