随笔分类 -  Linux内核协议栈

摘要:scoket系统调用主要完成socket的创建,必要字段的初始化,关联传输控制块,绑定文件等任务,完成返回socket绑定的文件描述符; 1 /** 2 * socket函数调用关系 3 * sys_socket 4 * |-->sock_create 5 * | |-->__sock_create 阅读全文
posted @ 2017-09-29 01:15 AlexAlex 阅读(711) 评论(0) 推荐(0)
摘要:概述 在ip_local_deliver中,如果检测到是分片包,则需要进行分片重组; 其涉及的函数调用关系如下所示: 1 /** 2 * ip_local_deliver 3 * |-->ip_is_fragment //判断是否为分片包 4 * |-->ip_defrag //分片缓存&重组 5 阅读全文
posted @ 2017-09-28 02:42 AlexAlex 阅读(4121) 评论(0) 推荐(0)
摘要:概述: 当ip包收上来,查路由,发现是发往本地的数据包时,会调用ip_local_deliver函数; ip_local_deliver中对ip分片进行重组,经过LOCAL_IN钩子点,然后调用ip_local_deliver_finish; ip_local_deliver_finish函数处理原 阅读全文
posted @ 2017-09-27 20:30 AlexAlex 阅读(1464) 评论(0) 推荐(0)
摘要:ip层收包流程概述: (1) 在inet_init中注册了类型为ETH_P_IP协议的数据包的回调ip_rcv (2) 当二层数据包接收完毕,会调用netif_receive_skb根据协议进行向上层分发 (3) 类型为ETH_P_IP类型的数据包,被传递到三层,调用ip_rcv函数 (4) ip_ 阅读全文
posted @ 2017-09-22 22:14 AlexAlex 阅读(3555) 评论(0) 推荐(0)
摘要:在设备驱动收包之后,会通过netif_receive_skb将收取的包,按照注册的协议回调,传递到上层进行处理; 1 /* 将skb传递到上层 */ 2 static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc) 阅读全文
posted @ 2017-09-22 20:47 AlexAlex 阅读(6028) 评论(0) 推荐(0)
摘要:两个函数分别完成ip地址的添加和删除工作,具体见下面源码分析; 1 /* 2 添加ip地址 3 主地址添加到最后一个满足范围的主地址后面 4 从地址添加到整个列表后面 5 若列表中存在与插入地址在同一子网的地址,则 6 要求ip地址不同且范围相同,并且插入地址认为是从地址 7 */ 8 static 阅读全文
posted @ 2017-09-17 23:05 AlexAlex 阅读(710) 评论(0) 推荐(0)
摘要:1 /* 根据指定设备的ip配置块,判断地址a,b是否在同一子网 */ 2 /* 3 --邻居项要求,在同一子网中的两个设备, 4 至少有一个接口有相同的子网配置, 5 --也就是说对端的in_dev->ifa_list中也能找到一个与当前 6 in_dev->ifa_list中相同的ifa_mas 阅读全文
posted @ 2017-09-17 21:41 AlexAlex 阅读(477) 评论(0) 推荐(0)
摘要:确认给定参数范围的ip地址是否存在; 1 /* 2 * Confirm that local IP address exists using wildcards: 3 * - net: netns to check, cannot be NULL 4 * - in_dev: only on this 阅读全文
posted @ 2017-09-17 21:01 AlexAlex 阅读(620) 评论(0) 推荐(1)
摘要:当通过输出设备向目的地址发送报文时,如果没有源地址,则需要调用inet_select_addr来选择ip地址作为源地址; 1 /* 2 选择ip地址 3 4 通过设备找到ip控制块,从ip控制块中遍历地址列表中的主地址, 5 优先选择满足范围,满足于目的地址网络部分相同的地址, 6 找不到则默认第一 阅读全文
posted @ 2017-09-17 20:14 AlexAlex 阅读(1214) 评论(0) 推荐(0)
摘要:inetdev_init为传入设备分配和绑定ip控制块,查看其调用关系如下: 1 /** 2 * fs_initcall(inet_init) 3 * |-->inet_init 4 * |-->ip_init 5 * |-->ip_rt_init 6 * |-->devinet_init 7 * 阅读全文
posted @ 2017-09-17 18:50 AlexAlex 阅读(626) 评论(0) 推荐(0)
摘要:in_device为ip配置块,关联了二层设备,包含ip地址列表,组播配置,arp参数,接口配置等; 1 /* ip配置块 */ 2 struct in_device { 3 /* 二层设备 */ 4 struct net_device *dev; 5 /* 引用计数 */ 6 atomic_t r 阅读全文
posted @ 2017-09-17 17:29 AlexAlex 阅读(2322) 评论(0) 推荐(0)
摘要:网络模块的初始化顺序 系统启动初始化时,一旦进入start_kernel,则说明低级初始化已经完成,接下来是对各种设备和子系统的初始化,网络模块初始化流程的调用关系如下图(图片来自:《Linux内核源码剖析-tcp/ip实现》): 在内核初始化过程中,初始化了很多模块,如图中的中断模块(init_i 阅读全文
posted @ 2017-09-17 15:25 AlexAlex 阅读(1197) 评论(0) 推荐(0)
摘要:如果设备不支持单播过滤,并且要监听多个单播地址时,就要使用net_device->uc_count和net_device->uc_promisc来设置混杂模式,具体见__dev_set_rx_mode函数。 多数设备实现了ndo_set_rx_mode,并且通过该函数设置了单播过滤,没有实现这个函数 阅读全文
posted @ 2017-09-16 05:35 AlexAlex 阅读(763) 评论(0) 推荐(0)
摘要:skb_clone–只复制skb描述符本身,如果只修改skb描述符则使用该函数克隆; pskb_copy–复制skb描述符+线性数据区域(包括skb_shared_info),如果需要修改描述符以及数据则使用该函数复制; skb_copy–复制所有数据,包括skb描述符+线性数据区域+非线性数据区, 阅读全文
posted @ 2017-09-16 02:15 AlexAlex 阅读(5707) 评论(0) 推荐(0)
摘要:alloc_skb –分配skb,进行基本的初始化; 1 static inline struct sk_buff *alloc_skb(unsigned int size, 2 gfp_t priority) 3 { 4 return __alloc_skb(size, priority, 0, 阅读全文
posted @ 2017-09-16 02:10 AlexAlex 阅读(6581) 评论(0) 推荐(0)
摘要:skb操作中的预留和对齐操作主要由skb_put、skb_push、skb_pull、skb_reserve完成;这几个函数的区别通过下面图(图片来自:深入理解linux网络技术内幕)可以清晰的区分;另外,需要注意的是skb_reserve只能操作空skb,即在分配了空间,尚未填充数据时调用; 以下 阅读全文
posted @ 2017-09-16 01:59 AlexAlex 阅读(24588) 评论(0) 推荐(1)
摘要:sk_buff结构用来描述已接收或者待发送的数据报文信息;skb在不同网络协议层之间传递,可被用于不同网络协议,如二层的以太网协议,三层的ip协议,四层的tcp或者udp协议,其中某些成员变量会在该结构从一层向另一层传递时发生改变,从上层向下层传递需要添加首部,从下层向上层传递需要移除首部; 多个s 阅读全文
posted @ 2017-09-16 01:55 AlexAlex 阅读(1542) 评论(0) 推荐(0)
摘要:通常网络设备会定时地检测设备是否处于可传递状态。当状态发生变化时,会调用netif_carrier_on或者netif_carrier_off来通知内核; 从网上设备插拔网线或者另一端的设备关闭或禁止,都会导致连接状态改变; netif_carrier_on—-设备驱动监测到设备传递信号时调用 ne 阅读全文
posted @ 2017-09-16 00:43 AlexAlex 阅读(2882) 评论(0) 推荐(0)
摘要:设备关闭操作主要完成设备启用标记位的清除,未发送完的数据发送完,发送禁用通知等操作;下面为相关函数的调用关系,其中dev_change_flags调用__dev_close的流程,已经在设备开启文章中做过介绍,此处不再分析; 1 /** 2 * 设备禁用函数调用关系 3 * dev_change_f 阅读全文
posted @ 2017-09-15 15:00 AlexAlex 阅读(883) 评论(0) 推荐(0)
摘要:__dev_open函数,完成对设备的启用操作,并进行一些必要初始化和通知,调用关系如下,本文主要对这几个函数进行分析; 1 /** 2 * _dev_open函数的调用关系 3 * dev_change_flags-->_dev_change_flags-->__dev_open 4 * 5 * 阅读全文
posted @ 2017-09-15 14:45 AlexAlex 阅读(2330) 评论(0) 推荐(0)