tun.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:12k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  TUN - Universal TUN/TAP device driver.
  3.  *  Copyright (C) 1999-2000 Maxim Krasnyansky <max_mk@yahoo.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.12 2001/03/08 03:29:27 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.4"
  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, const char *buf, size_t count)
  152. {
  153. struct tun_pi pi = { 0, __constant_htons(ETH_P_IP) };
  154. register const char *ptr = buf; 
  155. register int len = count;
  156. struct sk_buff *skb;
  157. if (!(tun->flags & TUN_NO_PI)) {
  158. if ((len -= sizeof(pi)) < 0)
  159. return -EINVAL;
  160. copy_from_user(&pi, ptr, sizeof(pi));
  161. ptr += sizeof(pi);
  162. }
  163.  
  164. if (!(skb = alloc_skb(len + 2, GFP_KERNEL))) {
  165. tun->stats.rx_dropped++;
  166. return -ENOMEM;
  167. }
  168. skb_reserve(skb, 2);
  169. copy_from_user(skb_put(skb, len), ptr, len); 
  170. skb->dev = &tun->dev;
  171. switch (tun->flags & TUN_TYPE_MASK) {
  172. case TUN_TUN_DEV:
  173. skb->mac.raw = skb->data;
  174. skb->protocol = pi.proto;
  175. break;
  176. case TUN_TAP_DEV:
  177. skb->protocol = eth_type_trans(skb, &tun->dev);
  178. break;
  179. };
  180. if (tun->flags & TUN_NOCHECKSUM)
  181. skb->ip_summed = CHECKSUM_UNNECESSARY;
  182.  
  183. netif_rx_ni(skb);
  184.    
  185. tun->stats.rx_packets++;
  186. tun->stats.rx_bytes += len;
  187. return count;
  188. /* Write */
  189. static ssize_t tun_chr_write(struct file * file, const char * buf, 
  190.      size_t count, loff_t *pos)
  191. {
  192. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  193. if (!tun)
  194. return -EBADFD;
  195. DBG(KERN_INFO "%s: tun_chr_write %dn", tun->name, count);
  196. if (verify_area(VERIFY_READ, buf, count))
  197. return -EFAULT;
  198. return tun_get_user(tun, buf, count);
  199. }
  200. /* Put packet to user space buffer(already verified) */
  201. static __inline__ ssize_t tun_put_user(struct tun_struct *tun,
  202.        struct sk_buff *skb,
  203.        char *buf, int count)
  204. {
  205. struct tun_pi pi = { 0, skb->protocol };
  206. int len = count, total = 0;
  207. char *ptr = buf;
  208. if (!(tun->flags & TUN_NO_PI)) {
  209. if ((len -= sizeof(pi)) < 0)
  210. return -EINVAL;
  211. if (len < skb->len) {
  212. /* Packet will be striped */
  213. pi.flags |= TUN_PKT_STRIP;
  214. }
  215.  
  216. copy_to_user(ptr, &pi, sizeof(pi));
  217. total += sizeof(pi);
  218. ptr += sizeof(pi);
  219. }       
  220. len = MIN(skb->len, len); 
  221. copy_to_user(ptr, skb->data, len); 
  222. total += len;
  223. tun->stats.tx_packets++;
  224. tun->stats.tx_bytes += len;
  225. return total;
  226. }
  227. /* Read */
  228. static ssize_t tun_chr_read(struct file * file, char * buf, 
  229.     size_t count, loff_t *pos)
  230. {
  231. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  232. DECLARE_WAITQUEUE(wait, current);
  233. struct sk_buff *skb;
  234. ssize_t ret = 0;
  235. if (!tun)
  236. return -EBADFD;
  237. DBG(KERN_INFO "%s: tun_chr_readn", tun->name);
  238. add_wait_queue(&tun->read_wait, &wait);
  239. while (count) {
  240. current->state = TASK_INTERRUPTIBLE;
  241. /* Read frames from the queue */
  242. if (!(skb=skb_dequeue(&tun->readq))) {
  243. if (file->f_flags & O_NONBLOCK) {
  244. ret = -EAGAIN;
  245. break;
  246. }
  247. if (signal_pending(current)) {
  248. ret = -ERESTARTSYS;
  249. break;
  250. }
  251. /* Nothing to read, let's sleep */
  252. schedule();
  253. continue;
  254. }
  255. netif_start_queue(&tun->dev);
  256. if (!verify_area(VERIFY_WRITE, buf, count))
  257. ret = tun_put_user(tun, skb, buf, count);
  258. else
  259. ret = -EFAULT;
  260. kfree_skb(skb);
  261. break;
  262. }
  263. current->state = TASK_RUNNING;
  264. remove_wait_queue(&tun->read_wait, &wait);
  265. return ret;
  266. }
  267. static int tun_set_iff(struct file *file, struct ifreq *ifr)
  268. {
  269. struct tun_struct *tun;
  270. struct net_device *dev;
  271. int err;
  272. dev = __dev_get_by_name(ifr->ifr_name);
  273. if (dev) {
  274. /* Device exist */
  275. tun = dev->priv;
  276. if (dev->init != tun_net_init || tun->attached)
  277. return -EBUSY;
  278. /* Check permissions */
  279. if (tun->owner != -1)
  280. if (current->euid != tun->owner && !capable(CAP_NET_ADMIN))
  281. return -EPERM;
  282. } else {
  283. char *name;
  284. /* Allocate new device */
  285. if (!(tun = kmalloc(sizeof(struct tun_struct), GFP_KERNEL)) )
  286. return -ENOMEM;
  287. memset(tun, 0, sizeof(struct tun_struct));
  288. skb_queue_head_init(&tun->readq);
  289. init_waitqueue_head(&tun->read_wait);
  290. tun->owner = -1;
  291. tun->dev.init = tun_net_init;
  292. tun->dev.priv = tun;
  293. err = -EINVAL;
  294. /* Set dev type */
  295. if (ifr->ifr_flags & IFF_TUN) {
  296. /* TUN device */
  297. tun->flags |= TUN_TUN_DEV;
  298. name = "tun%d";
  299. } else if (ifr->ifr_flags & IFF_TAP) {
  300. /* TAP device */
  301. tun->flags |= TUN_TAP_DEV;
  302. name = "tap%d";
  303. } else 
  304. goto failed;
  305.    
  306. if (*ifr->ifr_name)
  307. name = ifr->ifr_name;
  308. if ((err = dev_alloc_name(&tun->dev, name)) < 0)
  309. goto failed;
  310. if ((err = register_netdevice(&tun->dev)))
  311. goto failed;
  312. MOD_INC_USE_COUNT;
  313. tun->name = tun->dev.name;
  314. }
  315. DBG(KERN_INFO "%s: tun_set_iffn", tun->name);
  316. if (ifr->ifr_flags & IFF_NO_PI)
  317. tun->flags |= TUN_NO_PI;
  318. if (ifr->ifr_flags & IFF_ONE_QUEUE)
  319. tun->flags |= TUN_ONE_QUEUE;
  320. file->private_data = tun;
  321. tun->attached = 1;
  322. strcpy(ifr->ifr_name, tun->name);
  323. return 0;
  324. failed:
  325. kfree(tun);
  326. return err;
  327. }
  328. static int tun_chr_ioctl(struct inode *inode, struct file *file, 
  329.  unsigned int cmd, unsigned long arg)
  330. {
  331. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  332. if (cmd == TUNSETIFF && !tun) {
  333. struct ifreq ifr;
  334. int err;
  335. if (copy_from_user(&ifr, (void *)arg, sizeof(ifr)))
  336. return -EFAULT;
  337. ifr.ifr_name[IFNAMSIZ-1] = '';
  338. rtnl_lock();
  339. err = tun_set_iff(file, &ifr);
  340. rtnl_unlock();
  341. if (err)
  342. return err;
  343. copy_to_user((void *)arg, &ifr, sizeof(ifr));
  344. return 0;
  345. }
  346. if (!tun)
  347. return -EBADFD;
  348. DBG(KERN_INFO "%s: tun_chr_ioctl cmd %dn", tun->name, cmd);
  349. switch (cmd) {
  350. case TUNSETNOCSUM:
  351. /* Disable/Enable checksum */
  352. if (arg)
  353. tun->flags |= TUN_NOCHECKSUM;
  354. else
  355. tun->flags &= ~TUN_NOCHECKSUM;
  356. DBG(KERN_INFO "%s: checksum %sn",
  357.     tun->name, arg ? "disabled" : "enabled");
  358. break;
  359. case TUNSETPERSIST:
  360. /* Disable/Enable persist mode */
  361. if (arg)
  362. tun->flags |= TUN_PERSIST;
  363. else
  364. tun->flags &= ~TUN_PERSIST;
  365. DBG(KERN_INFO "%s: persist %sn",
  366.     tun->name, arg ? "disabled" : "enabled");
  367. break;
  368. case TUNSETOWNER:
  369. /* Set owner of the device */
  370. tun->owner = (uid_t) arg;
  371. DBG(KERN_INFO "%s: owner set to %dn", tun->owner);
  372. break;
  373. #ifdef TUN_DEBUG
  374. case TUNSETDEBUG:
  375. tun->debug = arg;
  376. break;
  377. #endif
  378. default:
  379. return -EINVAL;
  380. };
  381. return 0;
  382. }
  383. static int tun_chr_fasync(int fd, struct file *file, int on)
  384. {
  385. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  386. int ret;
  387. if (!tun)
  388. return -EBADFD;
  389. DBG(KERN_INFO "%s: tun_chr_fasync %dn", tun->name, on);
  390. if ((ret = fasync_helper(fd, file, on, &tun->fasync)) < 0)
  391. return ret; 
  392.  
  393. if (on) {
  394. tun->flags |= TUN_FASYNC;
  395. if (!file->f_owner.pid) {
  396. file->f_owner.pid  = current->pid;
  397. file->f_owner.uid  = current->uid;
  398. file->f_owner.euid = current->euid;
  399. }
  400. } else 
  401. tun->flags &= ~TUN_FASYNC;
  402. return 0;
  403. }
  404. static int tun_chr_open(struct inode *inode, struct file * file)
  405. {
  406. DBG1(KERN_INFO "tunX: tun_chr_openn");
  407. file->private_data = NULL;
  408. return 0;
  409. }
  410. static int tun_chr_close(struct inode *inode, struct file *file)
  411. {
  412. struct tun_struct *tun = (struct tun_struct *)file->private_data;
  413. if (!tun)
  414. return 0;
  415. DBG(KERN_INFO "%s: tun_chr_closen", tun->name);
  416. tun_chr_fasync(-1, file, 0);
  417. rtnl_lock();
  418. /* Detach from net device */
  419. file->private_data = NULL;
  420. tun->attached = 0;
  421. /* Drop read queue */
  422. skb_queue_purge(&tun->readq);
  423. if (!(tun->flags & TUN_PERSIST)) {
  424. dev_close(&tun->dev);
  425. unregister_netdevice(&tun->dev);
  426. kfree(tun);
  427. MOD_DEC_USE_COUNT;
  428. }
  429. rtnl_unlock();
  430. return 0;
  431. }
  432. static struct file_operations tun_fops = {
  433. owner: THIS_MODULE,
  434. llseek: no_llseek,
  435. read: tun_chr_read,
  436. write: tun_chr_write,
  437. poll: tun_chr_poll,
  438. ioctl: tun_chr_ioctl,
  439. open: tun_chr_open,
  440. release:tun_chr_close,
  441. fasync: tun_chr_fasync
  442. };
  443. static struct miscdevice tun_miscdev=
  444. {
  445. TUN_MINOR,
  446. "net/tun",
  447. &tun_fops
  448. };
  449. int __init tun_init(void)
  450. {
  451. printk(KERN_INFO "Universal TUN/TAP device driver %s " 
  452.        "(C)1999-2001 Maxim Krasnyanskyn", TUN_VER);
  453. if (misc_register(&tun_miscdev)) {
  454. printk(KERN_ERR "tun: Can't register misc device %dn", TUN_MINOR);
  455. return -EIO;
  456. }
  457. return 0;
  458. }
  459. void tun_cleanup(void)
  460. {
  461. misc_deregister(&tun_miscdev);  
  462. }
  463. module_init(tun_init);
  464. module_exit(tun_cleanup);
  465. MODULE_LICENSE("GPL");