gmm: Provide rlcmac with IMSI & PTMSI information

This information will be needed once the GRR layer starts listening for
paging requests, which identify MS by either PTMSI or IMSI.

Change-Id: I3a0c4a57c3d624c3ebb40ae2cc0c96626ccc2c99
This commit is contained in:
Pau Espin 2023-05-24 18:30:57 +02:00
parent c9f5abdbff
commit 7bbdcc4414
7 changed files with 26 additions and 0 deletions

View File

@ -185,6 +185,8 @@ struct osmo_gprs_gmm_gmmrr_prim {
/* OSMO_GPRS_GMM_GMMRR_ASSIGN | Req */
struct {
uint32_t new_tlli;
uint32_t ptmsi;
char imsi[OSMO_IMSI_BUF_SIZE];
} assign_req;
/* OSMO_GPRS_GMM_GMMRR_PAGE | Ind */
struct {

View File

@ -12,6 +12,10 @@ struct gprs_rlcmac_entity {
struct llist_head entry; /* item in (struct gprs_rlcmac_ctx)->gre_list */
uint32_t tlli;
/* Used to match paging requests coming from CS domain: */
uint32_t ptmsi;
char imsi[OSMO_IMSI_BUF_SIZE];
struct gprs_rlcmac_llc_queue *llc_queue;
/* Manage TBF Starting Time delay during TBF assignment: */

View File

@ -91,6 +91,8 @@ struct osmo_gprs_rlcmac_gmmrr_prim {
/* OSMO_GPRS_RLCMAC_GMMRR_ASSIGN | Req */
struct {
uint32_t new_tlli;
uint32_t ptmsi;
char imsi[OSMO_IMSI_BUF_SIZE];
} assign_req;
/* OSMO_GPRS_RLCMAC_GMMRR_PAGE | Ind */
struct {

View File

@ -459,6 +459,8 @@ static int gprs_gmm_submit_gmmrr_assing_req(struct gprs_gmm_entity *gmme)
int rc;
gmm_prim_tx = gprs_gmm_prim_alloc_gmmrr_assign_req(gmme->old_tlli, gmme->tlli);
gmm_prim_tx->gmmrr.assign_req.ptmsi = gmme->ptmsi;
OSMO_STRLCPY_ARRAY(gmm_prim_tx->gmmrr.assign_req.imsi, gmme->imsi);
rc = gprs_gmm_prim_call_down_cb(gmm_prim_tx);
return rc;

View File

@ -56,6 +56,7 @@ struct gprs_rlcmac_entity *gprs_rlcmac_entity_alloc(uint32_t tlli)
goto err_free_gre;
gre->tlli = tlli;
gre->ptmsi = GSM_RESERVED_TMSI;
llist_add_tail(&gre->entry, &g_rlcmac_ctx->gre_list);
return gre;

View File

@ -426,6 +426,8 @@ static int rlcmac_prim_handle_gmmrr_assign_req(struct osmo_gprs_rlcmac_prim *rlc
goto free_ret;
}
gprs_rlcmac_entity_free(gre);
gre = NULL;
goto free_ret;
} else {
/* Case "update", both old_tlli and new_tlli are valid */
gre = gprs_rlcmac_find_entity_by_tlli(old_tlli);
@ -438,6 +440,11 @@ static int rlcmac_prim_handle_gmmrr_assign_req(struct osmo_gprs_rlcmac_prim *rlc
gre->tlli = new_tlli;
}
/* cache/update knowledge about this GMME's PTMSI and IMSI. It will be
* needed later on to match paging requests: */
gre->ptmsi = rlcmac_prim->gmmrr.assign_req.ptmsi;
OSMO_STRLCPY_ARRAY(gre->imsi, rlcmac_prim->gmmrr.assign_req.imsi);
free_ret:
msgb_free(rlcmac_prim->oph.msg);
return rc;

View File

@ -904,6 +904,8 @@ static void test_dl_tbf_ccch_assign(void)
printf("=== %s start ===\n", __func__);
prepare_test();
uint32_t ptmsi = 0x00001234;
char *imsi = "1234567890";
uint32_t tlli = 0x0000001;
uint8_t ts_nr = 7;
uint8_t usf = 0;
@ -913,6 +915,8 @@ static void test_dl_tbf_ccch_assign(void)
/* Notify RLCMAC about our TLLI */
rlcmac_prim = osmo_gprs_rlcmac_prim_alloc_gmmrr_assign_req(GPRS_RLCMAC_TLLI_UNASSIGNED, tlli);
rlcmac_prim->gmmrr.assign_req.ptmsi = ptmsi;
OSMO_STRLCPY_ARRAY(rlcmac_prim->gmmrr.assign_req.imsi, imsi);
rc = osmo_gprs_rlcmac_prim_upper_down(rlcmac_prim);
OSMO_ASSERT(sizeof(ccch_imm_ass_pkt_dl_tbf) == GSM_MACBLOCK_LEN);
@ -951,6 +955,8 @@ static void test_dl_tbf_ccch_assign_requests_ul_tbf_pacch(void)
printf("=== %s start ===\n", __func__);
prepare_test();
RlcMacDownlink_t dl_block;
uint32_t ptmsi = 0x00001234;
char *imsi = "1234567890";
uint32_t tlli = 0x0000001;
uint8_t ts_nr = 7;
uint8_t usf = 0;
@ -963,6 +969,8 @@ static void test_dl_tbf_ccch_assign_requests_ul_tbf_pacch(void)
/* Notify RLCMAC about our TLLI */
rlcmac_prim = osmo_gprs_rlcmac_prim_alloc_gmmrr_assign_req(GPRS_RLCMAC_TLLI_UNASSIGNED, tlli);
rlcmac_prim->gmmrr.assign_req.ptmsi = ptmsi;
OSMO_STRLCPY_ARRAY(rlcmac_prim->gmmrr.assign_req.imsi, imsi);
rc = osmo_gprs_rlcmac_prim_upper_down(rlcmac_prim);
OSMO_ASSERT(sizeof(ccch_imm_ass_pkt_dl_tbf) == GSM_MACBLOCK_LEN);