[Cx] User-Name can be skipped in SAR (#921)

This commit is contained in:
Sukchan Lee 2021-04-08 22:49:08 +09:00
parent 44de4673bf
commit 27cee12a7b
4 changed files with 141 additions and 75 deletions

View File

@ -759,6 +759,28 @@ ogs_plmn_id_t *hss_cx_get_visited_plmn_id(char *public_identity)
return visited_plmn_id;
}
char *hss_cx_get_user_name(char *public_identity)
{
hss_impi_t *impi = NULL;
hss_impu_t *impu = NULL;
char *user_name = NULL;
ogs_thread_mutex_lock(&self.cx_lock);
impu = impu_find_by_id(public_identity);
if (impu) {
impi = impu->impi;
ogs_assert(impi);
user_name = impi->id;
}
ogs_thread_mutex_unlock(&self.cx_lock);
return user_name;
}
char *hss_cx_get_server_name(char *public_identity)
{
char *server_name = NULL;

View File

@ -79,6 +79,7 @@ void hss_cx_set_imsi_bcd(char *user_name, char *imsi_bcd);
char *hss_cx_get_imsi_bcd(char *public_identity);
ogs_plmn_id_t *hss_cx_get_visited_plmn_id(char *public_identity);
char *hss_cx_get_user_name(char *public_identity);
char *hss_cx_get_server_name(char *public_identity);
void hss_cx_set_server_name(

View File

@ -232,6 +232,8 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp,
uint8_t mac_s[OGS_MAC_S_LEN];
bool matched = false;
ogs_assert(msg);
ogs_debug("Multimedia-Auth-Request");
@ -273,7 +275,7 @@ static int hss_ogs_diam_cx_mar_cb( struct msg **msg, struct avp *avp,
ogs_assert(server_name);
/* Check if IMPI(User-Name) + IMPU(Public-Identity) is associated */
bool matched = hss_cx_identity_is_associated(user_name, public_identity);
matched = hss_cx_identity_is_associated(user_name, public_identity);
if (!matched) {
ogs_error("User-Name[%s] Public-Identity[%s] is not assocated",
user_name, public_identity);
@ -593,6 +595,8 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
struct msg *ans, *qry;
bool matched = false;
struct avp *user_name_avp = NULL;
struct avp *avpch = NULL;
struct avp_hdr *hdr;
union avp_value val;
@ -617,16 +621,6 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
ogs_assert(ret == 0);
ans = *msg;
/* Get User-Name AVP (Mandatory) */
ret = fd_msg_search_avp(qry, ogs_diam_user_name, &avp);
ogs_assert(ret == 0);
ret = fd_msg_avp_hdr(avp, &hdr);
ogs_assert(ret == 0);
user_name = ogs_strndup(
(char*)hdr->avp_value->os.data, hdr->avp_value->os.len);
ogs_assert(user_name);
/* Get Public-Identity AVP (Mandatory) */
ret = fd_msg_search_avp(qry, ogs_diam_cx_public_identity, &avp);
ogs_assert(ret == 0);
@ -647,14 +641,37 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
(char*)hdr->avp_value->os.data, hdr->avp_value->os.len);
ogs_assert(server_name);
/* Get User-Name AVP */
ret = fd_msg_search_avp(qry, ogs_diam_user_name, &user_name_avp);
ogs_assert(ret == 0);
if (user_name_avp) {
ret = fd_msg_avp_hdr(user_name_avp, &hdr);
ogs_assert(ret == 0);
user_name = ogs_strndup(
(char*)hdr->avp_value->os.data, hdr->avp_value->os.len);
ogs_assert(user_name);
/* Check if IMPI(User-Name) + IMPU(Public-Identity) is associated */
bool matched = hss_cx_identity_is_associated(user_name, public_identity);
matched = hss_cx_identity_is_associated(user_name, public_identity);
if (!matched) {
ogs_error("User-Name[%s] Public-Identity[%s] is not assocated",
user_name, public_identity);
result_code = OGS_DIAM_CX_ERROR_IDENTITIES_DONT_MATCH;
goto out;
}
} else {
user_name = hss_cx_get_user_name(public_identity);
if (!user_name) {
ogs_error("Cannot find User-Name for Public-Identity[%s]",
public_identity);
result_code = OGS_DIAM_CX_ERROR_USER_UNKNOWN;
goto out;
}
user_name = ogs_strdup(user_name);
ogs_assert(user_name);
}
/* Check if IMSI */
imsi_bcd = hss_cx_get_imsi_bcd(public_identity);
@ -704,6 +721,7 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
ret = fd_msg_rescode_set(ans, (char*)"DIAMETER_SUCCESS", NULL, NULL, 1);
ogs_assert(ret == 0);
if (user_name_avp) {
/* Set the User-Name AVP */
ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp);
ogs_assert(ret == 0);
@ -713,9 +731,20 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
ogs_assert(ret == 0);
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
}
/* Get Server-Assignment-Type AVP (Mandatory) */
ret = fd_msg_search_avp(qry,
ogs_diam_cx_server_assignment_type, &avp);
ogs_assert(ret == 0);
ret = fd_msg_avp_hdr(avp, &hdr);
ogs_assert(ret == 0);
if (hdr->avp_value->i32 == OGS_DIAM_CX_SERVER_ASSIGNMENT_REGISTRATION ||
hdr->avp_value->i32 == OGS_DIAM_CX_SERVER_ASSIGNMENT_RE_REGISTRATION) {
/* Get User-Data-Already-Available AVP (Mandatory) */
ret = fd_msg_search_avp(qry, ogs_diam_cx_user_data_already_available, &avp);
ret = fd_msg_search_avp(
qry, ogs_diam_cx_user_data_already_available, &avp);
ogs_assert(ret == 0);
ret = fd_msg_avp_hdr(avp, &hdr);
ogs_assert(ret == 0);
@ -761,6 +790,7 @@ static int hss_ogs_diam_cx_sar_cb( struct msg **msg, struct avp *avp,
ret = fd_msg_avp_add(ans, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
}
}
/* Send the answer */
ret = fd_msg_send(msg, NULL, NULL);

View File

@ -32,6 +32,8 @@ struct sess_state {
bool resync;
int server_assignment_type;
struct timespec ts; /* Time of sending the message */
};
@ -623,6 +625,8 @@ static void test_cx_maa_cb(void *data, struct msg **msg)
*msg = NULL;
if (sess_data->resync == true) {
sess_data->server_assignment_type =
OGS_DIAM_CX_SERVER_ASSIGNMENT_REGISTRATION;
test_cx_send_sar(sess_data);
} else {
sess_data->resync = true;
@ -706,6 +710,8 @@ static void test_cx_send_sar(struct sess_state *sess_data)
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
if (sess_data->server_assignment_type ==
OGS_DIAM_CX_SERVER_ASSIGNMENT_REGISTRATION) {
/* Set the User-Name AVP */
ret = fd_msg_avp_new(ogs_diam_user_name, 0, &avp);
ogs_assert(ret == 0);
@ -715,6 +721,7 @@ static void test_cx_send_sar(struct sess_state *sess_data)
ogs_assert(ret == 0);
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
ogs_assert(ret == 0);
}
/* Set the Public-Identity AVP */
ret = fd_msg_avp_new(ogs_diam_cx_public_identity, 0, &avp);
@ -739,7 +746,7 @@ static void test_cx_send_sar(struct sess_state *sess_data)
/* Set the Server-Assignment-Type AVP */
ret = fd_msg_avp_new(ogs_diam_cx_server_assignment_type, 0, &avp);
ogs_assert(ret == 0);
val.i32 = OGS_DIAM_CX_SERVER_ASSIGNMENT_REGISTRATION;
val.i32 = sess_data->server_assignment_type;
ret = fd_msg_avp_setvalue(avp, &val);
ogs_assert(ret == 0);
ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
@ -885,6 +892,10 @@ static void test_cx_saa_cb(void *data, struct msg **msg)
ogs_assert(ret == 0);
*msg = NULL;
if (sess_data->server_assignment_type ==
OGS_DIAM_CX_SERVER_ASSIGNMENT_UNREGISTERED_USER)
state_cleanup(sess_data, NULL, NULL);
else
test_cx_send_lir(sess_data);
return;
}
@ -1110,7 +1121,9 @@ static void test_cx_lia_cb(void *data, struct msg **msg)
ogs_assert(ret == 0);
*msg = NULL;
state_cleanup(sess_data, NULL, NULL);
sess_data->server_assignment_type =
OGS_DIAM_CX_SERVER_ASSIGNMENT_UNREGISTERED_USER;
test_cx_send_sar(sess_data);
return;
}