vlan_mvrp.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. return mrp_request_join(vlan->real_dev, &vlan_mrp_app,
  37. &vlan_id, sizeof(vlan_id), MVRP_ATTR_VID);
  38. }
  39. void vlan_mvrp_request_leave(const struct net_device *dev)
  40. {
  41. const struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
  42. __be16 vlan_id = htons(vlan->vlan_id);
  43. mrp_request_leave(vlan->real_dev, &vlan_mrp_app,
  44. &vlan_id, sizeof(vlan_id), MVRP_ATTR_VID);
  45. }
  46. int vlan_mvrp_init_applicant(struct net_device *dev)
  47. {
  48. return mrp_init_applicant(dev, &vlan_mrp_app);
  49. }
  50. void vlan_mvrp_uninit_applicant(struct net_device *dev)
  51. {
  52. mrp_uninit_applicant(dev, &vlan_mrp_app);
  53. }
  54. int __init vlan_mvrp_init(void)
  55. {
  56. return mrp_register_application(&vlan_mrp_app);
  57. }
  58. void vlan_mvrp_uninit(void)
  59. {
  60. mrp_unregister_application(&vlan_mrp_app);
  61. }