[SMF] Store Charging Characteristics IE from GTPv1C/2C and append AVP in Gy CCR (#1532)
This commit is contained in:
parent
4d2f7726b9
commit
99f59be5d7
|
@ -55,6 +55,7 @@ struct dict_object *ogs_diam_gy_sgsn_address = NULL;
|
|||
struct dict_object *ogs_diam_gy_ggsn_address = NULL;
|
||||
struct dict_object *ogs_diam_gy_3gpp_nsapi = NULL;
|
||||
struct dict_object *ogs_diam_gy_3gpp_selection_mode = NULL;
|
||||
struct dict_object *ogs_diam_gy_3gpp_charging_characteristics = NULL;
|
||||
|
||||
struct dict_object *ogs_diam_gy_feature_list_id = NULL;
|
||||
struct dict_object *ogs_diam_gy_feature_list = NULL;
|
||||
|
@ -117,7 +118,7 @@ int ogs_diam_gy_init(void)
|
|||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "GGSN-Address", &ogs_diam_gy_ggsn_address);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-NSAPI", &ogs_diam_gy_3gpp_nsapi);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Selection-Mode", &ogs_diam_gy_3gpp_selection_mode);
|
||||
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "3GPP-Charging-Characteristics", &ogs_diam_gy_3gpp_charging_characteristics);
|
||||
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Feature-List-ID", &ogs_diam_gy_feature_list_id);
|
||||
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "Feature-List", &ogs_diam_gy_feature_list);
|
||||
|
|
|
@ -106,6 +106,7 @@ extern struct dict_object *ogs_diam_gy_sgsn_address;
|
|||
extern struct dict_object *ogs_diam_gy_ggsn_address;
|
||||
extern struct dict_object *ogs_diam_gy_3gpp_nsapi;
|
||||
extern struct dict_object *ogs_diam_gy_3gpp_selection_mode;
|
||||
extern struct dict_object *ogs_diam_gy_3gpp_charging_characteristics;
|
||||
extern struct dict_object *ogs_diam_gy_feature_list_id;
|
||||
extern struct dict_object *ogs_diam_gy_feature_list;
|
||||
extern struct dict_object *ogs_diam_gy_qos_information;
|
||||
|
|
|
@ -316,6 +316,7 @@ typedef struct smf_sess_s {
|
|||
ogs_tlv_octet_t ue_pco;
|
||||
ogs_tlv_octet_t user_location_information;
|
||||
ogs_tlv_octet_t ue_timezone;
|
||||
ogs_tlv_octet_t charging_characteristics;
|
||||
bool create_session_response_apn_ambr;
|
||||
bool create_session_response_bearer_qos;
|
||||
uint8_t selection_mode; /* OGS_GTP{1,2}_SELECTION_MODE_*, same in GTPv1C and 2C. */
|
||||
|
|
|
@ -128,6 +128,10 @@ uint8_t smf_gn_handle_create_pdp_context_request(
|
|||
if (sess->gtp.selection_mode > 2)
|
||||
sess->gtp.selection_mode = 2;
|
||||
|
||||
if (req->charging_characteristics.presence) {
|
||||
OGS_TLV_STORE_DATA(&sess->gtp.charging_characteristics, &req->charging_characteristics);
|
||||
}
|
||||
|
||||
/* Control Plane(DL) : SGW-S5C */
|
||||
sess->sgw_s5c_teid = req->tunnel_endpoint_identifier_control_plane.u32;
|
||||
rv = ogs_gtp1_gsn_addr_to_ip(req->sgsn_address_for_signalling.data,
|
||||
|
|
|
@ -377,7 +377,6 @@ static void fill_service_information_ccr(smf_sess_t *sess,
|
|||
/* 3GPP-Selection-Mode, 3GPP TS 29.061 16.4.7.2 12 */
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_3gpp_selection_mode, 0, &avpch2);
|
||||
ogs_assert(ret == 0);
|
||||
ogs_assert(sess->session.name);
|
||||
digit = sess->gtp.selection_mode + '0';
|
||||
val.os.data = (uint8_t*)&digit;
|
||||
val.os.len = 1;
|
||||
|
@ -386,6 +385,25 @@ static void fill_service_information_ccr(smf_sess_t *sess,
|
|||
ret = fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2);
|
||||
ogs_assert(ret == 0);
|
||||
|
||||
/* 3GPP-Charging-Characteristics, 3GPP TS 29.061 16.4.7.2 13 */
|
||||
if (sess->gtp.charging_characteristics.presence &&
|
||||
sess->gtp.charging_characteristics.len > 0) {
|
||||
uint8_t oct1, oct2;
|
||||
char digits[5];
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_3gpp_charging_characteristics, 0, &avpch2);
|
||||
ogs_assert(ret == 0);
|
||||
oct1 = ((uint8_t*)sess->gtp.charging_characteristics.data)[0];
|
||||
oct2 = (sess->gtp.charging_characteristics.len > 1) ?
|
||||
((uint8_t*)sess->gtp.charging_characteristics.data)[1] : 0;
|
||||
snprintf(digits, sizeof(digits), "%02x%02x", oct1, oct2);
|
||||
val.os.data = (uint8_t*)&digits[0];
|
||||
val.os.len = 4;
|
||||
ret = fd_msg_avp_setvalue(avpch2, &val);
|
||||
ogs_assert(ret == 0);
|
||||
ret = fd_msg_avp_add(avpch1, MSG_BRW_LAST_CHILD, avpch2);
|
||||
ogs_assert(ret == 0);
|
||||
}
|
||||
|
||||
/* 3GPP-SGSN-MCC-MNC */
|
||||
ret = fd_msg_avp_new(ogs_diam_gy_3gpp_sgsn_mcc_mnc, 0, &avpch2);
|
||||
ogs_assert(ret == 0);
|
||||
|
|
|
@ -341,6 +341,10 @@ uint8_t smf_s5c_handle_create_session_request(
|
|||
OGS_TLV_STORE_DATA(&sess->gtp.ue_timezone, &req->ue_time_zone);
|
||||
}
|
||||
|
||||
if (req->charging_characteristics.presence) {
|
||||
OGS_TLV_STORE_DATA(&sess->gtp.charging_characteristics, &req->charging_characteristics);
|
||||
}
|
||||
|
||||
/* Set MSISDN */
|
||||
if (req->msisdn.presence && req->msisdn.len && req->msisdn.data) {
|
||||
smf_ue->msisdn_len = req->msisdn.len;
|
||||
|
|
Loading…
Reference in New Issue