Pre-ci test passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
376 lines
16 KiB
C
Executable File
376 lines
16 KiB
C
Executable File
/***************************************************************************
|
|
rrc_utilities.c -
|
|
-------------------
|
|
copyright : (C) 2002, 2010 by Eurecom
|
|
created by : michelle.wetterwald@eurecom.fr
|
|
**************************************************************************
|
|
Utilities: print buffer, measures ...
|
|
***************************************************************************/
|
|
/********************
|
|
//OpenAir definitions
|
|
********************/
|
|
#include "LAYER2/MAC/extern.h"
|
|
#include "UTIL/MEM/mem_block.h"
|
|
|
|
/********************
|
|
// RRC definitions
|
|
********************/
|
|
#ifdef NODE_MT
|
|
#include "rrc_ue_vars.h"
|
|
#endif
|
|
#ifdef NODE_RG
|
|
#include "rrc_rg_vars.h"
|
|
#endif
|
|
#include "rrc_nas_sap.h"
|
|
#include "rrc_msg_constant.h"
|
|
//-----------------------------------------------------------------------------
|
|
#include "rrc_proto_int.h"
|
|
//-----------------------------------------------------------------------------
|
|
#ifdef USER_MODE
|
|
#include <sys/stat.h>
|
|
#include <errno.h>
|
|
//#include <fcntl.h>
|
|
#endif
|
|
|
|
#ifdef USER_MODE
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_create_fifo (char *rrc_fifo){
|
|
//-----------------------------------------------------------------------------
|
|
mode_t mode_RWXall = S_IRWXU | S_IRWXG | S_IRWXO;
|
|
if (mkfifo (rrc_fifo, mode_RWXall) && (errno != EEXIST)) {
|
|
msg ("Impossible to create %s\n", rrc_fifo);
|
|
} else {
|
|
msg ("Creation %s\n", rrc_fifo);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Print the content of a buffer in hexadecimal
|
|
void rrc_print_buffer (char *buffer, int length){
|
|
//-----------------------------------------------------------------------------
|
|
#define DEBUG_RRC_DETAILS
|
|
#ifdef DEBUG_RRC_DETAILS
|
|
int i;
|
|
int used_length;
|
|
if (length > 1000) {
|
|
used_length = 1000;
|
|
msg ("[RRC-PRINT] buffer length %d too large, restricted to 1000 first bytes.\n", length);
|
|
} else {
|
|
used_length = length;
|
|
}
|
|
msg ("\n[RRC-PRINT] Buffer content: ");
|
|
for (i = 0; i < used_length; i++)
|
|
msg ("-%hx-", (unsigned char) buffer[i]);
|
|
msg (",\t total length %d\n\n", length);
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief Print out the name of the message
|
|
*/
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_mbms_mcch_message_name_print(int mcchMsgType){
|
|
//-----------------------------------------------------------------------------
|
|
switch (mcchMsgType) {
|
|
case MCCH_mbmsAccessInformation:
|
|
msg("AccessInformation"); break;
|
|
case MCCH_mbmsCommonPTMRBInformation:
|
|
msg("CommonPTMRBInformation"); break;
|
|
case MCCH_mbmsCurrentCellPTMRBInformation:
|
|
msg("CurrentCellPTMRBInformation"); break;
|
|
case MCCH_mbmsGeneralInformation:
|
|
msg("GeneralInformation"); break;
|
|
case MCCH_mbmsModifiedServicesInformation:
|
|
msg("ModifiedServicesInformation"); break;
|
|
case MCCH_mbmsNeighbouringCellPTMRBInformation:
|
|
msg("NeighbouringCellPTMRBInformation"); break;
|
|
case MCCH_mbmsUnmodifiedServicesInformation:
|
|
msg("UnmodifiedServicesInformation"); break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief find the serivice id in the service list
|
|
* @param services the service list
|
|
* @param numService the number of services in the list
|
|
* @param serviceID service id need to find
|
|
* @return the index in the list
|
|
*/
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_mbms_service_id_find(u8 numService, void * services, int serviceID){
|
|
//-----------------------------------------------------------------------------
|
|
int index;
|
|
|
|
for (index = 0; index < numService; index ++){
|
|
if (((o3*) services)[index] == (o3) serviceID)
|
|
break;
|
|
}
|
|
return index < numService ? index: -1;
|
|
}
|
|
|
|
|
|
#ifdef NODE_MT
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_print_meas_control (struct rrc_ue_meas_cmd *p){
|
|
//-----------------------------------------------------------------------------
|
|
int i = 0;
|
|
char *command[3] = { "Setup", "Modify", "Release" };
|
|
char *transf[2] = { "RLC AM", "RLC UM" };
|
|
char *trigger[2] = { "Periodical", "Event trigger" };
|
|
char *bool[2] = { "NO", "YES" };
|
|
char *validity[3] = { "cell_DCH", "all_But_Cell_DCH", "all_States" };
|
|
char *uequantity[2] = { "UE Transmitted Power", "UTRA carrier RSSI" };
|
|
|
|
msg ("\n[RRC] ****************** Measurement Control Message ******************\n");
|
|
msg ("[RRC] System Measurement Time : %d\n", protocol_ms->rrc.current_SFN);
|
|
msg ("[RRC] Measurement Identity: %d\t Command: %s\t Transfer Mode: %s\t Reporting Mode: %s\n", p->identity, command[p->command - 1], transf[p->xfer_mode], trigger[p->trigger]);
|
|
|
|
if (p->command == MC_release)
|
|
return;
|
|
|
|
switch (p->type) {
|
|
// Intra Frequency Measurement
|
|
case MT_intraFrequencyMeasurement:
|
|
msg ("\n[RRC] Measurement type: Intra Frequency Measurement\n");
|
|
msg ("[RRC] Measurement quantity-> Filter coefficient : %i, \tState Validity : %s\n", p->if_coeff, validity[p->if_validity]);
|
|
msg ("[RRC] Reporting quantities : \tCell identity : %s\tTimeslot ISCP : %s\tP-CCPCH RSCP : %s\tPathloss : %s\n",
|
|
bool[p->if_cellIdentity_ri], bool[p->if_timeslotISCP_ri], bool[p->if_BCH_RSCP_ri], bool[p->if_pathloss_ri]);
|
|
break;
|
|
// Traffic Volume Measurement
|
|
case MT_trafficVolumeMeasurement:
|
|
msg ("\n[RRC] Measurement type: Traffic Volume Measurement\n");
|
|
msg ("[RRC] State Validity : %s, \tPayload : %s, \tPayload Average : %s, \tPayload Variance : %s\n",
|
|
validity[p->tv_validity], bool[p->tv_payload_ri], bool[p->tv_average_ri], bool[p->tv_variance_ri]);
|
|
break;
|
|
// Quality Measurement
|
|
case MT_qualityMeasurement:
|
|
msg ("\n[RRC] Measurement type: Quality Measurement\n");
|
|
msg ("[RRC] Measurement quantity-> TRCH BLER : %s, SIR for TFCS : ", bool[p->q_dl_trch_bler_ri]);
|
|
for (i = 0; i < MAXMEASTFCS; i++)
|
|
msg ("%d\t", p->q_sir_TFCSid[i]);
|
|
msg ("\n");
|
|
break;
|
|
|
|
// UE Internal Measurement
|
|
case MT_ue_InternalMeasurement:
|
|
msg ("\n[RRC] Measurement type: UE Internal Measurement\n");
|
|
msg ("[RRC] Measurement quantity-> Filter coefficient : %i, \tMeasured Quantity : %s\n", p->int_coeff, uequantity[p->int_quantity]);
|
|
msg ("[RRC] Reporting quantities : \tUE Transmitted Power : %s\tApplied Timing Advance : %s\n", bool[p->int_rep_ue_TransmittedPower], bool[p->int_rep_appliedTA]);
|
|
break;
|
|
}
|
|
//
|
|
switch (p->criteria_type) {
|
|
case RC_ThresholdReportingCriteria:
|
|
msg ("\n[RRC] Report criteria: Threshold reporting -- FFS\n");
|
|
break;
|
|
case RC_PeriodicalReportingCriteria:
|
|
msg ("\n[RRC] Report criteria: Periodical Reporting\tAmount of reporting : %d \tReporting interval : %i\n", p->rep_amount, p->rep_interval);
|
|
break;
|
|
case RC_NoReporting:
|
|
msg ("\n[RRC] Report criteria: No reporting\n");
|
|
}
|
|
//
|
|
msg ("[RRC] *******END******** Measurement Control Message ****\n\n");
|
|
}
|
|
#endif
|
|
|
|
#ifdef NODE_RG
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_print_meas_report (struct rrc_rg_mt_meas_rep *p){
|
|
//-----------------------------------------------------------------------------
|
|
#ifdef DEBUG_RRC_MEASURE_REPORT
|
|
int i, j;
|
|
char *payload[20] =
|
|
{ "pl0", "pl4", "pl8", "pl16", "pl32", "pl64", "pl128", "pl256", "pl512", "pl1024", "pl2k", "pl4k", "pl8k", "pl16k", "pl32k", "pl64k", "pl128k", "pl256k", "pl512k", "pl1024k" };
|
|
char *average[20] =
|
|
{ "pla0", "pla4", "pla8", "pla16", "pla32", "pla64", "pla128", "pla256", "pla512", "pla1024", "pla2k",
|
|
"pla4k", "pla8k", "pla16k", "pla32k", "pla64k", "pla128k", "pla256k", "pla512k","pla1024k" };
|
|
char *variance[14] = { "plv0", "plv4", "plv8", "plv16", "plv32", "plv64", "plv128", "plv256", "plv512", "plv1024", "plv2k", "plv4k", "plv8k", "plv16k" };
|
|
|
|
|
|
msg ("\n[RRC] ************** Measurement Report Message *****************\n");
|
|
msg ("[RRC] Measurement Time: %d\n", protocol_bs->rrc.current_SFN);
|
|
msg ("[RRC] Measurement Identity: %d\t Measured Results type: ", p->identity);
|
|
switch (p->meas_results_type) {
|
|
case MR_intraFreqMeasuredResultsList:
|
|
msg ("Intra Frequency Measurement\t Number of cells: %d\n", p->if_num_cells);
|
|
for (i = 0; i < p->if_num_cells; i++) {
|
|
msg ("[RRC] Cell number: %d\tCell Identity: %d\tCell Parameters Id: %d\tP-CCPCH RSCP: %d\tPathloss: %d\n", i, p->if_cell_id[i], p->if_cell_parms_id[i], p->if_BCH_RSCP[i], p->if_pathloss[i]);
|
|
msg ("\tTimeslot ISCP for each slot:\t");
|
|
for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++)
|
|
msg ("%d: %d, ", j, p->if_slot_iscp[i][j]);
|
|
msg ("\n");
|
|
}
|
|
break;
|
|
// u16 tv_num_rbs;
|
|
// u16 tv_rbid[MAXMEASRBS];
|
|
// u16 tv_rb_payload[MAXMEASRBS];
|
|
// u16 tv_rb_average[MAXMEASRBS];
|
|
// u16 tv_rb_variance[MAXMEASRBS];
|
|
case MR_trafficVolumeMeasuredResultsList:
|
|
msg ("Traffic Volume Measurement -\t Number of RBs: %d\n", p->tv_num_rbs);
|
|
for (i = 0; i < p->tv_num_rbs; i++)
|
|
msg ("[RRC] RB_Id : %d\t, RLC_BufferPayload : %s\t, Average : %s\t, Variance : %s\n",
|
|
p->tv_rbid[i], payload[p->tv_rb_payload[i]], average[p->tv_rb_average[i]], variance[p->tv_rb_variance[i]]);
|
|
break;
|
|
// u16 q_num_TrCH;
|
|
// u16 q_dl_TrCH_id[MAXMEASTRCH];
|
|
// u16 q_dl_TrCH_BLER[MAXMEASTRCH];
|
|
// u16 q_num_tfcs;
|
|
// u16 q_tfcs_id[MAXMEASTFCS];
|
|
// u16 q_sir[MAXMEASTFCS][JRRM_SLOTS_PER_FRAME];
|
|
case MR_qualityMeasuredResults:
|
|
msg ("Quality Measurement -\t Number of Transport Channels : %d, Number of TFCS : %d\n", p->q_num_TrCH, p->q_num_tfcs);
|
|
msg ("[RRC] BLER for each Transport Channel:\t");
|
|
for (i = 0; i < p->q_num_TrCH; i++)
|
|
msg ("%d: %d, ", p->q_dl_TrCH_id[i], p->q_dl_TrCH_BLER[i]);
|
|
msg ("\n");
|
|
msg ("[RRC] SIR for each TFCS for each slot:\n");
|
|
for (i = 0; i < p->q_num_tfcs; i++) {
|
|
msg ("%d: ", p->q_tfcs_id[i]);
|
|
for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++)
|
|
msg ("%d, ", p->q_sir[i][j]);
|
|
msg ("\n");
|
|
}
|
|
break;
|
|
case MR_ue_InternalMeasuredResults:
|
|
msg ("UE internal Measurement\t Timing Advance: %d\n", p->int_timing_advance);
|
|
msg ("[RRC] Transmitted Power for each slot:\t");
|
|
for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++)
|
|
msg ("%d: %d, ", j, p->int_xmit_power[j]);
|
|
msg ("\n");
|
|
break;
|
|
}
|
|
msg ("[RRC] *****END********* Measurement Report Message *******\n\n");
|
|
#endif
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_print_meas_bs_control (struct rrc_rg_bs_meas_cmd *p){
|
|
//-----------------------------------------------------------------------------
|
|
// u16 identity;
|
|
// u16 command;
|
|
// u16 trigger;
|
|
// u16 type;
|
|
// u16 criteria_type;
|
|
// u16 rep_amount;
|
|
// u16 rep_interval;
|
|
#ifdef DEBUG_RRC_MEASURE_REPORT
|
|
char *command[3] = { "Setup", "Modify", "Release" };
|
|
char *trigger[2] = { "Periodical", "Event trigger" };
|
|
char *type[3] = { "BS internal", "Traffic Volume", "Quality" };
|
|
|
|
msg ("\n[RRC] ****************** BS Measurement Control Message ******************\n");
|
|
msg ("[RRC] System Measurement Time : %d\n", protocol_bs->rrc.current_SFN);
|
|
msg ("[RRC] Measurement Identity: %d\t Command: %s\t ", p->identity, command[p->command - 1]);
|
|
|
|
if (p->type != IX_ibsM)
|
|
msg ("Mobile Id: %d\t", p->UE_Id);
|
|
|
|
if (p->command == MC_release) {
|
|
msg ("\n");
|
|
return;
|
|
}
|
|
|
|
msg ("Reporting Mode: %s\n", trigger[p->trigger]);
|
|
msg ("\n[RRC] Measurement type: %s Measurement\n", type[p->type]);
|
|
//
|
|
switch (p->criteria_type) {
|
|
case RC_ThresholdReportingCriteria:
|
|
msg ("[RRC] Report criteria: Threshold reporting -- FFS\n");
|
|
break;
|
|
case RC_PeriodicalReportingCriteria:
|
|
msg ("[RRC] Report criteria: Periodical Reporting\tAmount of reporting : %d \tReporting interval : %i\n", p->rep_amount, p->rep_interval);
|
|
break;
|
|
case RC_NoReporting:
|
|
msg ("[RRC] Report criteria: No reporting\n");
|
|
}
|
|
//
|
|
msg ("[RRC] *******END******** BS Measurement Control Message ****\n\n");
|
|
#endif
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_print_bs_meas_report (struct rrc_rg_bs_meas_rep *p){
|
|
//-----------------------------------------------------------------------------
|
|
#ifdef DEBUG_RRC_MEASURE_REPORT
|
|
int i, j;
|
|
char *payload[20] =
|
|
{ "pl0", "pl4", "pl8", "pl16", "pl32", "pl64", "pl128", "pl256", "pl512", "pl1024", "pl2k", "pl4k", "pl8k", "pl16k", "pl32k", "pl64k", "pl128k", "pl256k", "pl512k", "pl1024k" };
|
|
char *average[20] =
|
|
{ "pla0", "pla4", "pla8", "pla16", "pla32", "pla64", "pla128", "pla256", "pla512", "pla1024", "pla2k",
|
|
"pla4k", "pla8k", "pla16k", "pla32k", "pla64k", "pla128k", "pla256k", "pla512k", "pla1024k" };
|
|
char *variance[14] = { "plv0", "plv4", "plv8", "plv16", "plv32", "plv64", "plv128", "plv256", "plv512", "plv1024", "plv2k", "plv4k", "plv8k", "plv16k" };
|
|
|
|
|
|
msg ("\n[RRC] ************** Measurement Report Message *****************\n");
|
|
msg ("[RRC] Measurement Identity: %d\t Measured Results type: ", p->identity);
|
|
switch (p->meas_results_type) {
|
|
case IX_tvbM:
|
|
// u16 tv_num_rbs;
|
|
// u16 tv_rbid[MAXMEASRBS];
|
|
// u16 tv_rb_payload[MAXMEASRBS];
|
|
// u16 tv_rb_average[MAXMEASRBS];
|
|
// u16 tv_rb_variance[MAXMEASRBS];
|
|
msg ("Traffic Volume Measurement -\t Number of RBs: %d\n", p->tv_num_rbs);
|
|
for (i = 0; i < p->tv_num_rbs; i++)
|
|
msg ("[RRC] RB_Id : %d\t, RLC_BufferPayload : %s\t, Average : %s\t, Variance : %s\n",
|
|
p->tv_rbid[i], payload[p->tv_rb_payload[i]], average[p->tv_rb_average[i]], variance[p->tv_rb_variance[i]]);
|
|
break;
|
|
case IX_qbM:
|
|
// u16 q_num_TrCH;
|
|
// u16 q_dl_TrCH_id[MAXMEASTRCH];
|
|
// u16 q_dl_TrCH_BLER[MAXMEASTRCH];
|
|
// u16 q_num_tfcs;
|
|
// u16 q_tfcs_id[MAXMEASTFCS];
|
|
// u16 q_sir[MAXMEASTFCS][JRRM_SLOTS_PER_FRAME];
|
|
msg ("Quality Measurement -\t Number of Transport Channels : %d, Number of TFCS : %d\n", p->q_num_TrCH, p->q_num_tfcs);
|
|
msg ("[RRC] BLER for each Transport Channel:\t");
|
|
for (i = 0; i < p->q_num_TrCH; i++)
|
|
msg ("%d: %d, ", p->q_dl_TrCH_id[i], p->q_dl_TrCH_BLER[i]);
|
|
msg ("\n");
|
|
msg ("[RRC] SIR for each TFCS for each slot:\n");
|
|
for (i = 0; i < p->q_num_tfcs; i++) {
|
|
msg ("%d: ", p->q_tfcs_id[i]);
|
|
for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++)
|
|
msg ("%d, ", p->q_sir[i][j]);
|
|
msg ("\n");
|
|
}
|
|
break;
|
|
case IX_ibsM:
|
|
// u16 int_xmit_power[numANTENNAS][JRRM_SLOTS_PER_FRAME];
|
|
// u16 int_rscp[JRRM_SLOTS_PER_FRAME][MAXCH];
|
|
// u16 int_rssi_rf[numANTENNAS][JRRM_SLOTS_PER_FRAME];
|
|
// u16 int_spare[NUMSPARE];
|
|
msg ("BS internal Measurement\n");
|
|
for (i = 0; i < numANTENNAS; i++) {
|
|
msg ("[RRC] Transmitted Power for each slot on antenna %d : ", i);
|
|
for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++)
|
|
msg ("%d: %d, ", j, p->int_xmit_power[i][j]);
|
|
msg ("\n");
|
|
}
|
|
for (i = 0; i < JRRM_SLOTS_PER_FRAME; i++) {
|
|
msg ("[RRC] RSCP for each channel on slot %d : ", i);
|
|
for (j = 0; j < MAXCH; j++)
|
|
msg ("%d: %d, ", j, p->int_rscp[i][j]);
|
|
msg ("\n");
|
|
}
|
|
for (i = 0; i < numANTENNAS; i++) {
|
|
msg ("[RRC] RSSI RF for each slot on antenna %d : ", i);
|
|
for (j = 0; j < JRRM_SLOTS_PER_FRAME; j++)
|
|
msg ("%d: %d, ", j, p->int_rssi_rf[i][j]);
|
|
msg ("\n");
|
|
}
|
|
for (i = 0; i < NUMSPARE; i++) {
|
|
msg ("[RRC] Spare value : %d: %d\n", i, p->int_spare[i]);
|
|
}
|
|
|
|
break;
|
|
}
|
|
msg ("[RRC] *****END********* Measurement Report Message *******\n\n");
|
|
#endif
|
|
}
|
|
|
|
#endif
|