From 79d3c7078f04b4efefd21230f3f40acb28b174ea Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Thu, 12 Oct 2023 15:33:56 +0200 Subject: [PATCH] hss: Don't send IDR for Operator-Determined-Barring changes if Subscriber-Status=SERVICE_GRANTED --- lib/diameter/s6a/message.h | 1 + src/hss/hss-context.c | 2 +- src/hss/hss-s6a-path.c | 13 ++++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/diameter/s6a/message.h b/lib/diameter/s6a/message.h index 5ecf4e369..8adf9628d 100644 --- a/lib/diameter/s6a/message.h +++ b/lib/diameter/s6a/message.h @@ -85,6 +85,7 @@ extern "C" { #define OGS_DIAM_S6A_SUBDATA_UEAMBR (1 << 7) #define OGS_DIAM_S6A_SUBDATA_APN_CONFIG (1 << 8) #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 extern struct dict_object *ogs_diam_s6a_application; diff --git a/src/hss/hss-context.c b/src/hss/hss-context.c index 9966d77f0..99e949add 100644 --- a/src/hss/hss-context.c +++ b/src/hss/hss-context.c @@ -1259,7 +1259,7 @@ int hss_handle_change_event(const bson_t *document) strlen("operator_determined_barring"))) { send_idr_flag = true; subdatamask = (subdatamask | - OGS_DIAM_S6A_SUBDATA_SUB_STATUS); + OGS_DIAM_S6A_SUBDATA_OP_DET_BARRING); } else if (!strncmp(child2_key, "network_access_mode", strlen("network_access_mode"))) { diff --git a/src/hss/hss-s6a-path.c b/src/hss/hss-s6a-path.c index 16dc6f3d4..d004a534f 100644 --- a/src/hss/hss-s6a-path.c +++ b/src/hss/hss-s6a-path.c @@ -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( ogs_diam_s6a_subscriber_status, 0, &avp_subscriber_status); 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; } + /* 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 */ sess_data = ogs_calloc(1, sizeof(*sess_data)); ogs_assert(sess_data);