* [SMF] rename function s/gtp/gtp2/

* [SMF] Store GTPC version in session

So far we always depended on an xact being present in the code path in
order to know which kind of session it is (GTPv1C vs GTPv2C). Let's
instead store that information in smf_sess_t so that we have it always
available in an easy way.

* [SMF] Move smf_sess_t GTPv1C specifics into gtp substruct

* [SMF] Gy CCR: append 3GPP-NSAPI AVP
This commit is contained in:
Pau Espin 2022-05-12 14:42:45 +02:00 committed by GitHub
parent 333e53d0dd
commit 5d478e2488
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 44 additions and 10 deletions

View File

@ -53,6 +53,7 @@ struct dict_object *ogs_diam_gy_3gpp_pdp_type = NULL;
struct dict_object *ogs_diam_gy_pdp_address = NULL;
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_feature_list_id = NULL;
struct dict_object *ogs_diam_gy_feature_list = NULL;
@ -113,6 +114,8 @@ int ogs_diam_gy_init(void)
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "PDP-Address", &ogs_diam_gy_pdp_address);
CHECK_dict_search(DICT_AVP, AVP_BY_NAME_ALL_VENDORS, "SGSN-Address", &ogs_diam_gy_sgsn_address);
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, "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);

View File

@ -104,6 +104,7 @@ extern struct dict_object *ogs_diam_gy_3gpp_pdp_type;
extern struct dict_object *ogs_diam_gy_pdp_address;
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_feature_list_id;
extern struct dict_object *ogs_diam_gy_feature_list;
extern struct dict_object *ogs_diam_gy_qos_information;

View File

@ -1141,10 +1141,11 @@ smf_sess_t *smf_sess_add_by_gtp1_message(ogs_gtp1_message_t *message)
}
sess = smf_sess_add_by_apn(smf_ue, apn, req->rat_type.u8);
sess->gtp.version = 1;
return sess;
}
smf_sess_t *smf_sess_add_by_gtp_message(ogs_gtp2_message_t *message)
smf_sess_t *smf_sess_add_by_gtp2_message(ogs_gtp2_message_t *message)
{
smf_ue_t *smf_ue = NULL;
smf_sess_t *sess = NULL;
@ -1204,6 +1205,7 @@ smf_sess_t *smf_sess_add_by_gtp_message(ogs_gtp2_message_t *message)
}
sess = smf_sess_add_by_apn(smf_ue, apn, req->rat_type.u8);
sess->gtp.version = 2;
return sess;
}

View File

@ -312,16 +312,16 @@ typedef struct smf_sess_s {
OpenAPI_rat_type_e sbi_rat_type;
struct {
uint8_t version; /* GTPC version */
ogs_tlv_octet_t ue_pco;
ogs_tlv_octet_t user_location_information;
ogs_tlv_octet_t ue_timezone;
bool create_session_response_apn_ambr;
bool create_session_response_bearer_qos;
} gtp; /* Saved from S5-C */
struct {
uint8_t nsapi;
} gtp1; /* GTPv1C specific fields */
struct {
uint8_t nsapi;
} v1; /* GTPv1C specific fields */
} gtp; /* Saved from S5-C/Gn */
struct {
uint64_t ul_octets;
@ -412,7 +412,7 @@ smf_ue_t *smf_ue_find_by_supi(char *supi);
smf_ue_t *smf_ue_find_by_imsi(uint8_t *imsi, int imsi_len);
smf_sess_t *smf_sess_add_by_gtp1_message(ogs_gtp1_message_t *message);
smf_sess_t *smf_sess_add_by_gtp_message(ogs_gtp2_message_t *message);
smf_sess_t *smf_sess_add_by_gtp2_message(ogs_gtp2_message_t *message);
smf_sess_t *smf_sess_add_by_apn(smf_ue_t *smf_ue, char *apn, uint8_t rat_type);
smf_sess_t *smf_sess_add_by_sbi_message(ogs_sbi_message_t *message);

View File

@ -157,7 +157,7 @@ ogs_pkbuf_t *smf_gn_build_create_pdp_context_response(
/* TODO: NSAPI ? */
rsp->nsapi.presence = 1;
rsp->nsapi.u8 = sess->gtp1.nsapi;
rsp->nsapi.u8 = sess->gtp.v1.nsapi;
/* Charging ID */
rsp->charging_id.presence = 1;

View File

@ -118,7 +118,7 @@ uint8_t smf_gn_handle_create_pdp_context_request(
ogs_assert(smf_ue);
/* Store NSAPI */
sess->gtp1.nsapi = req->nsapi.u8;
sess->gtp.v1.nsapi = req->nsapi.u8;
/* Control Plane(DL) : SGW-S5C */
sess->sgw_s5c_teid = req->tunnel_endpoint_identifier_control_plane.u32;

View File

@ -383,6 +383,34 @@ 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-NSAPI, 3GPP TS 29.061 16.4.7.2 10 */
if (sess->gtp.version == 1) {
char nsapi_hex;
if (sess->gtp.v1.nsapi <= 9)
nsapi_hex = sess->gtp.v1.nsapi + '0';
else
nsapi_hex = sess->gtp.v1.nsapi - 10 + 'A';
ret = fd_msg_avp_new(ogs_diam_gy_3gpp_nsapi, 0, &avpch2);
ogs_assert(ret == 0);
val.os.data = (uint8_t *)&nsapi_hex;
val.os.len = 1;
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);
} else {
/* GTPv2C: For PGW, EPS Bearer ID as specified in 3GPP TS 29.274 8.8 */
smf_bearer_t *bearer = smf_default_bearer_in_sess(sess);
ret = fd_msg_avp_new(ogs_diam_gy_3gpp_nsapi, 0, &avpch2);
ogs_assert(ret == 0);
val.os.data = (uint8_t *)&bearer->ebi;
val.os.len = 1;
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-MS-Timezone */
if (sess->gtp.ue_timezone.presence &&
sess->gtp.ue_timezone.len && sess->gtp.ue_timezone.data) {

View File

@ -132,7 +132,7 @@ void smf_state_operational(ogs_fsm_t *s, smf_event_t *e)
case OGS_GTP2_CREATE_SESSION_REQUEST_TYPE:
if (gtp2_message.h.teid == 0) {
ogs_expect(!sess);
sess = smf_sess_add_by_gtp_message(&gtp2_message);
sess = smf_sess_add_by_gtp2_message(&gtp2_message);
if (sess)
OGS_SETUP_GTP_NODE(sess, gnode);
}