vde_kern.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. * Copyright (C) 2007 Luca Bigliardi (shammash@artha.org).
  3. * Licensed under the GPL.
  4. *
  5. * Transport usage:
  6. * ethN=vde,<vde_switch>,<mac addr>,<port>,<group>,<mode>,<description>
  7. *
  8. */
  9. #include "linux/kernel.h"
  10. #include "linux/init.h"
  11. #include "linux/netdevice.h"
  12. #include "linux/etherdevice.h"
  13. #include "net_kern.h"
  14. #include "net_user.h"
  15. #include "vde.h"
  16. static void vde_init(struct net_device *dev, void *data)
  17. {
  18. struct vde_init *init = data;
  19. struct uml_net_private *pri;
  20. struct vde_data *vpri;
  21. pri = dev->priv;
  22. vpri = (struct vde_data *) pri->user;
  23. vpri->vde_switch = init->vde_switch;
  24. vpri->descr = init->descr ? init->descr : "UML vde_transport";
  25. vpri->args = NULL;
  26. vpri->conn = NULL;
  27. vpri->dev = dev;
  28. printk(KERN_INFO "vde backend - %s, ", vpri->vde_switch ?
  29. vpri->vde_switch : "(default socket)");
  30. vde_init_libstuff(vpri, init);
  31. printk(KERN_INFO "\n");
  32. }
  33. static int vde_read(int fd, struct sk_buff **skb, struct uml_net_private *lp)
  34. {
  35. struct vde_data *pri = (struct vde_data *) &lp->user;
  36. if (pri->conn != NULL) {
  37. *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER);
  38. if (*skb == NULL)
  39. return -ENOMEM;
  40. return vde_user_read(pri->conn, skb_mac_header(*skb),
  41. (*skb)->dev->mtu + ETH_HEADER_OTHER);
  42. }
  43. printk(KERN_ERR "vde_read - we have no VDECONN to read from");
  44. return -EBADF;
  45. }
  46. static int vde_write(int fd, struct sk_buff **skb, struct uml_net_private *lp)
  47. {
  48. struct vde_data *pri = (struct vde_data *) &lp->user;
  49. if (pri->conn != NULL)
  50. return vde_user_write((void *)pri->conn, (*skb)->data,
  51. (*skb)->len);
  52. printk(KERN_ERR "vde_write - we have no VDECONN to write to");
  53. return -EBADF;
  54. }
  55. static const struct net_kern_info vde_kern_info = {
  56. .init = vde_init,
  57. .protocol = eth_protocol,
  58. .read = vde_read,
  59. .write = vde_write,
  60. };
  61. static int vde_setup(char *str, char **mac_out, void *data)
  62. {
  63. struct vde_init *init = data;
  64. char *remain, *port_str = NULL, *mode_str = NULL, *last;
  65. *init = ((struct vde_init)
  66. { .vde_switch = NULL,
  67. .descr = NULL,
  68. .port = 0,
  69. .group = NULL,
  70. .mode = 0 });
  71. remain = split_if_spec(str, &init->vde_switch, mac_out, &port_str,
  72. &init->group, &mode_str, &init->descr, NULL);
  73. if (remain != NULL)
  74. printk(KERN_WARNING "vde_setup - Ignoring extra data :"
  75. "'%s'\n", remain);
  76. if (port_str != NULL) {
  77. init->port = simple_strtoul(port_str, &last, 10);
  78. if ((*last != '\0') || (last == port_str)) {
  79. printk(KERN_ERR "vde_setup - Bad port : '%s'\n",
  80. port_str);
  81. return 0;
  82. }
  83. }
  84. if (mode_str != NULL) {
  85. init->mode = simple_strtoul(mode_str, &last, 8);
  86. if ((*last != '\0') || (last == mode_str)) {
  87. printk(KERN_ERR "vde_setup - Bad mode : '%s'\n",
  88. mode_str);
  89. return 0;
  90. }
  91. }
  92. printk(KERN_INFO "Configured vde device: %s\n", init->vde_switch ?
  93. init->vde_switch : "(default socket)");
  94. return 1;
  95. }
  96. static struct transport vde_transport = {
  97. .list = LIST_HEAD_INIT(vde_transport.list),
  98. .name = "vde",
  99. .setup = vde_setup,
  100. .user = &vde_user_info,
  101. .kern = &vde_kern_info,
  102. .private_size = sizeof(struct vde_data),
  103. .setup_size = sizeof(struct vde_init),
  104. };
  105. static int register_vde(void)
  106. {
  107. register_transport(&vde_transport);
  108. return 0;
  109. }
  110. late_initcall(register_vde);