daemon_kern.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and
  3. * James Leu (jleu@mindspring.net).
  4. * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  5. * Copyright (C) 2001 by various other people who didn't put their name here.
  6. * Licensed under the GPL.
  7. */
  8. #include "linux/init.h"
  9. #include <linux/netdevice.h>
  10. #include "net_kern.h"
  11. #include "daemon.h"
  12. struct daemon_init {
  13. char *sock_type;
  14. char *ctl_sock;
  15. };
  16. static void daemon_init(struct net_device *dev, void *data)
  17. {
  18. struct uml_net_private *pri;
  19. struct daemon_data *dpri;
  20. struct daemon_init *init = data;
  21. pri = dev->priv;
  22. dpri = (struct daemon_data *) pri->user;
  23. dpri->sock_type = init->sock_type;
  24. dpri->ctl_sock = init->ctl_sock;
  25. dpri->fd = -1;
  26. dpri->control = -1;
  27. dpri->dev = dev;
  28. /* We will free this pointer. If it contains crap we're burned. */
  29. dpri->ctl_addr = NULL;
  30. dpri->data_addr = NULL;
  31. dpri->local_addr = NULL;
  32. printk("daemon backend (uml_switch version %d) - %s:%s",
  33. SWITCH_VERSION, dpri->sock_type, dpri->ctl_sock);
  34. printk("\n");
  35. }
  36. static int daemon_read(int fd, struct sk_buff **skb,
  37. struct uml_net_private *lp)
  38. {
  39. *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER);
  40. if (*skb == NULL)
  41. return -ENOMEM;
  42. return net_recvfrom(fd, skb_mac_header(*skb),
  43. (*skb)->dev->mtu + ETH_HEADER_OTHER);
  44. }
  45. static int daemon_write(int fd, struct sk_buff **skb,
  46. struct uml_net_private *lp)
  47. {
  48. return daemon_user_write(fd, (*skb)->data, (*skb)->len,
  49. (struct daemon_data *) &lp->user);
  50. }
  51. static const struct net_kern_info daemon_kern_info = {
  52. .init = daemon_init,
  53. .protocol = eth_protocol,
  54. .read = daemon_read,
  55. .write = daemon_write,
  56. };
  57. static int daemon_setup(char *str, char **mac_out, void *data)
  58. {
  59. struct daemon_init *init = data;
  60. char *remain;
  61. *init = ((struct daemon_init)
  62. { .sock_type = "unix",
  63. .ctl_sock = "/tmp/uml.ctl" });
  64. remain = split_if_spec(str, mac_out, &init->sock_type, &init->ctl_sock,
  65. NULL);
  66. if (remain != NULL)
  67. printk(KERN_WARNING "daemon_setup : Ignoring data socket "
  68. "specification\n");
  69. return 1;
  70. }
  71. static struct transport daemon_transport = {
  72. .list = LIST_HEAD_INIT(daemon_transport.list),
  73. .name = "daemon",
  74. .setup = daemon_setup,
  75. .user = &daemon_user_info,
  76. .kern = &daemon_kern_info,
  77. .private_size = sizeof(struct daemon_data),
  78. .setup_size = sizeof(struct daemon_init),
  79. };
  80. static int register_daemon(void)
  81. {
  82. register_transport(&daemon_transport);
  83. return 0;
  84. }
  85. late_initcall(register_daemon);