📄 ip_vs_core.c.txt
字号:
any problems, send mails to sindybear@163.com
相关文件
核心初始化函数,系统的所有初始化工作均在这里完成
static int __init ip_vs_init(void)
ret = ip_vs_control_init(); //设置控制信息。例如设置setopt函数接口。
ip_vs_sltimer_init();
ret = ip_vs_conn_init(); //设置连接表,用来查找连接
ret = ip_vs_app_init();
ret = nf_register_hook(&ip_vs_in_ops); //在NF_IP_LOCAL_IN上进行截取
ret = nf_register_hook(&ip_vs_out_ops); //在NF_IP_FORWARD上进行截取
ret = nf_register_hook(&ip_vs_post_routing_ops); //在ip_vs_post_routing上进行截取
ret = nf_register_hook(&ip_vs_forward_icmp_ops); //在NF_IP_FORWARD上进行截取
static unsigned int ip_vs_in(unsigned int hooknum,
struct sk_buff **skb_p,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
if (skb->pkt_type != PACKET_HOST || skb->dev == &loopback_dev) //如果是某些特殊的包
return NF_ACCEPT; //就直接接受
if (iph->protocol == IPPROTO_ICMP) //如果是ping,要另外进行处理
return ip_vs_in_icmp(skb_p);
if (iph->protocol != IPPROTO_TCP && iph->protocol != IPPROTO_UDP)
return NF_ACCEPT; //如果不是tcp/ip协议,通过
…… //进行一些检查
cp = ip_vs_conn_in_get(iph->protocol, iph->saddr, h.portp[0],
iph->daddr, h.portp[1]); //检查包是否已经属于一个连接
if (!cp
&& (h.th->syn || (iph->protocol!=IPPROTO_TCP))
&& (svc = ip_vs_service_get(skb->nfmark, iph->protocol,
iph->daddr, h.portp[1]))) {
//如果包不属于一个已经存在的连接,但是得到了一个服务service
cp = ip_vs_schedule(svc, iph); //调度程序选择一个机器并建立连接
}
if (!cp) {
return NF_ACCEPT; //如果仍然没有连接成功,丢弃
}
if (cp->dest && !(cp->dest->flags & IP_VS_DEST_F_AVAILABLE)) { //如果目标机器不可用
…… //进行相应的处理
}
ip_vs_in_stats(cp, skb);
ip_vs_set_state(cp, VS_STATE_INPUT, iph, h.portp); //进行数据统计
if (cp->packet_xmit) //如果存在发送函数
ret = cp->packet_xmit(skb, cp); //将数据包发送出去
else {
ret = NF_ACCEPT; //否则接受
}
…… //进行首位处理
static struct ip_vs_conn * ip_vs_schedule(struct ip_vs_service *svc, struct iphdr *iph)
dest = svc->scheduler->schedule(svc, iph); //选择一个目标机器
cp = ip_vs_conn_new(iph->protocol, //生成一个新连接
iph->saddr, portp[0],
iph->daddr, portp[1],
dest->addr, dest->port?dest->port:portp[1],
0,
dest);
return cp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -