openairinterface5g配置加载流程

openairinterface5g配置加载流程

代码版本:2024w28

重要的结构体

configmodule_interface_t

typedef struct configmodule_interface {
  int      argc;              //参数个数
  char     **argv;			  //参数集合
  uint32_t *argv_info;        //通过数组下标标示参数是否识别
  char     *cfgmode;          
  int      num_cfgP;         // -O后面的参数可以通过:分割,这个表示-O后面参数能分割出几个
  char     *cfgP[CONFIG_MAX_OOPT_PARAMS];  //存储-O后面具体的参数
  configmodule_initfunc_t         init;
  configmodule_getfunc_t          get;              /*函数签名*/
  configmodule_getlistfunc_t      getlist;
  configmodule_setfunc_t set;
  configmodule_endfunc_t          end;
  pthread_mutex_t  memBlocks_mutex;
  configmodule_endfunc_t write_parsedcfg;
  uint32_t numptrs;
  uint32_t rtflags;
  oneBlock_t oneBlock[CONFIG_MAX_ALLOCATEDPTRS];
  char *tmpdir;
  configmodule_status_t *status; // allocated in debug mode only
} configmodule_interface_t;

此结构体出现在nr-softmodem的main函数中,返回参数uniqcfg为该结构体,该参数为全局变量,定义在main函数上面。

 if ((uniqCfg = load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY)) == NULL) {
    exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
  }

命令的一般形式为:

./nr-softmodem -O <configsource>:<parameter1>:<parameter2>:... 

./nr-softmodem -O ~/gnb.conf --sa -E
我们一般启动时-O 后面直接跟配置文件,默认configsourrce是libconfig

paramdef_t

根据此结构体可以获取配置文件中的对应的值

typedef struct paramdef {
  char         optname[MAX_OPTNAME_SIZE]; /* 参数名,根据这个参数读取配置文件中对应的参数值 */
  char         *helpstr;                  /* help string */
  unsigned int paramflags;                /* value is a "ored" combination of above PARAMFLAG_XXXX values */
  union { /* 匿名union  存储参数值 */
    char      **strptr;
    char      **strlistptr;
    uint8_t   *u8ptr;
    int8_t    *i8ptr;
    uint16_t  *u16ptr;
    int16_t   *i16ptr;
    uint32_t  *uptr;
    int32_t   *iptr;
    uint64_t  *u64ptr;
    int64_t   *i64ptr;
    double    *dblptr;
    void      *voidptr;
  } ;
  union {                                /* 参数默认值 */
    char      *defstrval;
    char      **defstrlistval;
    uint32_t  defuintval;
    int       defintval;
    uint64_t  defint64val;
    int       *defintarrayval;
    double    defdblval;
  } ;
  char type;                              /* parameter value type, as listed below as TYPE_XXXX macro */
  int numelt;                             /* number of elements in a list or array parameters or max size of string value */
  checkedparam_t   *chkPptr;              /* possible pointer to the structure containing the info used to check parameter values */
  int *processedvalue;                    /* used to store integer values computed from string original value */
} paramdef_t;

重要的函数

config_get()

函数签名为

int config_get(configmodule_interface_t *cfgif, paramdef_t *params, int numparams, char *prefix)
    
 此函数的作用为读取参数的值,支持批量读取

config_getlist()

int config_getlist(paramlist_def_t *ParamList, paramdef_t *params, int numparams, char *prefix)
    
 读取数组类型的参数

这些类似的函数位于config_userapi.c文件中,配置文件读取的具体实现由configmodule_interface_t 的函数签名实现(通过链接libparams_libconfig.so)

具体流程

main函数调用load_configmodule初始化全局变量uniqCfg

 if ((uniqCfg = load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY)) == NULL) {
    exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
  }

官方文档对这个函数作用的描述

解析命令行选项,寻找 –O 参数:

  • 加载 libparams_<configsource>.so(当前为 libparams_libconfig.so)共享库
  • 查找 config_<config source>_init 符号并调用它,传递一个字符串数组,该数组对应于 –O 选项中使用的 : 分隔的字符串
  • 查找 config_<config source>_getconfig_<config source>_getlistconfig_<config source>_end 符号,这三个函数是配置库应该实现的。getgetlist 是必须的,end 是可选的。
  • 将所有必要信息存储在 configmodule_interface_t 结构中,只要我们只使用一个配置源,这对调用者来说没有用处。
  • 如果在 initflags 中设置了位掩码 CONFIG_ENABLECMDLINEONLY,则模块只允许通过命令行设置参数。这用于 oai UE。

函数被调用后,uniqCfg被初始化,各个模块就能通过上面的函数从配置文件读取出具体的参数值了。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值