diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c index 44ab07a49b..6626c8103b 100644 --- a/common/utils/telnetsrv/telnetsrv.c +++ b/common/utils/telnetsrv/telnetsrv.c @@ -709,6 +709,9 @@ int add_sharedmodules(void) { return ret; } +/* autoinit functions is called by the loader when the telnet shared library is + dynamically loaded +*/ int telnetsrv_autoinit(void) { memset(&telnetparams,0,sizeof(telnetparams)); config_get( telnetoptions,sizeof(telnetoptions)/sizeof(paramdef_t),"telnetsrv"); diff --git a/common/utils/telnetsrv/telnetsrv_CMakeLists.txt b/common/utils/telnetsrv/telnetsrv_CMakeLists.txt index 05c99aabb8..519a1a72ff 100644 --- a/common/utils/telnetsrv/telnetsrv_CMakeLists.txt +++ b/common/utils/telnetsrv/telnetsrv_CMakeLists.txt @@ -2,20 +2,32 @@ set(TELNETROOT ${OPENAIR_DIR}/common/utils/telnetsrv ) set(TELNETSRV_SOURCE ${TELNETROOT}/telnetsrv.c - ${TELNETROOT}/telnetsrv_phycmd.c ${TELNETROOT}/telnetsrv_proccmd.c ${TELNETROOT}/telnetsrv_loader.c ${TELNETROOT}/telnetsrv_measurements.c ) - -#set(TELNETSRV_ETHDEVCMD_SOURCE -# ${APPROOT}/telnetsrv/telnetsrv_ethdevcmd.c -# ) - + add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} ) -#add_library(telnetsrv_ethdevcmd MODULE ${TELNETSRV_ETHDEVCMD_SOURCE} ) target_link_libraries(telnetsrv PRIVATE history) +foreach(TELNETLIB enb gnb 4gUE 5gUE) + set(TELNETLIB_SRCS "") + foreach(TELNETLIB_ASRC measurements phycmd) + set(TELNETLIB_SRC ${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_${TELNETLIB}_${TELNETLIB_ASRC}.c) + if (EXISTS ${TELNETLIB_SRC}) + set( TELNETLIB_SRCS "${TELNETLIB_SRC};${TELNETLIB_SRCS}") + endif() + endforeach() + if(NOT "${TELNETLIB_SRCS}" STREQUAL "") + message("Add ${TELNETLIB} specific telnet functions in libtelnetsrv_${TELNETLIB}.so") + add_library(telnetsrv_${TELNETLIB} MODULE ${TELNETLIB_SRCS} ) + add_dependencies(telnetsrv telnetsrv_${TELNETLIB}) + install(TARGETS telnetsrv_${TELNETLIB} DESTINATION bin) + else() + message("No specific telnet functions for ${TELNETLIB}") + endif() +endforeach() + install(TARGETS telnetsrv DESTINATION bin) if (EXISTS "${OPENAIR_BUILD_DIR}/ran_build/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/ran_build/build") diff --git a/common/utils/telnetsrv/telnetsrv_measurements.c b/common/utils/telnetsrv/telnetsrv_measurements.c index 7cfc656225..4a11e7c2dd 100644 --- a/common/utils/telnetsrv/telnetsrv_measurements.c +++ b/common/utils/telnetsrv/telnetsrv_measurements.c @@ -20,9 +20,9 @@ */ /*! \file common/utils/telnetsrv/telnetsrv_measurements.c - * \brief: implementation of telnet commands related to measurments + * \brief: implementation of telnet measurement functions common to all softmodems * \author Francois TABURET - * \date 2019 + * \date 2020 * \version 0.1 * \company NOKIA BellLabs France * \email: francois.taburet@nokia-bell-labs.com @@ -47,40 +47,18 @@ #include "common/utils/LOG/log.h" #include "common/config/config_userapi.h" #include "telnetsrv_measurements.h" -#include "telnetsrv_ltemeasur_def.h" -#include "telnetsrv_cpumeasur_def.h" -#include "openair2/LAYER2/MAC/mac.h" -#include "openair1/PHY/phy_extern.h" - -void measurcmd_display_macstats(telnet_printfunc_t prnt); -void measurcmd_display_macstats_ue(telnet_printfunc_t prnt); -void measurcmd_display_rlcstats(telnet_printfunc_t prnt); -void measurcmd_display_phycpu(telnet_printfunc_t prnt); -void measurcmd_display_maccpu(telnet_printfunc_t prnt); -void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt); -static telnet_measurgroupdef_t measurgroups[] = { - {"enb", GROUP_LTESTATS,0, measurcmd_display_macstats, {NULL}}, - {"enbues",GROUP_LTESTATS,0, measurcmd_display_macstats_ue,{NULL}}, - {"rlc", GROUP_LTESTATS,0, measurcmd_display_rlcstats, {NULL}}, - {"phycpu",GROUP_CPUSTATS,0, measurcmd_display_phycpu, {NULL}}, - {"maccpu",GROUP_CPUSTATS,0, measurcmd_display_maccpu, {NULL}}, - {"pdcpcpu",GROUP_CPUSTATS,0, measurcmd_display_pdcpcpu, {NULL}}, -}; -#define TELNET_NUM_MEASURGROUPS (sizeof(measurgroups)/sizeof(telnet_measurgroupdef_t)) - -static int eNB_id =0; static char *grouptypes[] = {"ltestats","cpustats"}; static double cpufreq; #define TELNET_NUM_MEASURTYPES (sizeof(grouptypes)/sizeof(char *)) #define HDR "---------------------------------" -void measurcmd_display_groups(telnet_printfunc_t prnt) { +void measurcmd_display_groups(telnet_printfunc_t prnt,telnet_measurgroupdef_t *measurgroups,int groups_size) { prnt(" %*s %10s %s\n",TELNET_MAXMEASURNAME_LEN-1,"name","type","nombre de mesures"); - for(int i=0; iUE_list); - for (int UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) { - for (int i=0; inumactiveCCs[UE_id]; i++) { - int CC_id = UE_list->ordered_CCids[i][UE_id]; - prnt("%s UE %i Id %i CCid %i %s\n",HDR,i,UE_id,CC_id,HDR); - eNB_UE_STATS *macuestatptr = &(UE_list->eNB_UE_stats[CC_id][UE_id]); - telnet_ltemeasurdef_t statsptr[]=LTEMAC_UEMEASURE; - measurcmd_display_measures(prnt, statsptr, sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t)); - } - } -} /* measurcmd_display_macstats_ue */ - -void measurcmd_display_macstats(telnet_printfunc_t prnt) { - for (int CC_id=0 ; CC_id < MAX_NUM_CCs; CC_id++) { - eNB_STATS *macstatptr=&(RC.mac[eNB_id]->eNB_stats[CC_id]); - telnet_ltemeasurdef_t statsptr[]=LTEMAC_MEASURE; - prnt("%s eNB %i mac stats CC %i frame %u %s\n", - HDR, eNB_id, CC_id, RC.mac[eNB_id]->frame,HDR); - measurcmd_display_measures(prnt,statsptr,sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t)); - } -} /* measurcmd_display_macstats */ - - -void measurcmd_display_one_rlcstat(telnet_printfunc_t prnt, int UE_id, telnet_ltemeasurdef_t *statsptr, int num_rlcmeasure, unsigned int *rlcstats, - char *rbid_str, protocol_ctxt_t *ctxt, const srb_flag_t srb_flagP, const rb_id_t rb_idP) - -{ - int rlc_status = rlc_stat_req(ctxt,srb_flagP,rb_idP, - rlcstats, rlcstats+1, rlcstats+2, rlcstats+3, rlcstats+4, rlcstats+5, - rlcstats+6, rlcstats+7, rlcstats+8, rlcstats+9, rlcstats+10, rlcstats+11, - rlcstats+12, rlcstats+13, rlcstats+14, rlcstats+15, rlcstats+16, rlcstats+17, - rlcstats+18, rlcstats+19, rlcstats+20, rlcstats+21, rlcstats+22, rlcstats+23, - rlcstats+24, rlcstats+25, rlcstats+26, rlcstats+27); - - if (rlc_status == RLC_OP_STATUS_OK) { - prnt("%s UE %i RLC %s mode %s %s\n",HDR,UE_id, rbid_str, - (rlcstats[0]==RLC_MODE_AM)? "AM": (rlcstats[0]==RLC_MODE_UM)?"UM":"NONE",HDR); - measurcmd_display_measures(prnt, statsptr, num_rlcmeasure); - } -} /* status measurcmd_rlc_stat_req */ - - -void measurcmd_display_rlcstats(telnet_printfunc_t prnt) { - protocol_ctxt_t ctxt; - UE_list_t *UE_list = &(RC.mac[eNB_id]->UE_list); - telnet_ltemeasurdef_t statsptr[]=LTE_RLCMEASURE; - int num_rlcmeasure = sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t ); - unsigned int *rlcstats = malloc(num_rlcmeasure*sizeof(unsigned int)); - eNB_MAC_INST *eNB = RC.mac[eNB_id]; - - for(int i=0; i head; UE_id>=0; UE_id=UE_list->next[UE_id]) { -#define NB_eNB_INST 1 - PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt,eNB_id, ENB_FLAG_YES,UE_list->eNB_UE_stats[0][UE_id].crnti, - eNB->frame,eNB->subframe,eNB_id); - measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DCCH", &ctxt, SRB_FLAG_YES, DCCH); - measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DTCH", &ctxt, SRB_FLAG_NO, DTCH-2); - } -} /* measurcmd_display_macstats_ue */ /*------------------------------------------------------------------------------------------------------------------------*/ /* function called by the telnet server when measur command is entered */ @@ -238,20 +130,24 @@ int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt) { if (debug > 0) prnt(" measurcmd_show received %s\n",buf); - - // char tmp[20480]; - // dump_eNB_l2_stats(tmp, 0); - // prnt("%s\n",tmp); + int (*fptr)(telnet_measurgroupdef_t **) = dlsym(RTLD_DEFAULT,"get_measurgroups"); + if ( fptr == NULL) { + prnt("No measures available for this softmodem\n"); + return 0; + } + telnet_measurgroupdef_t *measurgroups; + int num_measurgroups = fptr( &measurgroups); + int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2); if (s>0) { if ( strcmp(subcmd,"groups") == 0) { - measurcmd_display_groups(prnt); + measurcmd_display_groups(prnt,measurgroups,num_measurgroups); badcmd=0; } else { for (int i=0; i #include "telnetsrv.h" #include "openair1/PHY/defs_eNB.h" -#ifdef TELNETSRV_MEASURMENTS_MAIN + #define TELNET_MAXMEASURNAME_LEN 30 #define TELNET_MAXMEASURGROUPS 10 -telnetshell_vardef_t measur_vardef[] = { - {"",0,NULL} -}; - +#define PRINT_CPUMEAS_STATE ((cpumeas(CPUMEAS_GETSTATE))?"enabled":"disabled") typedef struct cpumeasurdef { char statname[TELNET_MAXMEASURNAME_LEN]; time_stats_t *astatptr; @@ -75,6 +72,7 @@ typedef struct mesurgroupdef { #define LTEMAC_MEASURGROUP_NAME "ltemac" #define PHYCPU_MEASURGROUP_NAME "phycpu" +#ifdef TELNETSRV_MEASURMENTS_MAIN int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt); int measurcmd_cpustats(char *buf, int debug, telnet_printfunc_t prnt); telnetshell_cmddef_t measur_cmdarray[] = { @@ -83,6 +81,19 @@ telnetshell_cmddef_t measur_cmdarray[] = { {"","",NULL} }; +telnetshell_vardef_t measur_vardef[] = { + {"",0,NULL} +}; +/* function to be implemented in any telnetsrv_xxx_measurements.c sources + to allow common measurment code to access measurments data */ +extern int get_measurgroups(telnet_measurgroupdef_t **measurgroups); +/* */ + #else -extern void add_measur_cmds(void); +extern void add_measur_cmds(void); +extern void measurcmd_display_groups(telnet_printfunc_t prnt,telnet_measurgroupdef_t *measurgroups,int groups_size); +extern void measurcmd_display_cpumeasures(telnet_printfunc_t prnt, telnet_cpumeasurdef_t *cpumeasure, int cpumeasure_size) ; +extern uint64_t measurcmd_getstatvalue(telnet_ltemeasurdef_t *measur,telnet_printfunc_t prnt); +extern void measurcmd_display_measures(telnet_printfunc_t prnt, telnet_ltemeasurdef_t *statsptr, int stats_size); + #endif /* TELNETSRV_MEASURCMD_MAIN */ diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.c b/common/utils/telnetsrv/telnetsrv_phycmd.c deleted file mode 100644 index c60126f1c7..0000000000 --- a/common/utils/telnetsrv/telnetsrv_phycmd.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The OpenAirInterface Software Alliance licenses this file to You under - * the OAI Public License, Version 1.1 (the "License"); you may not use this file - * except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.openairinterface.org/?page_id=698 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *------------------------------------------------------------------------------- - * For more information about the OpenAirInterface (OAI) Software Alliance: - * contact@openairinterface.org - */ - -/*! \file common/utils/telnetsrv/telnetsrv_phycmd.c - * \brief: implementation of telnet commands related to softmodem linux process - * \author Francois TABURET - * \date 2017 - * \version 0.1 - * \company NOKIA BellLabs France - * \email: francois.taburet@nokia-bell-labs.com - * \note - * \warning - */ -#define _GNU_SOURCE -#include -#include - - -#define TELNETSERVERCODE -#include "telnetsrv.h" -#define TELNETSRV_PHYCMD_MAIN -#include "telnetsrv_phycmd.h" -char *prnbuff; -extern int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length); - -void init_phytelnet(void) -{ -prnbuff=malloc(get_phybsize() ); -if (prnbuff == NULL) - { - fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno)); - } -} - -void display_uestatshead( telnet_printfunc_t prnt) -{ -prnt("cc ue rnti Dmcs Umcs tao tau Dbr Dtb \n"); -} - -void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag) -{ - -int p; - - p=dump_eNB_l2_stats( prnbuff, 0); - if(prntflag>=1) - prnt("%s\n",prnbuff); - if(debug>=1) - prnt("%i bytes printed\n",p); - - -} - -void display_uestats(int debug, telnet_printfunc_t prnt, int ue) -{ - for (int cc=0; cc<1 ; cc++) - { - - - } -} - -void display_phycounters(char *buf, int debug, telnet_printfunc_t prnt) -{ - prnt(" DLSCH kb DLSCH kb/s\n"); - - dump_uestats(debug, prnt,0); - -} - -int dump_phyvars(char *buf, int debug, telnet_printfunc_t prnt) -{ - - - - if (debug > 0) - prnt("phy interface module received %s\n",buf); - if (strcasestr(buf,"phycnt") != NULL) - { - display_phycounters(buf, debug, prnt); - } - if (strcasestr(buf,"uestat") != NULL) - { - char *cptr=strcasestr(buf+sizeof("uestat"),"UE"); - display_uestatshead(prnt); - if (cptr != NULL) - { - int ueidx = strtol( cptr+sizeof("UE"), NULL, 10); - if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0) - { - display_uestats(debug, prnt,ueidx); - } - } /* if cptr != NULL */ - else - { - for (int ue=0; ue]", dump_phyvars}, - - {"","",NULL}, -}; - - -/*-------------------------------------------------------------------------------------*/ -void add_phy_cmds(void) -{ - - init_phytelnet(); - add_telnetcmd("phy", phy_vardef, phy_cmdarray); -}