Tap虚拟网卡 (草稿)

1 概述

Tap设备通常用于虚拟化场景下,参考如下场景:

图中标注了关键函数,以及数据流向。 

tun有两个数据接口,

  • file,给用户态使用;
  • socket,给内核态使用,例如vhost

2 异步处理

图中,蓝色线标识的是虚机输出的网络流量,在tap设备这边,不存在异步处理,参考代码:

tun_sendmsg() / tun_chr_write_iter()
  -> tun_get_user()
	-> tun_rx_batched()
	  -> netif_receive_skb()

如红色线部分,是输入到虚拟机的网络流量,在tap设备这边,则存在异步处理,需要wait和wakeup,参考代码:

tun_recvmsg() / tun_chr_read_iter()
  -> tun_do_read()
	-> tun_ring_recv()
	   ---
	ptr = ptr_ring_consume(&tfile->tx_ring);
	if (ptr)
		goto out;

	if (noblock) {
		error = -EAGAIN;
		goto out;
	}

	add_wait_queue(&tfile->socket.wq.wait, &wait);

	while (1) {
		set_current_state(TASK_INTERRUPTIBLE);
		ptr = ptr_ring_consume(&tfile->tx_ring);
		if (ptr)
			break;
		...
		schedule();
	}

	__set_current_state(TASK_RUNNING);
	remove_wait_queue(&tfile->socket.wq.wait, &wait);
	   ---



tun_net_xmit()
---
	if (ptr_ring_produce(&tfile->tx_ring, skb))
		goto drop;

	/* NETIF_F_LLTX requires to do our own update of trans_start */
	queue = netdev_get_tx_queue(dev, txq);
	queue->trans_start = jiffies;

	/* Notify and wake up reader process */
	if (tfile->flags & TUN_FASYNC)
		kill_fasync(&tfile->fasync, SIGIO, POLL_IN);
	tfile->socket.sk->sk_data_ready(tfile->socket.sk);
---

sock_def_readable()
---
	rcu_read_lock();
	wq = rcu_dereference(sk->sk_wq);
	if (skwq_has_sleeper(wq))
		wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | EPOLLPRI |
						EPOLLRDNORM | EPOLLRDBAND);
	sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
	rcu_read_unlock();
---

By default, sk->sk_wq is socket->wq,参考sock_init_data()

vhost只是数据使用了socket接口,在等待来自tap的数据时,它使用的了poll,

vhost_net_enable_vq()
---
	sock = vhost_vq_get_backend(vq);
	if (!sock)
		return 0;
	return vhost_poll_start(poll, sock->file);
---

tun_chr_poll()
---
	sk = tfile->socket.sk;

	poll_wait(file, sk_sleep(sk), wait);
	...
---

vhost_poll_init()
---
	init_waitqueue_func_entry(&poll->wait, vhost_poll_wakeup);
---

sk_sleep()就是sk->sk_wq,在sk_def_readable()会对其执行唤醒操作,进而调用vhost_poll_wakeup(),后者会提交一个vhost work,执行handle_rx操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/216586.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

他山之石,可以攻玉|银行业数据中心数字化转型之模型篇 04(完结)

导语:他山之石,可以攻玉|银行业数据中心数字化转型之模型篇 04(完结) 银行业数据中心数字化转型是一项系统性工程既涉及管理层面转型——包括数字化转型战略、基础架构和技术架构转型、技术创新和知识体系转型&#xf…

2023Q4 私有化版本发布,和鲸 ModelWhale 持续赋能大科研、高校教改的 AI for Science

作为数据科学多人协同平台,和鲸 ModelWhale 从一而终地为各级用户提供完备而周全的解决方案,覆盖数据研究、算法探索、模型调优、Python 案例教学等多个场景。特别地,如果对研究分析平台有更高的安全合规要求、希望兼容原有业务系统&#xff…

安全测试工具Burpsuit和OWASP ZAP使用入门指南

Burpsuit使用入门指南 安装: 网上有很多相关相关保姆级别教程,所以这里不加赘述了 尽量使用java8版本,破解版兼容8做的比较好 如果发现注册机无法打开或者能打开注册机【run】无法点击唤起软件安装,可以使用命令行工具java -jar…

深入解析常见的软件架构模式

在软件开发领域,选择合适的架构模式对于项目的可维护性和扩展性至关重要。本文将深入探讨常见的软件架构模式,包括MVC、MVP、MVVM、MVVM-C以及VIPER。 1. MVC(Model-View-Controller) MVC 是一种经典的软件架构模式,将…

一天一个设计模式---生成器模式

概念 生成器模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。它允许您逐步构造一个对象,将构建过程与最终对象的表示分离开来。这种模式通常用于创建复杂的对象,这些对象可能有多个部分组成&#xff0c…

探索人工智能领域——每日20个名词详解【day7】

目录 前言 正文 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以…

智能优化算法应用:基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于社会群体算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社会群体算法4.实验参数设定5.算法结果6.参考…

Spring Security 自定义异常失效?源码分析与解决方案

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

用python删除指定目录下带某个字符串的图片

前言: 在文件处理中,有时我们需要批量删除指定文件夹中的特定类型文件。如果文件数量非常庞大,手动删除会非常麻烦,所有可以用 Python 编写一个简单而高效的脚本,自动执行重复性的任务,从而节省时间和精力&…

Intellij idea 快速定位到文件的开头或者结尾的几种方式

方式一:Scroll To Top / Scroll To Bottom 首先打开Keymap设置,并搜索Scroll To 依次点击File->Settings->Keymap可打开该界面 对于Scroll To Top 快速滑动定位到文件顶部, Scroll To Bottom快速定位到文件底部 默认是没有设置快捷键的…

Python应用利器:缓存妙用,让你的程序更出色更快速!

更多资料获取 📚 个人网站:ipengtao.com 在 Python 应用程序中,使用缓存能够显著提高性能并降低资源消耗。本文将详细介绍如何在 Python 中实现缓存机制,包括内置 functools 模块提供的 lru_cache 装饰器以及自定义缓存机制。 使…

FacetWP Hierarchy Select网站内容层次结构选择插件

点击阅读FacetWP Hierarchy Select网站内容层次结构选择插件原文 FacetWP Hierarchy Select网站内容层次结构选择插件可让您基于分层分类法创建引导下拉菜单。 FacetWP Hierarchy Select网站内容层次结构选择插件功能 通过引导式下拉菜单过滤结果,一次一个深度级…

用python写一个简单的爬虫

爬虫是一种自动化程序,用于从互联网上获取数据。它能够模拟人类浏览网页的行为,访问网页并提取所需的信息。爬虫在很多领域都有广泛的应用,例如数据采集、信息监控、搜索引擎索引等。 下面是一个使用Python编写的简单爬虫示例: …

2023/11/30JAVAweb学习(postman,各种参数,统一响应数据,三层架构,分层解耦,bean组件扫描,Bean注入及解决方式)

数组json形式 想切换实现类,只需要只在你需要的类上添加 Component 如果在同一层,可以更改扫描范围,但是不推荐这种方法 注入时存在多个同类型bean解决方式

SQL手工注入漏洞测试(PostgreSQL数据库)-墨者

———靶场专栏——— 声明:文章由作者weoptions学习或练习过程中的步骤及思路,非正式答案,仅供学习和参考。 靶场背景: 来源: 墨者学院 简介: 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

[SHCTF 2023]——week1-week3 Web方向详细Writeup

Week1 babyRCE 源码如下 <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\>|\<|\|\"/i", $rce)) {system($rce);}else {echo "hhhhhhacker!!!".&…

医院信息化专业人员必备医院业务运作及管理流程知识(详细)

业务流程是一家医院运作的基础,医院所有业务都需要流程加以驱动。熟知医院各项业务,了解医院管理流程,有利于医院工作人员更好地投入自身岗位,提高工作效率。本文整理了常见医院业务运作及管理流程,仅供参考! 【门诊业务】 一、门诊业务的特点: 1.接诊病人多,就诊时…

全网最新最全的自动化测试教程:python+pytest接口自动化-requests发送post请求

简介 在HTTP协议中&#xff0c;与get请求把请求参数直接放在url中不同&#xff0c;post请求的请求数据需通过消息主体(request body)中传递。 且协议中并没有规定post请求的请求数据必须使用什么样的编码方式&#xff0c;所以其请求数据可以有不同的编码方式&#xff0c;服务…

Linux下快速创建大文件的4种方法

1、使用 dd 命令创建大文件 dd 命令用于复制和转换文件&#xff0c;它最常见的用途是创建实时 Linux USB。dd 命令是实际写入硬盘&#xff0c;文件产生的速度取决于硬盘的读写速度&#xff0c;根据文件的大小&#xff0c;该命令将需要一些时间才能完成。 假设我们要创建一个名…

记录华为云服务器(Linux 可视化 宝塔面板)-- Nginx配置出现500错误记录

文章目录 1、路由配置&#xff0c;访问显示500如有启发&#xff0c;可点赞收藏哟~ 1、路由配置&#xff0c;访问显示500 错误如图显示500 解决思路如下 1、先查看错误日志 错误日志存放位置 提示 /login配置的文件有问题 开始配置如下图 修改前 修改后&#xff08;即在/l…