summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2023-10-17 14:23:08 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2023-10-18 08:08:10 +0200
commit2c0f71ac43d2f7fb20e4b9ac610aab706e2f00ac (patch)
treeeddfffa44957a12246066c9580b267045968b401
parent026f11328073b83769ffac83f19567e44a5547cd (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
-rw-r--r--src/host/layer23/src/mobile/gsm48_mm.c26
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},