hsr_prp_slave.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /* Copyright 2011-2014 Autronica Fire and Security AS
  2. *
  3. * This program is free software; you can redistribute it and/or modify it
  4. * under the terms of the GNU General Public License as published by the Free
  5. * Software Foundation; either version 2 of the License, or (at your option)
  6. * any later version.
  7. *
  8. * Author(s):
  9. * 2011-2014 Arvid Brodin, arvid.brodin@alten.se
  10. */
  11. #include "hsr_prp_slave.h"
  12. #include <linux/etherdevice.h>
  13. #include <linux/if_arp.h>
  14. #include "hsr_prp_main.h"
  15. #include "hsr_prp_device.h"
  16. #include "hsr_prp_forward.h"
  17. #include "hsr_prp_framereg.h"
  18. static rx_handler_result_t hsr_prp_handle_frame(struct sk_buff **pskb)
  19. {
  20. struct sk_buff *skb = *pskb;
  21. struct hsr_prp_port *port;
  22. struct hsr_prp_priv *priv;
  23. u16 protocol;
  24. rcu_read_lock(); /* hsr->node_db, hsr->ports */
  25. port = hsr_prp_port_get_rcu(skb->dev);
  26. priv = port->priv;
  27. if (!skb_mac_header_was_set(skb)) {
  28. WARN_ONCE(1, "%s: skb invalid", __func__);
  29. goto finish_pass;
  30. }
  31. if (hsr_prp_addr_is_self(priv, eth_hdr(skb)->h_source)) {
  32. /* Directly kill frames sent by ourselves */
  33. INC_CNT_OWN_RX(port->type, priv);
  34. kfree_skb(skb);
  35. goto finish_consume;
  36. }
  37. /* For HSR, non tagged frames are unexpected, but for PRP
  38. * there could be non tagged frames as well.
  39. */
  40. protocol = eth_hdr(skb)->h_proto;
  41. if (protocol != htons(ETH_P_PRP) &&
  42. protocol != htons(ETH_P_HSR) &&
  43. (port->priv->prot_version <= HSR_V1) &&
  44. (!priv->rx_offloaded))
  45. goto finish_pass;
  46. /* Frame is a HSR or PRP frame or frame form a SAN. For
  47. * PRP, only supervisor frame will have a PRP protocol.
  48. */
  49. if (protocol == htons(ETH_P_HSR) || protocol == htons(ETH_P_PRP))
  50. skb_push(skb, ETH_HLEN);
  51. /* HACK: Not sure why we have to do this as some frames
  52. * don't have the skb->data pointing to mac header
  53. */
  54. if (skb_mac_header(skb) != skb->data) {
  55. skb_push(skb, ETH_HLEN);
  56. /* do one more check and bail out */
  57. if (skb_mac_header(skb) != skb->data) {
  58. INC_CNT_RX_ERROR(port->type, priv);
  59. goto finish_consume;
  60. }
  61. }
  62. INC_CNT_RX(port->type, priv);
  63. hsr_prp_forward_skb(skb, port);
  64. finish_consume:
  65. rcu_read_unlock(); /* hsr->node_db, hsr->ports */
  66. return RX_HANDLER_CONSUMED;
  67. finish_pass:
  68. INC_CNT_RX_ERROR(port->type, priv);
  69. rcu_read_unlock(); /* hsr->node_db, hsr->ports */
  70. return RX_HANDLER_PASS;
  71. }
  72. bool hsr_prp_port_exists(const struct net_device *dev)
  73. {
  74. return rcu_access_pointer(dev->rx_handler) == hsr_prp_handle_frame;
  75. }
  76. static int hsr_prp_check_dev_ok(struct net_device *dev)
  77. {
  78. /* Don't allow HSR on non-ethernet like devices */
  79. if ((dev->flags & IFF_LOOPBACK) || (dev->type != ARPHRD_ETHER) ||
  80. (dev->addr_len != ETH_ALEN)) {
  81. netdev_info(dev, "Cannot use loopback or non-ethernet device as HSR slave.\n");
  82. return -EINVAL;
  83. }
  84. /* Don't allow enslaving hsr devices */
  85. if (is_hsr_prp_master(dev)) {
  86. netdev_info(dev, "Cannot create trees of HSR devices.\n");
  87. return -EINVAL;
  88. }
  89. if (hsr_prp_port_exists(dev)) {
  90. netdev_info(dev, "This device is already a HSR slave.\n");
  91. return -EINVAL;
  92. }
  93. if (dev->priv_flags & IFF_DONT_BRIDGE) {
  94. netdev_info(dev, "This device does not support bridging.\n");
  95. return -EOPNOTSUPP;
  96. }
  97. /* HSR over bonded devices has not been tested, but I'm not sure it
  98. * won't work...
  99. */
  100. return 0;
  101. }
  102. /* Setup device to be added to the HSR bridge. */
  103. static int hsr_prp_portdev_setup(struct net_device *dev,
  104. struct hsr_prp_port *port)
  105. {
  106. int res;
  107. dev_hold(dev);
  108. res = dev_set_promiscuity(dev, 1);
  109. if (res)
  110. goto fail_promiscuity;
  111. /* FIXME:
  112. * What does net device "adjacency" mean? Should we do
  113. * res = netdev_master_upper_dev_link(port->dev, port->hsr->dev); ?
  114. */
  115. res = netdev_rx_handler_register(dev, hsr_prp_handle_frame, port);
  116. if (res)
  117. goto fail_rx_handler;
  118. dev_disable_lro(dev);
  119. return 0;
  120. fail_rx_handler:
  121. dev_set_promiscuity(dev, -1);
  122. fail_promiscuity:
  123. dev_put(dev);
  124. return res;
  125. }
  126. int hsr_prp_add_port(struct hsr_prp_priv *priv, struct net_device *dev,
  127. enum hsr_prp_port_type type)
  128. {
  129. struct hsr_prp_port *port, *master;
  130. int res;
  131. if (type != HSR_PRP_PT_MASTER) {
  132. res = hsr_prp_check_dev_ok(dev);
  133. if (res)
  134. return res;
  135. }
  136. port = hsr_prp_get_port(priv, type);
  137. if (port)
  138. return -EBUSY; /* This port already exists */
  139. port = kzalloc(sizeof(*port), GFP_KERNEL);
  140. if (!port)
  141. return -ENOMEM;
  142. if (type != HSR_PRP_PT_MASTER) {
  143. res = hsr_prp_portdev_setup(dev, port);
  144. if (res)
  145. goto fail_dev_setup;
  146. }
  147. port->priv = priv;
  148. port->dev = dev;
  149. port->type = type;
  150. list_add_tail_rcu(&port->port_list, &priv->ports);
  151. synchronize_rcu();
  152. master = hsr_prp_get_port(priv, HSR_PRP_PT_MASTER);
  153. netdev_update_features(master->dev);
  154. dev_set_mtu(master->dev, hsr_prp_get_max_mtu(priv));
  155. return 0;
  156. fail_dev_setup:
  157. kfree(port);
  158. return res;
  159. }
  160. void hsr_prp_del_port(struct hsr_prp_port *port)
  161. {
  162. struct hsr_prp_priv *priv;
  163. struct hsr_prp_port *master;
  164. priv = port->priv;
  165. master = hsr_prp_get_port(priv, HSR_PRP_PT_MASTER);
  166. list_del_rcu(&port->port_list);
  167. if (port != master) {
  168. if (master) {
  169. netdev_update_features(master->dev);
  170. dev_set_mtu(master->dev, hsr_prp_get_max_mtu(priv));
  171. }
  172. netdev_rx_handler_unregister(port->dev);
  173. dev_set_promiscuity(port->dev, -1);
  174. }
  175. /* FIXME?
  176. * netdev_upper_dev_unlink(port->dev, port->priv->dev);
  177. */
  178. synchronize_rcu();
  179. if (port != master)
  180. dev_put(port->dev);
  181. }