tun.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  TUN - Universal TUN/TAP device driver.
  3.  *  Copyright (C) 1999-2002 Maxim Krasnyansky <maxk@qualcomm.com>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  $Id: tun.c,v 1.15 2002/03/01 02:44:24 maxk Exp $
  16.  */
  17. /*
  18.  *  Daniel Podlejski <underley@underley.eu.org>
  19.  *    Modifications for 2.3.99-pre5 kernel.
  20.  */
  21. #define TUN_VER "1.5"
  22. #include <linux/config.h>
  23. #include <linux/module.h>
  24. #include <linux/errno.h>
  25. #include <linux/kernel.h>
  26. #include <linux/major.h>
  27. #include <linux/sched.h>
  28. #include <linux/slab.h>
  29. #include <linux/poll.h>
  30. #include <linux/fcntl.h>
  31. #include <linux/init.h>
  32. #include <linux/random.h>
  33. #include <linux/skbuff.h>
  34. #include <linux/netdevice.h>
  35. #include <linux/etherdevice.h>
  36. #include <linux/miscdevice.h>
  37. #include <linux/rtnetlink.h>
  38. #include <linux/if.h>
  39. #include <linux/if_arp.h>
  40. #include <linux/if_ether.h>
  41. #include <linux/if_tun.h>
  42. #include <asm/system.h>
  43. #include <asm/uaccess.h>
  44. #ifdef TUN_DEBUG
  45. static int debug;
  46. #endif
  47. /* Network device part of the driver */
  48. /* Net device open. */
  49. static int tun_net_open(struct net_device *dev)
  50. {
  51. netif_start_queue(dev);
  52. return 0;
  53. }
  54. /* Net device close. */
  55. static int tun_net_close(struct net_device *dev)
  56. {
  57. netif_stop_queue(dev);
  58. return 0;
  59. }
  60. /* Net device start xmit */
  61. static int tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
  62. {
  63. struct tun_struct *tun = (struct tun_struct *)dev->priv;
  64. DBG(KERN_INFO "%s: tun_net_xmit %dn", tun->name, skb->len);
  65. /* Drop packet if interface is not attached */
  66. if (!tun->attached)
  67. goto drop;
  68. /* Queue packet */
  69. if (!(tun->flags & TUN_ONE_QUEUE)) {
  70. /* Normal queueing mode.
  71.  * Packet scheduler handles dropping. */
  72. if (skb_queue_len(&tun->readq) >= TUN_READQ_SIZE)
  73. netif_stop_queue(dev);
  74. } else {
  75. /* Single queue mode.
  76.  * Driver handles dropping itself. */
  77. if (skb_queue_len(&tun->readq) >= dev->tx_queue_len)
  78. goto drop;
  79. }
  80. skb_queue_tail(&tun->readq, skb);
  81. /* Notify and wake up reader process */
  82. if (tun->flags & TUN_FASYNC)
  83. kill_fasync(&tun->fasync, SIGIO, POLL_IN);
  84. wake_up_interruptible(&tun->read_wait);
  85. return 0;
  86. drop:
  87. tun->stats.tx_dropped++;
  88. kfree_skb(skb);
  89. return 0;
  90. }
  91. static void tun_net_mclist(struct net_device *dev)
  92. {
  93. /* Nothing to do for multicast filters. 
  94.  * We always accept all frames. */
  95. return;
  96. }
  97. static struct net_device_stats *tun_net_stats(struct net_device *dev)
  98. {
  99. struct tun_struct *tun = (struct tun_struct *)dev->priv;
  100. return &tun->stats;
  101. }
  102. /* Initialize net device. */
  103. int tun_net_init(struct net_device *dev)
  104. {
  105. struct tun_struct *tun = (struct tun_struct *)dev->priv;
  106.    
  107. DBG(KERN_INFO "%s: tun_net_initn", tun->name);
  108. SET_MODULE_OWNER(dev);
  109. dev->open = tun_net_open;
  110. dev->hard_start_xmit = tun_net_xmit;
  111. dev->stop = tun_net_close;
  112. dev->get_stats = tun_net_stats;
  113. switch (tun->flags & TUN_TYPE_MASK) {
  114. case TUN_TUN_DEV:
  115. /* Point-to-Point TUN Device */
  116. dev->hard_header_len = 0;
  117. dev->addr_len = 0;
  118. dev->mtu = 1500;
  119. /* Type PPP seems most suitable */
  120. dev->type = ARPHRD_PPP; 
  121. dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
  122. dev->tx_queue_len = 10;
  123. break;
  124. case TUN_TAP_DEV:
  125. /* Ethernet TAP Device */
  126. dev->set_multicast_list = tun_net_mclist;
  127. /* Generate random Ethernet address.  */
  128. *(u16 *)dev->dev_addr = htons(0x00FF);
  129. get_random_bytes(dev->dev_addr + sizeof(u16), 4);
  130. ether_setup(dev);
  131. break;
  132. };
  133. return 0;
  134. }
  135. /* Character device part */
  136. /* Poll */
  137. static unsigned int tun_chr_poll(struct file *file, poll_table * wait)
  138. {  
  139. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  140. unsigned int mask = POLLOUT | POLLWRNORM;
  141. if (!tun)
  142. return -EBADFD;
  143. DBG(KERN_INFO "%s: tun_chr_polln", tun->name);
  144. poll_wait(file, &tun->read_wait, wait);
  145.  
  146. if (skb_queue_len(&tun->readq))
  147. mask |= POLLIN | POLLRDNORM;
  148. return mask;
  149. }
  150. /* Get packet from user space buffer(already verified) */
  151. static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, size_t count)
  152. {
  153. struct tun_pi pi = { 0, __constant_htons(ETH_P_IP) };
  154. struct sk_buff *skb;
  155. size_t len = count;
  156. if (!(tun->flags & TUN_NO_PI)) {
  157. if ((len -= sizeof(pi)) < 0)
  158. return -EINVAL;
  159. memcpy_fromiovec((void *)&pi, iv, sizeof(pi));
  160. }
  161.  
  162. if (!(skb = alloc_skb(len + 2, GFP_KERNEL))) {
  163. tun->stats.rx_dropped++;
  164. return -ENOMEM;
  165. }
  166. skb_reserve(skb, 2);
  167. memcpy_fromiovec(skb_put(skb, len), iv, len);
  168. skb->dev = &tun->dev;
  169. switch (tun->flags & TUN_TYPE_MASK) {
  170. case TUN_TUN_DEV:
  171. skb->mac.raw = skb->data;
  172. skb->protocol = pi.proto;
  173. break;
  174. case TUN_TAP_DEV:
  175. skb->protocol = eth_type_trans(skb, &tun->dev);
  176. break;
  177. };
  178. if (tun->flags & TUN_NOCHECKSUM)
  179. skb->ip_summed = CHECKSUM_UNNECESSARY;
  180.  
  181. netif_rx_ni(skb);
  182.    
  183. tun->stats.rx_packets++;
  184. tun->stats.rx_bytes += len;
  185. return count;
  186. /* Writev */
  187. static ssize_t tun_chr_writev(struct file * file, const struct iovec *iv, 
  188.       unsigned long count, loff_t *pos)
  189. {
  190. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  191. unsigned long i;
  192. size_t len;
  193. if (!tun)
  194. return -EBADFD;
  195. DBG(KERN_INFO "%s: tun_chr_write %dn", tun->name, count);
  196. for (i = 0, len = 0; i < count; i++) {
  197. if (verify_area(VERIFY_READ, iv[i].iov_base, iv[i].iov_len))
  198. return -EFAULT;
  199. len += iv[i].iov_len;
  200. }
  201. return tun_get_user(tun, (struct iovec *) iv, len);
  202. }
  203. /* Write */
  204. static ssize_t tun_chr_write(struct file * file, const char * buf, 
  205.      size_t count, loff_t *pos)
  206. {
  207. struct iovec iv = { (void *) buf, count };
  208. return tun_chr_writev(file, &iv, 1, pos);
  209. }
  210. /* Put packet to the user space buffer (already verified) */
  211. static __inline__ ssize_t tun_put_user(struct tun_struct *tun,
  212.        struct sk_buff *skb,
  213.        struct iovec *iv, int len)
  214. {
  215. struct tun_pi pi = { 0, skb->protocol };
  216. ssize_t total = 0;
  217. if (!(tun->flags & TUN_NO_PI)) {
  218. if ((len -= sizeof(pi)) < 0)
  219. return -EINVAL;
  220. if (len < skb->len) {
  221. /* Packet will be striped */
  222. pi.flags |= TUN_PKT_STRIP;
  223. }
  224.  
  225. memcpy_toiovec(iv, (void *) &pi, sizeof(pi));
  226. total += sizeof(pi);
  227. }       
  228. len = MIN(skb->len, len);
  229. skb_copy_datagram_iovec(skb, 0, iv, len);
  230. total += len;
  231. tun->stats.tx_packets++;
  232. tun->stats.tx_bytes += len;
  233. return total;
  234. }
  235. /* Readv */
  236. static ssize_t tun_chr_readv(struct file *file, const struct iovec *iv,
  237.     unsigned long count, loff_t *pos)
  238. {
  239. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  240. DECLARE_WAITQUEUE(wait, current);
  241. struct sk_buff *skb;
  242. ssize_t len, ret = 0;
  243. unsigned long i;
  244. if (!tun)
  245. return -EBADFD;
  246. DBG(KERN_INFO "%s: tun_chr_readn", tun->name);
  247. for (i = 0, len = 0; i < count; i++) {
  248. if (verify_area(VERIFY_WRITE, iv[i].iov_base, iv[i].iov_len))
  249. return -EFAULT;
  250. len += iv[i].iov_len;
  251. }
  252. add_wait_queue(&tun->read_wait, &wait);
  253. while (len) {
  254. current->state = TASK_INTERRUPTIBLE;
  255. /* Read frames from the queue */
  256. if (!(skb=skb_dequeue(&tun->readq))) {
  257. if (file->f_flags & O_NONBLOCK) {
  258. ret = -EAGAIN;
  259. break;
  260. }
  261. if (signal_pending(current)) {
  262. ret = -ERESTARTSYS;
  263. break;
  264. }
  265. /* Nothing to read, let's sleep */
  266. schedule();
  267. continue;
  268. }
  269. netif_start_queue(&tun->dev);
  270. ret = tun_put_user(tun, skb, (struct iovec *) iv, len);
  271. kfree_skb(skb);
  272. break;
  273. }
  274. current->state = TASK_RUNNING;
  275. remove_wait_queue(&tun->read_wait, &wait);
  276. return ret;
  277. }
  278. /* Read */
  279. static ssize_t tun_chr_read(struct file * file, char * buf, 
  280.     size_t count, loff_t *pos)
  281. {
  282. struct iovec iv = { buf, count };
  283. return tun_chr_readv(file, &iv, 1, pos);
  284. }
  285. static int tun_set_iff(struct file *file, struct ifreq *ifr)
  286. {
  287. struct tun_struct *tun;
  288. struct net_device *dev;
  289. int err;
  290. dev = __dev_get_by_name(ifr->ifr_name);
  291. if (dev) {
  292. /* Device exist */
  293. tun = dev->priv;
  294. if (dev->init != tun_net_init || tun->attached)
  295. return -EBUSY;
  296. /* Check permissions */
  297. if (tun->owner != -1)
  298. if (current->euid != tun->owner && !capable(CAP_NET_ADMIN))
  299. return -EPERM;
  300. } else {
  301. char *name;
  302. /* Allocate new device */
  303. if (!(tun = kmalloc(sizeof(struct tun_struct), GFP_KERNEL)) )
  304. return -ENOMEM;
  305. memset(tun, 0, sizeof(struct tun_struct));
  306. skb_queue_head_init(&tun->readq);
  307. init_waitqueue_head(&tun->read_wait);
  308. tun->owner = -1;
  309. tun->dev.init = tun_net_init;
  310. tun->dev.priv = tun;
  311. err = -EINVAL;
  312. /* Set dev type */
  313. if (ifr->ifr_flags & IFF_TUN) {
  314. /* TUN device */
  315. tun->flags |= TUN_TUN_DEV;
  316. name = "tun%d";
  317. } else if (ifr->ifr_flags & IFF_TAP) {
  318. /* TAP device */
  319. tun->flags |= TUN_TAP_DEV;
  320. name = "tap%d";
  321. } else 
  322. goto failed;
  323.    
  324. if (*ifr->ifr_name)
  325. name = ifr->ifr_name;
  326. if ((err = dev_alloc_name(&tun->dev, name)) < 0)
  327. goto failed;
  328. if ((err = register_netdevice(&tun->dev)))
  329. goto failed;
  330. MOD_INC_USE_COUNT;
  331. tun->name = tun->dev.name;
  332. }
  333. DBG(KERN_INFO "%s: tun_set_iffn", tun->name);
  334. if (ifr->ifr_flags & IFF_NO_PI)
  335. tun->flags |= TUN_NO_PI;
  336. if (ifr->ifr_flags & IFF_ONE_QUEUE)
  337. tun->flags |= TUN_ONE_QUEUE;
  338. file->private_data = tun;
  339. tun->attached = 1;
  340. strcpy(ifr->ifr_name, tun->name);
  341. return 0;
  342. failed:
  343. kfree(tun);
  344. return err;
  345. }
  346. static int tun_chr_ioctl(struct inode *inode, struct file *file, 
  347.  unsigned int cmd, unsigned long arg)
  348. {
  349. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  350. if (cmd == TUNSETIFF && !tun) {
  351. struct ifreq ifr;
  352. int err;
  353. if (copy_from_user(&ifr, (void *)arg, sizeof(ifr)))
  354. return -EFAULT;
  355. ifr.ifr_name[IFNAMSIZ-1] = '';
  356. rtnl_lock();
  357. err = tun_set_iff(file, &ifr);
  358. rtnl_unlock();
  359. if (err)
  360. return err;
  361. copy_to_user((void *)arg, &ifr, sizeof(ifr));
  362. return 0;
  363. }
  364. if (!tun)
  365. return -EBADFD;
  366. DBG(KERN_INFO "%s: tun_chr_ioctl cmd %dn", tun->name, cmd);
  367. switch (cmd) {
  368. case TUNSETNOCSUM:
  369. /* Disable/Enable checksum */
  370. if (arg)
  371. tun->flags |= TUN_NOCHECKSUM;
  372. else
  373. tun->flags &= ~TUN_NOCHECKSUM;
  374. DBG(KERN_INFO "%s: checksum %sn",
  375.     tun->name, arg ? "disabled" : "enabled");
  376. break;
  377. case TUNSETPERSIST:
  378. /* Disable/Enable persist mode */
  379. if (arg)
  380. tun->flags |= TUN_PERSIST;
  381. else
  382. tun->flags &= ~TUN_PERSIST;
  383. DBG(KERN_INFO "%s: persist %sn",
  384.     tun->name, arg ? "disabled" : "enabled");
  385. break;
  386. case TUNSETOWNER:
  387. /* Set owner of the device */
  388. tun->owner = (uid_t) arg;
  389. DBG(KERN_INFO "%s: owner set to %dn", tun->owner);
  390. break;
  391. #ifdef TUN_DEBUG
  392. case TUNSETDEBUG:
  393. tun->debug = arg;
  394. break;
  395. #endif
  396. default:
  397. return -EINVAL;
  398. };
  399. return 0;
  400. }
  401. static int tun_chr_fasync(int fd, struct file *file, int on)
  402. {
  403. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  404. int ret;
  405. if (!tun)
  406. return -EBADFD;
  407. DBG(KERN_INFO "%s: tun_chr_fasync %dn", tun->name, on);
  408. if ((ret = fasync_helper(fd, file, on, &tun->fasync)) < 0)
  409. return ret; 
  410.  
  411. if (on) {
  412. tun->flags |= TUN_FASYNC;
  413. if (!file->f_owner.pid) {
  414. file->f_owner.pid  = current->pid;
  415. file->f_owner.uid  = current->uid;
  416. file->f_owner.euid = current->euid;
  417. }
  418. } else 
  419. tun->flags &= ~TUN_FASYNC;
  420. return 0;
  421. }
  422. static int tun_chr_open(struct inode *inode, struct file * file)
  423. {
  424. DBG1(KERN_INFO "tunX: tun_chr_openn");
  425. file->private_data = NULL;
  426. return 0;
  427. }
  428. static int tun_chr_close(struct inode *inode, struct file *file)
  429. {
  430. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  431. if (!tun)
  432. return 0;
  433. DBG(KERN_INFO "%s: tun_chr_closen", tun->name);
  434. tun_chr_fasync(-1, file, 0);
  435. rtnl_lock();
  436. /* Detach from net device */
  437. file->private_data = NULL;
  438. tun->attached = 0;
  439. /* Drop read queue */
  440. skb_queue_purge(&tun->readq);
  441. if (!(tun->flags & TUN_PERSIST)) {
  442. dev_close(&tun->dev);
  443. unregister_netdevice(&tun->dev);
  444. kfree(tun);
  445. MOD_DEC_USE_COUNT;
  446. }
  447. rtnl_unlock();
  448. return 0;
  449. }
  450. static struct file_operations tun_fops = {
  451. owner: THIS_MODULE,
  452. llseek: no_llseek,
  453. read: tun_chr_read,
  454. readv: tun_chr_readv,
  455. write: tun_chr_write,
  456. writev: tun_chr_writev,
  457. poll: tun_chr_poll,
  458. ioctl: tun_chr_ioctl,
  459. open: tun_chr_open,
  460. release:tun_chr_close,
  461. fasync: tun_chr_fasync
  462. };
  463. static struct miscdevice tun_miscdev=
  464. {
  465. TUN_MINOR,
  466. "net/tun",
  467. &tun_fops
  468. };
  469. int __init tun_init(void)
  470. {
  471. printk(KERN_INFO "Universal TUN/TAP device driver %s " 
  472.        "(C)1999-2002 Maxim Krasnyanskyn", TUN_VER);
  473. if (misc_register(&tun_miscdev)) {
  474. printk(KERN_ERR "tun: Can't register misc device %dn", TUN_MINOR);
  475. return -EIO;
  476. }
  477. return 0;
  478. }
  479. void tun_cleanup(void)
  480. {
  481. misc_deregister(&tun_miscdev);  
  482. }
  483. module_init(tun_init);
  484. module_exit(tun_cleanup);
  485. MODULE_LICENSE("GPL");