gmm: Allow passing old RAI during attach

This is stored by the MS and hence shall be passed by the application.

Change-Id: I22ffa8a169c09445e7126892616f61b8d01cbfe7
This commit is contained in:
Pau Espin 2023-05-16 19:25:52 +02:00 committed by pespin
parent a57e7293df
commit 1d1b704dca
4 changed files with 15 additions and 11 deletions

View File

@ -14,6 +14,7 @@
#include <osmocom/core/utils.h>
#include <osmocom/core/prim.h>
#include <osmocom/gsm/protocol/gsm_23_003.h>
#include <osmocom/gsm/gsm48.h>
#include <osmocom/gprs/gmm/gmm.h>
struct osmo_gprs_llc_prim;
@ -108,7 +109,8 @@ struct osmo_gprs_gmm_gmmreg_prim {
char imsi[OSMO_IMSI_BUF_SIZE];
char imei[GSM23003_IMEI_NUM_DIGITS + 1];
char imeisv[GSM23003_IMEISV_NUM_DIGITS+1];
/* attach-type, READY-timer, STANDBY-timer */
struct gprs_ra_id old_rai;
/* READY-timer, STANDBY-timer */
} attach_req;
/* OSMO_GPRS_GMM_GMMREG_ATTACH | Cnf 6.6.1.2 / Rej 6.6.1.3 */
struct {
@ -212,7 +214,8 @@ struct osmo_gprs_gmm_gmmsm_prim {
char imsi[OSMO_IMSI_BUF_SIZE];
char imei[GSM23003_IMEI_NUM_DIGITS + 1];
char imeisv[GSM23003_IMEISV_NUM_DIGITS+1];
/* attach-type, READY-timer, STANDBY-timer */
struct gprs_ra_id old_rai;
/* READY-timer, STANDBY-timer */
} establish_req;
/* OSMO_GPRS_GMM_GMMSM_ESTABLISH | Cnf/Rej */
struct {

View File

@ -181,7 +181,6 @@ int gprs_gmm_build_attach_req(struct gprs_gmm_entity *gmme,
uint8_t *l;
int rc;
struct gsm48_ra_id *raid_enc;
struct gprs_ra_id raid;
gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh));
gh->proto_discr = GSM48_PDISC_MM_GPRS;
@ -221,15 +220,8 @@ int gprs_gmm_build_attach_req(struct gprs_gmm_entity *gmme,
*l = rc;
/* Old routing area identification 0.5.5.15 */
raid = (struct gprs_ra_id){ /* TODO: fill this correctly */
.mcc = 0,
.mnc = 0,
.mnc_3_digits = false,
.lac = 0,
.rac = 0,
};
raid_enc = (struct gsm48_ra_id *)msgb_put(msg, sizeof(struct gsm48_ra_id));
gsm48_encode_ra(raid_enc, &raid);
gsm48_encode_ra(raid_enc, &gmme->ra);
/* MS Radio Access capability 10.5.5.12a */
rc = encode_ms_ra_acc_cap(gmme, msg);

View File

@ -385,6 +385,7 @@ static int gprs_gmm_prim_handle_gmmreg_attach_req(struct osmo_gprs_gmm_prim *gmm
OSMO_STRLCPY_ARRAY(gmme->imei, gmm_prim->gmmreg.attach_req.imei);
if (gmm_prim->gmmreg.attach_req.imeisv[0] != '\0')
OSMO_STRLCPY_ARRAY(gmme->imeisv, gmm_prim->gmmreg.attach_req.imeisv);
memcpy(&gmme->ra, &gmm_prim->gmmreg.attach_req.old_rai, sizeof(gmme->ra));
rc = gprs_gmm_ms_fsm_ctx_request_attach(&gmme->ms_fsm,
gmm_prim->gmmreg.attach_req.attach_type,
@ -497,6 +498,7 @@ static int gprs_gmm_prim_handle_gmmsm_establish_req(struct osmo_gprs_gmm_prim *g
OSMO_STRLCPY_ARRAY(gmme->imei, gmm_prim->gmmsm.establish_req.imei);
if (gmm_prim->gmmsm.establish_req.imeisv[0] != '\0')
OSMO_STRLCPY_ARRAY(gmme->imeisv, gmm_prim->gmmsm.establish_req.imeisv);
memcpy(&gmme->ra, &gmm_prim->gmmsm.establish_req.old_rai, sizeof(gmme->ra));
rc = gprs_gmm_ms_fsm_ctx_request_attach(&gmme->ms_fsm,
gmm_prim->gmmsm.establish_req.attach_type,

View File

@ -306,6 +306,13 @@ static void test_gmm_prim_ms_gmmreg(void)
OSMO_STRLCPY_ARRAY(gmm_prim->gmmreg.attach_req.imsi, imsi);
OSMO_STRLCPY_ARRAY(gmm_prim->gmmreg.attach_req.imei, imei);
OSMO_STRLCPY_ARRAY(gmm_prim->gmmreg.attach_req.imeisv, imeisv);
gmm_prim->gmmreg.attach_req.old_rai = (struct gprs_ra_id){
.mcc = 0,
.mnc = 0,
.mnc_3_digits = false,
.lac = 0,
.rac = 0,
};
rc = osmo_gprs_gmm_prim_upper_down(gmm_prim);
OSMO_ASSERT(rc == 0);