tuntap_kern.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  3. * Licensed under the GPL
  4. */
  5. #include <linux/netdevice.h>
  6. #include <linux/init.h>
  7. #include <linux/skbuff.h>
  8. #include <asm/errno.h>
  9. #include "net_kern.h"
  10. #include "tuntap.h"
  11. struct tuntap_init {
  12. char *dev_name;
  13. char *gate_addr;
  14. };
  15. static void tuntap_init(struct net_device *dev, void *data)
  16. {
  17. struct uml_net_private *pri;
  18. struct tuntap_data *tpri;
  19. struct tuntap_init *init = data;
  20. pri = dev->priv;
  21. tpri = (struct tuntap_data *) pri->user;
  22. tpri->dev_name = init->dev_name;
  23. tpri->fixed_config = (init->dev_name != NULL);
  24. tpri->gate_addr = init->gate_addr;
  25. tpri->fd = -1;
  26. tpri->dev = dev;
  27. printk("TUN/TAP backend - ");
  28. if (tpri->gate_addr != NULL)
  29. printk("IP = %s", tpri->gate_addr);
  30. printk("\n");
  31. }
  32. static int tuntap_read(int fd, struct sk_buff **skb,
  33. struct uml_net_private *lp)
  34. {
  35. *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER);
  36. if (*skb == NULL)
  37. return -ENOMEM;
  38. return net_read(fd, skb_mac_header(*skb),
  39. (*skb)->dev->mtu + ETH_HEADER_OTHER);
  40. }
  41. static int tuntap_write(int fd, struct sk_buff **skb,
  42. struct uml_net_private *lp)
  43. {
  44. return net_write(fd, (*skb)->data, (*skb)->len);
  45. }
  46. const struct net_kern_info tuntap_kern_info = {
  47. .init = tuntap_init,
  48. .protocol = eth_protocol,
  49. .read = tuntap_read,
  50. .write = tuntap_write,
  51. };
  52. int tuntap_setup(char *str, char **mac_out, void *data)
  53. {
  54. struct tuntap_init *init = data;
  55. *init = ((struct tuntap_init)
  56. { .dev_name = NULL,
  57. .gate_addr = NULL });
  58. if (tap_setup_common(str, "tuntap", &init->dev_name, mac_out,
  59. &init->gate_addr))
  60. return 0;
  61. return 1;
  62. }
  63. static struct transport tuntap_transport = {
  64. .list = LIST_HEAD_INIT(tuntap_transport.list),
  65. .name = "tuntap",
  66. .setup = tuntap_setup,
  67. .user = &tuntap_user_info,
  68. .kern = &tuntap_kern_info,
  69. .private_size = sizeof(struct tuntap_data),
  70. .setup_size = sizeof(struct tuntap_init),
  71. };
  72. static int register_tuntap(void)
  73. {
  74. register_transport(&tuntap_transport);
  75. return 0;
  76. }
  77. late_initcall(register_tuntap);