虚拟网卡TUN/TAP 驱动程序设计原理 – 我是韦哥

在昨天,韦戈写道。Linux下TUN/TAP手段的交际规律 》一文,它只指we的持有格形式两个用户指引航线当打中交际办法和资源。,并不注意阐明Tun虚拟网卡驱动力是到何种地步创造的,我合法的主教教区一篇文字解说这点。,它曾经被武断地重现了。,谢谢作者,原始的在喂。:虚拟网卡TUN/TAP 驾驶员的设计规律

简介

虚拟网卡Tun/tap驱动力是一开源条,忍受多类UNIX平台,OpenVPN和Vtun都由于此创造了隧道包的封装。。本文将绍介tun/tap驱动力的应用并辨析虚拟网卡tun/tap驱动力顺序在Linux境况下的设计思绪。

tun/tap
驱动力顺序创造了虚拟网卡的功用,TUN管理的虚拟手段是对等手段。,TAP表现虚拟手段是以太网手段。,这两个手段为扩大任务相干包创造两样的包。。使用tun/tap
驱动力,可以将tcp/ip科学实验报告栈处置好的扩大任务相干分装传给大约一应用TUN/TAP驱动力顺序的指引航线,经过处理重行处置跟随发生送回物理成分链路。。开源条
openvpn( )和Vtun( 持有都是Tun/TAP驱动力顺序创造的隧道封装。。

应用TUN/TAP驱动力顺序

在Linux 2.4内核版本和晚年版本,tun/tap驱动力是作为零碎默许提前的汇编进内核打中。在应用垄断,确保Tun/TAP模块曾经装载量而且手段证明曾经蜂:

#modprobe tun
#mknod /dev/net/tun c 10 200

限制因素C是特点手段。, 10和200是主手段号和二次手段号RES。。

大约,we的持有格形式可以在顺序中应用驱动力顺序。。

应用TUN/TAP手段的示例顺序(OpenOpenPN开源条摘) ,证明)

int open_tun (康斯特 char *dev, char *actual, int 维)
{
  struct ifreq ifr;
  int fd;
  char *device = "/dev/net/tun";
  if (FD) = open (办法), O_RDWR)) < 0) //准备描写符
    msg (M_ERR, "Cannot open TUN/TAP dev %s", device);
  memset (&ifr, 0, sizeof (ifr));
  ifr.ifr_flags = IFF_NO_PI;
  if (!strncmp (dev, "tun", 3)) {  
      ifr.ifr_flags |= IFF_TUN;
   }
  else if (!strncmp (dev, "tap", 3)) {
      ifr.ifr_flags |= IFF_TAP;
    }
  else {
    msg (M_FATAL, "I don''t recognize device %s as a TUN or TAP device",dev);
    }
  if (strlen (dev) > 3)		/* unit number specified? */
    strncpy (, dev, IFNAMSIZ);
  if (ioctl (FD), TUNSETIFF, (虚空) *) IFR) < 0) //翻开虚拟网卡
    msg (M_ERR, "Cannot ioctl TUNSETIFF %s", dev);
  set_nonblock (FD));
  msg (M_INFO, "TUN/TAP device %s opened", );
  strncpynt (actual, , 维);
  return fd;
}

让与前述的作用后,可以在shell命令行下应用IFCONFIG。 命令使展开虚拟网卡了,创作的特点手段描写符,在顺序中应用read和write作用就可以读取或许发发出教训虚拟的网卡履历了。

TUN/TAP驱动力器的任务规律

做 为虚拟网卡驱动力,Tun /TAP驱动力顺序的履历接纳和发送与现实不指示方向互相牵连,它是经过用户健康状况改变的。。在Linux下,创造核认为和用户健康状况履历。 互动的,有很多办法。:一般性插座可用来创造特别插座。,使用Socket创造履历互动的;经过PROC证明零碎准备履历互动的;您还可以应用手段证明。 式,使用手段证明让与手段驱动力顺序的相关联的例程。,手段驱动力顺序自身是去核健康状况和用户健康状况当打中摇动。,TUN/TAP驱动力顺序是使用手段证明创造履历间的合流 互。

从和解上讲,TUN/TAP驱动力顺序做错简略的网卡驱动力顺序。,同时,还创造了特点手段驱动力顺序。。使用特点手段衔接用户健康状况和内去核态。上面是示意图。:

Tun/tap 驱动力顺序收录两一份遗产。,一份遗产是特点手段驱动力顺序。,另一一份遗产是NIC驱动力顺序一份遗产。。使用网卡驱动力一份遗产接纳来自某处TCP/IP科学实验报告栈的扩大任务相干分装跟随发生送或许反之将接 收到的扩大任务相干分装传给科学实验报告栈处置,特点驱动力一份遗产在内核和U当中改变扩大任务相干。,仿照物理成分链路打中履历接纳与发送。TUN/TAP驱动力顺序曾经创造了两种。 驱动力集成。

上面是Tun/TAP手段体系和解的使明确。:

struct tun_struct {
	char 姓名〔8〕 //手段名
	unsigned long 		flags; Tun与TAP手段的分别
	struct fasync_struct    *fasync; 证明异步流通的和解
	wait_queue_head_t 	read_wait; //可得到队列
	struct net_device	dev;  //linux 抽象概念扩大任务相干手段和解
	struct sk_buff_head 	txq; 扩大任务相干缓冲队列
    struct net_device_stats	stats; NIC健康状况教训和解
};

struct NETI手段和解是由T表示愿意的一致扩大任务相干手段和解。,使明确了零碎的一致使用摇动。。

Tun/tap驱动力中创造的网卡驱动力的处置例程:

static int tun_net_open(struct net_device DEV);
static int tun_net_close(struct net_device DEV);
static int tun_net_xmit(struct sk_buff *skb, struct net_device DEV);使成群发送拜访顺序
static void tun_net_mclist(struct net_device DEV);为多位置的改变扩大地址表
static
struct net_device_stats *tun_net_stats(struct net_device
DEV);当应用顺序需求实现扩大任务相干摇动的大约合乎情理教训时,,即将到来的作用可以让与。,如IFCONFIG、NETSTAT等。。
int tun_net_init(struct net_device DEV);扩大任务相干手段设定初值顺序

特点手段一份遗产:

在Linux,特点手段和块手段一致以证明的方法使用,使用它们的摇动是一致的。,应用OPEN()作用翻开手段证明或统治证明。,应用Read()和写()作用来读取和以书面提出证明等。。Tun/TAP驱动力顺序使明确的特点手段的使用摇动为:

static struct file_operations tun_fops = {
owner: THIS_MODULE,
llseek: tun_chr_lseek,
read tun_chr_read,
write: tun_chr_write,
poll: tun_chr_poll,
ioctl: tun_chr_ioctl,
open: tun_chr_open,
release: tun_chr_close,
fasync: tun_chr_fasync
};

在内核中应用MISCX表达 该作用表示为非标准特点手段驱动力顺序。,表示愿意与特点手段的杂多的顺序摇动。从\\驱动力顺序\NET中拔出剑密码

static struct miscdevice tun_miscdev=
{
        TUN_MINOR,
        "net/tun",
        &tun_fops
};
int __init tun_init(虚空))
{
	…
	if (misc_register(&tun_miscdev)) {
		printk(KERN_ERR "tun: Can''t register misc device %d\n", TUN_MINOR);
		return -EIO;
	}
	return 0;
}

翻开Tun/TAP办法时,open 作用将让与TuniChrxOnter()作用。,大约要紧的设定初值处理将使筋疲力尽。,包孕设置网卡驱动力顺序设定初值功用和设定初值 的设定初值。TUN/TAP驱动力网卡的表示嵌入到特点中。,它是经过对特点手段证明描写符使用自使明确的ioctl设置注意 TunSETIFF使筋疲力尽了网卡的表示。。上面是作用让与相干的示意图。:

使 应用IOCTL()作用伎俩特点手段证明描写符,将让与特点手段打中TuniChryIOCTL。 设置一曾经翻开的Tun/TAP手段。,即使设置被帐单为TunsTIFF,则让与tun_set_iff() 作用,即将到来的功用将使筋疲力尽一非常要紧的途径。,执意对网卡驱动力举行表示register_netdev(&tun->dev),NIC驱动力顺序的杂多的处置 例程的挂接在open管理时由tun_chr_open()作用设定初值好了。

TUN/TAP器件的任务处理:

Tun/tap 手段表示愿意的虚拟网卡驱动力,从TCP/IP科学实验报告栈的角度看,它与真正的NIC驱动力顺序不注意分别。。从驱赶者的角度,它与Tun/TAP打中NIC两样。 由手段获取的履历做错物理成分链路。,它来自某处用户区域。,TUN/TAP手段驱动力顺序按特点创造用户区域的履历收集。Tun/TAP手段不发送履历。 发送到物理成分链路。,它经过特点手段发送到用户区域。,于是由其他用户发生发送。。

发送处理:

使 使用TUN/TAP网卡顺序经过PR向驾驶员的印履历,驱动力顺序让与表示的HARDARSTARTXXMIT作用。 送,hard_start_xmit作用又会让与tun_net_xmit作用,SKB将被添加到SKB列表中。,于是应用Tun/TAP设置激起性欲闭塞。 特点驱动力的读履历处置,跟随tun/tap手段的特点驱动力一份遗产让与其tun_chr_read()处理读取skb链表,并将每个读取的SKB发发出教训用户。 区,使筋疲力尽虚拟网卡的履历发送。

接纳履历的处理:

当 we的持有格形式应用write()零碎让与向tun/tap手段的特点手段证明以书面提出履历时,将让与TunthCrxWrand作用。,它应用 TunyGETHub用户接球来自某处用户区域的履历,履历往事在SKB。,于是让与转折点作用NEIFTIFRX(SKB) 将SKB发送到TCP/IP科学实验报告栈处置,使筋疲力尽虚拟网卡的履历接纳。

小结

tun/tap驱动力很巧妙的将特点驱动力和网卡驱动力调配有工作的,本文注意辨析两种传动方法当打中触觉。,某一事项的驱动力器处置的底细不注意某一事项列出。,请参阅互相牵连证明。。

参考资料

发表评论

Close Menu