当前位置: 首页 > 工具软件 > freeDiameter > 使用案例 >

freediameter部分源码分析

岳永思
2023-12-01
freediameter状态机启动p_psm_th。


client端:
fd_peer_add添加server,连接每个server启动一个线程,fd_psm_begin,p_psm_th,通过fd_event_timedget获取消息;
如果超时未获取,得到FDEVP_PSM_TIMEOUT消息,执行fd_p_cnx_init,启动connect_thr线程,给自己发送FDEVP_CNX_ESTABLISHED消息;
状态机收到此FDEVP_CNX_ESTABLISHED消息,执行fd_p_ce_handle_newcnx,create_CER并发送,切换到STATE_WAITCEA状态。
如果状态机收到server回复的应答CC_CAPABILITIES_EXCHANGE消息,fd_p_ce_msgrcv,切换到STATE_OPEN状态;启动定时器;
定时器超时fd_p_dw_timeout,如果是第一次,发送DWR,fd_out_send,启动out_thr线程发送消息;




server端:
解析配置文件fd_core_parseconf;通过fd_ext_load,可以加载扩展的动态库;其中每个扩展的动态库,都调用EXTENSION_ENTRY,生成fd_ext_init,动态库的入口。
每个扩展都通过EXTENSION_ENTRY生成自己动态库的fd_ext_init函数,此函数实际调用注册的函数,

如dict_lxml.c调用dict_lxml_entry,此函数通过yacc文件,执行yyparse,进而调用dict_lxml_parse,xmlSAXUserParseFile解析xml文件,直接存储到fd_g_config->cnf_dict中;

还有一些其他扩展,如sip,则不是通过xml文件解析添加到fd_g_config->cnf_dict中,而是通过ds_dict_init等直接hard code写入字典中;


加载完配置文件后,server执行fd_core_start,fd_servers_start:

启动几个client_worker线程(对应一个serv_th线程)负责处理消息;

启动serv_th线程,负责监听端口;serv_th线程监听到消息后,转个client_worker线程进行处理;

client_worker线程执行fd_peer_handle_newCER,启动p_psm_th线程处理协议栈,发送FDEVP_CNX_INCOMING;

在p_psm_th线程中,fd_p_ce_handle_newCER,fd_p_ce_process_receiver,最后回复CEA;




编译加简单调试

http://blog.csdn.net/xmuyn/article/details/6002888


mkdir build
cd build
cmake ../
cmake ../ -DBUILD_TEST_APP:BOOL=ON
make edit_cache
make
make install


mkdir client
mkdir server
把freediameterd/freediameter-1.2.0复制到client和server
把test_app.fdx复制到client和server
把doc/single_host/test_app1.conf和freeDiameter-1.conf复制到client文件夹,test_app2.conf和freeDiameter-2.conf复制到server文件夹


修改freeDiameter-1.conf和freeDiameter-2.conf:
1. 把TLS_Cred和TLS_CA注释掉;
2. 把SecPort = 3869;等修改为SecPort = 0;即可。
3. 加入No_SCTP;
Prefer_TCP;


./freediameter-1.2.0 -c freeDiameter-1.conf
./freediameter-1.2.0 -c freeDiameter-2.conf

即可看到建起来diameter连接。


 类似资料: