forked from acouzens/open5gs
hss: Don't send IDR for Operator-Determined-Barring changes if Subscriber-Status=SERVICE_GRANTED
This commit is contained in:
parent
e108d6297c
commit
79d3c7078f
|
@ -85,6 +85,7 @@ extern "C" {
|
||||||
#define OGS_DIAM_S6A_SUBDATA_UEAMBR (1 << 7)
|
#define OGS_DIAM_S6A_SUBDATA_UEAMBR (1 << 7)
|
||||||
#define OGS_DIAM_S6A_SUBDATA_APN_CONFIG (1 << 8)
|
#define OGS_DIAM_S6A_SUBDATA_APN_CONFIG (1 << 8)
|
||||||
#define OGS_DIAM_S6A_SUBDATA_RAU_TAU_TIMER (1 << 9)
|
#define OGS_DIAM_S6A_SUBDATA_RAU_TAU_TIMER (1 << 9)
|
||||||
|
#define OGS_DIAM_S6A_SUBDATA_OP_DET_BARRING (1 << 10)
|
||||||
#define OGS_DIAM_S6A_SUBDATA_ALL 0xFFFFFFFF
|
#define OGS_DIAM_S6A_SUBDATA_ALL 0xFFFFFFFF
|
||||||
|
|
||||||
extern struct dict_object *ogs_diam_s6a_application;
|
extern struct dict_object *ogs_diam_s6a_application;
|
||||||
|
|
|
@ -1259,7 +1259,7 @@ int hss_handle_change_event(const bson_t *document)
|
||||||
strlen("operator_determined_barring"))) {
|
strlen("operator_determined_barring"))) {
|
||||||
send_idr_flag = true;
|
send_idr_flag = true;
|
||||||
subdatamask = (subdatamask |
|
subdatamask = (subdatamask |
|
||||||
OGS_DIAM_S6A_SUBDATA_SUB_STATUS);
|
OGS_DIAM_S6A_SUBDATA_OP_DET_BARRING);
|
||||||
} else if (!strncmp(child2_key,
|
} else if (!strncmp(child2_key,
|
||||||
"network_access_mode",
|
"network_access_mode",
|
||||||
strlen("network_access_mode"))) {
|
strlen("network_access_mode"))) {
|
||||||
|
|
|
@ -364,7 +364,7 @@ static int hss_s6a_avp_add_subscription_data(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (subdatamask & OGS_DIAM_S6A_SUBDATA_SUB_STATUS) {
|
if (subdatamask & (OGS_DIAM_S6A_SUBDATA_SUB_STATUS | OGS_DIAM_S6A_SUBDATA_OP_DET_BARRING)) {
|
||||||
ret = fd_msg_avp_new(
|
ret = fd_msg_avp_new(
|
||||||
ogs_diam_s6a_subscriber_status, 0, &avp_subscriber_status);
|
ogs_diam_s6a_subscriber_status, 0, &avp_subscriber_status);
|
||||||
ogs_assert(ret == 0);
|
ogs_assert(ret == 0);
|
||||||
|
@ -1356,6 +1356,17 @@ int hss_s6a_send_idr(char *imsi_bcd, uint32_t idr_flags, uint32_t subdatamask)
|
||||||
return OGS_ERROR;
|
return OGS_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Avoid sending IDR if only Operator-Determined-Barring field changed and
|
||||||
|
* Subscriber-Status is SERVICE_GRANTED, since then the field has no
|
||||||
|
* meaning and won't be sent through the wire, so nothing really changes
|
||||||
|
* from the PoV of the peer. */
|
||||||
|
if (subdatamask == OGS_DIAM_S6A_SUBDATA_OP_DET_BARRING &&
|
||||||
|
subscription_data.subscriber_status == OGS_SUBSCRIBER_STATUS_SERVICE_GRANTED) {
|
||||||
|
ogs_debug(" [%s] Skip sending IDR: Only Operator-Determined-Barring changed while"
|
||||||
|
" Subscriber-Status is SERVICE_GRANTED.", imsi_bcd);
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create the random value to store with the session */
|
/* Create the random value to store with the session */
|
||||||
sess_data = ogs_calloc(1, sizeof(*sess_data));
|
sess_data = ogs_calloc(1, sizeof(*sess_data));
|
||||||
ogs_assert(sess_data);
|
ogs_assert(sess_data);
|
||||||
|
|
Loading…
Reference in New Issue