vlan_mvrp.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * IEEE 802.1Q Multiple VLAN Registration Protocol (MVRP)
  3. *
  4. * Copyright (c) 2012 Massachusetts Institute of Technology
  5. *
  6. * Adapted from code in net/8021q/vlan_gvrp.c
  7. * Copyright (c) 2008 Patrick McHardy <kaber@trash.net>
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * version 2 as published by the Free Software Foundation.
  12. */
  13. #include <linux/types.h>
  14. #include <linux/if_ether.h>
  15. #include <linux/if_vlan.h>
  16. #include <net/mrp.h>
  17. #include "vlan.h"
  18. #define MRP_MVRP_ADDRESS { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x21 }
  19. enum mvrp_attributes {
  20. MVRP_ATTR_INVALID,
  21. MVRP_ATTR_VID,
  22. __MVRP_ATTR_MAX
  23. };
  24. #define MVRP_ATTR_MAX (__MVRP_ATTR_MAX - 1)
  25. static struct mrp_application vlan_mrp_app __read_mostly = {
  26. .type = MRP_APPLICATION_MVRP,
  27. .maxattr = MVRP_ATTR_MAX,
  28. .pkttype.type = htons(ETH_P_MVRP),
  29. .group_address = MRP_MVRP_ADDRESS,
  30. .version = 0,
  31. };
  32. int vlan_mvrp_request_join(const struct net_device *dev)
  33. {
  34. const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
  35. __be16 vlan_id = htons(vlan->vlan_id);
  36. if (vlan->vlan_proto != htons(ETH_P_8021Q))
  37. return 0;
  38. return mrp_request_join(vlan->real_dev, &vlan_mrp_app,
  39. &vlan_id, sizeof(vlan_id), MVRP_ATTR_VID);
  40. }
  41. void vlan_mvrp_request_leave(const struct net_device *dev)
  42. {
  43. const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
  44. __be16 vlan_id = htons(vlan->vlan_id);
  45. if (vlan->vlan_proto != htons(ETH_P_8021Q))
  46. return;
  47. mrp_request_leave(vlan->real_dev, &vlan_mrp_app,
  48. &vlan_id, sizeof(vlan_id), MVRP_ATTR_VID);
  49. }
  50. int vlan_mvrp_init_applicant(struct net_device *dev)
  51. {
  52. return mrp_init_applicant(dev, &vlan_mrp_app);
  53. }
  54. void vlan_mvrp_uninit_applicant(struct net_device *dev)
  55. {
  56. mrp_uninit_applicant(dev, &vlan_mrp_app);
  57. }
  58. int __init vlan_mvrp_init(void)
  59. {
  60. return mrp_register_application(&vlan_mrp_app);
  61. }
  62. void vlan_mvrp_uninit(void)
  63. {
  64. mrp_unregister_application(&vlan_mrp_app);
  65. }