mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-msc.git
synced 2025-10-23 08:12:10 +00:00
vlr: extend the subscriber invalidate callback with reasons
The VLR must be allowed to notify the MSC if a subscriber becomes invalid. There are multiple cases when this happens: a) if the subscriber didn't do a Location Update Procedure within the given periodic timer. b) if the HLR does a Cancel Location Procedure with reason withdraw c) if the HLR does a Cancel Location Procedure with reason update location. d) duplicate entries (unsure if this is valid, but keeping the code as is) Change-Id: Ie5b687318b106a230fcee52deba86649641004b3
This commit is contained in:
committed by
lynxis lazus
parent
ba9f30c5cc
commit
5611c75328
@@ -204,6 +204,13 @@ enum vlr_ciph {
|
||||
VLR_CIPH_A5_3 = 3, /*< A5/3, 'new secure' encryption */
|
||||
};
|
||||
|
||||
enum vlr_inval_reason {
|
||||
VLR_INVAL_REASON_WITHDRAWN, /*< HLR cancel location, reason subscription withdrawn */
|
||||
VLR_INVAL_REASON_UPDATE_LOCATION, /*< HLR cancel location, reason update location */
|
||||
VLR_INVAL_REASON_LOCATION_EXPIRED, /*< Location Update timer ran out */
|
||||
VLR_INVAL_REASON_DUPLICATE_SUBSCR, /*< A newer record of the same subscriber exists. This is the old entry. */
|
||||
};
|
||||
|
||||
static inline uint8_t vlr_ciph_to_gsm0808_alg_id(enum vlr_ciph ciph)
|
||||
{
|
||||
switch (ciph) {
|
||||
@@ -250,8 +257,8 @@ struct vlr_ops {
|
||||
/* notify MSC/SGSN that the given subscriber has been associated
|
||||
* with this msc_conn_ref */
|
||||
int (*subscr_assoc)(void *msc_conn_ref, struct vlr_subscr *vsub);
|
||||
/* notify MSC that the given subscriber is no longer valid */
|
||||
void (*subscr_inval)(void *msc_conn_ref, struct vlr_subscr *vsub);
|
||||
/* notify MSC that the given subscriber is no longer valid. */
|
||||
void (*subscr_inval)(void *msc_conn_ref, struct vlr_subscr *vsub, enum vlr_inval_reason reason);
|
||||
};
|
||||
|
||||
/* An instance of the VLR codebase */
|
||||
|
@@ -1572,7 +1572,7 @@ static int msc_vlr_subscr_assoc(void *msc_conn_ref,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void msc_vlr_subscr_inval(void *msc_conn_ref, struct vlr_subscr *vsub)
|
||||
static void msc_vlr_subscr_inval(void *msc_conn_ref, struct vlr_subscr *vsub, enum vlr_inval_reason reason)
|
||||
{
|
||||
/* Search vsub backwards to make sure msc_conn_ref is a valid msc_a instance. */
|
||||
struct msub *msub;
|
||||
|
@@ -629,7 +629,7 @@ static void dedup_vsub(struct vlr_subscr *exists, struct vlr_subscr *vsub)
|
||||
exists->imsi);
|
||||
|
||||
if (vlr->ops.subscr_inval)
|
||||
vlr->ops.subscr_inval(exists->msc_conn_ref, exists);
|
||||
vlr->ops.subscr_inval(exists->msc_conn_ref, exists, VLR_INVAL_REASON_DUPLICATE_SUBSCR);
|
||||
vlr_subscr_free(exists);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user