tun驱动之open
tun驱动对应的设备文件是:/dev/net/tun,其详细信息如下:
crw-rw-rw- 1 root root 10, 200 2月 26 08:05 tun
主次设备号的定义如下:
#define MISC_MAJOR 10
#define TUN_MINOR 200
由于tun驱动属于misc设备驱动,因此用户调用open打开/dev/net/tun时,会调用到misc_open。
static int misc_open(struct inode *inode, struct file *file)
{int minor = iminor(inode);struct miscdevice *c;int err = -ENODEV;const struct file_operations *new_fops = NULL;mutex_lock(&misc_mtx);// 根据次设备号,查找miscdevice,获取其fops(对于tun设备,就是tun_fops)list_for_each_entry(c, &misc_list, list) {if (c->minor == minor) {new_fops = fops_get(c->fops);break;}}if (!new_fops) {mutex_unlock(&misc_mtx);request_module("char-major-%d-%d", MISC_MAJOR, minor);mutex_lock(&misc_mtx);list_for_each_entry(c, &misc_list, list) {if (c->minor == minor) {new_fops = fops_get(c->fops);break;}}if (!new_fops)goto fail;}/** Place the miscdevice in the file's* private_data so it can be used by the* file operations, including f_op->open below*/file->private_data = c;err = 0;replace_fops(file, new_fops); // 将file->f_ops设置为tun_fopsif (file->f_op->open)err = file->f_op->open(inode, file); // 调用tun_fops
fail:mutex_unlock(&misc_mtx);return err;
}
代码中已经加了注释,最终调用到tun_fops中的open,即tun_chr_open。
static int tun_chr_open(struct inode *inode, struct file * file)
{
struct net *net = current->nsproxy->net_ns;
struct tun_file *tfile;
DBG1(KERN_INFO, "tunX: tun_chr_open\n");
// sk_alloc返回struct sock类型,tun_file第一个成员是struct sock类型,所以可以进行类型转换
tfile = (struct tun_file *)sk_alloc(net, AF_UNSPEC, GFP_KERNEL,
&tun_proto, 0);
if (!tfile)
return -ENOMEM;
RCU_INIT_POINTER(tfile->tun, NULL);
tfile->flags = 0;
tfile->ifindex = 0;
init_waitqueue_head(&tfile->wq.wait);
RCU_INIT_POINTER(tfile->socket.wq, &tfile->wq);
tfile->socket.file = file;
tfile->socket.ops = &tun_socket_ops;
sock_init_data(&tfile->socket, &tfile->sk);
tfile->sk.sk_write_space = tun_sock_write_space;
tfile->sk.sk_sndbuf = INT_MAX;
file->private_data = tfile;
INIT_LIST_HEAD(&tfile->next);
sock_set_flag(&tfile->sk, SOCK_ZEROCOPY);
memset(&tfile->tx_array, 0, sizeof(tfile->tx_array));
return 0;
}
sk_alloc申请的内存的大小,是由tun_proto.obj_size来指定的。上面的代码中,比较重要的几个地方,已经加粗。下面是涉及到的两个结构。
struct tun_file {
struct sock sk;
struct socket socket;
struct socket_wq wq;
... ...
};
static struct proto tun_proto = {
.name = "tun",
.owner = THIS_MODULE,
.obj_size = sizeof(struct tun_file), // 指定动态申请的tun_file大小
};
最后做下总结:用户空间打开/dev/net/tun驱动文件时,最终是调用tun_chr_open来处理的。在tun_chr_open中申请struct tun_file结构,并进行了相关字段的初始化。
tun驱动之open相关推荐
- tun驱动之read
从tun驱动读取的数据,最终来源于用户空间通过write写入的数据,如下所示: inti fd = socket(); ...
- tun驱动之tun_init
tun驱动的初始化方法是tun_init. static int __init tun_init(void) {int ret = 0;pr_info("%s, %s\n", DR ...
- linux tap 源码分析,tun/tap 驱动源码分析
此驱动运行时可设置tun模式和tap模式,tun模式能取到IP数据包,无法获得ARP数据,而tap模式取到的是以太包,可以得到链路层以上的一切数据包. 由于项目需要使用tun驱动,而又不想不求甚解,从 ...
- Tun/Tap接口指导
转载来源: 本文来自博客园,作者:charlieroro,转载请注明原文链接:https://www.cnblogs.com/charlieroro/p/13497340.html ========= ...
- TUN/TAP 学习总结(三) —— Windows TUN demo
这个和Linux 的TUN demo一样,添加一条静态路由指定TUN设备,demo 程序从TUN读取报文,简单处理ICMP报文,然后送回协议栈,从而使ping命令成功执行. 与Linux 不同,win ...
- TCP/IP网络的一些问题(路由/协议/linux的实现)
1.linux的虚拟网卡-tun linux的虚拟网卡驱动可以配置为两种模式,一种是点对点的tun模式,一种是以太网tap模式,实质上tun模式中从虚拟网卡出来的是ip数据报,也就是三层数据,而tap ...
- vmware的vmnet-概念的解说
vmware本身实现了一个很不错的虚拟网络-vmnet,这个虚拟网络完全可以脱离vmware而存在,我个人十分看好这个虚拟网络架构,它实质上是在内核实现的一个虚拟的链路层网络,至于它还有没有其它的组网 ...
- Linux虚拟化KVM-Qemu分析(九)之virtio设备
目录 1. 概述 2. 流程分析 3. tap创建 - 网卡后端设备 4. virtio-net创建 4.1 数据结构 4.2 流程分析 4.2.1 class_init 4.2.2 instance ...
- 超猛tuntap虚拟网卡实现超猛UDP隧道
TUN/TAP虚拟网卡在25Gbps物理网卡的环境下可以接近25Gbps的转发能力吗? 答案当然是可以. 实现简单到让你怀疑人生! 首先看一个图: 上周末写了点代码,这周贴上去: https://gi ...
最新文章
- 吉大c 语言程序设计奥鹏作业,吉大19秋学期《C语言程序设计》在线作业一【满分答案】...
- 使用adb命令控制Android
- Ajax+Node.js前后端交互最佳入门实践(04)
- C#位运算讲解与示例
- 【算法】剑指 Offer 58 - I. 翻转单词顺序
- Springboot 整合 Mybatis 的完整 Web 案例
- java中可以让实例改变了类Feild(java这么干就是一个错误,你看到了就当做是类在该修改或这个类Feild)...
- 微信号码检测工具的使用成功案例(一)
- android 竖屏优先,android 强制设置横屏 判断是横屏还是竖屏
- ipad如何与计算机连接网络连接不上,苹果平板ipad的无法连接无线网络WiFi如何解决...
- gym101964 G.Matrix Queries(思维+线段树)
- unity 制作拼图游戏
- 善用思维导图来整理发散的思维
- Cloudera Manager —— 端到端的企业数据中心管理工具
- LCD液晶屏驱动详解
- 【DS】三分钟带你学会时间(空间)复杂度
- RTOS与Linux
- 浅析私有化即时通讯软件的用处有哪些
- UE4 学习记录八 给场景中添加背景音乐和动画音效,运动加速效果
- 云原生时代崛起的编程语言Go常用标准库实战