From 12158eebb8ab0c6ea7b52291bce6cc4d3d38186c Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 19 Mar 2024 17:55:15 +0100 Subject: [PATCH] [SMF] Gy: Check Multiple-Services-Credit-Control Result-Code --- lib/diameter/gy/message.h | 2 ++ src/smf/gy-handler.c | 6 ++++++ src/smf/gy-path.c | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/lib/diameter/gy/message.h b/lib/diameter/gy/message.h index 5d402e042..2356738f3 100644 --- a/lib/diameter/gy/message.h +++ b/lib/diameter/gy/message.h @@ -187,6 +187,8 @@ typedef struct ogs_diam_gy_message_s { uint32_t time_threshold; uint32_t volume_threshold; ogs_diam_gy_service_unit_t granted; + uint32_t result_code; + uint32_t *err; } cca; }; } ogs_diam_gy_message_t; diff --git a/src/smf/gy-handler.c b/src/smf/gy-handler.c index 159d7f63c..78dfa2e01 100644 --- a/src/smf/gy-handler.c +++ b/src/smf/gy-handler.c @@ -178,6 +178,12 @@ uint32_t smf_gy_handle_cca_update_request( return gy_message->err ? *gy_message->err : ER_DIAMETER_AUTHENTICATION_REJECTED; } + if (gy_message->cca.result_code != ER_DIAMETER_SUCCESS) { + ogs_warn("Gy CCA Update Diameter Multiple-Services-Credit-Control Result-Code=%u", + gy_message->cca.result_code); + return gy_message->cca.err ? *gy_message->cca.err : + ER_DIAMETER_AUTHENTICATION_REJECTED; + } bearer = smf_default_bearer_in_sess(sess); ogs_assert(bearer); diff --git a/src/smf/gy-path.c b/src/smf/gy-path.c index db1827111..d2ad29519 100644 --- a/src/smf/gy-path.c +++ b/src/smf/gy-path.c @@ -1003,6 +1003,9 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) /* Set Credit Control Command */ gy_message->cmd_code = OGS_DIAM_GY_CMD_CODE_CREDIT_CONTROL; + /* Initialize some values: */ + gy_message->cca.result_code = ER_DIAMETER_SUCCESS; + /* Value of Result Code */ ret = fd_msg_search_avp(*msg, ogs_diam_result_code, &avp); ogs_assert(ret == 0); @@ -1114,6 +1117,10 @@ static void smf_gy_cca_cb(void *data, struct msg **msg) ret = fd_msg_avp_hdr(avpch1, &hdr); ogs_assert(ret == 0); switch (hdr->avp_code) { + case AC_RESULT_CODE: + gy_message->cca.result_code = hdr->avp_value->u32; + gy_message->cca.err = &gy_message->cca.result_code; + break; case OGS_DIAM_GY_AVP_CODE_GRANTED_SERVICE_UNIT: rv = decode_granted_service_unit( &gy_message->cca.granted, avpch1, &error);