Refactor 5GS registration result enc/dec functions
* adopt byte_array * move enc/dec functions to Registration Accept library * simplify code * log result received in Registration Accept
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
add_library(fgs_5gmm_ies_lib OBJECT
|
add_library(fgs_5gmm_ies_lib OBJECT
|
||||||
FGSMobileIdentity.c
|
FGSMobileIdentity.c
|
||||||
FGSRegistrationType.c
|
FGSRegistrationType.c
|
||||||
FGSRegistrationResult.c
|
|
||||||
FGMMCapability.c
|
FGMMCapability.c
|
||||||
NrUESecurityCapability.c
|
NrUESecurityCapability.c
|
||||||
FGCNasMessageContainer.c
|
FGCNasMessageContainer.c
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
/*
|
|
||||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
||||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
||||||
* except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.openairinterface.org/?page_id=698
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*-------------------------------------------------------------------------------
|
|
||||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
||||||
* contact@openairinterface.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*! \file FGSRegistrationResult.c
|
|
||||||
|
|
||||||
\brief 5GS Registration result for registration request procedures
|
|
||||||
\author Yoshio INOUE, Masayuki HARADA
|
|
||||||
\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
|
|
||||||
\date 2020
|
|
||||||
\version 0.1
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "TLVEncoder.h"
|
|
||||||
#include "TLVDecoder.h"
|
|
||||||
#include "FGSRegistrationResult.h"
|
|
||||||
|
|
||||||
int decode_fgs_registration_result(FGSRegistrationResult *fgsregistrationresult, uint8_t iei, uint16_t value, uint32_t len)
|
|
||||||
{
|
|
||||||
int decoded = 0;
|
|
||||||
uint16_t *buffer = &value;
|
|
||||||
fgsregistrationresult->registrationresult = *buffer & 0x7;
|
|
||||||
fgsregistrationresult->smsallowed = *buffer & 0x8;
|
|
||||||
decoded = decoded + 2;
|
|
||||||
return decoded;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t encode_fgs_registration_result(const FGSRegistrationResult *fgsregistrationresult)
|
|
||||||
{
|
|
||||||
uint16_t bufferReturn;
|
|
||||||
uint16_t *buffer = &bufferReturn;
|
|
||||||
uint8_t encoded = 0;
|
|
||||||
*(buffer + encoded) = 0x00 | (fgsregistrationresult->smsallowed & 0x8) | (fgsregistrationresult->registrationresult & 0x7);
|
|
||||||
encoded = encoded + 2;
|
|
||||||
|
|
||||||
return bufferReturn;
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
|
||||||
* this work for additional information regarding copyright ownership.
|
|
||||||
* The OpenAirInterface Software Alliance licenses this file to You under
|
|
||||||
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
|
|
||||||
* except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.openairinterface.org/?page_id=698
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*-------------------------------------------------------------------------------
|
|
||||||
* For more information about the OpenAirInterface (OAI) Software Alliance:
|
|
||||||
* contact@openairinterface.org
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*! \file FGSRegistrationResult.h
|
|
||||||
|
|
||||||
\brief 5GS Registration result for registration request procedures
|
|
||||||
\author Yoshio INOUE, Masayuki HARADA
|
|
||||||
\email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com
|
|
||||||
\date 2020
|
|
||||||
\version 0.1
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "OctetString.h"
|
|
||||||
|
|
||||||
#ifndef FGS_REGISTRATION_RESULT_H_
|
|
||||||
#define FGS_REGISTRATION_RESULT_H_
|
|
||||||
#define FGS_REGISTRATION_RESULT_3GPP 0b001
|
|
||||||
#define FGS_REGISTRATION_RESULT_NON_3GPP 0b010
|
|
||||||
#define FGS_REGISTRATION_RESULT_3GPP_AND_NON_3GPP 0b011
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t iei;
|
|
||||||
uint8_t resultlength;
|
|
||||||
uint8_t spare: 4;
|
|
||||||
uint8_t smsallowed: 1;
|
|
||||||
uint8_t registrationresult: 3;
|
|
||||||
} FGSRegistrationResult;
|
|
||||||
|
|
||||||
uint16_t encode_fgs_registration_result(const FGSRegistrationResult *fgsregistrationresult);
|
|
||||||
|
|
||||||
int decode_fgs_registration_result(FGSRegistrationResult *fgsregistrationresult, uint8_t iei, uint16_t value, uint32_t len);
|
|
||||||
|
|
||||||
#endif /* FGS REGISTRATION RESULT_H_*/
|
|
||||||
@@ -38,8 +38,36 @@
|
|||||||
#include "RegistrationAccept.h"
|
#include "RegistrationAccept.h"
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include "fgs_nas_utils.h"
|
#include "fgs_nas_utils.h"
|
||||||
|
#include "common/utils/utils.h"
|
||||||
|
#include "ds/byte_array.h"
|
||||||
|
|
||||||
#define IEI_5G_GUTI 0x77
|
#define IEI_5G_GUTI 0x77
|
||||||
|
#define FGS_REGISTRATION_RESULT_LEN 2
|
||||||
|
#define REGISTRATION_ACCEPT_MIN_LEN FGS_REGISTRATION_RESULT_LEN // (5GS registration result) 2 octets
|
||||||
|
|
||||||
|
/** @brief Decode 5GS registration result (9.11.3.6 3GPP TS 24.501) */
|
||||||
|
static int decode_fgs_registration_result(registration_accept_msg *out, const byte_array_t buffer)
|
||||||
|
{
|
||||||
|
if (buffer.len < FGS_REGISTRATION_RESULT_LEN) {
|
||||||
|
PRINT_NAS_ERROR("5GS registration result decoding failure: invalid buffer length\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
out->result = buffer.buf[1] & 0x7; // skip length of contents octet
|
||||||
|
out->sms_allowed = buffer.buf[1] & 0x8;
|
||||||
|
return 2; // length 2 octets (no IEI)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int encode_fgs_registration_result(byte_array_t buffer, const registration_accept_msg *out)
|
||||||
|
{
|
||||||
|
if (buffer.len < FGS_REGISTRATION_RESULT_LEN) {
|
||||||
|
PRINT_NAS_ERROR("5GS registration result encoding failure: invalid buffer length\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
uint8_t *buf = buffer.buf;
|
||||||
|
buf[0] = 1;
|
||||||
|
buf[1] = 0x00 | (out->sms_allowed & 0x8) | (out->result & 0x7);
|
||||||
|
return 2; // encoded length 2 octets (no IEI)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allowed NSSAI from Registration Accept according to 3GPP TS 24.501 Table 8.2.7.1.1
|
* @brief Allowed NSSAI from Registration Accept according to 3GPP TS 24.501 Table 8.2.7.1.1
|
||||||
@@ -105,8 +133,9 @@ int decode_registration_accept(registration_accept_msg *registration_accept, con
|
|||||||
int dec = 0;
|
int dec = 0;
|
||||||
const uint8_t *end = buffer + len;
|
const uint8_t *end = buffer + len;
|
||||||
|
|
||||||
/* Decoding mandatory fields */
|
// 5GS registration result (Mandatory)
|
||||||
if ((dec = decode_fgs_registration_result(®istration_accept->fgsregistrationresult, 0, *buffer, len)) < 0)
|
byte_array_t ba = {.buf = buffer, .len = len};
|
||||||
|
if ((dec = decode_fgs_registration_result(registration_accept, ba)) < 0)
|
||||||
return dec;
|
return dec;
|
||||||
buffer += dec;
|
buffer += dec;
|
||||||
|
|
||||||
@@ -149,9 +178,8 @@ int encode_registration_accept(const registration_accept_msg *registration_accep
|
|||||||
int encoded = 0;
|
int encoded = 0;
|
||||||
|
|
||||||
LOG_FUNC_IN;
|
LOG_FUNC_IN;
|
||||||
|
byte_array_t ba = {.buf = buffer, .len = len};
|
||||||
*(buffer + encoded) = encode_fgs_registration_result(®istration_accept->fgsregistrationresult);
|
encoded += encode_fgs_registration_result(ba, registration_accept);
|
||||||
encoded = encoded + 2;
|
|
||||||
|
|
||||||
if (registration_accept->guti) {
|
if (registration_accept->guti) {
|
||||||
int mi_enc = encode_5gs_mobile_identity(registration_accept->guti, 0x77, buffer + encoded, len - encoded);
|
int mi_enc = encode_5gs_mobile_identity(registration_accept->guti, 0x77, buffer + encoded, len - encoded);
|
||||||
|
|||||||
@@ -34,12 +34,17 @@
|
|||||||
|
|
||||||
#include "SecurityHeaderType.h"
|
#include "SecurityHeaderType.h"
|
||||||
#include "MessageType.h"
|
#include "MessageType.h"
|
||||||
#include "FGSRegistrationResult.h"
|
|
||||||
#include "FGSMobileIdentity.h"
|
#include "FGSMobileIdentity.h"
|
||||||
|
|
||||||
#ifndef REGISTRATION_ACCEPT_H_
|
#ifndef REGISTRATION_ACCEPT_H_
|
||||||
#define REGISTRATION_ACCEPT_H_
|
#define REGISTRATION_ACCEPT_H_
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
FGS_REGISTRATION_RESULT_3GPP = 1,
|
||||||
|
FGS_REGISTRATION_RESULT_NON_3GPP = 2,
|
||||||
|
FGS_REGISTRATION_RESULT_3GPP_AND_NON_3GPP = 3
|
||||||
|
} fgs_registration_result_t;
|
||||||
|
|
||||||
// 9.11.3.37 of 3GPP TS 24.501
|
// 9.11.3.37 of 3GPP TS 24.501
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int sst;
|
int sst;
|
||||||
@@ -56,9 +61,10 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct registration_accept_msg_tag {
|
typedef struct registration_accept_msg_tag {
|
||||||
/* Mandatory fields */
|
// 5GS registration result (Mandatory)
|
||||||
FGSRegistrationResult fgsregistrationresult;
|
fgs_registration_result_t result;
|
||||||
/* Optional fields */
|
bool sms_allowed;
|
||||||
|
// 5G-GUTI (Optional)
|
||||||
FGSMobileIdentity *guti;
|
FGSMobileIdentity *guti;
|
||||||
// Allowed NSSAI (O)
|
// Allowed NSSAI (O)
|
||||||
nr_nas_msg_snssai_t nas_allowed_nssai[8];
|
nr_nas_msg_snssai_t nas_allowed_nssai[8];
|
||||||
|
|||||||
@@ -1438,7 +1438,6 @@ static void process_guti(Guti5GSMobileIdentity_t *guti, nr_ue_nas_t *nas)
|
|||||||
|
|
||||||
static void handle_registration_accept(nr_ue_nas_t *nas, const uint8_t *pdu_buffer, uint32_t msg_length)
|
static void handle_registration_accept(nr_ue_nas_t *nas, const uint8_t *pdu_buffer, uint32_t msg_length)
|
||||||
{
|
{
|
||||||
LOG_I(NAS, "[UE] Received REGISTRATION ACCEPT message\n");
|
|
||||||
registration_accept_msg msg = {0};
|
registration_accept_msg msg = {0};
|
||||||
fgs_nas_message_security_header_t sp_header = {0};
|
fgs_nas_message_security_header_t sp_header = {0};
|
||||||
const uint8_t *end = pdu_buffer + msg_length;
|
const uint8_t *end = pdu_buffer + msg_length;
|
||||||
@@ -1465,6 +1464,13 @@ static void handle_registration_accept(nr_ue_nas_t *nas, const uint8_t *pdu_buff
|
|||||||
LOG_E(NAS, "Failed to decode NAS Registration Accept\n");
|
LOG_E(NAS, "Failed to decode NAS Registration Accept\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
LOG_I(NAS,
|
||||||
|
"Received Registration Accept with result %s\n",
|
||||||
|
msg.result == FGS_REGISTRATION_RESULT_3GPP ? "3GPP"
|
||||||
|
: msg.result == FGS_REGISTRATION_RESULT_NON_3GPP ? "non-3PP"
|
||||||
|
: "3GPP and non-3GPP");
|
||||||
|
LOG_I(NAS, "SMS %s in 5GS Registration Result\n", msg.sms_allowed ? "allowed" : "not allowed");
|
||||||
|
|
||||||
pdu_buffer += decoded;
|
pdu_buffer += decoded;
|
||||||
// process GUTI
|
// process GUTI
|
||||||
if (msg.guti) {
|
if (msg.guti) {
|
||||||
|
|||||||
Reference in New Issue
Block a user