⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ip_vs_core.c.txt

📁 这是一个牛人的linux学习内核时分析内核的笔记
💻 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 + -