We have to eat all the bytes, not only one. We have to get the bit we want from the right buffer position. Note: only one bit is supported from this "EPS network feature support", not sure how to properly deal with it, so let's keep the code as it is. This commit was made because the MAGMA MME sends "EPS network feature support" to the UE in the NAS message "Attach Accept". OAI MME does not send this. So the bug about size was not seen.
90 lines
2.8 KiB
C
90 lines
2.8 KiB
C
/*
|
|
* 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
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
|
|
|
|
#include "TLVEncoder.h"
|
|
#include "TLVDecoder.h"
|
|
#include "EpsNetworkFeatureSupport.h"
|
|
|
|
int decode_eps_network_feature_support(EpsNetworkFeatureSupport *epsnetworkfeaturesupport, uint8_t iei, uint8_t *buffer, uint32_t len)
|
|
{
|
|
int decoded = 0;
|
|
uint8_t ielen = 0;
|
|
|
|
if (iei > 0) {
|
|
CHECK_IEI_DECODER(iei, *buffer);
|
|
decoded++;
|
|
}
|
|
|
|
ielen = *(buffer + decoded);
|
|
decoded++;
|
|
CHECK_LENGTH_DECODER(len - decoded, ielen);
|
|
/* note: only the bit "IMS voice over PS session in S1 mode" is processed
|
|
* TODO: deal with other bits?
|
|
*/
|
|
*epsnetworkfeaturesupport = (*(buffer + decoded)) & 0x1;
|
|
decoded += ielen;
|
|
#if defined (NAS_DEBUG)
|
|
dump_eps_network_feature_support_xml(epsnetworkfeaturesupport, iei);
|
|
#endif
|
|
return decoded;
|
|
}
|
|
int encode_eps_network_feature_support(EpsNetworkFeatureSupport *epsnetworkfeaturesupport, uint8_t iei, uint8_t *buffer, uint32_t len)
|
|
{
|
|
uint8_t *lenPtr;
|
|
uint32_t encoded = 0;
|
|
/* Checking IEI and pointer */
|
|
CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, EPS_NETWORK_FEATURE_SUPPORT_MINIMUM_LENGTH, len);
|
|
#if defined (NAS_DEBUG)
|
|
dump_eps_network_feature_support_xml(epsnetworkfeaturesupport, iei);
|
|
#endif
|
|
|
|
if (iei > 0) {
|
|
*buffer = iei;
|
|
encoded++;
|
|
}
|
|
|
|
lenPtr = (buffer + encoded);
|
|
encoded ++;
|
|
*(buffer + encoded) = 0x00 |
|
|
(*epsnetworkfeaturesupport & 0x1);
|
|
encoded++;
|
|
*lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
|
|
return encoded;
|
|
}
|
|
|
|
void dump_eps_network_feature_support_xml(EpsNetworkFeatureSupport *epsnetworkfeaturesupport, uint8_t iei)
|
|
{
|
|
printf("<Eps Network Feature Support>\n");
|
|
|
|
if (iei > 0)
|
|
/* Don't display IEI if = 0 */
|
|
printf(" <IEI>0x%X</IEI>\n", iei);
|
|
|
|
printf(" <IMS VoPS>%u</IMS VoPS>\n", *epsnetworkfeaturesupport);
|
|
printf("</Eps Network Feature Support>\n");
|
|
}
|
|
|