网络子系统9_ip校验和计算

//ip校验和计算使用与体系结构相关的内联汇编
//x86_64版本
//b 1字节
//w 2字节
//l 4字节
//q 8字节
//1010 1010 逻辑左移 -> 0101 010[0]
//1010 1010 算数左移 -> 0101 010[0]

//1010 1010 逻辑右移 -> [0]101 0101
//1010 1010 算数右移 -> [1]101 0101
1.1 static inline unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl)
{
	unsigned int sum;
	asm(
		"  movl (%1), %0\n"//将sum = *iph
		"  subl $4, %2\n"//ihl = ihl-4
		"  jbe 2f\n"//长度为0,跳转到2处
		"  addl 4(%1), %0\n"//sum += *(iph+4)
		"  adcl 8(%1), %0\n"//sum += *(iph+8)
		"  adcl 12(%1), %0\n"//sum += *(iph + 12)
		"1: adcl 16(%1), %0\n"//sum += *(iph + 16)
		"  lea 4(%1), %1\n"//iph = iph + 4
		"  decl %2\n"//ihl -= 1
		"  jne	1b\n"//如果ihl!=0,跳转到1
		"  adcl $0, %0\n"//sum = sum+0
		"  movl %0, %2\n"//ihl = sum
		"  shrl $16, %0\n"//sum逻辑右移16位
		"  addw %w2, %w0\n"//取ihl低16位加到sum低16位
		"  adcl $0, %0\n"//sum = sum+0
		"  notl %0\n"//sum取反
		"2:"
	: "=r" (sum), "=r" (iph), "=r" (ihl)//输出,都使用寄存器保存输出
	: "1" (iph), "2" (ihl)//第一个输入为iph,第二个输入为ihl
	: "memory");//表明内存可能发生变化
	return(sum);//返回sum
}
时间: 2024-11-05 14:42:03

网络子系统9_ip校验和计算的相关文章

网络子系统42_ip协议数据帧的接收

//参考 深入理解linux网络技术内幕                                      // 注册l3协议 // ptype_all链表,链接所有ETH_P_ALL类型的l3协议 // ptype_base哈希表,非ETH_P_ALL类型的l3协议 // 注:l3协议可以使用相同的协议号 1.1 void dev_add_pack(struct packet_type *pt) { int hash; //ptype_all ptype_base共用一把锁 ptype

Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统.网络子系统.虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了. 在http://www.cnbl

网络子系统86_inet协议族-l4向下(一)

// l4数据向下l3传递 // 步骤: // 1.如果sock->sk_write_queue为空,初始化corking // 1.1 corking信息用于帮助ip层对数据进行分片 1.1 int ip_append_data(struct sock *sk, struct flowi4 *fl4, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), void *from,

网络子系统8_netpoll机制

// 1.netpoll的作用: // 用于让内核在网络和I/O子系统尚不能完整可用时,依然能发送和接收数据包,主要用于网络控制台和远程. // 2.netpoll机制需要驱动程序的支持: // 使外部通过软件方式调用驱动程序的中断处理程序. // 大部分poll_controller定义如下: // void this_controller(struct net_device *dev) // { // disable_dev_interrupt(dev); // call_interrupt

网络子系统14_邻居子系统通用接口

//创建一个新的邻居项 //参考 深入理解linux网络技术内幕 // 1.邻居子系统为具体的邻居协议,提供通用的功能接口 // 2.系统中所有的邻居协议被链接在neigh_tables链表中 // 3.neigh_table代表一个具体的邻居协议 // 4.具体邻居协议在运行时的行为,可以通过struct neigh_parms调节, // neigh_params与设备关联,每个邻居协议neigh_table提供一个默认的neigh_params. //注册一个邻居协议到系统中 // 1.与

网络子系统56_ip协议分片重组_重组分片

//调用路径ip_defrag->ip_frag_reasm // 所有ip分片都被接收到时,重组ip数据包 // 判断ip所有分片都接收到的条件: // 1.FIRST_IN, LAST_IN // 2.meat = len,即 根据offset推断出的最大封包长度等于已接收到的封包长度 // 重组过程: // 1.将sk_buff链表从ipq->fragments取下 // 2.将第一个分片以后的分片挂在第一个分片的frag_list域 // 3.从分片子系统使用内存中减去该ip数据包的内

网络子系统48_ip协议数据帧的发送

//ip协议与l4协议接口,l4通过此接口向下l3传递数据帧 //函数主要任务: // 1.通过路由子系统路由封包 // 2.填充l3报头 // 3.ip分片 // 4.计算校验和 // 5.衔接邻居子系统,向下层传送封包. 1.1 int ip_queue_xmit(struct sk_buff *skb, int ipfragok) { struct sock *sk = skb->sk; struct inet_sock *inet = inet_sk(sk); struct ip_opt

网络子系统11_arp子系统初始化

// 1.邻居: // 网络中的邻居指连接到同一个LAN中,且至少有一个接口有相同的ip子网配置 // 2.邻居协议的作用: // 通过l3地址获取主机的l2地址 // 3.通过l3获取l2地址办法: // 3.1 点到点连接,此时不需要l2地址 // 3.2 特殊的l3地址,通过简单的规则获取l2的映射 // 3.3 多播地址通过简单的转换规则转换为l2地址 // 3.4 ip中使用arp协议完成映射 // arp协议的初始化 // 向内核邻居子系统注册arp地址解析协议. // 调用路径:i

网络子系统7_l2、l3接口

// 调用路径: // 1.NAPI设备的poll函数->netif_receive_skb // 2.积压设备的process_backlog函数->netif_receive_skb // 参数: // skb,驱动程序已经去掉了以太帧最后的四字节crc32,skb->mac.raw指向mac头,skb->data,skb->nh指向l3帧头 // 函数主要任务: // 1.处理netpoll衔接点 // 2.更新时间戳,dev的统计信息 // 3.处理bonding衔接