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>_get
、config_<config source>_getlist
和config_<config source>_end
符号,这三个函数是配置库应该实现的。get
和getlist
是必须的,end
是可选的。- 将所有必要信息存储在
configmodule_interface_t
结构中,只要我们只使用一个配置源,这对调用者来说没有用处。- 如果在
initflags
中设置了位掩码 CONFIG_ENABLECMDLINEONLY,则模块只允许通过命令行设置参数。这用于 oai UE。
函数被调用后,uniqCfg被初始化,各个模块就能通过上面的函数从配置文件读取出具体的参数值了。