Merge branch 'develop1B' of https://gitlab.eurecom.fr/oai1B/openairinterface5g into bugfix-44

This commit is contained in:
hbilel
2016-12-13 12:27:41 +01:00
331 changed files with 40378 additions and 1567 deletions
+2 -1
View File
@@ -188,10 +188,11 @@ int decode_attach_accept(attach_accept_msg *attach_accept, uint8_t *buffer, uint
default:
errorCodeDecoder = TLV_DECODE_UNEXPECTED_IEI;
LOG_TRACE(WARNING, "DECODE_UNEXPECTED_IEI %x (4 bits)", ieiDecoded);
return TLV_DECODE_UNEXPECTED_IEI;
}
}
LOG_TRACE(WARNING, "DECODED %d\n", decoded);
return decoded;
}
@@ -38,7 +38,7 @@ int decode_authentication_request(authentication_request_msg *authentication_req
CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, AUTHENTICATION_REQUEST_MINIMUM_LENGTH, len);
/* Decoding mandatory fields */
if ((decoded_result = decode_u8_nas_key_set_identifier(&authentication_request->naskeysetidentifierasme, 0, *(buffer + decoded) >> 4, len - decoded)) < 0)
if ((decoded_result = decode_u8_nas_key_set_identifier(&authentication_request->naskeysetidentifierasme, 0, *(buffer + decoded), len - decoded)) < 0)
return decoded_result;
decoded++;
@@ -72,6 +72,8 @@ int decode_security_mode_command(security_mode_command_msg *security_mode_comman
decoded += decoded_result;
/* Set corresponding mask to 1 in presencemask */
security_mode_command->presencemask |= SECURITY_MODE_COMMAND_IMEISV_REQUEST_PRESENT;
LOG_TRACE(INFO," SECURITY MODE COMMAND: IMEISV_REQUEST: %d \n",security_mode_command->imeisvrequest);
break;
case SECURITY_MODE_COMMAND_REPLAYED_NONCEUE_IEI:
@@ -76,8 +76,11 @@ int encode_security_mode_complete(security_mode_complete_msg *security_mode_comp
/* Checking IEI and pointer */
CHECK_PDU_POINTER_AND_LENGTH_ENCODER(buffer, SECURITY_MODE_COMPLETE_MINIMUM_LENGTH, len);
LOG_TRACE(INFO,"SECURITY MODE COMMAND COMPLETE: presencemask: %d \n",security_mode_complete->presencemask);
if ((security_mode_complete->presencemask & SECURITY_MODE_COMPLETE_IMEISV_PRESENT)
== SECURITY_MODE_COMPLETE_IMEISV_PRESENT) {
LOG_TRACE(INFO,"SECURITY MODE COMMAND COMPLETE: encode imeisv \n");
if ((encode_result =
encode_mobile_identity(&security_mode_complete->imeisv,
SECURITY_MODE_COMPLETE_IMEISV_IEI, buffer + encoded, len -
@@ -87,7 +90,7 @@ int encode_security_mode_complete(security_mode_complete_msg *security_mode_comp
else
encoded += encode_result;
}
LOG_TRACE(INFO,"SECURITY MODE COMMAND COMPLETE done !!! \n");
return encoded;
}
+42 -12
View File
@@ -41,10 +41,24 @@ int decode_emergency_number_list(EmergencyNumberList *emergencynumberlist, uint8
ielen = *(buffer + decoded);
decoded++;
CHECK_LENGTH_DECODER(len - decoded, ielen);
emergencynumberlist->lengthofemergency = *(buffer + decoded);
decoded++;
emergencynumberlist->emergencyservicecategoryvalue = *(buffer + decoded) & 0x1f;
decoded++;
int information_element_index = 0;
while ((decoded < ielen) && (information_element_index < EMERGENCY_NUMBER_LIST_MAX_NUMBER_INFORMATION)) {
emergencynumberlist->emergency_number_information[information_element_index].lengthofemergency = *(buffer + decoded);
decoded++;
emergencynumberlist->emergency_number_information[information_element_index].emergencyservicecategoryvalue = *(buffer + decoded) & 0x1f;
decoded++;
int remaining_len = emergencynumberlist->emergency_number_information[information_element_index].lengthofemergency - 1;
int digit_index = 0;
while (remaining_len > 0) {
emergencynumberlist->emergency_number_information[information_element_index].bcd_digits[digit_index++] = *(buffer + decoded);
decoded++;
remaining_len --;
}
while (digit_index < EMERGENCY_NUMBER_LIST_MAX_2DIGITS) {
emergencynumberlist->emergency_number_information[information_element_index].bcd_digits[digit_index++] = 0xFF;
}
information_element_index++;
}
#if defined (NAS_DEBUG)
dump_emergency_number_list_xml(emergencynumberlist, iei);
#endif
@@ -67,11 +81,16 @@ int encode_emergency_number_list(EmergencyNumberList *emergencynumberlist, uint8
lenPtr = (buffer + encoded);
encoded ++;
*(buffer + encoded) = emergencynumberlist->lengthofemergency;
encoded++;
*(buffer + encoded) = 0x00 |
(emergencynumberlist->emergencyservicecategoryvalue & 0x1f);
encoded++;
for ( int ie_index = 0; ie_index < emergencynumberlist->num_emergency_elements; ie_index++) {
*(buffer + encoded) = emergencynumberlist->emergency_number_information[ie_index].lengthofemergency;
encoded++;
*(buffer + encoded) = 0x00 |
(emergencynumberlist->emergency_number_information[ie_index].emergencyservicecategoryvalue & 0x1f);
encoded++;
for (int bcd2_index = 0; bcd2_index < (emergencynumberlist->emergency_number_information[ie_index].lengthofemergency - 1); bcd2_index++) {
*(buffer + encoded) = emergencynumberlist->emergency_number_information[ie_index].bcd_digits[bcd2_index];
}
}
*lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
return encoded;
}
@@ -83,9 +102,20 @@ void dump_emergency_number_list_xml(EmergencyNumberList *emergencynumberlist, ui
if (iei > 0)
/* Don't display IEI if = 0 */
printf(" <IEI>0x%X</IEI>\n", iei);
printf(" <Length of emergency>%u</Length of emergency>\n", emergencynumberlist->lengthofemergency);
printf(" <Emergency service category value>%u</Emergency service category value>\n", emergencynumberlist->emergencyservicecategoryvalue);
for ( int ie_index = 0; ie_index < emergencynumberlist->num_emergency_elements; ie_index++) {
printf(" <Length of emergency>%u</Length of emergency>\n", emergencynumberlist->emergency_number_information[ie_index].lengthofemergency);
printf(" <Emergency service category value>%u</Emergency service category value>\n", emergencynumberlist->emergency_number_information[ie_index].emergencyservicecategoryvalue);
for (int bcd2_index = 0; bcd2_index < (emergencynumberlist->emergency_number_information[ie_index].lengthofemergency - 1); bcd2_index++) {
uint8_t bcd1 = emergencynumberlist->emergency_number_information[ie_index].bcd_digits[bcd2_index] & 0x0f;
uint8_t bcd2 = (emergencynumberlist->emergency_number_information[ie_index].bcd_digits[bcd2_index] & 0xf0) >> 4;
if (bcd1 < 10) {
printf(" <BCD Digit%u>%u</BCD Digit%u>\n", (bcd2_index*2)+1, bcd1, (bcd2_index*2)+1);
if (bcd2 < 10) {
printf(" <BCD Digit%u>%u</BCD Digit%u>\n", (bcd2_index*2)+2, bcd2, (bcd2_index*2)+2);
}
}
}
}
printf("</Emergency Number List>\n");
}
@@ -32,8 +32,14 @@
#define EMERGENCY_NUMBER_LIST_MAXIMUM_LENGTH 50
typedef struct EmergencyNumberList_tag {
uint8_t lengthofemergency;
uint8_t emergencyservicecategoryvalue:5;
uint8_t num_emergency_elements;
struct {
uint8_t lengthofemergency;
uint8_t emergencyservicecategoryvalue:5;
#define EMERGENCY_NUMBER_LIST_MAX_2DIGITS 6
uint8_t bcd_digits[EMERGENCY_NUMBER_LIST_MAX_2DIGITS]; // length to be fixed
#define EMERGENCY_NUMBER_LIST_MAX_NUMBER_INFORMATION 2
} emergency_number_information[EMERGENCY_NUMBER_LIST_MAX_NUMBER_INFORMATION];
} EmergencyNumberList;
int encode_emergency_number_list(EmergencyNumberList *emergencynumberlist, uint8_t iei, uint8_t *buffer, uint32_t len);
+10 -5
View File
@@ -575,6 +575,8 @@ static int encode_imei_mobile_identity(ImeiMobileIdentity_t *imei, uint8_t *buff
static int encode_imeisv_mobile_identity(ImeisvMobileIdentity_t *imeisv, uint8_t *buffer)
{
uint32_t encoded = 0;
LOG_TRACE(INFO,"SECURITY MODE COMMAND COMPLETE: encode_imeisv_mobile_identity \n");
*(buffer + encoded) = 0x00 | (imeisv->digit1 << 4) | (imeisv->oddeven << 3) |
(imeisv->typeofidentity);
encoded++;
@@ -590,12 +592,15 @@ static int encode_imeisv_mobile_identity(ImeisvMobileIdentity_t *imeisv, uint8_t
encoded++;
*(buffer + encoded) = 0x00 | (imeisv->digit13 << 4) | imeisv->digit12;
encoded++;
*(buffer + encoded) = 0x00 | (imeisv->digit15 << 4) | imeisv->digit14;
encoded++;
*(buffer + encoded) = 0x00 | (imeisv->parity << 4) | imeisv->digit16;
if (imeisv->oddeven != MOBILE_IDENTITY_EVEN) {
*(buffer + encoded) = 0x00 | (imeisv->digit15 << 4) | imeisv->digit14;
} else {
*(buffer + encoded) = 0xf0 | imeisv->digit14;
}
//if (imeisv->oddeven != MOBILE_IDENTITY_EVEN) {
// *(buffer + encoded) = 0x00 | (imeisv->digit15 << 4) | imeisv->digit14;
//} else {
// *(buffer + encoded) = 0xf0 | imeisv->digit14;
//}
encoded++;
return encoded;
+56 -1
View File
@@ -73,8 +73,63 @@ typedef struct {
uint8_t mbmssessionid;
} TmgiMobileIdentity_t;
typedef struct imeisv_s{
uint8_t digit1:4;
uint8_t oddeven:1;
uint8_t typeofidentity:3;
uint8_t digit2:4;
uint8_t digit3:4;
uint8_t digit4:4;
uint8_t digit5:4;
uint8_t digit6:4;
uint8_t digit7:4;
uint8_t digit8:4;
uint8_t digit9:4;
uint8_t digit10:4;
uint8_t digit11:4;
uint8_t digit12:4;
uint8_t digit13:4;
uint8_t digit14:4;
uint8_t digit15:4;
uint8_t digit16:4;
#define EVEN_PARITY 0
#define IMEI_ODD_PARITY 0xf
uint8_t parity:4;
} imeisv_t;
#if 0
typedef struct imeisv_s {
uint8_t length;
union {
struct {
uint8_t tac2:4;
uint8_t tac1:4;
uint8_t tac4:4;
uint8_t tac3:4;
uint8_t tac6:4;
uint8_t tac5:4;
uint8_t tac8:4;
uint8_t tac7:4;
uint8_t snr2:4;
uint8_t snr1:4;
uint8_t snr4:4;
uint8_t snr3:4;
uint8_t snr6:4;
uint8_t snr5:4;
uint8_t svn2:4;
uint8_t svn1:4;
#define EVEN_PARITY 0
#define IMEI_ODD_PARITY 0xf
uint8_t parity:4;
} num;
#define IMEISV_BCD8_SIZE 9
uint8_t value[IMEISV_BCD8_SIZE];
} u;
} imeisv_t;
#endif
typedef ImsiMobileIdentity_t ImeiMobileIdentity_t;
typedef ImsiMobileIdentity_t ImeisvMobileIdentity_t;
typedef imeisv_t ImeisvMobileIdentity_t;
typedef ImsiMobileIdentity_t TmsiMobileIdentity_t;
typedef ImsiMobileIdentity_t NoMobileIdentity_t;
+1
View File
@@ -120,6 +120,7 @@ typedef struct emm_as_security_s {
uint8_t ucs2;
uint8_t uia; /* Replayed UMTS integrity algorithms */
uint8_t gea; /* Replayed GPRS encryption algorithms */
uint8_t imeisv_request;
uint8_t umts_present;
uint8_t gprs_present;
+4 -2
View File
@@ -140,7 +140,7 @@ int emm_recv_attach_accept(attach_accept_msg *msg, int *emm_cause)
// supported cases:
// typeoflist = 1 Or
// typeoflist = 0 and numberofelements = 1 (ie numberofelements equal to zero see 3gpp 24.301 9.9.3.33.1)
LOG_D(NAS,"attach accept type of list: %d, number of element: %d\n",msg->tailist.typeoflist, msg->tailist.numberofelements);
LOG_TRACE(DEBUG,"attach accept type of list: %d, number of element: %d\n",msg->tailist.typeoflist, msg->tailist.numberofelements);
if (!( (msg->tailist.typeoflist == TRACKING_AREA_IDENTITY_LIST_ONE_PLMN_CONSECUTIVE_TACS) ||
((msg->tailist.typeoflist == 0) && ( msg->tailist.numberofelements == 0))
)
@@ -472,13 +472,15 @@ int emm_recv_security_mode_command(security_mode_command_msg *msg,
* Message processing
*/
/* Execute the security mode control procedure initiated by the network */
LOG_TRACE(INFO,"Execute the security mode control procedure initiated by the network: imeisvrequest %d\n",msg->imeisvrequest);
rc = emm_proc_security_mode_command(
msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED,
msg->naskeysetidentifier.naskeysetidentifier,
msg->selectednassecurityalgorithms.typeofcipheringalgorithm,
msg->selectednassecurityalgorithms.typeofintegrityalgorithm,
msg->replayeduesecuritycapabilities.eea,
msg->replayeduesecuritycapabilities.eia);
msg->replayeduesecuritycapabilities.eia,
msg->imeisvrequest & 0x7);
LOG_FUNC_RETURN (rc);
}
+28
View File
@@ -855,6 +855,34 @@ int emm_send_security_mode_complete(const emm_as_security_t *msg,
/* Mandatory - Message type */
emm_msg->messagetype = SECURITY_MODE_COMPLETE;
if(msg->imeisv_request)
{
// configure imeisv param
emm_msg->presencemask |= SECURITY_MODE_COMPLETE_IMEISV_PRESENT;
// 33 85 76 02 05 26 84 01 F1
emm_msg->imeisv.imeisv.digit1 = 0x3;
emm_msg->imeisv.imeisv.oddeven = 0x0;
emm_msg->imeisv.imeisv.typeofidentity = 0x3;
emm_msg->imeisv.imeisv.digit2 = 0x5;
emm_msg->imeisv.imeisv.digit3 = 0x7;
emm_msg->imeisv.imeisv.digit4 = 0x4;
emm_msg->imeisv.imeisv.digit5 = 0x7;
emm_msg->imeisv.imeisv.digit6 = 0x3;
emm_msg->imeisv.imeisv.digit7 = 0x0;
emm_msg->imeisv.imeisv.digit8 = 0x4;
emm_msg->imeisv.imeisv.digit9 = 0x0;
emm_msg->imeisv.imeisv.digit10 = 0x0;
emm_msg->imeisv.imeisv.digit11 = 0x7;
emm_msg->imeisv.imeisv.digit12 = 0x0;
emm_msg->imeisv.imeisv.digit13 = 0x5;
emm_msg->imeisv.imeisv.digit14 = 0x3;
emm_msg->imeisv.imeisv.digit15 = 0x0;
emm_msg->imeisv.imeisv.digit16 = 0x0;
emm_msg->imeisv.imeisv.parity = IMEI_ODD_PARITY;
size += SECURITY_MODE_COMPLETE_MAXIMUM_LENGTH;
}
LOG_FUNC_RETURN (size);
}
+2 -1
View File
@@ -146,7 +146,7 @@ static void _security_release(emm_security_context_t *ctx);
** **
***************************************************************************/
int emm_proc_security_mode_command(int native_ksi, int ksi,
int seea, int seia, int reea, int reia)
int seea, int seia, int reea, int reia, int imeisv_request)
{
LOG_FUNC_IN;
@@ -329,6 +329,7 @@ int emm_proc_security_mode_command(int native_ksi, int ksi,
emm_sap.u.emm_as.u.security.guti = _emm_data.guti;
emm_sap.u.emm_as.u.security.ueid = 0;
emm_sap.u.emm_as.u.security.msgType = EMM_AS_MSG_TYPE_SMC;
emm_sap.u.emm_as.u.security.imeisv_request = imeisv_request;
emm_sap.u.emm_as.u.security.emm_cause = emm_cause;
/* Setup EPS NAS security data */
emm_as_set_security_data(&emm_sap.u.emm_as.u.security.sctx,
+2 -1
View File
@@ -40,6 +40,7 @@ Description Defines the EPS Mobility Management procedure call manager,
#include "emm_main.h"
#include "nas_log.h"
#include "emmData.h"
#include "MobileIdentity.h"
#include "memory.h"
#include "usim_api.h"
@@ -919,7 +920,7 @@ static int _emm_main_get_imei(imei_t *imei, const char *imei_str)
int len = strlen(imei_str);
if (len % 2) {
imei->u.num.parity = ODD_PARITY;
imei->u.num.parity = IMEI_ODD_PARITY;
} else {
imei->u.num.parity = EVEN_PARITY;
}
+1 -1
View File
@@ -174,7 +174,7 @@ int emm_proc_authentication_delete(void);
* --------------------------------------------------------------------------
*/
int emm_proc_security_mode_command(int native_ksi, int ksi, int seea, int seia,
int reea, int reia);
int reea, int reia,int imeisv_request);
/*
*---------------------------------------------------------------------------
+2
View File
@@ -71,6 +71,8 @@ static void _nas_signal_handler(int signal);
static void _nas_clean(int usr_fd, int net_fd);
uint8_t usim_test = 0;
/****************************************************************************/
/****************** E X P O R T E D F U N C T I O N S ******************/
/****************************************************************************/