1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright 2011-2014 Autronica Fire and Security AS 3 * 4 * Author(s): 5 * 2011-2014 Arvid Brodin, arvid.brodin@alten.se 6 * 7 * Frame handler other utility functions for HSR and PRP. 8 */ 9 10 #include "hsr_slave.h" 11 #include <linux/etherdevice.h> 12 #include <linux/if_arp.h> 13 #include <linux/if_vlan.h> 14 #include "hsr_main.h" 15 #include "hsr_device.h" 16 #include "hsr_forward.h" 17 #include "hsr_framereg.h" 18 19 bool hsr_invalid_dan_ingress_frame(__be16 protocol) 20 { 21 return (protocol != htons(ETH_P_PRP) && protocol != htons(ETH_P_HSR)); 22 } 23 24 static rx_handler_result_t hsr_handle_frame(struct sk_buff **pskb) 25 { 26 struct sk_buff *skb = *pskb; 27 struct hsr_port *port; 28 struct hsr_priv *hsr; 29 __be16 protocol; 30 31 /* Packets from dev_loopback_xmit() do not have L2 header, bail out */ 32 if (unlikely(skb->pkt_type == PACKET_LOOPBACK)) 33 return RX_HANDLER_PASS; 34 35 if (!skb_mac_header_was_set(skb)) { 36 WARN_ONCE(1, "%s: skb invalid", __func__); 37 return RX_HANDLER_PASS; 38 } 39 40 port = hsr_port_get_rcu(skb->dev); 41 if (!port) 42 goto finish_pass; 43 hsr = port->hsr; 44 45 if (hsr_addr_is_self(port->hsr, eth_hdr(skb)->h_source)) { 46 /* Directly kill frames sent by ourselves */ 47 kfree_skb(skb); 48 goto finish_consume; 49 } 50 51 /* For HSR, only tagged frames are expected, but for PRP 52 * there could be non tagged frames as well from Single 53 * attached nodes (SANs). 54 */ 55 protocol = eth_hdr(skb)->h_proto; 56 if (hsr->proto_ops->invalid_dan_ingress_frame && 57 hsr->proto_ops->invalid_dan_ingress_frame(protocol)) 58 goto finish_pass; 59 60 skb_push(skb, ETH_HLEN); 61 62 if (skb_mac_header(skb) != skb->data) { 63 WARN_ONCE(1, "%s:%d: Malformed frame at source port %s)\n", 64 __func__, __LINE__, port->dev->name); 65 goto finish_consume; 66 } 67 68 hsr_forward_skb(skb, port); 69 70 finish_consume: 71 return RX_HANDLER_CONSUMED; 72 73 finish_pass: 74 return RX_HANDLER_PASS; 75 } 76 77 bool hsr_port_exists(const struct net_device *dev) 78 { 79 return rcu_access_pointer(dev->rx_handler) == hsr_handle_frame; 80 } 81 82 static int hsr_check_dev_ok(struct net_device *dev, 83 struct netlink_ext_ack *extack) 84 { 85 /* Don't allow HSR on non-ethernet like devices */ 86 if ((dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER || 87 dev->addr_len != ETH_ALEN) { 88 NL_SET_ERR_MSG_MOD(extack, "Cannot use loopback or non-ethernet device as HSR slave."); 89 return -EINVAL; 90 } 91 92 /* Don't allow enslaving hsr devices */ 93 if (is_hsr_master(dev)) { 94 NL_SET_ERR_MSG_MOD(extack, 95 "Cannot create trees of HSR devices."); 96 return -EINVAL; 97 } 98 99 if (hsr_port_exists(dev)) { 100 NL_SET_ERR_MSG_MOD(extack, 101 "This device is already a HSR slave."); 102 return -EINVAL; 103 } 104 105 if (is_vlan_dev(dev)) { 106 NL_SET_ERR_MSG_MOD(extack, "HSR on top of VLAN is not yet supported in this driver."); 107 return -EINVAL; 108 } 109 110 if (dev->priv_flags & IFF_DONT_BRIDGE) { 111 NL_SET_ERR_MSG_MOD(extack, 112 "This device does not support bridging."); 113 return -EOPNOTSUPP; 114 } 115 116 /* HSR over bonded devices has not been tested, but I'm not sure it 117 * won't work... 118 */ 119 120 return 0; 121 } 122 123 /* Setup device to be added to the HSR bridge. */ 124 static int hsr_portdev_setup(struct hsr_priv *hsr, struct net_device *dev, 125 struct hsr_port *port, 126 struct netlink_ext_ack *extack) 127 128 { 129 struct net_device *hsr_dev; 130 struct hsr_port *master; 131 int res; 132 133 res = dev_set_promiscuity(dev, 1); 134 if (res) 135 return res; 136 137 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); 138 hsr_dev = master->dev; 139 140 res = netdev_upper_dev_link(dev, hsr_dev, extack); 141 if (res) 142 goto fail_upper_dev_link; 143 144 res = netdev_rx_handler_register(dev, hsr_handle_frame, port); 145 if (res) 146 goto fail_rx_handler; 147 dev_disable_lro(dev); 148 149 return 0; 150 151 fail_rx_handler: 152 netdev_upper_dev_unlink(dev, hsr_dev); 153 fail_upper_dev_link: 154 dev_set_promiscuity(dev, -1); 155 return res; 156 } 157 158 int hsr_add_port(struct hsr_priv *hsr, struct net_device *dev, 159 enum hsr_port_type type, struct netlink_ext_ack *extack) 160 { 161 struct hsr_port *port, *master; 162 int res; 163 164 if (type != HSR_PT_MASTER) { 165 res = hsr_check_dev_ok(dev, extack); 166 if (res) 167 return res; 168 } 169 170 port = hsr_port_get_hsr(hsr, type); 171 if (port) 172 return -EBUSY; /* This port already exists */ 173 174 port = kzalloc(sizeof(*port), GFP_KERNEL); 175 if (!port) 176 return -ENOMEM; 177 178 port->hsr = hsr; 179 port->dev = dev; 180 port->type = type; 181 182 if (type != HSR_PT_MASTER) { 183 res = hsr_portdev_setup(hsr, dev, port, extack); 184 if (res) 185 goto fail_dev_setup; 186 } 187 188 list_add_tail_rcu(&port->port_list, &hsr->ports); 189 synchronize_rcu(); 190 191 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); 192 netdev_update_features(master->dev); 193 dev_set_mtu(master->dev, hsr_get_max_mtu(hsr)); 194 195 return 0; 196 197 fail_dev_setup: 198 kfree(port); 199 return res; 200 } 201 202 void hsr_del_port(struct hsr_port *port) 203 { 204 struct hsr_priv *hsr; 205 struct hsr_port *master; 206 207 hsr = port->hsr; 208 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); 209 list_del_rcu(&port->port_list); 210 211 if (port != master) { 212 netdev_update_features(master->dev); 213 dev_set_mtu(master->dev, hsr_get_max_mtu(hsr)); 214 netdev_rx_handler_unregister(port->dev); 215 dev_set_promiscuity(port->dev, -1); 216 netdev_upper_dev_unlink(port->dev, master->dev); 217 } 218 219 synchronize_rcu(); 220 221 kfree(port); 222 } 223