From 0c4ba24a8a51281bf90675bba68fb487d23ae121 Mon Sep 17 00:00:00 2001 From: navid <navid@mycompany.com> Date: Mon, 27 Jul 2015 13:03:44 +0000 Subject: [PATCH] add NetworkFeatureSupport message for attach request git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7747 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- cmake_targets/CMakeLists.txt | 1 + openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c | 36 +++++++- openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h | 5 ++ .../NAS/COMMON/IES/MsNetworkFeatureSupport.c | 85 +++++++++++++++++++ .../NAS/COMMON/IES/MsNetworkFeatureSupport.h | 53 ++++++++++++ openair-cn/NAS/COMMON/UTIL/TLVDecoder.h | 2 +- 6 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.c create mode 100644 openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.h diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index eea548774a..5c682a1a52 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1173,6 +1173,7 @@ set(libnas_ies_OBJS ${NAS_SRC}COMMON/IES/MobileStationClassmark2.c ${NAS_SRC}COMMON/IES/MobileStationClassmark3.c ${NAS_SRC}COMMON/IES/MsNetworkCapability.c + ${NAS_SRC}COMMON/IES/MsNetworkFeatureSupport.c ${NAS_SRC}COMMON/IES/NasKeySetIdentifier.c ${NAS_SRC}COMMON/IES/NasMessageContainer.c ${NAS_SRC}COMMON/IES/NasRequestType.c diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c b/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c index 15a29b1f29..f301b44a86 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.c @@ -217,8 +217,9 @@ int decode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u case ATTACH_REQUEST_SUPPORTED_CODECS_IEI: if ((decoded_result = decode_supported_codec_list(&attach_request->supportedcodecs, - ATTACH_REQUEST_SUPPORTED_CODECS_IEI, buffer + decoded, len - - decoded)) <= 0) { + ATTACH_REQUEST_SUPPORTED_CODECS_IEI, + buffer + decoded, + len - decoded)) <= 0) { // return decoded_result; LOG_FUNC_RETURN(decoded_result); } @@ -270,12 +271,26 @@ int decode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u attach_request->presencemask |= ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT; break; - + case ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_IEI: + if ((decoded_result = + decode_ms_network_feature_support(&attach_request->msnetworkfeaturesupport, + ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_IEI, + buffer + decoded, len - decoded)) <= 0) { + // return decoded_result; + LOG_FUNC_RETURN(decoded_result); + } + + decoded += decoded_result; + /* Set corresponding mask to 1 in presencemask */ + attach_request->presencemask |= ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT; + break; default: + errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; { // return TLV_DECODE_UNEXPECTED_IEI; - LOG_FUNC_RETURN(TLV_DECODE_UNEXPECTED_IEI); + LOG_TRACE(INFO,"EMM: Can't decode the message with iei %d\n",ieiDecoded); + LOG_FUNC_RETURN(TLV_DECODE_UNEXPECTED_IEI); } } } @@ -469,6 +484,19 @@ int encode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u encoded += encode_result; } + if ((attach_request->presencemask & ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT) + == ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT) { + if ((encode_result = + encode_ms_network_feature_support(&attach_request->msnetworkfeaturesupport, + ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_IEI, + buffer + encoded, + len - encoded)) < 0) + // Return in case of error + return encode_result; + else + encoded += encode_result; + } + return encoded; } diff --git a/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h b/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h index 5368df7fc7..f19c53f1ad 100644 --- a/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h +++ b/openair-cn/NAS/COMMON/EMM/MSG/AttachRequest.h @@ -42,6 +42,7 @@ #include "TrackingAreaIdentity.h" #include "DrxParameter.h" #include "MsNetworkCapability.h" +#include "MsNetworkFeatureSupport.h" #include "LocationAreaIdentification.h" #include "TmsiStatus.h" #include "MobileStationClassmark2.h" @@ -74,6 +75,7 @@ TRACKING_AREA_IDENTITY_MAXIMUM_LENGTH + \ DRX_PARAMETER_MAXIMUM_LENGTH + \ MS_NETWORK_CAPABILITY_MAXIMUM_LENGTH + \ + MS_NETWORK_FEATURE_SUPPORT_MAXIMUM_LENGTH + \ LOCATION_AREA_IDENTIFICATION_MAXIMUM_LENGTH + \ TMSI_STATUS_MAXIMUM_LENGTH + \ MOBILE_STATION_CLASSMARK_2_MAXIMUM_LENGTH + \ @@ -98,12 +100,14 @@ # define ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT (1<<10) # define ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT (1<<11) # define ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT (1<<12) +# define ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_PRESENT (1<<13) typedef enum attach_request_iei_tag { ATTACH_REQUEST_OLD_PTMSI_SIGNATURE_IEI = 0x19, /* 0x19 = 25 */ ATTACH_REQUEST_ADDITIONAL_GUTI_IEI = 0x50, /* 0x50 = 80 */ ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_IEI = 0x52, /* 0x52 = 82 */ ATTACH_REQUEST_DRX_PARAMETER_IEI = 0x5C, /* 0x5C = 92 */ + ATTACH_REQUEST_MS_NETWORK_FEATURE_SUPPORT_IEI = 0xC0, /* 0xC- = 192- */ ATTACH_REQUEST_MS_NETWORK_CAPABILITY_IEI = 0x31, /* 0x31 = 49 */ ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_IEI = 0x13, /* 0x13 = 19 */ ATTACH_REQUEST_TMSI_STATUS_IEI = 0x90, /* 0x90 = 144 */ @@ -147,6 +151,7 @@ typedef struct attach_request_msg_tag { AdditionalUpdateType additionalupdatetype; GutiType oldgutitype; VoiceDomainPreferenceAndUeUsageSetting voicedomainpreferenceandueusagesetting; + MsNetworkFeatureSupport msnetworkfeaturesupport; } attach_request_msg; int decode_attach_request(attach_request_msg *attachrequest, uint8_t *buffer, uint32_t len); diff --git a/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.c b/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.c new file mode 100644 index 0000000000..e05968c2d5 --- /dev/null +++ b/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.c @@ -0,0 +1,85 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see <http://www.gnu.org/licenses/>. + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@eurecom.fr + + Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. + + *******************************************************************************/ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + + +#include "TLVEncoder.h" +#include "TLVDecoder.h" +#include "MsNetworkFeatureSupport.h" + +int decode_ms_network_feature_support(MsNetworkFeatureSupport *msnetworkfeaturesupport, uint8_t iei, uint8_t *buffer, uint32_t len) +{ + int decoded = 0; + + + if (iei > 0) { + CHECK_IEI_DECODER(iei, (*buffer & 0xc0)); + } + msnetworkfeaturesupport->spare_bits= (*(buffer + decoded) >> 3) & 0x7; + msnetworkfeaturesupport->extended_periodic_timers= *(buffer + decoded) & 0x1; + decoded++; + +#if defined (NAS_DEBUG) + dump_ms_network_feature_support_xml(msnetworkfeaturesupport, iei); +#endif + return decoded; +} +int encode_ms_network_feature_support(MsNetworkFeatureSupport *msnetworkfeaturesupport, uint8_t iei, uint8_t *buffer, uint32_t len) +{ + uint8_t *lenPtr; + uint32_t encoded = 0; + int encode_result; + /* Checking IEI and pointer */ + CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, MS_NETWORK_FEATURE_SUPPORT_MINIMUM_LENGTH, len); +#if defined (NAS_DEBUG) + dump_ms_network_feature_support_xml(msnetworkfeaturesupport, iei); +#endif + + + *(buffer + encoded) = 0x00 | ((msnetworkfeaturesupport->spare_bits & 0x7) << 3) + | (msnetworkfeaturesupport->extended_periodic_timers & 0x1); + encoded++; + return encoded; +} + +void dump_ms_network_feature_support_xml(MsNetworkFeatureSupport *msnetworkfeaturesupport, uint8_t iei) +{ + printf("<Ms Network Feature Support>\n"); + + if (iei > 0) + /* Don't display IEI if = 0 */ + printf(" <IEI>0x%X</IEI>\n", iei); + + printf(" <spare_bits>%u<spare_bits>\n",msnetworkfeaturesupport->spare_bits); + printf(" <extended_periodic_timer>%u<extended_periodic_timer>\n",msnetworkfeaturesupport->extended_periodic_timers); + printf("</Ms Network Feature Support>\n"); +} + diff --git a/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.h b/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.h new file mode 100644 index 0000000000..334430de1a --- /dev/null +++ b/openair-cn/NAS/COMMON/IES/MsNetworkFeatureSupport.h @@ -0,0 +1,53 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see <http://www.gnu.org/licenses/>. + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@eurecom.fr + + Address : Eurecom, Compus SophiaTech 450, route des chappes, 06451 Biot, France. + + *******************************************************************************/ +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +#include "OctetString.h" + +#ifndef MS_NETWORK_FEATURE_SUPPORT_H_ +#define MS_NETWORK_FEATURE_SUPPORT_H_ + +#define MS_NETWORK_FEATURE_SUPPORT_MINIMUM_LENGTH 3 +#define MS_NETWORK_FEATURE_SUPPORT_MAXIMUM_LENGTH 10 + +typedef struct MsNetworkFeatureSupport_tag { + uint8_t spare_bits:3; + uint8_t extended_periodic_timers:1; +} MsNetworkFeatureSupport; + +int encode_ms_network_feature_support(MsNetworkFeatureSupport *msnetworkfeaturesupport, uint8_t iei, uint8_t *buffer, uint32_t len); + +int decode_ms_network_feature_support(MsNetworkFeatureSupport *msnetworkfeaturesupport, uint8_t iei, uint8_t *buffer, uint32_t len); + +void dump_ms_network_feature_support_xml(MsNetworkFeatureSupport *msnetworkfeaturesupport, uint8_t iei); + +#endif /* MS NETWORK CAPABILITY_H_ */ + diff --git a/openair-cn/NAS/COMMON/UTIL/TLVDecoder.h b/openair-cn/NAS/COMMON/UTIL/TLVDecoder.h index 6e1764edad..152fd9c737 100644 --- a/openair-cn/NAS/COMMON/UTIL/TLVDecoder.h +++ b/openair-cn/NAS/COMMON/UTIL/TLVDecoder.h @@ -132,7 +132,7 @@ void tlv_decode_perror(void); if(iEI != bUFFER) \ { \ printf("IEI is different than the one expected." \ - "(Got: 0x%x, expecting: 0x%x\n", bUFFER, iEI); \ + "(Got: 0x%x, expecting: 0x%x)\n", bUFFER, iEI); \ errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; \ LOG_FUNC_RETURN(TLV_DECODE_UNEXPECTED_IEI); \ } -- GitLab