我建了一个 Freeswitch 内核研究 交流群, 45211986, 欢迎加入, 另外,承接 基于SIP的通信服务器及客户端解决方案。
freeswitch 为支持跨平台,底层库使用 apache portable runtime lib(apr),其作者之前的工作中一直接触apache.
swith_apr.c 中为 freeswitch引用 apr提供的所有工具库接口函数的重新定义,目的是为了统一。
当通信层采用sip协议时,mod_sofia 模块被使用,此模块为 对诺基亚开源sip协议栈sofia sip的访问入口,
mod_sofia 为内核启动后的驱动入口。
sip 模块在文件 mod_sofia.c文件中。
SWITCH_MODULE_LOAD_FUNCTION(name) 为每个可加载模块的入口,系统启动时根据module.xml配置动态加载配置的模块。
与动态模块加载相关的宏定义在switch_types.h里,每个模块会定义模块加载,运行,移除对应的回调。
SWITCH_MODULE_LOAD_FUNCTION
SWITCH_MODULE_SHUTDOWN_FUNCTION
SWITCH_MODULE_DEFINITION
所以,sip 模块的加载入口在 SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
mod_sofia_globals 结构保存sip 运行时全局配置,首先设置一些全局配置,然后进入
config_sofia 函数 解析sip配置信息。
首先解析sip协议栈主配置文件,sofia.conf。
<configuration name="sofia.conf" description="sofia Endpoint">
<global_settings>
<param name="log-level" value="0"/>
<!-- <param name="auto-restart" value="false"/> -->
<param name="debug-presence" value="0"/>
</global_settings>
<!--
The rabbit hole goes deep. This includes all the
profiles in the sip_profiles directory that is up
one level from this directory.
-->
<profiles>
<X-PRE-PROCESS cmd="include" data="../sip_profiles/*.xml"/> // 用预处理宏包含配置文件
</profiles>
</configuration>
sofia.conf 分两部分
1.全局配置 (global_settings)
2.sip 协议栈 profiles(局域网,外网,网关配置),所有与此相关的配置文件放在sip_profiles 目录下
freeswitch 中 UA = User Agent = Sofia Profile = SIP Profile
为安全起见,freeswitch把UA按局域网(客户端与服务器在一个网段内),外网分类。
config_sofia 解析完第一部分后,开始解析 第二部分:
按sip_profiles目录下的配置文件一个一个解析:
这里注意只会解析sip_profiles目录下的xml文件,不会递归解析
此目录下每个配置文件对应一个sofia_profile结构。sofia_profile可以理解为一个sip ua
此目录下的文件分 这样几个固定节点:
1. settings 节点 ,其为name value对。 为此类型sip ua的通用属性配置。包括 sip 属性,rtp 属性等的设置,比如 是否开启
sip 100rel特性,Presence 等。与asterisk sip.conf配置文件下的分机属性概念类似类似,但更详尽,灵活。
2. gateways 节点,freeswitch与sip 落地的接口节点,此节点包括若干sip落地网关的配置。
dilplan中 呼叫字符串结构:
sofia/gateway/<gateway_name>/<dialstring>
单个网关节点包含对应属性配置,如是呼入网关还是呼出,注册到网关的账号等。。。
parse_gateways 函数完成网关节点的配置解析。sofia_reg_add_gateway函数把此网关放到freeswitch注册列表里(freeswitch 作为
客户端注册到网关上)。
3. domains 节点,此节点包含所有分机节点。为所有分机节点的父节点 ,分级结构如下
domains
domain
groups
group
user
directory 目录下的所有user都在此处被解析。
4. aliases 节点
当此类型sip profile 解析完毕后 ,launch_sofia_profile_thread启动一个线程 sofia_profile_thread_run进一步设置此profile。
线程内部 用nua_create创建sofia sip ua, nua_create 为 sofia sip 协议栈提供的api,负责创建并启动一个 sip ua 协议栈 ,
指定事件回调函数 sofia_event_callback,所有传输层sip 消息的入口即为此函数。所有 sip协议栈事件都通过sofia_event_callback
传给mod_sofia.
最后 启动工作线程sofia_profile_worker_thread_run 处理此sip ua的事件队列。
更深入的分析 应该进入nua_create 访问sofia sip 协议栈的核心(创建,初始化,启动)。