Commit 0c4ba24a authored by navid's avatar navid

add NetworkFeatureSupport message for attach request

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7747 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent a262968a
...@@ -1173,6 +1173,7 @@ set(libnas_ies_OBJS ...@@ -1173,6 +1173,7 @@ set(libnas_ies_OBJS
${NAS_SRC}COMMON/IES/MobileStationClassmark2.c ${NAS_SRC}COMMON/IES/MobileStationClassmark2.c
${NAS_SRC}COMMON/IES/MobileStationClassmark3.c ${NAS_SRC}COMMON/IES/MobileStationClassmark3.c
${NAS_SRC}COMMON/IES/MsNetworkCapability.c ${NAS_SRC}COMMON/IES/MsNetworkCapability.c
${NAS_SRC}COMMON/IES/MsNetworkFeatureSupport.c
${NAS_SRC}COMMON/IES/NasKeySetIdentifier.c ${NAS_SRC}COMMON/IES/NasKeySetIdentifier.c
${NAS_SRC}COMMON/IES/NasMessageContainer.c ${NAS_SRC}COMMON/IES/NasMessageContainer.c
${NAS_SRC}COMMON/IES/NasRequestType.c ${NAS_SRC}COMMON/IES/NasRequestType.c
......
...@@ -217,8 +217,9 @@ int decode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u ...@@ -217,8 +217,9 @@ int decode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u
case ATTACH_REQUEST_SUPPORTED_CODECS_IEI: case ATTACH_REQUEST_SUPPORTED_CODECS_IEI:
if ((decoded_result = if ((decoded_result =
decode_supported_codec_list(&attach_request->supportedcodecs, decode_supported_codec_list(&attach_request->supportedcodecs,
ATTACH_REQUEST_SUPPORTED_CODECS_IEI, buffer + decoded, len ATTACH_REQUEST_SUPPORTED_CODECS_IEI,
- decoded)) <= 0) { buffer + decoded,
len - decoded)) <= 0) {
// return decoded_result; // return decoded_result;
LOG_FUNC_RETURN(decoded_result); LOG_FUNC_RETURN(decoded_result);
} }
...@@ -270,11 +271,25 @@ int decode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u ...@@ -270,11 +271,25 @@ 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; attach_request->presencemask |= ATTACH_REQUEST_VOICE_DOMAIN_PREFERENCE_AND_UE_USAGE_SETTING_PRESENT;
break; 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: default:
errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI;
{ {
// return TLV_DECODE_UNEXPECTED_IEI; // 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); LOG_FUNC_RETURN(TLV_DECODE_UNEXPECTED_IEI);
} }
} }
...@@ -469,6 +484,19 @@ int encode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u ...@@ -469,6 +484,19 @@ int encode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u
encoded += encode_result; 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; return encoded;
} }
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include "TrackingAreaIdentity.h" #include "TrackingAreaIdentity.h"
#include "DrxParameter.h" #include "DrxParameter.h"
#include "MsNetworkCapability.h" #include "MsNetworkCapability.h"
#include "MsNetworkFeatureSupport.h"
#include "LocationAreaIdentification.h" #include "LocationAreaIdentification.h"
#include "TmsiStatus.h" #include "TmsiStatus.h"
#include "MobileStationClassmark2.h" #include "MobileStationClassmark2.h"
...@@ -74,6 +75,7 @@ ...@@ -74,6 +75,7 @@
TRACKING_AREA_IDENTITY_MAXIMUM_LENGTH + \ TRACKING_AREA_IDENTITY_MAXIMUM_LENGTH + \
DRX_PARAMETER_MAXIMUM_LENGTH + \ DRX_PARAMETER_MAXIMUM_LENGTH + \
MS_NETWORK_CAPABILITY_MAXIMUM_LENGTH + \ MS_NETWORK_CAPABILITY_MAXIMUM_LENGTH + \
MS_NETWORK_FEATURE_SUPPORT_MAXIMUM_LENGTH + \
LOCATION_AREA_IDENTIFICATION_MAXIMUM_LENGTH + \ LOCATION_AREA_IDENTIFICATION_MAXIMUM_LENGTH + \
TMSI_STATUS_MAXIMUM_LENGTH + \ TMSI_STATUS_MAXIMUM_LENGTH + \
MOBILE_STATION_CLASSMARK_2_MAXIMUM_LENGTH + \ MOBILE_STATION_CLASSMARK_2_MAXIMUM_LENGTH + \
...@@ -98,12 +100,14 @@ ...@@ -98,12 +100,14 @@
# define ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT (1<<10) # define ATTACH_REQUEST_ADDITIONAL_UPDATE_TYPE_PRESENT (1<<10)
# define ATTACH_REQUEST_OLD_GUTI_TYPE_PRESENT (1<<11) # 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_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 { typedef enum attach_request_iei_tag {
ATTACH_REQUEST_OLD_PTMSI_SIGNATURE_IEI = 0x19, /* 0x19 = 25 */ ATTACH_REQUEST_OLD_PTMSI_SIGNATURE_IEI = 0x19, /* 0x19 = 25 */
ATTACH_REQUEST_ADDITIONAL_GUTI_IEI = 0x50, /* 0x50 = 80 */ ATTACH_REQUEST_ADDITIONAL_GUTI_IEI = 0x50, /* 0x50 = 80 */
ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_IEI = 0x52, /* 0x52 = 82 */ ATTACH_REQUEST_LAST_VISITED_REGISTERED_TAI_IEI = 0x52, /* 0x52 = 82 */
ATTACH_REQUEST_DRX_PARAMETER_IEI = 0x5C, /* 0x5C = 92 */ 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_MS_NETWORK_CAPABILITY_IEI = 0x31, /* 0x31 = 49 */
ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_IEI = 0x13, /* 0x13 = 19 */ ATTACH_REQUEST_OLD_LOCATION_AREA_IDENTIFICATION_IEI = 0x13, /* 0x13 = 19 */
ATTACH_REQUEST_TMSI_STATUS_IEI = 0x90, /* 0x90 = 144 */ ATTACH_REQUEST_TMSI_STATUS_IEI = 0x90, /* 0x90 = 144 */
...@@ -147,6 +151,7 @@ typedef struct attach_request_msg_tag { ...@@ -147,6 +151,7 @@ typedef struct attach_request_msg_tag {
AdditionalUpdateType additionalupdatetype; AdditionalUpdateType additionalupdatetype;
GutiType oldgutitype; GutiType oldgutitype;
VoiceDomainPreferenceAndUeUsageSetting voicedomainpreferenceandueusagesetting; VoiceDomainPreferenceAndUeUsageSetting voicedomainpreferenceandueusagesetting;
MsNetworkFeatureSupport msnetworkfeaturesupport;
} attach_request_msg; } attach_request_msg;
int decode_attach_request(attach_request_msg *attachrequest, uint8_t *buffer, uint32_t len); int decode_attach_request(attach_request_msg *attachrequest, uint8_t *buffer, uint32_t len);
......
/*******************************************************************************
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");
}
/*******************************************************************************
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_ */
...@@ -132,7 +132,7 @@ void tlv_decode_perror(void); ...@@ -132,7 +132,7 @@ void tlv_decode_perror(void);
if(iEI != bUFFER) \ if(iEI != bUFFER) \
{ \ { \
printf("IEI is different than the one expected." \ 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; \ errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI; \
LOG_FUNC_RETURN(TLV_DECODE_UNEXPECTED_IEI); \ LOG_FUNC_RETURN(TLV_DECODE_UNEXPECTED_IEI); \
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment