Linux内核网络
hhhhhyyyyy8
好记性不如烂笔头
展开
-
linux netlink通信机制
转载自:https://blog.csdn.net/stone8761/article/details/72780863https://www.cnblogs.com/wenqiang/p/6306727.htmluser_msghdr结构体,就是用户层的msghdr结构体。E:\linux-4.1.45\linux-4.1.45\include\linux\socket.hstruct user_msghdr { void __user *msg_name; /* ptr to soc转载 2020-06-05 16:43:29 · 361 阅读 · 0 评论 -
从udp_sendmsg到ip_output发包过程
UDP socket在传输层调用的发送函数为udp_sendmsg,这个函数内容好多。参考:https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/#udp_sendmsghttp://arthurchiao.art/blog/tuning-stack-tx-zh/#chap_5.1http://blog.chinaunix.net/uid-145288转载 2020-06-06 17:41:05 · 2092 阅读 · 0 评论 -
sendmsg系统调用
sendmsg系统调用,主要工作是将用户空间的消息头复制到内核空间中,对消息头进行检查。最后逐级调用发包接口发送数据。SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *, msg, unsigned int, flags)E:\linux-4.1.45\linux-4.1.45\net\socket.cSYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *.原创 2020-06-05 11:29:29 · 3335 阅读 · 0 评论 -
socket系统调用-文件相关
sock_map_fd()获取文件描述符,创建file结构实例;socket与file绑定,将file结构添加到进程打开的文件指针数组中。寻思着,根据fd,找到file;根据file找到socket。E:\linux-4.1.45\linux-4.1.45\net\socket.cstatic int sock_map_fd(struct socket *sock, int flags){ struct file *newfile; int fd = get_unused_fd_fla原创 2020-06-03 20:20:40 · 472 阅读 · 0 评论 -
待会再起
socket虽然也属于VFS的管辖范围,但是有其独特性,不能像打开大部分文件系统下的文件一样打开socket,它只能被创建。VFS是物理文件系统与服务之间的一个接口层,它对Linux的每个文件系统的所有细节进行抽象,使得不同的文件系统在Linux上看起来都是相同的。严格地说,VFS并不是一种实际的文件系统,它只存在于内存中,不存在于任何外存空间,VFS在系统启动时建立,在系统关闭时消亡。用户只能与VFS打交道,不能直接访问实际的文件系统,例如EXT2、EXT3、PROC。...原创 2020-06-03 13:10:26 · 171 阅读 · 0 评论 -
网络IO模型
同步IO与异步IO阻塞IOsocket默认是阻塞的非阻塞IOIO多路复用select:监控多个socket后面找个例子敲敲select (基本被淘汰)监听的socket个数有限;循环扫描监听,socket个数越多,性能越低。信号驱动IO异步IO...原创 2020-06-02 18:00:55 · 152 阅读 · 0 评论 -
抓包工具
红色的比较重要。读一下这些工具的源码。iperf:原创 2020-05-30 23:20:46 · 779 阅读 · 0 评论 -
网络设备初始化
E:\Linux_kernel\linux-4.1.45\linux-4.1.45\include\linux\init.h/* * A "pure" initcall has no dependencies on anything else, and purely * initializes variables that couldn't be statically initialized. * * This only exists for built-in code, not for m...原创 2020-05-28 10:41:32 · 898 阅读 · 0 评论 -
linux的initcall机制
linux的initcall机制(针对编译进内核的驱动)initcall机制的由来我们都知道,linux对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者通常提供一个xxx_init()函数接口以启动这个驱动程序同时提供某些服务。那么,根据常识来说,这个xxx_init()函数肯定是要在系统启动的某个时候被调用,才能启动这个驱动程序。最简单直观地做法就是:开发者试图添加一个驱动程序时,在内核启动init程序的某个地方直接添加调用自己驱动程序的xxx_转载 2020-05-26 14:56:09 · 268 阅读 · 0 评论 -
网络设备初始化过程分析
原创 2020-05-26 14:52:45 · 478 阅读 · 1 评论 -
ubuntu编译内核
https://blog.csdn.net/weixin_38180645/article/details/82856407原创 2020-05-21 22:41:57 · 211 阅读 · 0 评论 -
ioctl系统调用
先mark一下:https://www.cnblogs.com/lifexy/p/10289491.htmlhttps://www.cnblogs.com/tdyizhen1314/p/4896689.htmlhttps://blog.csdn.net/dayancn/article/details/52953777https://www.cnblogs.com/sky-heaven/archive/2019/11/27/11940638.htmlioctl内核实现的地方://\l原创 2020-05-18 22:54:18 · 2120 阅读 · 0 评论 -
skb函数记录
consume_skb()/** * consume_skb - free an skbuff * @skb: buffer to free * * Drop a ref to the buffer and free it if the usage count has hit zero * Functions identically to kfree_skb, but kfree_...原创 2020-04-12 20:27:16 · 298 阅读 · 0 评论 -
icmp报文
傻逼了,一个ICMP报文搞得这么复杂,其实就是普通的ip报文,mac地址逐条变化,ip地址不变。中间和其他ip报文一样,可能有arp请求。https://blog.51cto.com/14437350/2476952...原创 2020-04-12 13:13:57 · 356 阅读 · 0 评论 -
Linux内核-arp协议
arp协议:原创 2020-04-11 20:56:23 · 2538 阅读 · 0 评论 -
linux系统调用
linux系统中,C库由GNU libc提供,简称glic。glibc库中除了包括C标准库外,还提供了系统调用封装。https://www.zhihu.com/question/46763480原创 2020-04-05 11:57:07 · 533 阅读 · 0 评论 -
in_device和in_ifaddr数据结构
net_device、in_device、in_ifaddr数据结构关系:一、in_device数据结构:IP配置块,网络设备层与IPv4相关的配置都存放在in_device结构中,应用层可以通过ip或者ifconfig工具来修改这些配置。该结构实例的地址保存在net_device的in_ptr中,可以通过in_dev_get()访问它。访问结束后,必须使用in_dev_put()。...原创 2019-11-24 19:39:34 · 2520 阅读 · 0 评论 -
Netfilter
enum { NFPROTO_UNSPEC = 0, NFPROTO_INET = 1, NFPROTO_IPV4 = 2, //这里别写PF_INET了,不规范 NFPROTO_ARP = 3, NFPROTO_BRIDGE = 7, NFPROTO_IPV6 = 10, NFPROTO_DECNET = 12, NFPROTO_NUMPROTO,...原创 2019-11-03 15:09:49 · 408 阅读 · 0 评论 -
sock结构--prot结构
sock结构怎么这么负责,跟sk_buff又得一比了。原创 2019-10-28 21:12:25 · 156 阅读 · 0 评论 -
alloc_inode()函数中sb->s_op->alloc_inode()指向sock_alloc_inode()过程分析
前面说到在alloc_inode()函数中sb->s_op->alloc_inode()是指向sock_alloc_inode()函数的,关于这个函数指针是在什么时候指向sock_alloc_inode()函数的。整体过程为:1. sock_alloc(sock_mnt->mnt_sb) –> new_inode_pseudo() –> alloc_inode...转载 2019-10-27 17:21:06 · 477 阅读 · 0 评论 -
socket系统调用过程
一. socket()函数系统调用过程在sys_socketcall()函数中可以看到,socket系统调用最终调用的是sys_socket()函数sys_socket()函数声明如下:asmlinkage long sys_socket(int, int, int);同样地,sys_socket()函数实现为:1. sys_socket()SYSCA...原创 2019-10-27 15:30:55 · 2449 阅读 · 0 评论 -
socket---proto_ops---inetsw_array等基本结构
为了体现一切皆文件的理念,套接口在创建时,即与一个文件及文件描述符绑定,此后所有对该套接口的操作都是通过文件描述符来进行的,包括专门的套接口系统调用,基于标准IO系统调用。套接口层整体流程图1. socket结构体/** * struct socket - general BSD socket * @state: socket state (%SS_CONNECTED, ...原创 2019-10-26 13:52:39 · 1893 阅读 · 1 评论 -
net_device相关函数
1.关于struct hlist_node name_hlist网络设备名以散列表的形式组织到dev_name_head散列表中,这样就可以通过网络设备名快速地对应到相应的设备。2.关于网络设备状态state3.关于netdev_features_t features;4.关于unsigned int flags;标识接口特性这个...原创 2019-10-19 19:15:39 · 1929 阅读 · 0 评论 -
Linux内核bridge结构体相关
STP相关先不管,以后有兴趣了在专门研究。一、net_bridge、net_bridge_prot、net_bridge_fdb_entry数据结构1. 网桥设备net_bridge数据结构struct net_bridge { /*自旋锁*/ spinlock_t lock; /*用于管理下面hash表的锁*/ spinlock_t hash_lock;...原创 2019-10-17 23:32:41 · 1787 阅读 · 0 评论 -
Linux内核网络学习
sk_buff是在什么时候分配和释放的?数据拷贝的时候,哪种机制最快?DMA数据包来了之后交给哪个CPU?网卡驱动比字符设备驱动,块设备驱动要难一些。查看网卡驱动类型:https://blog.csdn.net/superbfly/article/details/53423378查看网卡驱动信息:pcnet32网卡驱动源代码路径:linux/dr...原创 2019-10-03 18:08:03 · 436 阅读 · 0 评论 -
数据包校验和相关知识
主要涉及sk_buff->ip_summed与sk_buff->csum这两个字段含义因skb是接收报文还是发送报文而不同:一、sk_buff->ip_summed与sk_buff->csum//linux 4.1.45/* Don't change this without changing skb_csum_unnecessary! */#define ...原创 2019-10-13 11:46:55 · 1612 阅读 · 0 评论 -
Linux内核数据包L3层转发处理流程
转载:https://blog.csdn.net/eric_liufeng/article/details/10789811https://blog.csdn.net/shichaog/article/details/44572561https://www.cnblogs.com/aiwz/p/6333287.htmlhttps://blog.csdn.net/shanshanpt...原创 2019-10-03 22:51:18 · 2596 阅读 · 0 评论 -
Linux内核数据包bridge上转发流程
转载:https://blog.csdn.net/Sophisticated_/article/details/87923362http://blog.chinaunix.net/uid-28541347-id-5750406.htmlhttps://blog.csdn.net/linyt/article/details/5191512https://blog.csdn.net/N...原创 2019-10-05 15:39:04 · 6686 阅读 · 2 评论 -
e100网卡收包流程分析
四、网卡的数据接收内核如何从网卡接受数据,传统的经典过程:1、数据到达网卡;2、网卡产生一个中断给内核;3、内核使用I/O指令,从网卡I/O区域中去读取数据;我们在许多网卡驱动中,都可以在网卡的中断函数中见到这一过程。但是,这一种方法,有一种重要的问题,就是大流量的数据来到,网卡会产生大量的中断,内核在中断上下文中,会浪费大量的资源来处理中断本身。所以,一个问题是,“可不可以不使用中断”...转载 2019-10-13 11:56:20 · 657 阅读 · 0 评论 -
linux网卡报文接收流程
NAPI:1. 网卡接收到帧之后,把帧放到自己的接收环形队列(双向链表)中,产生硬中断,2. 调用napi_schedule调度函数,把自己对应的napi_struct挂到CPU的接收sotfnet_data的poll_list链表中,调用__raise_softirq_irqoff触发软中断。3. 调用net_rx_action()函数,遍历poll_list链表,关闭硬中断,调用驱...原创 2019-10-10 23:09:35 · 1280 阅读 · 0 评论 -
sk_buff数据结构分析
随着linux内核版本的不同,sk_buff数据结构有细微差异。这里以kernel version:4.1.45来说。一、sk_buff()数据结构/** * struct sk_buff - socket buffer * @next: Next buffer in list * @prev: Previous buffer in list * @tstamp: Time w...原创 2019-10-13 11:10:20 · 797 阅读 · 0 评论 -
Linux内核基础知识
sk_buff结构当缓冲区向上传经各个网络分层时,并没有把L2层的抱头从缓冲区删除,而是把指向有效载荷开端的指针向前移动到L3报头的开端。__u32,说定义在<asm/types.h>头文件,但是没有找到这个文件。在/usr/src/linux-headers-4.15.0-33-generic/include/uapi/asm-generic/int-ll64.h中找到了。...原创 2019-08-19 21:48:36 · 432 阅读 · 0 评论