tuntap_kern.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
  3. * Licensed under the GPL
  4. */
  5. #include "linux/stddef.h"
  6. #include "linux/netdevice.h"
  7. #include "linux/etherdevice.h"
  8. #include "linux/skbuff.h"
  9. #include "linux/init.h"
  10. #include "asm/errno.h"
  11. #include "net_kern.h"
  12. #include "net_user.h"
  13. #include "tuntap.h"
  14. struct tuntap_init {
  15. char *dev_name;
  16. char *gate_addr;
  17. };
  18. static void tuntap_init(struct net_device *dev, void *data)
  19. {
  20. struct uml_net_private *pri;
  21. struct tuntap_data *tpri;
  22. struct tuntap_init *init = data;
  23. pri = dev->priv;
  24. tpri = (struct tuntap_data *) pri->user;
  25. tpri->dev_name = init->dev_name;
  26. tpri->fixed_config = (init->dev_name != NULL);
  27. tpri->gate_addr = init->gate_addr;
  28. tpri->fd = -1;
  29. tpri->dev = dev;
  30. printk("TUN/TAP backend - ");
  31. if (tpri->gate_addr != NULL)
  32. printk("IP = %s", tpri->gate_addr);
  33. printk("\n");
  34. }
  35. static int tuntap_read(int fd, struct sk_buff **skb,
  36. struct uml_net_private *lp)
  37. {
  38. *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER);
  39. if(*skb == NULL) return(-ENOMEM);
  40. return(net_read(fd, (*skb)->mac.raw,
  41. (*skb)->dev->mtu + ETH_HEADER_OTHER));
  42. }
  43. static int tuntap_write(int fd, struct sk_buff **skb,
  44. struct uml_net_private *lp)
  45. {
  46. return(net_write(fd, (*skb)->data, (*skb)->len));
  47. }
  48. struct net_kern_info tuntap_kern_info = {
  49. .init = tuntap_init,
  50. .protocol = eth_protocol,
  51. .read = tuntap_read,
  52. .write = tuntap_write,
  53. };
  54. int tuntap_setup(char *str, char **mac_out, void *data)
  55. {
  56. struct tuntap_init *init = data;
  57. *init = ((struct tuntap_init)
  58. { .dev_name = NULL,
  59. .gate_addr = NULL });
  60. if(tap_setup_common(str, "tuntap", &init->dev_name, mac_out,
  61. &init->gate_addr))
  62. return(0);
  63. return(1);
  64. }
  65. static struct transport tuntap_transport = {
  66. .list = LIST_HEAD_INIT(tuntap_transport.list),
  67. .name = "tuntap",
  68. .setup = tuntap_setup,
  69. .user = &tuntap_user_info,
  70. .kern = &tuntap_kern_info,
  71. .private_size = sizeof(struct tuntap_data),
  72. .setup_size = sizeof(struct tuntap_init),
  73. };
  74. static int register_tuntap(void)
  75. {
  76. register_transport(&tuntap_transport);
  77. return(1);
  78. }
  79. __initcall(register_tuntap);
  80. /*
  81. * Overrides for Emacs so that we follow Linus's tabbing style.
  82. * Emacs will notice this stuff at the end of the file and automatically
  83. * adjust the settings for this buffer only. This must remain at the end
  84. * of the file.
  85. * ---------------------------------------------------------------------------
  86. * Local variables:
  87. * c-file-style: "linux"
  88. * End:
  89. */