diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 715d4e65addb2cd631b12261aac5c14658ebef95..348002e3e9099bd073286a69059e1997ec994a81 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -103,6 +103,13 @@ int errno; #define msg printf #endif +typedef struct xer_sprint_string_s +{ + char *string; + size_t string_size; + size_t string_index; +} xer_sprint_string_t; + extern unsigned char NB_eNB_INST; uint16_t two_tier_hexagonal_cellIds[7] = {0,1,2,4,5,7,8}; @@ -120,22 +127,39 @@ uint16_t two_tier_hexagonal_adjacent_cellIds[7][6] = {{1,2,4,5,7,8}, // CellI */ static int xer__print2s (const void *buffer, size_t size, void *app_key) { - char *string = (char *) app_key; + xer_sprint_string_t *string_buffer = (xer_sprint_string_t *) app_key; + size_t string_remaining = string_buffer->string_size - string_buffer->string_index; - strncat(string, buffer, size); + if (string_remaining > 0) + { + if (size > string_remaining) + { + size = string_remaining; + } + memcpy(&string_buffer->string[string_buffer->string_index], buffer, size); + string_buffer->string_index += size; + } return 0; } -int xer_sprint (char *string, asn_TYPE_descriptor_t *td, void *sptr) +int xer_sprint (char *string, size_t string_size, asn_TYPE_descriptor_t *td, void *sptr) { asn_enc_rval_t er; + xer_sprint_string_t string_buffer; - er = xer_encode(td, sptr, XER_F_BASIC, xer__print2s, string); - if (er.encoded == -1) - return -1; + string_buffer.string = string; + string_buffer.string_size = string_size; + string_buffer.string_index = 0; - return 0; + er = xer_encode(td, sptr, XER_F_BASIC, xer__print2s, &string_buffer); + if (er.encoded > string_buffer.string_size) + { + LOG_E(RRC, "xer_sprint string buffer too small, got %d need %d!", string_buffer.string_size, er.encoded); + er.encoded = string_buffer.string_size; + } + + return er.encoded; } uint16_t get_adjacent_cell_id(uint8_t Mod_id,uint8_t index) { @@ -2016,22 +2040,17 @@ OAI_UECapability_t *fill_ue_capability() { } # else { - char *message_string = NULL; + char message_string[10000]; + size_t message_string_size; - message_string = calloc(10000, sizeof(char)); - - if (xer_sprint(message_string, &asn_DEF_UE_EUTRA_Capability, (void *)UE_EUTRA_Capability) >= 0) + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UE_EUTRA_Capability, (void *)UE_EUTRA_Capability)) > 0) { MessageDef *message_p; - size_t message_string_size; - message_string_size = strlen(message_string); message_p = itti_alloc_new_message_sized (TASK_RRC_UE, GENERIC_LOG, message_string_size); memcpy(&message_p->ittiMsg.generic_log, message_string, message_string_size); itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p); - - free(message_string); } } # endif diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.h b/openair2/RRC/LITE/MESSAGES/asn1_msg.h index 9f3650f71028c8585238e23e502c7ad9f63263ea..130caa75ff0185ff40a034e5dffe3cff5eb4e2cf 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.h +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.h @@ -61,7 +61,7 @@ * -1: Problem printing the structure. * WARNING: No sensible errno value is returned. */ -int xer_sprint(char *string, struct asn_TYPE_descriptor_s *td, void *sptr); +int xer_sprint(char *string, size_t string_size, struct asn_TYPE_descriptor_s *td, void *sptr); uint16_t get_adjacent_cell_id(uint8_t Mod_id,uint8_t index); diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 030f053a0fb09bb3bb05effddacfbfcd914cf9f6..3c276e8cf211dc8b7d683bdcb8bd8b336a03ebf8 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -343,22 +343,17 @@ int rrc_ue_decode_ccch(u8 Mod_id, u32 frame, SRB_INFO *Srb_info, u8 eNB_index){ } # else { - char *message_string = NULL; + char message_string[10000]; + size_t message_string_size; - message_string = calloc(10000, sizeof(char)); - - if (xer_sprint(message_string, &asn_DEF_DL_CCCH_Message, (void *)dl_ccch_msg) >= 0) + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_DL_CCCH_Message, (void *)dl_ccch_msg)) > 0) { MessageDef *message_p; - size_t message_string_size; - message_string_size = strlen(message_string); message_p = itti_alloc_new_message_sized (TASK_RRC_UE, GENERIC_LOG, message_string_size); memcpy(&message_p->ittiMsg.generic_log, message_string, message_string_size); itti_send_msg_to_task(TASK_UNKNOWN, Mod_id + NB_eNB_INST, message_p); - - free(message_string); } } # endif @@ -1378,22 +1373,17 @@ void rrc_ue_decode_dcch(u8 Mod_id,u32 frame,u8 Srb_id, u8 *Buffer,u8 eNB_index) } # else { - char *message_string = NULL; - - message_string = calloc(20000, sizeof(char)); + char message_string[20000]; + size_t message_string_size; - if (xer_sprint(message_string, &asn_DEF_DL_DCCH_Message, (void *)dl_dcch_msg) >= 0) + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_DL_DCCH_Message, (void *)dl_dcch_msg)) > 0) { MessageDef *message_p; - size_t message_string_size; - message_string_size = strlen(message_string); message_p = itti_alloc_new_message_sized (TASK_RRC_UE, GENERIC_LOG, message_string_size); memcpy(&message_p->ittiMsg.generic_log, message_string, message_string_size); itti_send_msg_to_task(TASK_UNKNOWN, Mod_id + NB_eNB_INST, message_p); - - free(message_string); } } # endif @@ -1593,22 +1583,17 @@ int decode_BCCH_DLSCH_Message(u8 Mod_id,u32 frame,u8 eNB_index,u8 *Sdu,u8 Sdu_le } # else { - char *message_string = NULL; - - message_string = calloc(10000, sizeof(char)); + char message_string[15000]; + size_t message_string_size; - if (xer_sprint(message_string, &asn_DEF_BCCH_DL_SCH_Message, (void *)bcch_message) >= 0) + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_BCCH_DL_SCH_Message, (void *)bcch_message)) > 0) { MessageDef *message_p; - size_t message_string_size; - message_string_size = strlen(message_string); message_p = itti_alloc_new_message_sized (TASK_RRC_UE, GENERIC_LOG, message_string_size); memcpy(&message_p->ittiMsg.generic_log, message_string, message_string_size); itti_send_msg_to_task(TASK_UNKNOWN, Mod_id + NB_eNB_INST, message_p); - - free(message_string); } } # endif diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index b0e2abfee265b358706a2b9a56cc6761ca10570d..2fd4db1074c4cdb548fcd26736e84e5f930e92d5 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -2514,22 +2514,17 @@ int rrc_eNB_decode_ccch (u8 Mod_id, u32 frame, SRB_INFO * Srb_info) } # else { - char *message_string = NULL; + char message_string[10000]; + size_t message_string_size; - message_string = calloc(10000, sizeof(char)); - - if (xer_sprint(message_string, &asn_DEF_UL_CCCH_Message, (void *)ul_ccch_msg) >= 0) + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_CCCH_Message, (void *)ul_ccch_msg)) > 0) { MessageDef *message_p; - size_t message_string_size; - message_string_size = strlen(message_string); message_p = itti_alloc_new_message_sized (TASK_RRC_ENB, GENERIC_LOG, message_string_size); memcpy(&message_p->ittiMsg.generic_log, message_string, message_string_size); itti_send_msg_to_task(TASK_UNKNOWN, Mod_id, message_p); - - free(message_string); } } # endif @@ -2731,22 +2726,17 @@ int rrc_eNB_decode_dcch (u8 Mod_id, u32 frame, u8 Srb_id, u8 UE_index, } # else { - char *message_string = NULL; + char message_string[10000]; + size_t message_string_size; - message_string = calloc(10000, sizeof(char)); - - if (xer_sprint(message_string, &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg) >= 0) + if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_UL_DCCH_Message, (void *)ul_dcch_msg)) >= 0) { MessageDef *message_p; - size_t message_string_size; - message_string_size = strlen(message_string); message_p = itti_alloc_new_message_sized (TASK_RRC_ENB, GENERIC_LOG, message_string_size); memcpy(&message_p->ittiMsg.generic_log, message_string, message_string_size); itti_send_msg_to_task(TASK_UNKNOWN, Mod_id, message_p); - - free(message_string); } } # endif @@ -2796,30 +2786,21 @@ int rrc_eNB_decode_dcch (u8 Mod_id, u32 frame, u8 Srb_id, u8 UE_index, rrcConnectionReconfigurationComplete.criticalExtensions. present == RRCConnectionReconfigurationComplete__criticalExtensions_PR_rrcConnectionReconfigurationComplete_r8) - { - rrc_eNB_process_RRCConnectionReconfigurationComplete (Mod_id, - frame, - UE_index, - &ul_dcch_msg-> - message. - choice.c1. - choice. - rrcConnectionReconfigurationComplete. - criticalExtensions. - choice. - rrcConnectionReconfigurationComplete_r8); - eNB_rrc_inst[Mod_id].Info.UE[UE_index].Status = RRC_RECONFIGURED; - LOG_I (RRC, "[eNB %d] UE %d State = RRC_RECONFIGURED \n", - Mod_id, UE_index); - -#if defined(ENABLE_USE_MME) - if (EPC_MODE_ENABLED == 1) - { -# if defined(ENABLE_ITTI) - eNB_rrc_inst[Mod_id].Info.UE[UE_index].e_rab[eNB_rrc_inst[Mod_id].Info.UE[UE_index].index_of_e_rabs - 1].status = E_RAB_STATUS_DONE; - } -# endif -#endif + { + rrc_eNB_process_RRCConnectionReconfigurationComplete (Mod_id, + frame, + UE_index, + &ul_dcch_msg-> + message. + choice.c1. + choice. + rrcConnectionReconfigurationComplete. + criticalExtensions. + choice. + rrcConnectionReconfigurationComplete_r8); + eNB_rrc_inst[Mod_id].Info.UE[UE_index].Status = RRC_RECONFIGURED; + LOG_I (RRC, "[eNB %d] UE %d State = RRC_RECONFIGURED \n", + Mod_id, UE_index); } #if defined(ENABLE_USE_MME) @@ -2828,28 +2809,7 @@ int rrc_eNB_decode_dcch (u8 Mod_id, u32 frame, u8 Srb_id, u8 UE_index, # if defined(ENABLE_ITTI) eNB_RRC_UE_INFO *UE_info = &eNB_rrc_inst[Mod_id].Info.UE[UE_index]; - /* Process e RAB parameters received from S1AP one by one (the previous one is completed, eventually process the next one) */ - if (UE_info->nb_of_e_rabs > 0) - { - /* Process e RAB configuration from S1AP initial_context_setup_req */ - rrc_eNB_generate_defaultRRCConnectionReconfiguration (Mod_id, frame, - UE_index, - UE_info->e_rab[UE_info->index_of_e_rabs].param.nas_pdu.buffer, - UE_info->e_rab[UE_info->index_of_e_rabs].param.nas_pdu.length, - eNB_rrc_inst[Mod_id].HO_flag); - /* Free the NAS PDU buffer and invalidate it */ - if (UE_info->e_rab[UE_info->index_of_e_rabs].param.nas_pdu.buffer != NULL) - { - free (UE_info->e_rab[UE_info->index_of_e_rabs].param.nas_pdu.buffer); - } - UE_info->e_rab[UE_info->index_of_e_rabs].param.nas_pdu.buffer = NULL; - UE_info->nb_of_e_rabs --; - UE_info->index_of_e_rabs ++; - } - else - { - rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP (Mod_id, UE_index); - } + rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP (Mod_id, UE_index); # endif } #endif diff --git a/openair2/RRC/LITE/rrc_eNB_S1AP.c b/openair2/RRC/LITE/rrc_eNB_S1AP.c index 87627f1711aeb2fb0ea4e8def69b13a086d579f8..c6a9e3d0956dba5179c2250bdf17c0fb2795fb2d 100644 --- a/openair2/RRC/LITE/rrc_eNB_S1AP.c +++ b/openair2/RRC/LITE/rrc_eNB_S1AP.c @@ -400,10 +400,13 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char /* TODO parameters yet to process ... */ { S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).ue_ambr; - S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).security_capabilities.encryption_algorithms; - S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).security_capabilities.integrity_algorithms; S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).security_key; } + /* Save security parameters, assuming S1AP and RRC are using the same coding for all configuration */ + eNB_rrc_inst[instance].ciphering_algorithm[ue_index] = + S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).security_capabilities.encryption_algorithms; + eNB_rrc_inst[instance].ciphering_algorithm[ue_index] = + S1AP_INITIAL_CONTEXT_SETUP_REQ(msg_p).security_capabilities.integrity_algorithms; { uint8_t send_security_mode_command = TRUE; @@ -451,13 +454,21 @@ int rrc_eNB_process_S1AP_UE_CTXT_MODIFICATION_REQ(MessageDef *msg_p, const char if (S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).present & S1AP_UE_CONTEXT_MODIFICATION_SECURITY_KEY) { S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).security_key; } + if (S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).present & S1AP_UE_CONTEXT_MODIFICATION_UE_AMBR) { S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).ue_ambr; } - if (S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).present & S1AP_UE_CONTEXT_MODIFICATION_UE_SECU_CAP) { - S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).security_capabilities.encryption_algorithms; - S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).security_capabilities.integrity_algorithms; - } + } + + if (S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).present & S1AP_UE_CONTEXT_MODIFICATION_UE_SECU_CAP) { + /* Save security parameters, assuming S1AP and RRC are using the same coding for all configuration */ + eNB_rrc_inst[instance].ciphering_algorithm[ue_index] = + S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).security_capabilities.encryption_algorithms; + eNB_rrc_inst[instance].ciphering_algorithm[ue_index] = + S1AP_UE_CTXT_MODIFICATION_REQ(msg_p).security_capabilities.integrity_algorithms; + + /* transmit the new security parameters to UE */ + rrc_eNB_generate_SecurityModeCommand (instance, 0 /* TODO put frame number ! */, ue_index); } /* Send the response */