慢慢欣赏linux 网络协议栈四 sk_buff以及数据收发

Linux 网络协议栈开发代码分析篇之数据收发(一) —— netif_receive_skb()函数 提到网络协议栈,数据的收发是核心,我们先来看下数据的接收函数 netif_receive_skb()      先统一介绍下数据收发            对于linux内核来说,网络报文由网络设备来进行接收。设备驱动程序从网络设备中读取报文,通过内核提供的网络接口函数,将报文传递到内核中的网络协议栈。报文经过协议栈的处理,或转发、或丢弃、或被传送给某个进程。 阅读详情

以3c359x.c的网卡为例,因为这是《深入理解Linux网络技术内幕》里面的例子

irqreturn_t vortex_interrupt(int irq, void *dev_id)
	vortex_rx(dev);
	=>int vortex_rx(struct net_device *dev)
		struct vortex_private *vp = netdev_priv(dev);
		void __iomem *ioaddr = vp->ioaddr;
		short rx_status;
		while ((rx_status = ioread16(ioaddr + RxStatus)) > 0)
			int pkt_len = rx_status & 0x1fff;
			struct sk_buff *skb = dev_alloc_skb(pkt_len + 5);
			skb_reserve(skb, 2);	/* Align IP on 16 byte boundaries */
			if (vp->bus_master && ! (ioread16(ioaddr + Wn7_MasterStatus) & 0x8000)) 
				dma_addr_t dma = pci_map_single(VORTEX_PCI(vp), skb_put(skb, pkt_len), pkt_len, PCI_DMA_FROMDEVICE);
				iowrite32(dma, ioaddr + Wn7_MasterAddr);
				iowrite16((skb->len + 3) & ~3, ioaddr + Wn7_MasterLen);
				iowrite16(StartDMAUp, ioaddr + EL3_CMD);
				while (ioread16(ioaddr + Wn7_MasterStatus) & 0x8000)
					;
				pci_unmap_single(VORTEX_PCI(vp), dma, pkt_len, PCI_DMA_FROMDEVICE);
			else 
				ioread32_rep(ioaddr + RX_FIFO, skb_put(skb, pkt_len), (pkt_len + 3) >> 2);
				
			iowrite16(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
			skb->protocol = eth_type_trans(skb, dev);
			netif_rx(skb)
			=>int netif_rx(struct sk_buff *skb)
				if (queue->input_pkt_queue.qlen <= netdev_max_backlog)
					if (queue->input_pkt_queue.qlen)
			enqueue:
						__skb_queue_tail(&queue->input_pkt_queue, skb);
						return NET_RX_SUCCESS;
						
					napi_schedule(&queue->backlog);
					=>inline void napi_schedule(struct napi_struct *n)
						if (napi_schedule_prep(n))
							__napi_schedule(n);
							=>void __napi_schedule(struct napi_struct *n)
								list_add_tail(&n->poll_list, &__get_cpu_var(softnet_data).poll_list);
								__raise_softirq_irqoff(NET_RX_SOFTIRQ);//唤醒软中断
					goto enqueue;

收包软中断入口函数

void net_rx_action(struct softirq_action *h)
	struct list_head *list = &__get_cpu_var(softnet_data).poll_list;
	while (!list_empty(list))
		n = list_first_entry(list, struct napi_struct, poll_list);

		have = netpoll_poll_lock(n);

		weight = n->weight;
		
		n = list_first_entry(list, struct napi_struct, poll_list);

		have = netpoll_poll_lock(n);

		weight = n->weight;
		
		work = 0;
		if (test_bit(NAPI_STATE_SCHED, &n->state))
			work = n->poll(n, weight);
			=>int process_backlog(struct napi_struct *napi, int quota)
			
		budget -= work;

Linux 网络协议栈开发代码分析篇之数据收发(一) —— netif_receive_skb()函数
https://blog.youkuaiyun.com/zqixiao_09/article/details/79185800

Linux内核--网络栈实现分析(二)--数据包的传递过程(上)
https://blog.youkuaiyun.com/geekcome/article/details/7492423

Linux 网络协议栈开发代码分析篇之数据收发(二) —— dev_queue_xmit()函数 当所有的信息都准备好了之后,例如,出口设备,下一跳的地址,以及链路层地址。就会调用dev.c文件中的dev_queue_xmin函数,该函数是设备驱动程序执行传输的接口。也就是所有的数据包在填充完成后,最终发送数据时,都会调用该函数。      Dev_queue_xmit函数只接收一个skb_buff结构作为输入的值。此数据结构包含了此函数所需要的一切信息。Skb->dev是出口设备,skb- 阅读详情

相关推荐

sk_buff结构详解

sk_buff结构是Linux网络模块中最重要的数据结构之一,用以描述已接收或待发送的数据报文信息,其成员可大致分为以下几类: 与sk_buff组织相关的成员变量。通用成员变量。标志性变量。与特性相关的成员变量。   下面对sk_buff结构进行详细介绍。 struct sk_buff { /* These two members must be first. */

keepmovingnow的专栏 1708

linux内核网络 sk_buff 之队列管理函数

pskb_trim()函数其实包含了skb_trim()函数,如果当分片结构数据区没有数据则skb_trim()函数和pskb_trim()函数是一样的。删除数据函数和插入数据函数相对应,和删除函数不一样,删除函数只是删除队列链表中的某个元素节点,而删除数据函数是删除sk_buff结构中的数据区数据以及删除sk_buff结构中分片结构的数据区中数据。然后创建个空的链表。插入数据函数和插入函数是不一样的,插入函数是把sk_buff结构体插入链表中,而插入数据函数是把数据插入sk_buff结构的数据区。

m0_74282605的博客 790

Linux 网络协议栈开发(四)—— 二层桥实现原理

(转自 http://blog.youkuaiyun.com/u010246947/article/details/18223263) 网桥原理:     网桥工作在链路层,所以它是二层的东西,对于以太网来说网桥和二层网络设备交换机的工作方式几乎是一样的,每个交换机包含一系列以太网接口,交换机通过其内部的硬件交换芯片实现对这些以太网接口出入报文的二层接收转发及过滤等二层qos功能,网桥在功能上和交换机

知秋一叶 1万+

Linux TCP/IP 协议栈的关键数据结构Socket Buffer

sk_buff结构可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息。它在中定义,并包含很多成员变量供网络代码中的各子系统使用。 这个结构在linux内核的发展过程中改动过很多次,或者是增加新的选项,或者是重新组织已存在的成员变量以使得成员变量的布局更加清晰。它的成员变量可以大致分为以下几类: Layout 布局

Make Progress Everyday! 3634

sk_buff结构小谈

struct sk_buff 可能是linux网络代码中最重要的数据结构,它表示接受或发送数据包的包头信息,并包含很多成员变量供网络代码中的各子系统使用。

linux sk_buff结构详解

linux著名的sk_buff结构详解 struct sk_buff可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息,并包含很多成员变量供网络代码中的各子系统使用。

Linux下4种uid

另外这个程序中使用的是seteuid而不是setuid, 这是因为如果改成setuid的话, 执行第一个setuid时, 因为当前effective uid为root, 第一个规则就满足, 所以把real uid, effective uid和saved uid都改成zzz了, 因为这样更改了saved uid, 执行第二个setuid时, 规则一&规则二都不满足,调用失败,我们就回不去root了。这个改动之所以能成功,原因在于上面列举出的情况2):该ID为进程的real user ID,满足规则二。

dcj_56dcj的博客 1391

【2026-Spark实验一-Windows中安装Spark环境】

本文详细介绍了在Windows系统中配置Spark 3.5.8开发环境的完整流程。主要内容包括:安装JDK 8并配置环境变量,下载并解压Spark 3.5.8预编译版,设置SPARK_HOME系统变量,配置Hadoop的winutils工具解决Windows兼容性问题。通过spark-shell和SparkPi示例程序验证环境配置成功,确保Spark能够正常运行分布式计算任务。文中特别强调了路径命名规范、环境变量设置顺序等关键细节,提供了完整的配置截图和验证方法,帮助开发者快速搭建稳定的Spark学习环境。

pblh123的专栏 1587

linux 网络 sk_buff结构

sk_buff的意思是socket buffer,这是Linux网络子系统中的核心数据结构。定义在中,它由许多变量组成,目标就是满足所有网络协议的需要。sk_buff在不同的网络层被使用(MAC 或其他在 L2 的协议,在 L3 的 IP 协议,在 L4 的 TCP 或 UDP 等),当它从一层传递到另一层时,各个字段也会发生变化。在被传递到 L3 之前,L4 会追加头信息,然后在被传递到 L2 之前,L3 会追加头信息。。

wwwlyj123321的博客 4476

openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解

文章目录1. 写在前面2. Heatmap 类实现热力图2.1 Heatmap 参数2.2 实现热力图3. 完整代码4. 添加删除map图层的方法5. 热力图自身的get,set方法 1. 写在前面 我们主要看热力图的效果,区域绘制效怎么设置详细内容可以访问 openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解 在 openlayers 中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer、热度图(HeatMap L

@必意玲 1万+

硅光芯片边耦合器综述(一)

摘要:硅光子学在过去几十年间吸引了越来越多的关注,由于其具有诸多优点,如极低的成本、硅的高折射率带来的高集成密度,以及与现有半导体制造工艺的兼容性,被认为是未来日常应用中的一项充满前景的关键技术。在硅光子集成电路中,光互连是一个重要的问题,而在数据中心和光传输系统等应用场景中,光纤到芯片的光互连至关重要。光纤到芯片的光学耦合主要分为两大类:面外耦合(off-plane coupling)和面内耦合(in-plane coupling)。光栅耦合器属于前者,而边耦合器则属于面内耦合。本文主要关注硅光子集成电路

jhbfsoagoodgio的博客 5041

sk_buff经典分析

Linux TCP/IP 协议栈的关键数据结构Socket Buffer(sk_buff ) sk_buff结构可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息。它在中定义,并包含很多成员变量供网络代码中的各子系统使用。 这个结构在linux内核的发展过程中改动过很多次,或者是增加新的选项,或者是重新组织已存在

qinm的专栏 1167

NAO V6 开发环境的配置(附所有文件)

NAO V6开发环境配置前言环境Robot SettingsChoregraphe 2.8.5.10python2.7+naoqi2.8+opencv4.1.0putty与FileZilla 前言 学校的机器人摸索了一段时间,之前摸爬滚打探索环境,之前没接触这类机器人可能会非常艰辛,希望能给需要的人一些帮助。Nao与pepper通用 环境 win10(x64)+naoqi2.8 1、Robot S...

wbhhello的博客 3219

Linux中一个网络包的发送/接收流程

Linux发送HTTP网络包图像 图像解析 写入套接字缓冲区(添加TcpHeader) 用户态进程通过write()系统调用切到内核态将用户进程缓冲区中的HTTP报文数据通过Tcp Process处理程序为HTTP报文添加TcpHeader,并进行CPU copy写入套接字发送缓冲区,每个套接字会分别对应一个Send-Q(发送缓冲区队列)、Recv-Q(接收缓冲区队列),可以通过ss -nt语句获取当前的套接字缓冲区的状态; # ss -nt State Recv-Q Send-Q .

开源世界 674

PowerShell 升级到 v7 并设置为默认版本(详细操作指南)

本文详细介绍了如何将PowerShell升级到v7并设为默认版本。PowerShell 7基于.NET Core构建,具有跨平台支持、性能优化和新语法特性等优势。文章提供了多种安装方法(MSI安装包、包管理器)和设置默认版本的方案(修改PATH、创建符号链接、配置编辑器等),同时涵盖企业批量部署解决方案和常见问题处理。通过升级到PowerShell 7,用户可以获得更强大的命令行体验,适用于开发、运维和自动化场景。

huluang的专栏 4292

Unity WebView 插件⭐️(十八)3D WebView 原生2D模式 — Native 2D Mode

Unity中的 浏览器插件:3D WebView,利用好该插件我们可以自己使用Unity打造出一个自定义的多样化浏览器。可以用于2D显示,也可以用于3D空间场景中使用,在PC端、手机端和VR设备等都可以有一个非常好的效果。一起来浏览器插件:3D WebView的专栏学习使用吧!

努力前行,总会成为自己心中的那道光 7640

Linux:sk_buff完全剖析与理解【转】

sk_buff 目录 1 sk_buff介绍 2 sk_buff组成 3 struct sk_buff 结构体 4 sk_buff成员变量 4.1 Layout布局 4.2 General通用 4.3 Feature-specific功能相关 5 sk_buff管理和操作函数 5.1缓冲区操作函数 skb_reserve  skb_put  skb_push  skb_pull

奋斗的小鸟 5087

图神经网络实战(8)——图注意力网络(Graph Attention Networks, GAT)

图注意力网络 (Graph Attention Networks, GAT) 是对图卷积网络 (Graph Convolutional Network, GCN) 的改进,提出了一种通过自注意力 (self-attention) 过程计算的加权因子,而不是使用静态的归一化系数。在本节中,我们介绍了 GAT 架构。通过从线性变换到多头注意力的四个主要步骤,了解了 GAT 的工作原理,并在 NumPy 中从零开始构建了 GAT 层。最后,将 GAT 模型应用于 Cora 和 CiteSeer 数据集。

盼小辉丶的博客 1万+

sk_buf, 再转载,太经典了 - 网络协议栈分析 - 草本植物

本文转自: http://www.360doc.com/content/09/0205/16/36491_2466152.shtml# sk_buff结构可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息。它在中定义,并包含很多成员变量供网络代码中的各子系统使用。 这个结构在linux内核的发展过程中改动过很多次,或者是增加新的选项,或者是重新组织已存在的

EthanYYYY的博客 4351

SAP S/4HANA 数据 API 化与 MCP 集成全流程实战指南

通过 RAP 发布 OData、利用 Communication Arrangement 打通外网、再在 MCP-server 里封装函数签名,你就能把 S/4HANA 的核心数据安全、标准化地暴露给任意支持 MCP 的大模型。这条链路的每一个环节都由 SAP 与 MCP 社区提供了现成框架,既兼顾了企业合规,也让 LLM 落地更为轻量。期待你在项目里把这些拼图真正串联起来,让业务数据与生成式 AI 碰撞出高价值的火花。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 977

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux内核sk_buff的结构分析

我看的内核版本是2.6.32. 在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。 而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个是...

但行好事 莫问前程 490

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux内核中sk_buff分析

&lt;style type="text/css"&gt; &lt;!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } --&gt; &lt;/style&gt; 在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_b...

soboer 343

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux 内核网络协议栈 ------sk_buff 结构体 以及 完全解释 (2.6.16)

sk_buff 结构体详解

shanshanpt的专栏 4万+

SATA学习之一 代码分析和学习心得

sata_fsl_init =&amp;amp;amp;gt;platform_driver_register(&amp;amp;amp;amp;fsl_sata_driver);//注册platform驱动 static struct platform_driver fsl_sata_driver = { .driver = { .name = &amp;amp;quot;fsl-sata&amp;amp;qu

shipinsky的博客 9507
上一篇: 慢慢欣赏linux 网络协议栈三 监听链路状态
下一篇: 慢慢欣赏linux 网络协议栈五 bonding配置
天麓
博客等级 码龄22年 323粉丝 437原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值