diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2023-10-17 14:23:08 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2023-10-18 08:08:10 +0200 |
commit | 2c0f71ac43d2f7fb20e4b9ac610aab706e2f00ac (patch) | |
tree | eddfffa44957a12246066c9580b267045968b401 /src/host/layer23/src | |
parent | 026f11328073b83769ffac83f19567e44a5547cd (diff) |
ASCI: Join a group/bcast call in correct MM states only
These states are:
GSM48_MM_SST_NORMAL_SERVICE
GSM48_MM_SST_ATTEMPT_UPDATE
GSM48_MM_SST_LIMITED_SERVICE
GSM48_MM_SST_LOC_UPD_NEEDED
GSM48_MM_SST_PLMN_SEARCH (limited service)
GSM48_MM_SST_PLMN_SEARCH_NORMAL
If the service is limited, group/bcast calls can be joined, but uplink
access is not allowed.
Related: OS#5364
Change-Id: I2f8ff65f6e101972f9b1760013983d00ae6e7760
Diffstat (limited to 'src/host/layer23/src')
-rw-r--r-- | src/host/layer23/src/mobile/gsm48_mm.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c index 995c5d12..0cf1feee 100644 --- a/src/host/layer23/src/mobile/gsm48_mm.c +++ b/src/host/layer23/src/mobile/gsm48_mm.c @@ -3816,10 +3816,11 @@ static int gsm48_mm_group_req(struct osmocom_ms *ms, struct msgb *msg) mm->vgcs.enabled = true; mm->vgcs.group_call = (mmh->msg_type == GSM48_MMGCC_GROUP_REQ); mm->vgcs.callref = mmh->ref; - mm->vgcs.normal_service = (mm->substate == GSM48_MM_SST_NORMAL_SERVICE); + mm->vgcs.normal_service = (mm->substate == GSM48_MM_SST_NORMAL_SERVICE || + mm->substate == GSM48_MM_SST_PLMN_SEARCH_NORMAL); /* Change to VGCS substate. */ - new_mm_state(mm, GSM48_MM_ST_MM_IDLE, (mm->substate == GSM48_MM_SST_NORMAL_SERVICE) + new_mm_state(mm, GSM48_MM_ST_MM_IDLE, (mm->vgcs.normal_service) ? GSM48_MM_SST_RX_VGCS_NORMAL : GSM48_MM_SST_RX_VGCS_LIMITED); /* Group recevie mode request to RR layer */ @@ -4180,10 +4181,12 @@ static struct downstate { SBIT(GSM48_MM_SST_LOC_UPD_NEEDED), GSM48_MMCC_EST_REQ, gsm48_mm_init_mm_no_rr}, /* emergency only */ - {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_ATTEMPT_UPDATE), + {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_ATTEMPT_UPDATE) | + SBIT(GSM48_MM_SST_LOC_UPD_NEEDED), GSM48_MMBCC_GROUP_REQ, gsm48_mm_group_req}, - {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_ATTEMPT_UPDATE), + {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_ATTEMPT_UPDATE) | + SBIT(GSM48_MM_SST_LOC_UPD_NEEDED), GSM48_MMGCC_GROUP_REQ, gsm48_mm_group_req}, /* 4.2.2.3 Limited service */ @@ -4216,10 +4219,22 @@ static struct downstate { {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_PLMN_SEARCH_NORMAL), GSM48_MMBCC_EST_REQ, gsm48_mm_init_mm_no_rr}, + {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_PLMN_SEARCH_NORMAL), + GSM48_MMBCC_GROUP_REQ, gsm48_mm_group_req}, + + {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_PLMN_SEARCH_NORMAL), + GSM48_MMGCC_GROUP_REQ, gsm48_mm_group_req}, + /* 4.2.2.6 PLMN search */ {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_PLMN_SEARCH), GSM48_MMCC_EST_REQ, gsm48_mm_init_mm_no_rr}, + {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_PLMN_SEARCH), + GSM48_MMBCC_GROUP_REQ, gsm48_mm_group_req}, + + {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_PLMN_SEARCH), + GSM48_MMGCC_GROUP_REQ, gsm48_mm_group_req}, + /* 4.2.2.7 Receiving group call, normal service */ {SBIT(GSM48_MM_ST_MM_IDLE), SBIT(GSM48_MM_SST_RX_VGCS_NORMAL), GSM48_MMGCC_REL_REQ, gsm48_mm_group_rel_req}, @@ -4271,9 +4286,6 @@ static struct downstate { {SBIT(GSM48_MM_ST_MM_CONN_ACTIVE), ALL_STATES, GSM48_MMSMS_EST_REQ, gsm48_mm_init_mm_more}, - {SBIT(GSM48_MM_ST_MM_CONN_ACTIVE), ALL_STATES, - GSM48_MMGCC_GROUP_REQ, gsm48_mm_group_req}, - {SBIT(GSM48_MM_ST_WAIT_NETWORK_CMD), ALL_STATES, GSM48_MMCC_EST_REQ, gsm48_mm_init_mm_wait}, |