hsr_device.c 11.8 KB
Newer Older
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 8 9 10 11 12 13 14 15 16
 *
 * This file contains device methods for creating, using and destroying
 * virtual HSR devices.
 */

#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/etherdevice.h>
#include <linux/rtnetlink.h>
#include <linux/pkt_sched.h>
#include "hsr_device.h"
17
#include "hsr_slave.h"
18 19
#include "hsr_framereg.h"
#include "hsr_main.h"
A
Arvid Brodin 已提交
20
#include "hsr_forward.h"
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

static bool is_admin_up(struct net_device *dev)
{
	return dev && (dev->flags & IFF_UP);
}

static bool is_slave_up(struct net_device *dev)
{
	return dev && is_admin_up(dev) && netif_oper_up(dev);
}

static void __hsr_set_operstate(struct net_device *dev, int transition)
{
	write_lock_bh(&dev_base_lock);
	if (dev->operstate != transition) {
		dev->operstate = transition;
		write_unlock_bh(&dev_base_lock);
		netdev_state_change(dev);
	} else {
		write_unlock_bh(&dev_base_lock);
	}
}

44
static void hsr_set_operstate(struct hsr_port *master, bool has_carrier)
45
{
46 47
	if (!is_admin_up(master->dev)) {
		__hsr_set_operstate(master->dev, IF_OPER_DOWN);
48 49 50
		return;
	}

51
	if (has_carrier)
52
		__hsr_set_operstate(master->dev, IF_OPER_UP);
53
	else
54
		__hsr_set_operstate(master->dev, IF_OPER_LOWERLAYERDOWN);
55 56
}

57
static bool hsr_check_carrier(struct hsr_port *master)
58
{
59
	struct hsr_port *port;
60

61
	ASSERT_RTNL();
62

63
	hsr_for_each_port(master->hsr, port) {
64
		if (port->type != HSR_PT_MASTER && is_slave_up(port->dev)) {
65 66
			netif_carrier_on(master->dev);
			return true;
67
		}
68
	}
69

70
	netif_carrier_off(master->dev);
71

72
	return false;
73 74
}

75 76
static void hsr_check_announce(struct net_device *hsr_dev,
			       unsigned char old_operstate)
77
{
78
	struct hsr_priv *hsr;
79

80
	hsr = netdev_priv(hsr_dev);
81

82
	if (hsr_dev->operstate == IF_OPER_UP && old_operstate != IF_OPER_UP) {
83
		/* Went up */
84
		hsr->announce_count = 0;
85 86
		mod_timer(&hsr->announce_timer,
			  jiffies + msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL));
87 88
	}

89
	if (hsr_dev->operstate != IF_OPER_UP && old_operstate == IF_OPER_UP)
90
		/* Went down */
91
		del_timer(&hsr->announce_timer);
92 93
}

94 95
void hsr_check_carrier_and_operstate(struct hsr_priv *hsr)
{
96
	struct hsr_port *master;
97 98 99
	unsigned char old_operstate;
	bool has_carrier;

100
	master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
101 102 103
	/* netif_stacked_transfer_operstate() cannot be used here since
	 * it doesn't set IF_OPER_LOWERLAYERDOWN (?)
	 */
104 105 106 107
	old_operstate = master->dev->operstate;
	has_carrier = hsr_check_carrier(master);
	hsr_set_operstate(master, has_carrier);
	hsr_check_announce(master->dev, old_operstate);
108 109
}

110
int hsr_get_max_mtu(struct hsr_priv *hsr)
111
{
112
	unsigned int mtu_max;
113
	struct hsr_port *port;
114 115

	mtu_max = ETH_DATA_LEN;
116 117 118
	hsr_for_each_port(hsr, port)
		if (port->type != HSR_PT_MASTER)
			mtu_max = min(port->dev->mtu, mtu_max);
119 120 121

	if (mtu_max < HSR_HLEN)
		return 0;
122
	return mtu_max - HSR_HLEN;
123 124 125 126
}

static int hsr_dev_change_mtu(struct net_device *dev, int new_mtu)
{
127
	struct hsr_priv *hsr;
128

129
	hsr = netdev_priv(dev);
130

131
	if (new_mtu > hsr_get_max_mtu(hsr)) {
132
		netdev_info(dev, "A HSR master's MTU cannot be greater than the smallest MTU of its slaves minus the HSR Tag length (%d octets).\n",
133
			    HSR_HLEN);
134 135 136 137 138 139 140 141 142 143
		return -EINVAL;
	}

	dev->mtu = new_mtu;

	return 0;
}

static int hsr_dev_open(struct net_device *dev)
{
144
	struct hsr_priv *hsr;
145 146
	struct hsr_port *port;
	char designation;
147

148
	hsr = netdev_priv(dev);
149
	designation = '\0';
150

151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
	hsr_for_each_port(hsr, port) {
		if (port->type == HSR_PT_MASTER)
			continue;
		switch (port->type) {
		case HSR_PT_SLAVE_A:
			designation = 'A';
			break;
		case HSR_PT_SLAVE_B:
			designation = 'B';
			break;
		default:
			designation = '?';
		}
		if (!is_slave_up(port->dev))
			netdev_warn(dev, "Slave %c (%s) is not up; please bring it up to get a fully working HSR network\n",
				    designation, port->dev->name);
167
	}
168 169 170

	if (designation == '\0')
		netdev_warn(dev, "No slave devices configured\n");
171 172 173 174 175 176

	return 0;
}

static int hsr_dev_close(struct net_device *dev)
{
177
	/* Nothing to do here. */
178 179 180
	return 0;
}

181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
static netdev_features_t hsr_features_recompute(struct hsr_priv *hsr,
						netdev_features_t features)
{
	netdev_features_t mask;
	struct hsr_port *port;

	mask = features;

	/* Mask out all features that, if supported by one device, should be
	 * enabled for all devices (see NETIF_F_ONE_FOR_ALL).
	 *
	 * Anything that's off in mask will not be enabled - so only things
	 * that were in features originally, and also is in NETIF_F_ONE_FOR_ALL,
	 * may become enabled.
	 */
	features &= ~NETIF_F_ONE_FOR_ALL;
	hsr_for_each_port(hsr, port)
		features = netdev_increment_features(features,
						     port->dev->features,
						     mask);

	return features;
}

static netdev_features_t hsr_fix_features(struct net_device *dev,
					  netdev_features_t features)
{
	struct hsr_priv *hsr = netdev_priv(dev);

	return hsr_features_recompute(hsr, features);
}

213 214
static int hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
{
A
Arvid Brodin 已提交
215
	struct hsr_priv *hsr = netdev_priv(dev);
216
	struct hsr_port *master;
217

218
	master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
219 220 221 222 223 224 225
	if (master) {
		skb->dev = master->dev;
		hsr_forward_skb(skb, master);
	} else {
		atomic_long_inc(&dev->tx_dropped);
		dev_kfree_skb_any(skb);
	}
226 227 228 229
	return NETDEV_TX_OK;
}

static const struct header_ops hsr_header_ops = {
A
Arvid Brodin 已提交
230
	.create	 = eth_header,
231 232 233
	.parse	 = eth_header_parse,
};

P
Peter Heise 已提交
234
static void send_hsr_supervision_frame(struct hsr_port *master,
235
				       u8 type, u8 hsr_ver)
236 237 238
{
	struct sk_buff *skb;
	int hlen, tlen;
P
Peter Heise 已提交
239
	struct hsr_tag *hsr_tag;
240 241 242 243
	struct hsr_sup_tag *hsr_stag;
	struct hsr_sup_payload *hsr_sp;
	unsigned long irqflags;

244 245
	hlen = LL_RESERVED_SPACE(master->dev);
	tlen = master->dev->needed_tailroom;
246 247 248
	skb = dev_alloc_skb(sizeof(struct hsr_tag) +
			    sizeof(struct hsr_sup_tag) +
			    sizeof(struct hsr_sup_payload) + hlen + tlen);
249

250
	if (!skb)
251 252 253 254
		return;

	skb_reserve(skb, hlen);

255
	skb->dev = master->dev;
256
	skb->protocol = htons(hsr_ver ? ETH_P_HSR : ETH_P_PRP);
257 258
	skb->priority = TC_PRIO_CONTROL;

259
	if (dev_hard_header(skb, skb->dev, (hsr_ver ? ETH_P_HSR : ETH_P_PRP),
A
Arvid Brodin 已提交
260 261
			    master->hsr->sup_multicast_addr,
			    skb->dev->dev_addr, skb->len) <= 0)
262
		goto out;
A
Arvid Brodin 已提交
263
	skb_reset_mac_header(skb);
264 265
	skb_reset_network_header(skb);
	skb_reset_transport_header(skb);
266

267
	if (hsr_ver > 0) {
268
		hsr_tag = skb_put(skb, sizeof(struct hsr_tag));
P
Peter Heise 已提交
269 270 271
		hsr_tag->encap_proto = htons(ETH_P_PRP);
		set_hsr_tag_LSDU_size(hsr_tag, HSR_V1_SUP_LSDUSIZE);
	}
272

273
	hsr_stag = skb_put(skb, sizeof(struct hsr_sup_tag));
274 275
	set_hsr_stag_path(hsr_stag, (hsr_ver ? 0x0 : 0xf));
	set_hsr_stag_HSR_ver(hsr_stag, hsr_ver);
276

P
Peter Heise 已提交
277
	/* From HSRv1 on we have separate supervision sequence numbers. */
A
Arvid Brodin 已提交
278
	spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
279
	if (hsr_ver > 0) {
P
Peter Heise 已提交
280 281 282 283 284 285 286 287
		hsr_stag->sequence_nr = htons(master->hsr->sup_sequence_nr);
		hsr_tag->sequence_nr = htons(master->hsr->sequence_nr);
		master->hsr->sup_sequence_nr++;
		master->hsr->sequence_nr++;
	} else {
		hsr_stag->sequence_nr = htons(master->hsr->sequence_nr);
		master->hsr->sequence_nr++;
	}
A
Arvid Brodin 已提交
288
	spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
289

290
	hsr_stag->HSR_TLV_type = type;
P
Peter Heise 已提交
291
	/* TODO: Why 12 in HSRv0? */
292 293
	hsr_stag->HSR_TLV_length =
				hsr_ver ? sizeof(struct hsr_sup_payload) : 12;
294 295

	/* Payload: MacAddressA */
296
	hsr_sp = skb_put(skb, sizeof(struct hsr_sup_payload));
297
	ether_addr_copy(hsr_sp->macaddress_A, master->dev->dev_addr);
298

299 300
	if (skb_put_padto(skb, ETH_ZLEN + HSR_HLEN))
		return;
P
Peter Heise 已提交
301

A
Arvid Brodin 已提交
302
	hsr_forward_skb(skb, master);
303 304 305
	return;

out:
D
Dan Carpenter 已提交
306
	WARN_ONCE(1, "HSR: Could not send supervision frame\n");
307 308 309 310 311
	kfree_skb(skb);
}

/* Announce (supervision frame) timer function
 */
312
static void hsr_announce(struct timer_list *t)
313
{
314
	struct hsr_priv *hsr;
315
	struct hsr_port *master;
316
	unsigned long interval;
317

318
	hsr = from_timer(hsr, t, announce_timer);
A
Arvid Brodin 已提交
319 320

	rcu_read_lock();
321
	master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
322

323
	if (hsr->announce_count < 3 && hsr->prot_version == 0) {
P
Peter Heise 已提交
324
		send_hsr_supervision_frame(master, HSR_TLV_ANNOUNCE,
325
					   hsr->prot_version);
326
		hsr->announce_count++;
327

328
		interval = msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
P
Peter Heise 已提交
329 330
	} else {
		send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK,
331
					   hsr->prot_version);
P
Peter Heise 已提交
332

333
		interval = msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
P
Peter Heise 已提交
334
	}
335

336
	if (is_admin_up(master->dev))
337
		mod_timer(&hsr->announce_timer, jiffies + interval);
A
Arvid Brodin 已提交
338 339

	rcu_read_unlock();
340 341
}

342
void hsr_del_ports(struct hsr_priv *hsr)
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
{
	struct hsr_port *port;

	port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_A);
	if (port)
		hsr_del_port(port);

	port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_B);
	if (port)
		hsr_del_port(port);

	port = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
	if (port)
		hsr_del_port(port);
}

359 360 361 362 363
static const struct net_device_ops hsr_device_ops = {
	.ndo_change_mtu = hsr_dev_change_mtu,
	.ndo_open = hsr_dev_open,
	.ndo_stop = hsr_dev_close,
	.ndo_start_xmit = hsr_dev_xmit,
364
	.ndo_fix_features = hsr_fix_features,
365 366
};

367 368 369
static struct device_type hsr_type = {
	.name = "hsr",
};
370 371 372

void hsr_dev_setup(struct net_device *dev)
{
373
	eth_hw_addr_random(dev);
374 375

	ether_setup(dev);
376
	dev->min_mtu = 0;
377 378 379
	dev->header_ops = &hsr_header_ops;
	dev->netdev_ops = &hsr_device_ops;
	SET_NETDEV_DEVTYPE(dev, &hsr_type);
380
	dev->priv_flags |= IFF_NO_QUEUE;
381

382
	dev->needs_free_netdev = true;
383 384 385 386 387 388 389 390 391 392 393 394 395

	dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
			   NETIF_F_GSO_MASK | NETIF_F_HW_CSUM |
			   NETIF_F_HW_VLAN_CTAG_TX;

	dev->features = dev->hw_features;

	/* Prevent recursive tx locking */
	dev->features |= NETIF_F_LLTX;
	/* VLAN on top of HSR needs testing and probably some work on
	 * hsr_header_create() etc.
	 */
	dev->features |= NETIF_F_VLAN_CHALLENGED;
396 397 398 399
	/* Not sure about this. Taken from bridge code. netdev_features.h says
	 * it means "Does not change network namespaces".
	 */
	dev->features |= NETIF_F_NETNS_LOCAL;
400 401 402 403
}

/* Return true if dev is a HSR master; return false otherwise.
 */
404
inline bool is_hsr_master(struct net_device *dev)
405 406 407 408 409
{
	return (dev->netdev_ops->ndo_start_xmit == hsr_dev_xmit);
}

/* Default multicast address for HSR Supervision frames */
J
Joe Perches 已提交
410
static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = {
411 412 413 414
	0x01, 0x15, 0x4e, 0x00, 0x01, 0x00
};

int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
415 416
		     unsigned char multicast_spec, u8 protocol_version,
		     struct netlink_ext_ack *extack)
417
{
418
	struct hsr_priv *hsr;
419 420
	int res;

421
	hsr = netdev_priv(hsr_dev);
422
	INIT_LIST_HEAD(&hsr->ports);
423 424
	INIT_LIST_HEAD(&hsr->node_db);
	INIT_LIST_HEAD(&hsr->self_node_db);
425
	spin_lock_init(&hsr->list_lock);
426 427 428 429

	ether_addr_copy(hsr_dev->dev_addr, slave[0]->dev_addr);

	/* Make sure we recognize frames from ourselves in hsr_rcv() */
430
	res = hsr_create_self_node(hsr, hsr_dev->dev_addr,
431 432 433 434
				   slave[1]->dev_addr);
	if (res < 0)
		return res;

435
	spin_lock_init(&hsr->seqnr_lock);
436
	/* Overflow soon to find bugs easier: */
A
Arvid Brodin 已提交
437
	hsr->sequence_nr = HSR_SEQNR_START;
P
Peter Heise 已提交
438
	hsr->sup_sequence_nr = HSR_SUP_SEQNR_START;
439

440 441
	timer_setup(&hsr->announce_timer, hsr_announce, 0);
	timer_setup(&hsr->prune_timer, hsr_prune_nodes, 0);
442

443 444
	ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr);
	hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
445

446
	hsr->prot_version = protocol_version;
P
Peter Heise 已提交
447

448 449 450 451 452 453 454 455 456
	/* FIXME: should I modify the value of these?
	 *
	 * - hsr_dev->flags - i.e.
	 *			IFF_MASTER/SLAVE?
	 * - hsr_dev->priv_flags - i.e.
	 *			IFF_EBRIDGE?
	 *			IFF_TX_SKB_SHARING?
	 *			IFF_HSR_MASTER/SLAVE?
	 */
457 458 459 460

	/* Make sure the 1st call to netif_carrier_on() gets through */
	netif_carrier_off(hsr_dev);

461
	res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER, extack);
462
	if (res)
463
		goto err_add_master;
464

465
	res = register_netdevice(hsr_dev);
466
	if (res)
467
		goto err_unregister;
468

469
	res = hsr_add_port(hsr, slave[0], HSR_PT_SLAVE_A, extack);
470
	if (res)
471 472
		goto err_add_slaves;

473
	res = hsr_add_port(hsr, slave[1], HSR_PT_SLAVE_B, extack);
474
	if (res)
475
		goto err_add_slaves;
476

477
	hsr_debugfs_init(hsr, hsr_dev);
478
	mod_timer(&hsr->prune_timer, jiffies + msecs_to_jiffies(PRUNE_PERIOD));
479

480
	return 0;
481

482 483 484
err_add_slaves:
	unregister_netdevice(hsr_dev);
err_unregister:
485
	hsr_del_ports(hsr);
486
err_add_master:
487
	hsr_del_self_node(hsr);
488 489

	return res;
490
}