1.启动流程:
获取启动参数并设置相应参数功能,然后调用read_mainconfig()读取配置文件,
Thu Dec 9 16:20:47 2010 : Info: Starting - reading configuration files ...
Thu Dec 9 16:20:47 2010 : Debug: including configuration file /usr/local/etc/raddb/radiusd.conf
Thu Dec 9 16:20:47 2010 : Debug: including configuration file /usr/local/etc/raddb/proxy.conf
Thu Dec 9 16:20:47 2010 : Debug: including configuration file /usr/local/etc/raddb/clients.conf
Thu Dec 9 16:20:47 2010 : Debug: including files in directory /usr/local/etc/raddb/modules/
。。。。。。。。。。。
然后 初始化数据字典,解析 file /usr/local/etc/raddb/dictionary
。。。。。
加载 realm及Home servers ...
..
将客户端初始化到链表。。。,
至此配置文件模块加载完毕,
调用radius_event_init初始化事件池,事件链表是一个全局数据,所有事件串成一个链表,此处即创建表头。同时初始化包列表。
如果有代理服务器则创建代理服务器全局链表并创建代理服务器线程专门处理代理服务器事件。
。。。。。
创建线程池,线程相关参数(线程数等)通过前面的配置文件配置,在这里需要说明的是 freeradius 内部通过线程池处理请求,所有请求先放入队列,线程从队列里取事件(通过信号量同步)并处理。
。。。。。
。。。。
监听fd事件并注册处理事件的信号handler.
....
启动各个端口udp socket server(acct server、access server,proxy server...).这里注意一点,如果没有在radiusd.conf文件中配置的端口号为0则会取系统/etc/services里面的服务端口,同时,对于计费端口,如果在/etc/service文件中没找到计费端口,则用认证端口+1 作为计费端口。
监听端口存储在链表中,所有socket 句柄被监听起来(插入fd句柄列表并绑定信号handler)。
至此,初始换基本完毕,不断调用radius_event_process()读取全局事件列表并处理事件。
radius_event_process()->fr_event_loop(el 全局事件链表).