Linux内核IP层的报文处理流程--从网卡接收的报文处理流程

本文聚焦Linux内核2.6.32.27版本,深入剖析IP层架构及接收到的网卡报文处理流程,通过流程图和伪代码进行阐述,适合对C语言有一定基础的读者。此外,文章还提及了与二层数据包处理的关联。
摘要由CSDN通过智能技术生成

本文主要讲解了Linux内核IP层的整体架构和对从网卡接受的报文处理流程,使用的内核的版本是2.6.32.27

为了方便理解,本文采用整体流程图加伪代码的方式对Linxu内核中IP整体实现架构和对网卡报文的处理流程进行了讲解,希望可以对大家有所帮助。阅读本文章假设大家对C语言有了一定的了解


IP层的整体实现架构




IP层接受底层数据报文的处理流程

/*
 * 在NET_RX_SOFTIRQ软中后,由ETH_P_IP触发的ipv4协议入口函数
 */
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{
	/*
	 * 过滤掉送往其他主机的数据包(这时网卡正在处于混杂模式)
	 */
	if (skb->pkt_type == PACKET_OTHERHOST)
		goto drop;

	iph = ip_hdr(skb);

	/*头的长度是否至少是IP头长度(5); 是否是IPV4报文*/
	if (iph->ihl < 5 || iph->version != 4)
		goto inhdr_error;

	/*IP头长度是否正确,不是伪造的长度*/
	if (!pskb_may_pull(skb, iph->ihl*4))
		goto inhdr_error;

	iph = ip_hdr(skb);
	/*检查校验和*/
	if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
		goto inhdr_error;

	len = ntohs(iph->tot_len);
	if (skb->len < len) {
		IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INTRUNCATEDPKTS);
		goto drop;
	} else if (len < (iph->ihl*4))
		goto inhdr_error;

	/*实际尺寸不匹配套接字缓冲(skb->len)中维护的信息,则调用skb_trim调整数据包的长度*/
	if (psk
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值