mirror of
				https://github.com/open5gs/open5gs.git
				synced 2025-11-04 05:53:18 +00:00 
			
		
		
		
	[SMF] Store MSISDN from GTPC and pass it in Gy CCR (#1519)
This commit is contained in:
		@@ -109,6 +109,11 @@ typedef struct smf_ue_s {
 | 
				
			|||||||
    int imsi_len;
 | 
					    int imsi_len;
 | 
				
			||||||
    char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
 | 
					    char imsi_bcd[OGS_MAX_IMSI_BCD_LEN+1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* MSISDN */
 | 
				
			||||||
 | 
					    uint8_t msisdn[OGS_MAX_MSISDN_LEN];
 | 
				
			||||||
 | 
					    int msisdn_len;
 | 
				
			||||||
 | 
					    char msisdn_bcd[OGS_MAX_MSISDN_BCD_LEN+1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ogs_list_t sess_list;
 | 
					    ogs_list_t sess_list;
 | 
				
			||||||
} smf_ue_t;
 | 
					} smf_ue_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -93,6 +93,10 @@ uint8_t smf_gn_handle_create_pdp_context_request(
 | 
				
			|||||||
        ogs_error("No SGSN Address for user traffic");
 | 
					        ogs_error("No SGSN Address for user traffic");
 | 
				
			||||||
        cause_value = OGS_GTP1_CAUSE_MANDATORY_IE_MISSING;
 | 
					        cause_value = OGS_GTP1_CAUSE_MANDATORY_IE_MISSING;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (req->msisdn.presence == 0) {
 | 
				
			||||||
 | 
					        ogs_error("No MSISDN");
 | 
				
			||||||
 | 
					        cause_value = OGS_GTP1_CAUSE_MANDATORY_IE_MISSING;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (req->quality_of_service_profile.presence == 0) {
 | 
					    if (req->quality_of_service_profile.presence == 0) {
 | 
				
			||||||
        ogs_error("No QoS Profile");
 | 
					        ogs_error("No QoS Profile");
 | 
				
			||||||
        cause_value = OGS_GTP1_CAUSE_MANDATORY_IE_MISSING;
 | 
					        cause_value = OGS_GTP1_CAUSE_MANDATORY_IE_MISSING;
 | 
				
			||||||
@@ -141,6 +145,19 @@ uint8_t smf_gn_handle_create_pdp_context_request(
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set MSISDN: */
 | 
				
			||||||
 | 
					    /* TS 29.060 sec 7.7.33, TS 29.002 ISDN-AddressString
 | 
				
			||||||
 | 
					     * 1 byte offset: Get rid of address and numbering plan indicator  */
 | 
				
			||||||
 | 
					    if (req->msisdn.len == 0 || (req->msisdn.len - 1) > sizeof(smf_ue->msisdn))  {
 | 
				
			||||||
 | 
					        ogs_error("MSISDN wrong size %u > %zu", (req->msisdn.len - 1), sizeof(smf_ue->msisdn));
 | 
				
			||||||
 | 
					        return OGS_GTP1_CAUSE_MANDATORY_IE_INCORRECT;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    smf_ue->msisdn_len = req->msisdn.len - 1;
 | 
				
			||||||
 | 
					    if (smf_ue->msisdn_len > 0) {
 | 
				
			||||||
 | 
					        memcpy(smf_ue->msisdn, (uint8_t*)req->msisdn.data + 1, smf_ue->msisdn_len);
 | 
				
			||||||
 | 
					        ogs_buffer_to_bcd(smf_ue->msisdn, smf_ue->msisdn_len, smf_ue->msisdn_bcd);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Set Bearer QoS */
 | 
					    /* Set Bearer QoS */
 | 
				
			||||||
    rv = ogs_gtp1_parse_qos_profile(&qos_pdec,
 | 
					    rv = ogs_gtp1_parse_qos_profile(&qos_pdec,
 | 
				
			||||||
        &req->quality_of_service_profile);
 | 
					        &req->quality_of_service_profile);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -457,7 +457,7 @@ void smf_gy_send_ccr(smf_sess_t *sess, void *xact,
 | 
				
			|||||||
    ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
 | 
					    ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
 | 
				
			||||||
    ogs_assert(ret == 0);
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Subscription-Id */
 | 
					    /* Subscription-Id (IMSI) */
 | 
				
			||||||
    ret = fd_msg_avp_new(ogs_diam_subscription_id, 0, &avp);
 | 
					    ret = fd_msg_avp_new(ogs_diam_subscription_id, 0, &avp);
 | 
				
			||||||
    ogs_assert(ret == 0);
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -481,6 +481,30 @@ void smf_gy_send_ccr(smf_sess_t *sess, void *xact,
 | 
				
			|||||||
    ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
 | 
					    ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
 | 
				
			||||||
    ogs_assert(ret == 0);
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Subscription-Id (MSISDN) */
 | 
				
			||||||
 | 
					    ret = fd_msg_avp_new(ogs_diam_subscription_id, 0, &avp);
 | 
				
			||||||
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = fd_msg_avp_new(ogs_diam_subscription_id_type, 0, &avpch1);
 | 
				
			||||||
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					    val.i32 = OGS_DIAM_SUBSCRIPTION_ID_TYPE_END_USER_E164;
 | 
				
			||||||
 | 
					    ret = fd_msg_avp_setvalue (avpch1, &val);
 | 
				
			||||||
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					    ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
 | 
				
			||||||
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = fd_msg_avp_new(ogs_diam_subscription_id_data, 0, &avpch1);
 | 
				
			||||||
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					    val.os.data = (uint8_t *)smf_ue->msisdn_bcd;
 | 
				
			||||||
 | 
					    val.os.len = strlen(smf_ue->msisdn_bcd);
 | 
				
			||||||
 | 
					    ret = fd_msg_avp_setvalue (avpch1, &val);
 | 
				
			||||||
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					    ret = fd_msg_avp_add (avp, MSG_BRW_LAST_CHILD, avpch1);
 | 
				
			||||||
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = fd_msg_avp_add(req, MSG_BRW_LAST_CHILD, avp);
 | 
				
			||||||
 | 
					    ogs_assert(ret == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Termination-Cause */
 | 
					    /* Termination-Cause */
 | 
				
			||||||
    if (cc_request_type == OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST) {
 | 
					    if (cc_request_type == OGS_DIAM_GY_CC_REQUEST_TYPE_TERMINATION_REQUEST) {
 | 
				
			||||||
        ret = fd_msg_avp_new(ogs_diam_termination_cause, 0, &avp);
 | 
					        ret = fd_msg_avp_new(ogs_diam_termination_cause, 0, &avp);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,6 +78,10 @@ uint8_t smf_s5c_handle_create_session_request(
 | 
				
			|||||||
        ogs_error("No IMSI");
 | 
					        ogs_error("No IMSI");
 | 
				
			||||||
        cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
 | 
					        cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (req->msisdn.presence == 0) {
 | 
				
			||||||
 | 
					        ogs_error("No MSISDN");
 | 
				
			||||||
 | 
					        cause_value = OGS_GTP2_CAUSE_CONDITIONAL_IE_MISSING;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (req->sender_f_teid_for_control_plane.presence == 0) {
 | 
					    if (req->sender_f_teid_for_control_plane.presence == 0) {
 | 
				
			||||||
        ogs_error("No TEID");
 | 
					        ogs_error("No TEID");
 | 
				
			||||||
        cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
 | 
					        cause_value = OGS_GTP2_CAUSE_MANDATORY_IE_MISSING;
 | 
				
			||||||
@@ -150,6 +154,18 @@ uint8_t smf_s5c_handle_create_session_request(
 | 
				
			|||||||
    smf_ue = sess->smf_ue;
 | 
					    smf_ue = sess->smf_ue;
 | 
				
			||||||
    ogs_assert(smf_ue);
 | 
					    ogs_assert(smf_ue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set MSISDN: */
 | 
				
			||||||
 | 
					    /* TS 29.274 sec 8.11, TS 29.002 ISDN-AddressString  */
 | 
				
			||||||
 | 
					    if (req->msisdn.len > sizeof(smf_ue->msisdn))  {
 | 
				
			||||||
 | 
					        ogs_error("MSISDN wrong size %u > %zu", req->msisdn.len, sizeof(smf_ue->msisdn));
 | 
				
			||||||
 | 
					        return OGS_GTP2_CAUSE_MANDATORY_IE_INCORRECT;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    smf_ue->msisdn_len = req->msisdn.len;
 | 
				
			||||||
 | 
					    if (smf_ue->msisdn_len > 0) {
 | 
				
			||||||
 | 
					        memcpy(smf_ue->msisdn, req->msisdn.data, smf_ue->msisdn_len);
 | 
				
			||||||
 | 
					        ogs_buffer_to_bcd(smf_ue->msisdn, smf_ue->msisdn_len, smf_ue->msisdn_bcd);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_EUTRAN) {
 | 
					    if (sess->gtp_rat_type == OGS_GTP2_RAT_TYPE_EUTRAN) {
 | 
				
			||||||
        /* User Location Inforation is mandatory only for E-UTRAN */
 | 
					        /* User Location Inforation is mandatory only for E-UTRAN */
 | 
				
			||||||
        ogs_assert(req->user_location_information.presence);
 | 
					        ogs_assert(req->user_location_information.presence);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1291,6 +1291,10 @@ bson_t *test_db_new_simple(test_ue_t *test_ue)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    doc = BCON_NEW(
 | 
					    doc = BCON_NEW(
 | 
				
			||||||
            "imsi", BCON_UTF8(test_ue->imsi),
 | 
					            "imsi", BCON_UTF8(test_ue->imsi),
 | 
				
			||||||
 | 
					            "msisdn", "[",
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_MSISDN),
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_ADDITIONAL_MSISDN),
 | 
				
			||||||
 | 
					            "]",
 | 
				
			||||||
            "ambr", "{",
 | 
					            "ambr", "{",
 | 
				
			||||||
                "downlink", "{",
 | 
					                "downlink", "{",
 | 
				
			||||||
                    "value", BCON_INT32(1),
 | 
					                    "value", BCON_INT32(1),
 | 
				
			||||||
@@ -1351,6 +1355,10 @@ bson_t *test_db_new_qos_flow(test_ue_t *test_ue)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    doc = BCON_NEW(
 | 
					    doc = BCON_NEW(
 | 
				
			||||||
            "imsi", BCON_UTF8(test_ue->imsi),
 | 
					            "imsi", BCON_UTF8(test_ue->imsi),
 | 
				
			||||||
 | 
					            "msisdn", "[",
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_MSISDN),
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_ADDITIONAL_MSISDN),
 | 
				
			||||||
 | 
					            "]",
 | 
				
			||||||
            "ambr", "{",
 | 
					            "ambr", "{",
 | 
				
			||||||
                "downlink", "{",
 | 
					                "downlink", "{",
 | 
				
			||||||
                    "value", BCON_INT32(1),
 | 
					                    "value", BCON_INT32(1),
 | 
				
			||||||
@@ -1451,6 +1459,10 @@ bson_t *test_db_new_session(test_ue_t *test_ue)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    doc = BCON_NEW(
 | 
					    doc = BCON_NEW(
 | 
				
			||||||
            "imsi", BCON_UTF8(test_ue->imsi),
 | 
					            "imsi", BCON_UTF8(test_ue->imsi),
 | 
				
			||||||
 | 
					            "msisdn", "[",
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_MSISDN),
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_ADDITIONAL_MSISDN),
 | 
				
			||||||
 | 
					            "]",
 | 
				
			||||||
            "ambr", "{",
 | 
					            "ambr", "{",
 | 
				
			||||||
                "downlink", "{",
 | 
					                "downlink", "{",
 | 
				
			||||||
                    "value", BCON_INT32(1),
 | 
					                    "value", BCON_INT32(1),
 | 
				
			||||||
@@ -1725,6 +1737,10 @@ bson_t *test_db_new_slice_with_same_dnn(test_ue_t *test_ue)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    doc = BCON_NEW(
 | 
					    doc = BCON_NEW(
 | 
				
			||||||
            "imsi", BCON_UTF8(test_ue->imsi),
 | 
					            "imsi", BCON_UTF8(test_ue->imsi),
 | 
				
			||||||
 | 
					            "msisdn", "[",
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_MSISDN),
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_ADDITIONAL_MSISDN),
 | 
				
			||||||
 | 
					            "]",
 | 
				
			||||||
            "ambr", "{",
 | 
					            "ambr", "{",
 | 
				
			||||||
                "downlink", "{",
 | 
					                "downlink", "{",
 | 
				
			||||||
                    "value", BCON_INT32(1),
 | 
					                    "value", BCON_INT32(1),
 | 
				
			||||||
@@ -2098,6 +2114,10 @@ bson_t *test_db_new_slice_with_different_dnn(test_ue_t *test_ue)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    doc = BCON_NEW(
 | 
					    doc = BCON_NEW(
 | 
				
			||||||
            "imsi", BCON_UTF8(test_ue->imsi),
 | 
					            "imsi", BCON_UTF8(test_ue->imsi),
 | 
				
			||||||
 | 
					            "msisdn", "[",
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_MSISDN),
 | 
				
			||||||
 | 
					                BCON_UTF8(TEST_ADDITIONAL_MSISDN),
 | 
				
			||||||
 | 
					            "]",
 | 
				
			||||||
            "ambr", "{",
 | 
					            "ambr", "{",
 | 
				
			||||||
                "downlink", "{",
 | 
					                "downlink", "{",
 | 
				
			||||||
                    "value", BCON_INT32(1),
 | 
					                    "value", BCON_INT32(1),
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user