[OAI-UE] merge com4Innov branch to integration branch
This commit is contained in:
@@ -644,7 +644,7 @@ add_boolean_option(ENABLE_USE_CPU_EXECUTION_TIME True "Add data in vcd traces: d
|
||||
add_boolean_option(ENABLE_VCD True "always true now, time measurements of proc calls and var displays")
|
||||
add_boolean_option(ENABLE_VCD_FIFO True "time measurements of proc calls and var displays sent to FIFO (one more thread)")
|
||||
add_boolean_option(HARD_RT False "???")
|
||||
add_boolean_option(LINUX False "used in weird memcpy() in pdcp.c ???")
|
||||
add_boolean_option(LINUX True "used in weird memcpy() in pdcp.c ???")
|
||||
add_boolean_option(LINUX_LIST False "used only in lists.c: either use OAI implementation of lists or Linux one (should be True, but it is False")
|
||||
add_boolean_option(LOG_NO_THREAD True "Disable thread for log, seems always set to true")
|
||||
add_boolean_option(OPENAIR_LTE True "Seems legacy: keep it to true")
|
||||
@@ -727,7 +727,7 @@ add_boolean_option(TRACE_RLC_UM_TX_STATUS False "TRACE for RLC UM, TO BE CHANGE
|
||||
##########################
|
||||
# PDCP LAYER OPTIONS
|
||||
##########################
|
||||
add_boolean_option(PDCP_USE_NETLINK False "For eNB, PDCP communicate with a NETLINK socket if connected to network driver, else could use a RT-FIFO")
|
||||
add_boolean_option(PDCP_USE_NETLINK True "For eNB, PDCP communicate with a NETLINK socket if connected to network driver, else could use a RT-FIFO")
|
||||
add_boolean_option(PDCP_USE_NETLINK_QUEUES False "When PDCP_USE_NETLINK is true, incoming IP packets are stored in queues")
|
||||
add_boolean_option(LINK_ENB_PDCP_TO_IP_DRIVER False "For eNB, PDCP communicate with a IP driver")
|
||||
add_boolean_option(LINK_ENB_PDCP_TO_GTPV1U True "For eNB, PDCP communicate with GTP-U protocol (eNB<->S-GW)")
|
||||
|
||||
+1
-1
@@ -656,7 +656,7 @@ typedef struct {
|
||||
/// \brief Total gains with bypassed RF gain stage (ExpressMIMO2/Lime)
|
||||
uint32_t rx_gain_byp[4];
|
||||
/// \brief Current transmit power
|
||||
int8_t tx_power_dBm[10];
|
||||
int16_t tx_power_dBm[10];
|
||||
/// \brief Total number of REs in current transmission
|
||||
int tx_total_RE[10];
|
||||
/// \brief Maximum transmit power
|
||||
|
||||
@@ -119,7 +119,7 @@ typedef struct {
|
||||
Byte_t digit14:4;
|
||||
Byte_t digit13:4;
|
||||
#define EVEN_PARITY 0
|
||||
#define ODD_PARITY 1
|
||||
#define ODD_PARITY 0xf
|
||||
Byte_t parity:4;
|
||||
Byte_t digit15:4;
|
||||
} num;
|
||||
|
||||
@@ -1356,7 +1356,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
|
||||
// Trigger BSR Periodic
|
||||
UE_mac_inst[module_idP].BSR_reporting_active |= BSR_TRIGGER_PERIODIC;
|
||||
|
||||
LOG_I(MAC,"[UE %d] MAC BSR Triggered PeriodicBSR Timer expiry at frame%d subframe %d TBS=%d\n",
|
||||
LOG_D(MAC,"[UE %d] MAC BSR Triggered PeriodicBSR Timer expiry at frame%d subframe %d TBS=%d\n",
|
||||
module_idP, frameP, subframe, buflen);
|
||||
|
||||
}
|
||||
|
||||
@@ -493,7 +493,7 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const ctxt_pP)
|
||||
ctxt.enb_flag = ctxt_cpy.enb_flag;
|
||||
|
||||
#ifdef PDCP_DEBUG
|
||||
LOG_I(PDCP, "[PDCP][NETLINK] pdcp_read_header_g.rb_id = %d\n", pdcp_read_header_g.rb_id);
|
||||
LOG_D(PDCP, "[PDCP][NETLINK] pdcp_read_header_g.rb_id = %d\n", pdcp_read_header_g.rb_id);
|
||||
#endif
|
||||
|
||||
if (ctxt_cpy.enb_flag) {
|
||||
|
||||
@@ -426,7 +426,7 @@ rlc_um_rx (const protocol_ctxt_t* const ctxt_pP, void *argP, struct mac_data_ind
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
struct mac_status_resp
|
||||
rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP)
|
||||
rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP,const eNB_flag_t enb_flagP)
|
||||
{
|
||||
struct mac_status_resp status_resp;
|
||||
uint16_t sdu_size = 0;
|
||||
@@ -434,6 +434,7 @@ rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP
|
||||
int32_t diff_time=0;
|
||||
rlc_um_entity_t *rlc_p = NULL;
|
||||
mem_block_t *mb_p = NULL;
|
||||
unsigned int max_li_overhead = 0;
|
||||
|
||||
status_resp.buffer_occupancy_in_pdus = 0;
|
||||
status_resp.buffer_occupancy_in_bytes = 0;
|
||||
@@ -453,7 +454,20 @@ rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, void *rlc_pP
|
||||
|
||||
if ((status_resp.buffer_occupancy_in_bytes > 0) && ((mb_p = list_get_head(&rlc_p->input_sdus)) != NULL)) {
|
||||
|
||||
status_resp.buffer_occupancy_in_bytes += rlc_p->tx_header_min_length_in_bytes;
|
||||
//Fix on full Header size
|
||||
if (enb_flagP == ENB_FLAG_NO)
|
||||
{
|
||||
// compute Length Indicator overhead to inform MAC of maximum full RLC PDU size according to stored SDUs
|
||||
// For UE scheduler
|
||||
// Could be useful for eNB: to be checked
|
||||
if (rlc_p->input_sdus.nb_elements <= 1) {
|
||||
max_li_overhead = 0;
|
||||
} else {
|
||||
unsigned int num_li = rlc_p->input_sdus.nb_elements - 1;
|
||||
max_li_overhead = num_li + (num_li >> 1) + (num_li & 1);
|
||||
}
|
||||
}
|
||||
status_resp.buffer_occupancy_in_bytes += (rlc_p->tx_header_min_length_in_bytes + max_li_overhead);
|
||||
status_resp.buffer_occupancy_in_pdus = rlc_p->input_sdus.nb_elements;
|
||||
|
||||
diff_time = ctxt_pP->frame - ((struct rlc_um_tx_sdu_management *)mb_p->data)->sdu_creation_time;
|
||||
|
||||
@@ -186,7 +186,7 @@ protected_rlc_um( void rlc_um_rx (const protocol_ctxt_t* const ctxt_pP, rlc_
|
||||
* \param[in] tx_statusP Transmission status given by MAC on previous MAC transmission of the PDU.
|
||||
* \return The maximum number of bytes that can be served by RLC instance to MAC.
|
||||
*/
|
||||
public_rlc_um( struct mac_status_resp rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP);)
|
||||
public_rlc_um( struct mac_status_resp rlc_um_mac_status_indication (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP, uint16_t tbs_sizeP, struct mac_status_ind tx_statusP, const eNB_flag_t enb_flagP);)
|
||||
|
||||
/*! \fn struct mac_data_req rlc_um_mac_data_request (const protocol_ctxt_t* const ctxt_pP, rlc_um_entity_t * const rlc_pP)
|
||||
* \brief Gives PDUs to lower layer MAC.
|
||||
|
||||
@@ -471,9 +471,9 @@ void rlc_um_v9_3_0_test_exchange_pdus(rlc_um_entity_t *um_txP,
|
||||
memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp));
|
||||
memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp));
|
||||
|
||||
mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status);
|
||||
mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status,ENB_FLAG_YES);
|
||||
data_request_tx = rlc_um_mac_data_request(um_txP, g_frame);
|
||||
mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status);
|
||||
mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status,ENB_FLAG_YES);
|
||||
data_request_rx = rlc_um_mac_data_request(um_rxP, g_frame);
|
||||
|
||||
|
||||
@@ -517,9 +517,9 @@ void rlc_um_v9_3_0_test_exchange_delayed_pdus(rlc_um_entity_t *um_txP,
|
||||
memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp));
|
||||
memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp));
|
||||
|
||||
mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status);
|
||||
mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, g_frame, 1, bytes_txP, tx_status,ENB_FLAG_YES);
|
||||
data_request_tx = rlc_um_mac_data_request(um_txP, g_frame);
|
||||
mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status);
|
||||
mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, g_frame, 0, bytes_rxP, tx_status,ENB_FLAG_YES);
|
||||
data_request_rx = rlc_um_mac_data_request(um_rxP, g_frame);
|
||||
|
||||
|
||||
|
||||
@@ -406,7 +406,7 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
|
||||
break;
|
||||
|
||||
case RLC_MODE_UM:
|
||||
status_resp = rlc_um_mac_status_indication(&ctxt, &rlc_union_p->rlc.um, tb_sizeP, tx_status);
|
||||
status_resp = rlc_um_mac_status_indication(&ctxt, &rlc_union_p->rlc.um, tb_sizeP, tx_status, enb_flagP);
|
||||
mac_rlc_status_resp.bytes_in_buffer = status_resp.buffer_occupancy_in_bytes;
|
||||
mac_rlc_status_resp.pdus_in_buffer = status_resp.buffer_occupancy_in_pdus;
|
||||
mac_rlc_status_resp.head_sdu_creation_time = status_resp.head_sdu_creation_time;
|
||||
|
||||
@@ -99,7 +99,8 @@ ue_ip_common_class_wireless2ip(
|
||||
hard_header_len = ue_ip_dev[instP]->hard_header_len;
|
||||
|
||||
skb_set_mac_header(skb_p, 0);
|
||||
|
||||
skb_set_network_header(skb_p, hard_header_len);
|
||||
skb_p->mark = rb_idP;
|
||||
//printk("[NAC_COMMIN_RECEIVE]: Packet Type %d (%d,%d)",skb_p->pkt_type,PACKET_HOST,PACKET_BROADCAST);
|
||||
skb_p->pkt_type = PACKET_HOST;
|
||||
|
||||
@@ -344,7 +345,7 @@ void ue_ip_common_wireless2ip(struct nlmsghdr *nlh_pP)
|
||||
|
||||
ue_ip_common_class_wireless2ip(pdcph_p->data_size,
|
||||
(unsigned char *)NLMSG_DATA(nlh_pP) + UE_IP_PDCPH_SIZE,
|
||||
pdcph_p->inst,
|
||||
1, //pdcph_p->inst,
|
||||
pdcph_p->rb_id);
|
||||
|
||||
}
|
||||
|
||||
@@ -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_I(NAS," 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_I(NAS,"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_I(NAS,"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_I(NAS,"SECURITY MODE COMMAND COMPLETE done !!! \n");
|
||||
return encoded;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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_I(NAS,"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;
|
||||
|
||||
@@ -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 ODD_PARITY 1
|
||||
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 ODD_PARITY 1
|
||||
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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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_I(NAS,"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);
|
||||
}
|
||||
|
||||
@@ -855,6 +855,35 @@ 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;
|
||||
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 = ODD_PARITY;
|
||||
|
||||
size += SECURITY_MODE_COMPLETE_MAXIMUM_LENGTH;
|
||||
}
|
||||
LOG_FUNC_RETURN (size);
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
|
||||
@@ -188,9 +188,9 @@ void pdcp_rlc_test_exchange_pdus(rlc_um_entity_t *um_txP,
|
||||
memset(&mac_rlc_status_resp_tx, 0, sizeof(struct mac_status_resp));
|
||||
memset(&mac_rlc_status_resp_rx, 0, sizeof(struct mac_status_resp));
|
||||
|
||||
mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, bytes_txP, tx_status);
|
||||
mac_rlc_status_resp_tx = rlc_um_mac_status_indication(um_txP, bytes_txP, tx_status, ENB_FLAG_YES);
|
||||
data_request_tx = rlc_um_mac_data_request(um_txP);
|
||||
mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, bytes_rxP, tx_status);
|
||||
mac_rlc_status_resp_rx = rlc_um_mac_status_indication(um_rxP, bytes_rxP, tx_status, ENB_FLAG_YES);
|
||||
data_request_rx = rlc_um_mac_data_request(um_rxP);
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user