[SMF] Add check for relay peer in ogs_diam_is_relay_or_app_advertised function (#3589)

Modify the function to return true if the peer is a relay,
otherwise check for advertised application.
This commit is contained in:
Sukchan Lee
2024-12-13 14:54:36 +09:00
parent 6ffd7c978f
commit b44d159c7b
5 changed files with 25 additions and 18 deletions

View File

@@ -90,7 +90,7 @@ int ogs_diam_start(void);
void ogs_diam_final(void);
int ogs_diam_config_init(ogs_diam_config_t *fd_config);
bool ogs_diam_app_connected(uint32_t app_id);
bool ogs_diam_is_relay_or_app_advertised(uint32_t app_id);
int fd_avp_search_avp ( struct avp * groupedavp,
struct dict_object * what, struct avp ** avp );

View File

@@ -19,7 +19,7 @@
#include "ogs-diameter-common.h"
bool ogs_diam_app_connected(uint32_t app_id)
bool ogs_diam_is_relay_or_app_advertised(uint32_t app_id)
{
struct fd_list *li = NULL;
struct fd_app *found = NULL;
@@ -36,18 +36,23 @@ bool ogs_diam_app_connected(uint32_t app_id)
if (state == STATE_OPEN) {
ogs_debug("'%s' STATE is OPEN", p->info.pi_diamid);
/* Check if the remote peer advertised the message's appli */
fd_app_check(&p->info.runtime.pir_apps, app_id, &found);
if (found) break;
if (p->info.runtime.pir_relay) {
ogs_debug("'%s' RELAY is enabled", p->info.pi_diamid);
CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );
return true;
} else {
/* Check if the remote peer advertised the message's appli */
fd_app_check(&p->info.runtime.pir_apps, app_id, &found);
if (found) {
CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );
return true;
}
}
} else {
ogs_debug("'%s' STATE[%d] is NOT open ", p->info.pi_diamid, state);
}
}
CHECK_POSIX( pthread_rwlock_unlock(&fd_g_peers_rw) );
if (found)
return true;
else
return false;
return false;
}

View File

@@ -53,9 +53,11 @@ int smf_use_gy_iface(void)
{
switch (smf_self()->ctf_config.enabled) {
case SMF_CTF_ENABLED_AUTO:
return ogs_diam_app_connected(OGS_DIAM_GY_APPLICATION_ID) ? 1 : 0;
return ogs_diam_is_relay_or_app_advertised(
OGS_DIAM_GY_APPLICATION_ID) ? 1 : 0;
case SMF_CTF_ENABLED_YES:
return ogs_diam_app_connected(OGS_DIAM_GY_APPLICATION_ID) ? 1 : -1;
return ogs_diam_is_relay_or_app_advertised(
OGS_DIAM_GY_APPLICATION_ID) ? 1 : -1;
case SMF_CTF_ENABLED_NO:
return 0;
default:

View File

@@ -110,7 +110,7 @@ uint8_t smf_gn_handle_create_pdp_context_request(
cause_value = OGS_GTP1_CAUSE_MANDATORY_IE_MISSING;
}
if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) {
if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) {
ogs_error("No Gx Diameter Peer");
cause_value = OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE;
}
@@ -309,7 +309,7 @@ uint8_t smf_gn_handle_delete_pdp_context_request(
{
ogs_debug("Delete PDP Context Request");
if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) {
if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) {
ogs_error("No Gx Diameter Peer");
return OGS_GTP1_CAUSE_NO_RESOURCES_AVAILABLE;
}

View File

@@ -155,7 +155,7 @@ uint8_t smf_s5c_handle_create_session_request(
cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
}
if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) {
if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) {
ogs_error("No Gx Diameter Peer");
cause_value = OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING;
}
@@ -172,7 +172,7 @@ uint8_t smf_s5c_handle_create_session_request(
}
break;
case OGS_GTP2_RAT_TYPE_WLAN:
if (!ogs_diam_app_connected(OGS_DIAM_S6B_APPLICATION_ID)) {
if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_S6B_APPLICATION_ID)) {
ogs_error("No S6b Diameter Peer");
cause_value = OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING;
}
@@ -485,13 +485,13 @@ uint8_t smf_s5c_handle_delete_session_request(
ogs_assert(xact);
ogs_assert(req);
if (!ogs_diam_app_connected(OGS_DIAM_GX_APPLICATION_ID)) {
if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_GX_APPLICATION_ID)) {
ogs_error("No Gx Diameter Peer");
return OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING;
}
if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_WLAN) {
if (!ogs_diam_app_connected(OGS_DIAM_S6B_APPLICATION_ID)) {
if (!ogs_diam_is_relay_or_app_advertised(OGS_DIAM_S6B_APPLICATION_ID)) {
ogs_error("No S6b Diameter Peer");
return OGS_GTP2_CAUSE_REMOTE_PEER_NOT_RESPONDING;
}