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相关推荐

  1. tun驱动之read

    从tun驱动读取的数据,最终来源于用户空间通过write写入的数据,如下所示: inti fd = socket();                                          ...

  2. tun驱动之tun_init

    tun驱动的初始化方法是tun_init. static int __init tun_init(void) {int ret = 0;pr_info("%s, %s\n", DR ...

  3. linux tap 源码分析,tun/tap 驱动源码分析

    此驱动运行时可设置tun模式和tap模式,tun模式能取到IP数据包,无法获得ARP数据,而tap模式取到的是以太包,可以得到链路层以上的一切数据包. 由于项目需要使用tun驱动,而又不想不求甚解,从 ...

  4. Tun/Tap接口指导

    转载来源: 本文来自博客园,作者:charlieroro,转载请注明原文链接:https://www.cnblogs.com/charlieroro/p/13497340.html ========= ...

  5. TUN/TAP 学习总结(三) —— Windows TUN demo

    这个和Linux 的TUN demo一样,添加一条静态路由指定TUN设备,demo 程序从TUN读取报文,简单处理ICMP报文,然后送回协议栈,从而使ping命令成功执行. 与Linux 不同,win ...

  6. TCP/IP网络的一些问题(路由/协议/linux的实现)

    1.linux的虚拟网卡-tun linux的虚拟网卡驱动可以配置为两种模式,一种是点对点的tun模式,一种是以太网tap模式,实质上tun模式中从虚拟网卡出来的是ip数据报,也就是三层数据,而tap ...

  7. vmware的vmnet-概念的解说

    vmware本身实现了一个很不错的虚拟网络-vmnet,这个虚拟网络完全可以脱离vmware而存在,我个人十分看好这个虚拟网络架构,它实质上是在内核实现的一个虚拟的链路层网络,至于它还有没有其它的组网 ...

  8. Linux虚拟化KVM-Qemu分析(九)之virtio设备

    目录 1. 概述 2. 流程分析 3. tap创建 - 网卡后端设备 4. virtio-net创建 4.1 数据结构 4.2 流程分析 4.2.1 class_init 4.2.2 instance ...

  9. 超猛tuntap虚拟网卡实现超猛UDP隧道

    TUN/TAP虚拟网卡在25Gbps物理网卡的环境下可以接近25Gbps的转发能力吗? 答案当然是可以. 实现简单到让你怀疑人生! 首先看一个图: 上周末写了点代码,这周贴上去: https://gi ...

最新文章

  1. 吉大c 语言程序设计奥鹏作业,吉大19秋学期《C语言程序设计》在线作业一【满分答案】...
  2. 使用adb命令控制Android
  3. Ajax+Node.js前后端交互最佳入门实践(04)
  4. C#位运算讲解与示例
  5. 【算法】剑指 Offer 58 - I. 翻转单词顺序
  6. Springboot 整合 Mybatis 的完整 Web 案例
  7. java中可以让实例改变了类Feild(java这么干就是一个错误,你看到了就当做是类在该修改或这个类Feild)...
  8. 微信号码检测工具的使用成功案例(一)
  9. android 竖屏优先,android 强制设置横屏 判断是横屏还是竖屏
  10. ipad如何与计算机连接网络连接不上,苹果平板ipad的无法连接无线网络WiFi如何解决...
  11. gym101964 G.Matrix Queries(思维+线段树)
  12. unity 制作拼图游戏
  13. 善用思维导图来整理发散的思维
  14. Cloudera Manager —— 端到端的企业数据中心管理工具
  15. LCD液晶屏驱动详解
  16. 【DS】三分钟带你学会时间(空间)复杂度
  17. RTOS与Linux
  18. 浅析私有化即时通讯软件的用处有哪些
  19. UE4 学习记录八 给场景中添加背景音乐和动画音效,运动加速效果
  20. 云原生时代崛起的编程语言Go常用标准库实战

热门文章

  1. oracle rac v3500_OEL6.X IBM v3500存储多路径配置
  2. 新手如何看懂电路图?有哪些必要的知识点?
  3. 香魂一缕随风散,愁绪三更入梦遥
  4. Vue和微信小程序绑定样式的区别
  5. 简单十招教你学会破解软件
  6. 【Comet OJ】 - Contest #9 X Round 3 【XR-3】小道消息
  7. RocketMQ 源码分析 —— 集成 Spring Boot
  8. 解决 Birt 等报表工具制作报表的几个难题
  9. 架构师之路-【1】架构方法
  10. nodejs+vue家庭菜谱食谱管理系统