无论是zebra也好还是动态路由的进程也好其都是一个单线程的程序;都能完成以下几个事情
1。一个tcp服务器
2。一个cli命令处理程序;
3。能够监听socket事件(读/写/关闭)
一个线程能完成如此复杂的事情,这个与guagga程序良好的框架设计有关系;
所有的库都在lib目录下
thread库
其实说是thread其实这并不是真正操作系统上的thread的概念,它是事件驱动模型中的一个事件的概念。一个fd对应的事件,其实对应起来就是一个thread。也就是说zebra项目中的thread其实是fd事件的描述;有多少个fd就应该对应有多少个thread。代码在thread.c中;有时间讲详细讲解thread的具体用法;这个thread的实现与libevent的实现其实是类似的。
cli库
cli的库包含几个部分,一个是cli部分的远程回调注册的框架程序,另外一个是cli命令对应终端程序的抽象,注册+回调框架在command.c中。vty的抽象在vty.c代码中;简单讲就是通过实现写好的cli注册命令,关联了命令字符串与其处理回调的关系。vty处理输入输出的信息,代码不用关系是telnet上来的请求,还是unix上来的请求;
zclient库
之前说过无论是ospf 还是ripd都是zebra的client程序,client与server之间交互的常用API已经全部定义到zclient库了,主要定义了zebra通知消息给ospf 以及ospf请求内容到server的一些常用方法。具体后续有时间详细说明;
kernel网络抽象库rtnetlink
因为guagga是路由的套件,自然少不了内核路由的一些接口在rt_netlink.c代码中,写好了常用的netlink消息以及其处理的回调函数,以及一些常用接口的API,例如接口up down的通知回调,例如添加删除路由的API接口等等。所有跟内核网络相关的接口都可以在这里面找到;
数据结构的库
也可以在其中可以找到例如c语言的vector list等等,都已经在里面实现好了。