[SMF] UpdPDPCtxRsp: Fix adding 2 IP addresses to one GSN Address IE (#1382)
In the event we have 2 local IP addresses available for use, put the one having same IP version in "GGSN Address *" IE, and the one with the other IP version in "Alternative GGSN Address *" IE. Same fix was applied recently to CreatePDPContextResponse.
This commit is contained in:
parent
b0fc06ab6c
commit
882548de11
|
@ -327,7 +327,8 @@ ogs_pkbuf_t *smf_gn_build_update_pdp_context_response(
|
|||
uint8_t pco_buf[OGS_MAX_PCO_LEN];
|
||||
int16_t pco_len;
|
||||
ogs_gtp1_gsn_addr_t smf_gnc_gsnaddr, pgw_gnu_gsnaddr;
|
||||
int len;
|
||||
ogs_gtp1_gsn_addr_t smf_gnc_altgsnaddr, pgw_gnu_altgsnaddr;
|
||||
int gsn_len, gsn_altlen;
|
||||
ogs_gtp1_qos_profile_decoded_t qos_pdec;
|
||||
char qos_pdec_buf[OGS_GTP1_QOS_PROFILE_MAX_LEN];
|
||||
ogs_gtp1_apn_ambr_t ambr;
|
||||
|
@ -369,25 +370,74 @@ ogs_pkbuf_t *smf_gn_build_update_pdp_context_response(
|
|||
}
|
||||
|
||||
/* GGSN Address for Control Plane */
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(
|
||||
ogs_gtp_self()->gtpc_addr, ogs_gtp_self()->gtpc_addr6,
|
||||
&smf_gnc_gsnaddr, &len);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
/* Alternative GGSN Address for Control Plane */
|
||||
if (ogs_gtp_self()->gtpc_addr && ogs_gtp_self()->gtpc_addr6) {
|
||||
if (sess->sgw_s5c_ip.ipv4) {
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(ogs_gtp_self()->gtpc_addr, NULL,
|
||||
&smf_gnc_gsnaddr, &gsn_len);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(NULL, ogs_gtp_self()->gtpc_addr6,
|
||||
&smf_gnc_altgsnaddr, &gsn_altlen);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
} else {
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(NULL, ogs_gtp_self()->gtpc_addr6,
|
||||
&smf_gnc_gsnaddr, &gsn_len);
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(ogs_gtp_self()->gtpc_addr, NULL,
|
||||
&smf_gnc_altgsnaddr, &gsn_altlen);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
}
|
||||
rsp->alternative_ggsn_address_for_control_plane.presence = 1;
|
||||
rsp->alternative_ggsn_address_for_control_plane.data = &smf_gnc_altgsnaddr;
|
||||
rsp->alternative_ggsn_address_for_control_plane.len = gsn_altlen;
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
} else {
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(
|
||||
ogs_gtp_self()->gtpc_addr, ogs_gtp_self()->gtpc_addr6,
|
||||
&smf_gnc_gsnaddr, &gsn_len);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
}
|
||||
rsp->ggsn_address_for_control_plane.presence = 1;
|
||||
rsp->ggsn_address_for_control_plane.data = &smf_gnc_gsnaddr;
|
||||
rsp->ggsn_address_for_control_plane.len = len;
|
||||
rsp->ggsn_address_for_control_plane.len = gsn_len;
|
||||
|
||||
/* GGSN Address for user traffic */
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(
|
||||
bearer->pgw_s5u_addr, bearer->pgw_s5u_addr6,
|
||||
&pgw_gnu_gsnaddr, &len);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
/* Alternative GGSN Address for user traffic */
|
||||
if (bearer->pgw_s5u_addr && bearer->pgw_s5u_addr6) {
|
||||
if (bearer->sgw_s5u_ip.ipv4) {
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(bearer->pgw_s5u_addr, NULL,
|
||||
&pgw_gnu_gsnaddr, &gsn_len);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(NULL, bearer->pgw_s5u_addr6,
|
||||
&pgw_gnu_altgsnaddr, &gsn_altlen);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
} else {
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(NULL, bearer->pgw_s5u_addr6,
|
||||
&pgw_gnu_gsnaddr, &gsn_len);
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(bearer->pgw_s5u_addr, NULL,
|
||||
&pgw_gnu_altgsnaddr, &gsn_altlen);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
}
|
||||
rsp->alternative_ggsn_address_for_user_traffic.presence = 1;
|
||||
rsp->alternative_ggsn_address_for_user_traffic.data = &pgw_gnu_altgsnaddr;
|
||||
rsp->alternative_ggsn_address_for_user_traffic.len = gsn_altlen;
|
||||
} else {
|
||||
rv = ogs_gtp1_sockaddr_to_gsn_addr(
|
||||
bearer->pgw_s5u_addr, bearer->pgw_s5u_addr6,
|
||||
&pgw_gnu_gsnaddr, &gsn_len);
|
||||
ogs_expect_or_return_val(rv == OGS_OK, NULL);
|
||||
}
|
||||
rsp->ggsn_address_for_user_traffic.presence = 1;
|
||||
rsp->ggsn_address_for_user_traffic.data = &pgw_gnu_gsnaddr;
|
||||
rsp->ggsn_address_for_user_traffic.len = len;
|
||||
rsp->ggsn_address_for_user_traffic.len = gsn_len;
|
||||
|
||||
/* QoS Profile: if PCRF changes Bearer QoS, this should be included. */
|
||||
if (sess->gtp.create_session_response_bearer_qos == true) {
|
||||
build_qos_profile_from_session(&qos_pdec, sess);
|
||||
rsp->quality_of_service_profile.presence = 1;
|
||||
ogs_gtp1_build_qos_profile(&rsp->quality_of_service_profile,
|
||||
&qos_pdec, qos_pdec_buf, OGS_GTP1_QOS_PROFILE_MAX_LEN);
|
||||
}
|
||||
|
||||
/* TODO: Alternative GGSN Address for Control Plane */
|
||||
/* TODO: Alternative GGSN Address for user traffic */
|
||||
|
||||
/* QoS Profile: if PCRF changes Bearer QoS, this should be included. */
|
||||
if (sess->gtp.create_session_response_bearer_qos == true) {
|
||||
|
|
Loading…
Reference in New Issue