From 77f70e77eaff2e29a39dc69680ea47a019d54d95 Mon Sep 17 00:00:00 2001
From: frtabu <francois.taburet@nokia-bell-labs.com>
Date: Fri, 24 Aug 2018 17:40:14 +0200
Subject: [PATCH] MSC logging utility as a config option

---
 cmake_targets/CMakeLists.txt               | 19 ++++-----
 cmake_targets/build_oai                    | 19 ++++++++-
 cmake_targets/nas_sim_tools/CMakeLists.txt |  1 -
 common/utils/LOG/log.c                     |  5 ++-
 common/utils/load_module_shlib.c           |  4 +-
 common/utils/load_module_shlib.h           |  5 ++-
 common/utils/msc/msc.c                     | 31 ++++++++++----
 common/utils/msc/msc.h                     | 47 +++++++++++++---------
 openair1/PHY/CODING/coding_load.c          |  2 +-
 openair1/SCHED/phy_procedures_lte_eNb.c    | 12 +++---
 openair2/ENB_APP/NB_IoT_interface.c        |  2 +-
 openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c   | 12 +++---
 openair3/S1AP/s1ap_eNB_handlers.c          |  2 +-
 openair3/S1AP/s1ap_eNB_nas_procedures.c    | 13 ++----
 targets/ARCH/COMMON/common_lib.c           |  2 +-
 targets/RT/USER/lte-softmodem.c            | 13 +++---
 targets/RT/USER/lte-softmodem.h            |  2 +
 targets/RT/USER/lte-uesoftmodem.c          | 10 +++--
 18 files changed, 123 insertions(+), 78 deletions(-)

diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 7ad0a2d620..b38bb05642 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -882,12 +882,9 @@ add_library(HASHTABLE
 )
 include_directories(${OPENAIR_DIR}/common/utils/hashtable)
 
-if (MESSAGE_CHART_GENERATOR)
-  add_library(MSC
-    ${OPENAIR_DIR}/common/utils/msc/msc.c
-  )
-  set(MSC_LIB MSC)
-endif()
+add_library(msc MODULE ${OPENAIR_DIR}/common/utils/msc/msc.c )
+target_link_libraries (msc LFDS)
+
 include_directories(${OPENAIR_DIR}/common/utils/msc)
 
 set(UTIL_SRC
@@ -1936,7 +1933,7 @@ add_executable(lte-softmodem
 target_link_libraries (lte-softmodem
   -Wl,--start-group
   RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2
-  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
+   ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
   NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   -Wl,--end-group z dl)
 
@@ -1972,7 +1969,7 @@ add_executable(lte-softmodem-nos1
   )
 target_link_libraries (lte-softmodem-nos1
   -Wl,--start-group
-  RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2 ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB}
+  RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_LIB SCHED_RU_LIB PHY_COMMON PHY PHY_RU LFDS L2  ${RAL_LIB} ${ITTI_LIB}
   ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7
   NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   -Wl,--end-group z dl )
@@ -2012,7 +2009,7 @@ add_executable(lte-uesoftmodem
 target_link_libraries (lte-uesoftmodem
   -Wl,--start-group
   RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU
-  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
+   ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
   NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   -Wl,--end-group z dl)
 
@@ -2050,7 +2047,7 @@ add_executable(lte-uesoftmodem-nos1
 
 target_link_libraries (lte-uesoftmodem-nos1
   -Wl,--start-group
-  RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB}
+  RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_UE PHY_RU LFDS L2_UE SIMU ${RAL_LIB} ${ITTI_LIB}
   ${MIH_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
   NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   -Wl,--end-group z dl )
@@ -2128,7 +2125,7 @@ add_executable(test_epc_generate_scenario
   ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h
   )
 target_link_libraries (test_epc_generate_scenario
-  -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
+  -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS ${ITTI_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} ${CONFIG_LIBRARIES}
   )
 
 add_executable(test_epc_play_scenario
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index c15e1e8ec7..3954827c09 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -40,7 +40,7 @@ set_openair_env
 gen_nvram_path=$OPENAIR_DIR/targets/bin
 conf_nvram_path=$OPENAIR_DIR/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
 
-MSC_GEN="False"
+MSC_GEN=0
 XFORMS="True"
 UE_EXPANSION="False"
 PRINT_STATS="False"
@@ -155,6 +155,10 @@ Options
    Disable all LOG_* macros
 --build-eclipse
    Build eclipse project files. Paths are auto corrected by fixprj.sh
+--build-telnet
+   Build telnet server, specify --telnetsrv on command line to start it (eNB only)
+--build-msc
+   Build MSC tracing utility, specify --msc on command line to start it (eNB and UE)
 --usrp-recplay
    Build for I/Q record-playback modes
 --ue-nas-use-tun
@@ -345,6 +349,10 @@ function main() {
        --build-telnetsrv)
             BUILD_TELNETSRV=1
             echo_info "Build embedded telnet server"
+            shift ;;
+       --build-msc)
+            MSC_GEN=1
+            echo_info "Build MSC tracing utility"
             shift ;;			
         --usrp-recplay)
             USRP_REC_PLAY="True"
@@ -690,6 +698,15 @@ function main() {
                   $build_dir telnetsrv \
                   libtelnetsrv.so $dbin/libtelnetsrv.so
 
+  fi 
+  # Telnet server compilation
+  #####################
+  if [ "$MSC_GEN" = "1" ] ; then
+              build_dir=$lte_build_dir
+              compilations \
+                  $build_dir msc \
+                  libmsc.so $dbin/libmsc.so
+
   fi  
   # build RF device and transport protocol libraries
   #####################################
diff --git a/cmake_targets/nas_sim_tools/CMakeLists.txt b/cmake_targets/nas_sim_tools/CMakeLists.txt
index 81e3fe4b3c..c1a0bb419b 100644
--- a/cmake_targets/nas_sim_tools/CMakeLists.txt
+++ b/cmake_targets/nas_sim_tools/CMakeLists.txt
@@ -27,7 +27,6 @@ set(CONF2UEDATA_LIB_SRC
     ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.c
     ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/aka_functions.c
     ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/memory.c
-    ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/nas_log.c
     ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/OctetString.c
     ${OPENAIR_DIR}/openair3/NAS/COMMON/UTIL/TLVEncoder.c
     ${OPENAIR_DIR}/common/utils/utils.c
diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c
index 7a840f22e2..c1f11c0bfd 100644
--- a/common/utils/LOG/log.c
+++ b/common/utils/LOG/log.c
@@ -455,13 +455,14 @@ int rt =   pthread_getname_np(pthread_self(), threadname,bufsize) ;
 
 int inline log_header(char *log_buffer, int buffsize, int comp, int level,const char *format) {
   char threadname[PR_SET_NAME];
-return  snprintf(log_buffer, buffsize , "%s%s[%s]%c %s %s",
+return  snprintf(log_buffer, buffsize , "%s%s[%s]%c %s %s%s",
   	   log_level_highlight_end[level],
   	   ( (g_log->flag & FLAG_NOCOLOR)?"":log_level_highlight_start[level]),
   	   g_log->log_component[comp].name,
   	   ( (g_log->flag & FLAG_LEVEL)?g_log->level2string[level]:' '),
   	   ( (g_log->flag & FLAG_THREAD)?log_getthreadname(threadname,PR_SET_NAME+1):""),
-  	   format);
+  	   format,
+           log_level_highlight_end[level]);
 }
 
 void logRecord_mt(const char *file, const char *func, int line, int comp, int level, const char* format, ... )
diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c
index c8a293f279..c0afdb0b64 100644
--- a/common/utils/load_module_shlib.c
+++ b/common/utils/load_module_shlib.c
@@ -118,7 +118,7 @@ int ret;
    return tmpstr; 
 }
 
-int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf)
+int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf, void *autoinit_arg)
 {
    void *lib_handle;
    initfunc_t fpi;
@@ -155,7 +155,7 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf)
       fpi = dlsym(lib_handle,afname);
 
       if (fpi != NULL ) {
-	 fpi();
+	 fpi(autoinit_arg);
       }
 
       if (farray != NULL) {
diff --git a/common/utils/load_module_shlib.h b/common/utils/load_module_shlib.h
index 6cfd41ac78..685b3d1b65 100644
--- a/common/utils/load_module_shlib.h
+++ b/common/utils/load_module_shlib.h
@@ -59,7 +59,8 @@ typedef struct {
 
 /* function type of functions which may be implemented by a module */
 /* 1: init function, called when loading, if found in the shared lib */
-typedef int(*initfunc_t)(void);
+typedef int(*initfunc_t)(void *);
+
 /* 2: version checking function, called when loading, if it returns -1, trigger main exec abort  */
 typedef int(*checkverfunc_t)(char * mainexec_version, char ** shlib_version);
 /* 3: get function array function, called when loading when a module doesn't provide */
@@ -83,7 +84,7 @@ loader_data_t loader_data;
 
 /*-------------------------------------------------------------------------------------------------------------*/
 #else  /* LOAD_MODULE_SHLIB_MAIN */
-extern int load_module_shlib(char *modname, loader_shlibfunc_t *farray, int numf);
+extern int load_module_shlib(char *modname, loader_shlibfunc_t *farray, int numf, void *initfunc_arg);
 extern void * get_shlibmodule_fptr(char *modname, char *fname);
 extern loader_data_t loader_data;
 #endif /* LOAD_MODULE_SHLIB_MAIN */
diff --git a/common/utils/msc/msc.c b/common/utils/msc/msc.c
index bb88b9b4b6..8ff8846b70 100644
--- a/common/utils/msc/msc.c
+++ b/common/utils/msc/msc.c
@@ -32,11 +32,15 @@
 #include <stdint.h>
 #include <inttypes.h>
 
+#define MSC_LIBRARY
+#include "msc.h"
+
 #include "liblfds611.h"
 #include "intertask_interface.h"
 #include "timer.h"
 
-#include "msc.h"
+
+
 #include "assertions.h"
 
 //-------------------------------
@@ -67,8 +71,8 @@ void *msc_task(void *args_p)
 //------------------------------------------------------------------------------
 {
   MessageDef         *received_message_p    = NULL;
-  const char         *msg_name = NULL;
-  instance_t          instance  = 0;
+//  const char         *msg_name = NULL;
+//  instance_t          instance  = 0;
   long                timer_id;
 
   itti_mark_task_ready(TASK_MSC);
@@ -88,9 +92,9 @@ void *msc_task(void *args_p)
     itti_receive_msg(TASK_MSC, &received_message_p);
 
     if (received_message_p != NULL) {
-      msg_name = ITTI_MSG_NAME (received_message_p);
-      instance = ITTI_MSG_INSTANCE (received_message_p);
-
+//      msg_name = ITTI_MSG_NAME (received_message_p);
+//      instance = ITTI_MSG_INSTANCE (received_message_p);
+      
       switch (ITTI_MSG_ID(received_message_p)) {
 
         case TIMER_HAS_EXPIRED: {
@@ -571,4 +575,17 @@ error_event:
   free(new_item_p);
 }
 
-
+//------------------------------------------------------------------------------
+//  function called when oai loader loads the msc shared lib
+int msc_autoinit(msc_interface_t *msc_interface)
+//------------------------------------------------------------------------------
+ {
+
+  msc_interface->msc_init = msc_init;
+  msc_interface->msc_start_use = msc_start_use;
+  msc_interface->msc_end = msc_end;
+  msc_interface->msc_log_event = msc_log_event;
+  msc_interface->msc_log_message = msc_log_message;
+  msc_interface->msc_loaded = 1;
+  return 0;
+ }
diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h
index 4493a5239a..78eb6cdb08 100644
--- a/common/utils/msc/msc.h
+++ b/common/utils/msc/msc.h
@@ -73,7 +73,23 @@ typedef enum {
 #define MSC_AS_TIME_ARGS(CTXT_Pp) \
     (CTXT_Pp)->frame, \
     (CTXT_Pp)->subframe
-#if defined(MESSAGE_CHART_GENERATOR)
+
+typedef int(*msc_init_t)(const msc_env_t, const int );
+typedef void(*msc_start_use_t)(void );
+typedef void(*msc_end_t)(void);
+typedef void(*msc_log_event_t)(const msc_proto_t,char *, ...);
+typedef void(*msc_log_message_t)(const char *   const, const msc_proto_t, const msc_proto_t, 
+                                 const uint8_t* const, const unsigned int, char * , ...);
+typedef struct msc_interface {
+    int               msc_loaded;
+    msc_init_t        msc_init;
+    msc_start_use_t   msc_start_use;
+    msc_end_t         msc_end;
+    msc_log_event_t   msc_log_event;
+    msc_log_message_t msc_log_message;
+} msc_interface_t;
+
+#ifdef MSC_LIBRARY
 int msc_init(const msc_env_t envP, const int max_threadsP);
 void msc_start_use(void);
 void msc_flush_messages(void);
@@ -88,22 +104,17 @@ void msc_log_message(
     const unsigned int num_bytes,
     char *format, ...);
 
-#define MSC_INIT(arg1,arg2)                                      msc_init(arg1,arg2)
-#define MSC_START_USE                                            msc_start_use
-#define MSC_END                                                  msc_end
-#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...)                msc_log_event(mScPaRaMs, fORMAT, ##aRGS)
-#define MSC_LOG_RX_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...)           msc_log_message("<-",rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, ##aRGS)
-#define MSC_LOG_RX_DISCARDED_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) msc_log_message("x-",rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, ##aRGS)
-#define MSC_LOG_TX_MESSAGE(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...)           msc_log_message("->",sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, ##aRGS)
-#define MSC_LOG_TX_MESSAGE_FAILED(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...)    msc_log_message("-x",sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, ##aRGS)
 #else
-#define MSC_INIT(arg1,arg2)
-#define MSC_START_USE(mScPaRaMs)
-#define MSC_END(mScPaRaMs)
-#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...)
-#define MSC_LOG_RX_MESSAGE(mScPaRaMs, fORMAT, aRGS...)
-#define MSC_LOG_RX_DISCARDED_MESSAGE(mScPaRaMs, fORMAT, aRGS...)
-#define MSC_LOG_TX_MESSAGE(mScPaRaMs, fORMAT, aRGS...)
-#define MSC_LOG_TX_MESSAGE_FAILED(mScPaRaMs, fORMAT, aRGS...)
-#endif
+
+msc_interface_t msc_interface;
+#define MSC_INIT(arg1,arg2)                                     if(msc_interface.msc_loaded) msc_interface.msc_init(arg1,arg2)
+#define MSC_START_USE                                           if(msc_interface.msc_loaded) msc_interface.msc_start_use
+#define MSC_END                                                 if(msc_interface.msc_loaded) msc_interface.msc_end
+#define MSC_LOG_EVENT(mScPaRaMs, fORMAT, aRGS...)               if(msc_interface.msc_loaded) msc_interface.msc_log_event(mScPaRaMs, fORMAT, ##aRGS)
+#define MSC_LOG_RX_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...)           if(msc_interface.msc_loaded) msc_interface.msc_log_message("<-",rECEIVER, sENDER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS)
+#define MSC_LOG_RX_DISCARDED_MESSAGE(rECEIVER, sENDER, bYTES, nUMbYTES, fORMAT, aRGS...) if(msc_interface.msc_loaded) msc_interface.msc_log_message("x-",rECEIVER, sENDER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS)
+#define MSC_LOG_TX_MESSAGE(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...)           if(msc_interface.msc_loaded) msc_interface.msc_log_message("->",sENDER, rECEIVER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS)
+#define MSC_LOG_TX_MESSAGE_FAILED(sENDER, rECEIVER, bYTES, nUMbYTES, fORMAT, aRGS...)    if(msc_interface.msc_loaded) msc_interface.msc_log_message("-x",sENDER, rECEIVER, (const uint8_t *)bYTES, nUMbYTES, fORMAT, ##aRGS)
 #endif
+
+#endif 
diff --git a/openair1/PHY/CODING/coding_load.c b/openair1/PHY/CODING/coding_load.c
index a895d9648e..30b876c654 100644
--- a/openair1/PHY/CODING/coding_load.c
+++ b/openair1/PHY/CODING/coding_load.c
@@ -130,7 +130,7 @@ int load_codinglib(void) {
      shlib_fdesc[ENCODE_SSE_FPTRIDX].fname=    "threegpplte_turbo_encoder_sse";
      shlib_fdesc[ENCODE_C_FPTRIDX].fname=      "threegpplte_turbo_encoder";
      shlib_fdesc[ENCODE_INIT_SSE_FPTRIDX].fname=       "init_encoder_sse";
-     ret=load_module_shlib("coding",shlib_fdesc,DECODE_NUM_FPTR);
+     ret=load_module_shlib("coding",shlib_fdesc,DECODE_NUM_FPTR,NULL);
      if (ret < 0) exit_fun("Error loading coding library");
 
 /* execute encoder/decoder init functions */     
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index a6a44c66e2..2a3f22cd51 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -347,7 +347,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
 	  dlsch_harq->rvidx,
 	  dlsch_harq->round);
   }    
-#if defined(MESSAGE_CHART_GENERATOR_PHY)
+
   MSC_LOG_TX_MESSAGE(
 		     MSC_PHY_ENB,MSC_PHY_UE,
 		     NULL,0,
@@ -368,7 +368,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,
 		     pmi2hex_2Ar1(dlsch_harq->pmi_alloc),
 		     dlsch_harq->rvidx,
 		     dlsch_harq->round);
-#endif
+
   
   
   if (ue_stats) ue_stats->dlsch_sliding_cnt++;
@@ -1375,7 +1375,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
 	  ulsch->harq_mask   &= ~(1 << harq_pid);
 	  ulsch_harq->round   = 0;
 	}
-#if defined(MESSAGE_CHART_GENERATOR_PHY)
+
         MSC_LOG_RX_DISCARDED_MESSAGE(
 				     MSC_PHY_ENB,MSC_PHY_UE,
 				     NULL,0,
@@ -1384,7 +1384,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
 				     ulsch->rnti,harq_pid,
 				     ulsch_harq->round-1
 				     );
-#endif
+
 	
         /* Mark the HARQ process to release it later if max transmission reached
          * (see below).
@@ -1403,7 +1403,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
         T(T_ENB_PHY_ULSCH_UE_ACK, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe), T_INT(ulsch->rnti),
           T_INT(harq_pid));
 
-#if defined(MESSAGE_CHART_GENERATOR_PHY)
+
           MSC_LOG_RX_MESSAGE(
               MSC_PHY_ENB,MSC_PHY_UE,
               NULL,0,
@@ -1411,7 +1411,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
               frame,subframe,
               ulsch->rnti,harq_pid
               );
-#endif
+
 
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_ULSCH
diff --git a/openair2/ENB_APP/NB_IoT_interface.c b/openair2/ENB_APP/NB_IoT_interface.c
index c4884453c2..7355233d71 100644
--- a/openair2/ENB_APP/NB_IoT_interface.c
+++ b/openair2/ENB_APP/NB_IoT_interface.c
@@ -43,7 +43,7 @@ int load_NB_IoT(void) {
  RCConfig_NbIoT_f_t RCConfig;
  loader_shlibfunc_t shlib_fdesc[]=NBIOT_INTERFACE_FLIST; 
 
-     ret=load_module_shlib(NBIOT_MODULENAME,shlib_fdesc,sizeof(shlib_fdesc)/sizeof(loader_shlibfunc_t));
+     ret=load_module_shlib(NBIOT_MODULENAME,shlib_fdesc,sizeof(shlib_fdesc)/sizeof(loader_shlibfunc_t),NULL);
      if (ret) {
         return ret;
      }
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
index b9e605ca24..92409d96dc 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
@@ -760,10 +760,10 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const  ctxt_pP)
                                     0,
                                     MSC_AS_TIME_FMT" DATA-REQ inst %u rb %u rab %u size %u",
                                     MSC_AS_TIME_ARGS(ctxt_pP),
-                                    pc5s_header.inst,
-                                    pc5s_header.rb_id,
+                                    pc5s_header->inst,
+                                    pc5s_header->rb_id,
                                     rab_id,
-                                    pc5s_header.data_size);
+                                    pc5s_header->data_size);
 
                   pdcp_data_req(
                         &ctxt,
@@ -787,10 +787,10 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t* const  ctxt_pP)
                                     0,
                                     MSC_AS_TIME_FMT" DATA-REQ inst %u rb %u rab %u size %u",
                                     MSC_AS_TIME_ARGS(ctxt_pP),
-                                    pc5s_header.inst,
-                                    pc5s_header.rb_id,
+                                    pc5s_header->inst,
+                                    pc5s_header->rb_id,
                                     rab_id,
-                                    pc5s_header.data_size);
+                                    pc5s_header->data_size);
                   LOG_D(PDCP,
                         "[FRAME %5u][UE][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes ---X][PDCP][MOD %u][UE %u][RB %u] NON INSTANCIATED INSTANCE key 0x%"PRIx64", DROPPED\n",
                         ctxt.frame,
diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c
index 9b150fe751..5c6b208b87 100644
--- a/openair3/S1AP/s1ap_eNB_handlers.c
+++ b/openair3/S1AP/s1ap_eNB_handlers.c
@@ -1043,7 +1043,7 @@ int s1ap_eNB_handle_paging(uint32_t               assoc_id,
 
   /* Paging procedure -> stream != 0 */
   if (stream == 0) {
-    S1AP_ERROR("[SCTP %d] Received Paging procedure on stream (%d)\n",
+    LOG_W(S1AP,"[SCTP %d] Received Paging procedure on stream (%d)\n",
                assoc_id, stream);
     return -1;
   }
diff --git a/openair3/S1AP/s1ap_eNB_nas_procedures.c b/openair3/S1AP/s1ap_eNB_nas_procedures.c
index f2f84de32d..ebd5bab4fd 100644
--- a/openair3/S1AP/s1ap_eNB_nas_procedures.c
+++ b/openair3/S1AP/s1ap_eNB_nas_procedures.c
@@ -473,17 +473,11 @@ int s1ap_eNB_handle_nas_downlink(uint32_t         assoc_id,
     MSC_LOG_RX_DISCARDED_MESSAGE(
       MSC_S1AP_ENB,
       MSC_S1AP_MME,
-      (const char *)NULL,
       NULL,
+      0,
       MSC_AS_TIME_FMT" downlinkNASTransport  eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
-      0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
       enb_ue_s1ap_id,
       mme_ue_s1ap_id);
-    /* TODO: fix this log - the original version is suspicious (twice downlink_NAS_transport_p->eNB_UE_S1AP_ID?) */
-    /*S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%"PRIx32" %u\n",
-               assoc_id,
-               downlink_NAS_transport_p->eNB_UE_S1AP_ID,
-               downlink_NAS_transport_p->eNB_UE_S1AP_ID);*/
     S1AP_ERROR("[SCTP %d] Received NAS downlink message for non existing UE context eNB_UE_S1AP_ID: 0x%lx\n",
                assoc_id,
                enb_ue_s1ap_id);
@@ -518,11 +512,10 @@ int s1ap_eNB_handle_nas_downlink(uint32_t         assoc_id,
   MSC_LOG_RX_MESSAGE(
     MSC_S1AP_ENB,
     MSC_S1AP_MME,
-    (const char *)NULL,
     NULL,
+    0,
     MSC_AS_TIME_FMT" downlinkNASTransport  eNB_ue_s1ap_id %u mme_ue_s1ap_id %u",
-    0,0,//MSC_AS_TIME_ARGS(ctxt_pP),
-    enb_ue_s1ap_id,
+    assoc_id,
     mme_ue_s1ap_id);
 
   S1AP_FIND_PROTOCOLIE_BY_ID(S1AP_DownlinkNASTransport_IEs_t, ie, container,
diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c
index 7ff3b820dc..d25826e82e 100644
--- a/targets/ARCH/COMMON/common_lib.c
+++ b/targets/ARCH/COMMON/common_lib.c
@@ -100,7 +100,7 @@ int load_lib(openair0_device *device, openair0_config_t *openair0_cfg, eth_param
       libname=OAI_TP_LIBNAME;
       shlib_fdesc[0].fname="transport_init";      
     } 
-  ret=load_module_shlib(libname,shlib_fdesc,1);
+  ret=load_module_shlib(libname,shlib_fdesc,1,NULL);
   if (ret < 0) {
        fprintf(stderr,"Library %s couldn't be loaded\n",libname);
   } else {
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index c74cd3b443..a011a6253b 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -514,7 +514,7 @@ void *l2l1_task(void *arg) {
 #endif
 
 
-static void get_options(void) {
+static void get_options(unsigned int *start_msc) {
  
   int tddflag, nonbiotflag;
  
@@ -548,11 +548,9 @@ static void get_options(void) {
       set_glog(glog_level);
   }
   if (start_telnetsrv) {
-     load_module_shlib("telnetsrv",NULL,0);
+     load_module_shlib("telnetsrv",NULL,0,NULL);
   }
 
-
-
   if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) {
       memset((void*)&RC,0,sizeof(RC));
       /* Read RC configuration file */
@@ -925,6 +923,7 @@ int main( int argc, char **argv )
 #if defined (XFORMS)
   int ret;
 #endif
+  unsigned int start_msc=0;
 
   if ( load_configmodule(argc,argv) == NULL) {
     exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
@@ -942,7 +941,7 @@ int main( int argc, char **argv )
 
   printf("Reading in command-line options\n");
 
-  get_options ();
+  get_options (&start_msc);
   if (CONFIG_ISFLAGSET(CONFIG_ABORT) ) {
       fprintf(stderr,"Getting configuration failed\n");
       exit(-1);
@@ -968,9 +967,13 @@ int main( int argc, char **argv )
 #if defined(ENABLE_ITTI)
 
   printf("ITTI init, useMME: %i\n" ,EPC_MODE_ENABLED);
+
   itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
 
   // initialize mscgen log after ITTI
+  if (start_msc) {
+     load_module_shlib("msc",NULL,0,&msc_interface);
+  }
   MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX);
 #endif
 
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index a1f26de5dc..2eb4b0d60d 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -194,6 +194,7 @@
 #define CONFIG_HLP_FLOG          "Enable online log \n"
 #define CONFIG_HLP_LOGL          "Set the global log level, valide options: (4:trace, 3:debug, 2:info, 1:warn, (0:error))\n"
 #define CONFIG_HLP_TELN          "Start embedded telnet server \n"
+#define CONFIG_HLP_MSC           "Enable the MSC tracing utility \n"
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            command line parameters for LOG utility                                                                                        */
 /*   optname                     helpstr                paramflags                      XXXptr                  defXXXval                            type           numelt   */
@@ -202,6 +203,7 @@
 {"R" ,  		  	 CONFIG_HLP_FLOG,	0,                uptr:&online_log_messages,		defintval:1,			   TYPE_INT,	  0},			   \
 {"g" ,  		  	 CONFIG_HLP_LOGL,	0,		  uptr:&glog_level,			defintval:0,			   TYPE_UINT,     0},			   \
 {"telnetsrv",    		 CONFIG_HLP_TELN,	PARAMFLAG_BOOL,	  uptr:&start_telnetsrv,		defintval:0,			   TYPE_UINT,     0},			   \
+{"msc",    		         CONFIG_HLP_MSC,	PARAMFLAG_BOOL,	  uptr:start_msc,		        defintval:0,			   TYPE_UINT,     0},	                   \
 }
 #define CMDLINE_ONLINELOG_IDX     0 
 #define CMDLINE_GLOGLEVEL_IDX     1
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 57b1dfb105..3ee4283404 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -470,7 +470,7 @@ void *l2l1_task(void *arg) {
 
 extern int16_t dlsch_demod_shift;
 
-static void get_options(void) {
+static void get_options(unsigned int *start_msc) {
   int CC_id;
   int tddflag, nonbiotflag;
   char *loopfile=NULL;
@@ -505,7 +505,7 @@ static void get_options(void) {
       set_glog(glog_level);
   }
   if (start_telnetsrv) {
-     load_module_shlib("telnetsrv",NULL,0);
+     load_module_shlib("telnetsrv",NULL,0,NULL);
   }
 
   paramdef_t cmdline_uemodeparams[] =CMDLINE_UEMODEPARAMS_DESC;
@@ -770,6 +770,7 @@ int main( int argc, char **argv )
 
   int CC_id;
   uint8_t  abstraction_flag=0;
+  unsigned int start_msc=0;
 
   // Default value for the number of UEs. It will hold,
   // if not changed from the command line option --num-ues
@@ -797,7 +798,7 @@ int main( int argc, char **argv )
   printf("Reading in command-line options\n");
 
   for (int i=0;i<MAX_NUM_CCs;i++) tx_max_power[i]=23; 
-  get_options ();
+  get_options (&start_msc);
 
 
   printf("Running with %d UE instances\n",NB_UE_INST);
@@ -843,6 +844,9 @@ int main( int argc, char **argv )
   itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
 
   // initialize mscgen log after ITTI
+  if (start_msc) {
+     load_module_shlib("msc",NULL,0,&msc_interface);
+  }
   MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX);
 #endif
 
-- 
GitLab