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 */ /* OSMO_GPRS_GMM_GMMRR_ASSIGN | Req */
struct { struct {
uint32_t new_tlli; uint32_t new_tlli;
uint32_t ptmsi;
char imsi[OSMO_IMSI_BUF_SIZE];
} assign_req; } assign_req;
/* OSMO_GPRS_GMM_GMMRR_PAGE | Ind */ /* OSMO_GPRS_GMM_GMMRR_PAGE | Ind */
struct { struct {

View File

@ -12,6 +12,10 @@ struct gprs_rlcmac_entity {
struct llist_head entry; /* item in (struct gprs_rlcmac_ctx)->gre_list */ struct llist_head entry; /* item in (struct gprs_rlcmac_ctx)->gre_list */
uint32_t tlli; 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; struct gprs_rlcmac_llc_queue *llc_queue;
/* Manage TBF Starting Time delay during TBF assignment: */ /* 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 */ /* OSMO_GPRS_RLCMAC_GMMRR_ASSIGN | Req */
struct { struct {
uint32_t new_tlli; uint32_t new_tlli;
uint32_t ptmsi;
char imsi[OSMO_IMSI_BUF_SIZE];
} assign_req; } assign_req;
/* OSMO_GPRS_RLCMAC_GMMRR_PAGE | Ind */ /* OSMO_GPRS_RLCMAC_GMMRR_PAGE | Ind */
struct { struct {

View File

@ -459,6 +459,8 @@ static int gprs_gmm_submit_gmmrr_assing_req(struct gprs_gmm_entity *gmme)
int rc; int rc;
gmm_prim_tx = gprs_gmm_prim_alloc_gmmrr_assign_req(gmme->old_tlli, gmme->tlli); 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); rc = gprs_gmm_prim_call_down_cb(gmm_prim_tx);
return rc; return rc;

View File

@ -56,6 +56,7 @@ struct gprs_rlcmac_entity *gprs_rlcmac_entity_alloc(uint32_t tlli)
goto err_free_gre; goto err_free_gre;
gre->tlli = tlli; gre->tlli = tlli;
gre->ptmsi = GSM_RESERVED_TMSI;
llist_add_tail(&gre->entry, &g_rlcmac_ctx->gre_list); llist_add_tail(&gre->entry, &g_rlcmac_ctx->gre_list);
return gre; 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; goto free_ret;
} }
gprs_rlcmac_entity_free(gre); gprs_rlcmac_entity_free(gre);
gre = NULL;
goto free_ret;
} else { } else {
/* Case "update", both old_tlli and new_tlli are valid */ /* Case "update", both old_tlli and new_tlli are valid */
gre = gprs_rlcmac_find_entity_by_tlli(old_tlli); 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; 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: free_ret:
msgb_free(rlcmac_prim->oph.msg); msgb_free(rlcmac_prim->oph.msg);
return rc; return rc;

View File

@ -904,6 +904,8 @@ static void test_dl_tbf_ccch_assign(void)
printf("=== %s start ===\n", __func__); printf("=== %s start ===\n", __func__);
prepare_test(); prepare_test();
uint32_t ptmsi = 0x00001234;
char *imsi = "1234567890";
uint32_t tlli = 0x0000001; uint32_t tlli = 0x0000001;
uint8_t ts_nr = 7; uint8_t ts_nr = 7;
uint8_t usf = 0; uint8_t usf = 0;
@ -913,6 +915,8 @@ static void test_dl_tbf_ccch_assign(void)
/* Notify RLCMAC about our TLLI */ /* Notify RLCMAC about our TLLI */
rlcmac_prim = osmo_gprs_rlcmac_prim_alloc_gmmrr_assign_req(GPRS_RLCMAC_TLLI_UNASSIGNED, 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); rc = osmo_gprs_rlcmac_prim_upper_down(rlcmac_prim);
OSMO_ASSERT(sizeof(ccch_imm_ass_pkt_dl_tbf) == GSM_MACBLOCK_LEN); 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__); printf("=== %s start ===\n", __func__);
prepare_test(); prepare_test();
RlcMacDownlink_t dl_block; RlcMacDownlink_t dl_block;
uint32_t ptmsi = 0x00001234;
char *imsi = "1234567890";
uint32_t tlli = 0x0000001; uint32_t tlli = 0x0000001;
uint8_t ts_nr = 7; uint8_t ts_nr = 7;
uint8_t usf = 0; 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 */ /* Notify RLCMAC about our TLLI */
rlcmac_prim = osmo_gprs_rlcmac_prim_alloc_gmmrr_assign_req(GPRS_RLCMAC_TLLI_UNASSIGNED, 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); rc = osmo_gprs_rlcmac_prim_upper_down(rlcmac_prim);
OSMO_ASSERT(sizeof(ccch_imm_ass_pkt_dl_tbf) == GSM_MACBLOCK_LEN); OSMO_ASSERT(sizeof(ccch_imm_ass_pkt_dl_tbf) == GSM_MACBLOCK_LEN);