LVS源码分析二---模块组织

版权:自由转载,说明出处,保留原作者名,保留文章的完整性,需要商业用途,请联系作者me.
韩波 yahoo邮箱 GameProgramHack 2010.01.02 深圳市龙岗区坂田镇XXX小山村。

ipvs相关代码
include/linux/ip_vs.h
include/net/ip_vs.h
net/netfilter/ipvs/目录下共23个文件。

从Makefile分析。
http://www.linuxvirtualserver.org/zh/index.html文中提到的各种连接调度算法。每一种算法
分别独立实现为一个内核模块:ip_vs_rr.o,ip_vs_wrr.o,ip_vs_lc.o,ip_vs_wlc.o,ip_vs_lblc.o,ip_vs_lblcr.o,ip_vs_dh.o,ip_vs_sh.o,ip_vs_sed.o,ip_vs_nq.o.共对应了10个C文件。
每一个C文件主要实现属于自己调度算法的struct ip_vs_scheduler结构,在模块初始化的时候注册到ipvs系统中,
在模块卸载的时候,从ipvs系统中注销掉自己。

ipvs目前支持的传输层协议tcp,udp,ah,esp四种,tcp,udp很常见,ah,esp属于IPsec协议族的协议。相信了解
IPsec VPN的人对这很熟悉。其中对应的ip_vs_proto_udp.c,ip_vs_proto_tcp.c,ip_vs_proto_ah_esp.c共3个C文件。
主要实现各自协议的struct ip_vs_protocol数据结构。

连接调度算法每一个种算法都设计为独立内核模块,可以在运行时动态的按需加载。然而对传输层协议的支持没有设计为独立的内核模块,不可以运行时决定支持那种协议。而是在编译的时候决定的。编译的时候配置了支持某种传输层协议。在Makefile中会把对应的.o静态连接到ip_vs.o中:
ip_vs_proto-objs-y :=
ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_TCP) += ip_vs_proto_tcp.o
ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_UDP) += ip_vs_proto_udp.o
ip_vs_proto-objs-$(CONFIG_IP_VS_PROTO_AH_ESP) += ip_vs_proto_ah_esp.o
并且在ip_vs_proto.c文件
ip_vs_protocol_init函数中把对应的传输层协议注册到ip_vs系统中:
#ifdef CONFIG_IP_VS_PROTO_TCP
REGISTER_PROTOCOL(&ip_vs_protocol_tcp);
#endif
#ifdef CONFIG_IP_VS_PROTO_UDP
REGISTER_PROTOCOL(&ip_vs_protocol_udp);
#endif
#ifdef CONFIG_IP_VS_PROTO_AH
REGISTER_PROTOCOL(&ip_vs_protocol_ah);
#endif
#ifdef CONFIG_IP_VS_PROTO_ESP
REGISTER_PROTOCOL(&ip_vs_protocol_esp);
#endif

ip_vs_ftp.o是ip_vs的应用helper,对应ip_vs_ftp.c.由ftp协议猜想可能是用来解决关联连接的问题。如果是为了解决关联连接问题,这里可以看到ipvs并不完善,其实还有很多工作需要做。比如netfilter中处理关联连接除了支持ftp外,已经支持了h323,pptp等其他很多协议。

剩下9个文件是ip_vs.o的必选文件。我这里为了与以上各部门区分,称他们为ip_vs_core.下面主要的精力会集中分析ip_vs_core.

广告过后,精彩等着你... ...

randomness