hsr_device.c 12.2 KB
Newer Older
1
/* Copyright 2011-2014 Autronica Fire and Security AS
2 3 4 5 6 7 8
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * Author(s):
9
 *	2011-2014 Arvid Brodin, arvid.brodin@alten.se
10 11 12 13 14 15 16 17 18 19 20
 *
 * 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"
21
#include "hsr_slave.h"
22 23
#include "hsr_framereg.h"
#include "hsr_main.h"
A
Arvid Brodin 已提交
24
#include "hsr_forward.h"
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48


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);
	}
}

49
static void hsr_set_operstate(struct hsr_port *master, bool has_carrier)
50
{
51 52
	if (!is_admin_up(master->dev)) {
		__hsr_set_operstate(master->dev, IF_OPER_DOWN);
53 54 55
		return;
	}

56
	if (has_carrier)
57
		__hsr_set_operstate(master->dev, IF_OPER_UP);
58
	else
59
		__hsr_set_operstate(master->dev, IF_OPER_LOWERLAYERDOWN);
60 61
}

62
static bool hsr_check_carrier(struct hsr_port *master)
63
{
64
	struct hsr_port *port;
65 66
	bool has_carrier;

67 68 69 70 71 72 73 74 75
	has_carrier = false;

	rcu_read_lock();
	hsr_for_each_port(master->hsr, port)
		if ((port->type != HSR_PT_MASTER) && is_slave_up(port->dev)) {
			has_carrier = true;
			break;
		}
	rcu_read_unlock();
76 77

	if (has_carrier)
78
		netif_carrier_on(master->dev);
79
	else
80
		netif_carrier_off(master->dev);
81 82

	return has_carrier;
83 84 85
}


86 87
static void hsr_check_announce(struct net_device *hsr_dev,
			       unsigned char old_operstate)
88
{
89
	struct hsr_priv *hsr;
90

91
	hsr = netdev_priv(hsr_dev);
92

P
Peter Heise 已提交
93 94
	if ((hsr_dev->operstate == IF_OPER_UP)
			&& (old_operstate != IF_OPER_UP)) {
95
		/* Went up */
96 97
		hsr->announce_count = 0;
		hsr->announce_timer.expires = jiffies +
98
				msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
99
		add_timer(&hsr->announce_timer);
100 101 102 103
	}

	if ((hsr_dev->operstate != IF_OPER_UP) && (old_operstate == IF_OPER_UP))
		/* Went down */
104
		del_timer(&hsr->announce_timer);
105 106
}

107 108
void hsr_check_carrier_and_operstate(struct hsr_priv *hsr)
{
109
	struct hsr_port *master;
110 111 112
	unsigned char old_operstate;
	bool has_carrier;

113
	master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
114 115 116
	/* netif_stacked_transfer_operstate() cannot be used here since
	 * it doesn't set IF_OPER_LOWERLAYERDOWN (?)
	 */
117 118 119 120
	old_operstate = master->dev->operstate;
	has_carrier = hsr_check_carrier(master);
	hsr_set_operstate(master, has_carrier);
	hsr_check_announce(master->dev, old_operstate);
121 122
}

123
int hsr_get_max_mtu(struct hsr_priv *hsr)
124
{
125
	unsigned int mtu_max;
126
	struct hsr_port *port;
127 128 129

	mtu_max = ETH_DATA_LEN;
	rcu_read_lock();
130 131 132
	hsr_for_each_port(hsr, port)
		if (port->type != HSR_PT_MASTER)
			mtu_max = min(port->dev->mtu, mtu_max);
133 134 135 136
	rcu_read_unlock();

	if (mtu_max < HSR_HLEN)
		return 0;
137
	return mtu_max - HSR_HLEN;
138 139
}

140

141 142
static int hsr_dev_change_mtu(struct net_device *dev, int new_mtu)
{
143
	struct hsr_priv *hsr;
144
	struct hsr_port *master;
145

146
	hsr = netdev_priv(dev);
147
	master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
148

149
	if (new_mtu > hsr_get_max_mtu(hsr)) {
150
		netdev_info(master->dev, "A HSR master's MTU cannot be greater than the smallest MTU of its slaves minus the HSR Tag length (%d octets).\n",
151
			    HSR_HLEN);
152 153 154 155 156 157 158 159 160 161
		return -EINVAL;
	}

	dev->mtu = new_mtu;

	return 0;
}

static int hsr_dev_open(struct net_device *dev)
{
162
	struct hsr_priv *hsr;
163 164
	struct hsr_port *port;
	char designation;
165

166
	hsr = netdev_priv(dev);
167
	designation = '\0';
168

169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
	rcu_read_lock();
	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);
186
	}
187 188 189 190
	rcu_read_unlock();

	if (designation == '\0')
		netdev_warn(dev, "No slave devices configured\n");
191 192 193 194

	return 0;
}

195

196 197
static int hsr_dev_close(struct net_device *dev)
{
198
	/* Nothing to do here. */
199 200 201 202
	return 0;
}


203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
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);
}


236 237
static int hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
{
A
Arvid Brodin 已提交
238
	struct hsr_priv *hsr = netdev_priv(dev);
239
	struct hsr_port *master;
240

241
	master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
A
Arvid Brodin 已提交
242 243
	skb->dev = master->dev;
	hsr_forward_skb(skb, master);
244 245 246 247 248 249

	return NETDEV_TX_OK;
}


static const struct header_ops hsr_header_ops = {
A
Arvid Brodin 已提交
250
	.create	 = eth_header,
251 252 253
	.parse	 = eth_header_parse,
};

P
Peter Heise 已提交
254 255
static void send_hsr_supervision_frame(struct hsr_port *master,
		u8 type, u8 hsrVer)
256 257 258
{
	struct sk_buff *skb;
	int hlen, tlen;
P
Peter Heise 已提交
259
	struct hsr_tag *hsr_tag;
260 261 262 263
	struct hsr_sup_tag *hsr_stag;
	struct hsr_sup_payload *hsr_sp;
	unsigned long irqflags;

264 265
	hlen = LL_RESERVED_SPACE(master->dev);
	tlen = master->dev->needed_tailroom;
P
Peter Heise 已提交
266 267 268 269
	skb = dev_alloc_skb(
			sizeof(struct hsr_tag) +
			sizeof(struct hsr_sup_tag) +
			sizeof(struct hsr_sup_payload) + hlen + tlen);
270 271 272 273 274 275

	if (skb == NULL)
		return;

	skb_reserve(skb, hlen);

276
	skb->dev = master->dev;
P
Peter Heise 已提交
277
	skb->protocol = htons(hsrVer ? ETH_P_HSR : ETH_P_PRP);
278 279
	skb->priority = TC_PRIO_CONTROL;

P
Peter Heise 已提交
280
	if (dev_hard_header(skb, skb->dev, (hsrVer ? ETH_P_HSR : ETH_P_PRP),
A
Arvid Brodin 已提交
281 282
			    master->hsr->sup_multicast_addr,
			    skb->dev->dev_addr, skb->len) <= 0)
283
		goto out;
A
Arvid Brodin 已提交
284
	skb_reset_mac_header(skb);
285

P
Peter Heise 已提交
286 287 288 289 290
	if (hsrVer > 0) {
		hsr_tag = (typeof(hsr_tag)) skb_put(skb, sizeof(struct hsr_tag));
		hsr_tag->encap_proto = htons(ETH_P_PRP);
		set_hsr_tag_LSDU_size(hsr_tag, HSR_V1_SUP_LSDUSIZE);
	}
291

P
Peter Heise 已提交
292 293 294
	hsr_stag = (typeof(hsr_stag)) skb_put(skb, sizeof(struct hsr_sup_tag));
	set_hsr_stag_path(hsr_stag, (hsrVer ? 0x0 : 0xf));
	set_hsr_stag_HSR_Ver(hsr_stag, hsrVer);
295

P
Peter Heise 已提交
296
	/* From HSRv1 on we have separate supervision sequence numbers. */
A
Arvid Brodin 已提交
297
	spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
P
Peter Heise 已提交
298 299 300 301 302 303 304 305 306
	if (hsrVer > 0) {
		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 已提交
307
	spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
308 309

	hsr_stag->HSR_TLV_Type = type;
P
Peter Heise 已提交
310 311
	/* TODO: Why 12 in HSRv0? */
	hsr_stag->HSR_TLV_Length = hsrVer ? sizeof(struct hsr_sup_payload) : 12;
312 313

	/* Payload: MacAddressA */
P
Peter Heise 已提交
314
	hsr_sp = (typeof(hsr_sp)) skb_put(skb, sizeof(struct hsr_sup_payload));
315
	ether_addr_copy(hsr_sp->MacAddressA, master->dev->dev_addr);
316

P
Peter Heise 已提交
317 318
	skb_put_padto(skb, ETH_ZLEN + HSR_HLEN);

A
Arvid Brodin 已提交
319
	hsr_forward_skb(skb, master);
320 321 322
	return;

out:
D
Dan Carpenter 已提交
323
	WARN_ONCE(1, "HSR: Could not send supervision frame\n");
324 325 326 327 328 329 330 331
	kfree_skb(skb);
}


/* Announce (supervision frame) timer function
 */
static void hsr_announce(unsigned long data)
{
332
	struct hsr_priv *hsr;
333
	struct hsr_port *master;
334

335
	hsr = (struct hsr_priv *) data;
A
Arvid Brodin 已提交
336 337

	rcu_read_lock();
338
	master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
339

P
Peter Heise 已提交
340 341 342
	if (hsr->announce_count < 3 && hsr->protVersion == 0) {
		send_hsr_supervision_frame(master, HSR_TLV_ANNOUNCE,
				hsr->protVersion);
343
		hsr->announce_count++;
344

345
		hsr->announce_timer.expires = jiffies +
346
				msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
P
Peter Heise 已提交
347 348 349 350
	} else {
		send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK,
				hsr->protVersion);

351
		hsr->announce_timer.expires = jiffies +
352
				msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
P
Peter Heise 已提交
353
	}
354

355
	if (is_admin_up(master->dev))
356
		add_timer(&hsr->announce_timer);
A
Arvid Brodin 已提交
357 358

	rcu_read_unlock();
359 360 361 362 363 364 365 366
}


/* According to comments in the declaration of struct net_device, this function
 * is "Called from unregister, can be used to call free_netdev". Ok then...
 */
static void hsr_dev_destroy(struct net_device *hsr_dev)
{
367
	struct hsr_priv *hsr;
368
	struct hsr_port *port;
369

370
	hsr = netdev_priv(hsr_dev);
371 372

	rtnl_lock();
373 374
	hsr_for_each_port(hsr, port)
		hsr_del_port(port);
375
	rtnl_unlock();
376

377 378
	del_timer_sync(&hsr->prune_timer);
	del_timer_sync(&hsr->announce_timer);
379 380

	synchronize_rcu();
381 382 383 384 385 386 387
}

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,
388
	.ndo_fix_features = hsr_fix_features,
389 390
};

391 392 393
static struct device_type hsr_type = {
	.name = "hsr",
};
394 395 396

void hsr_dev_setup(struct net_device *dev)
{
397
	eth_hw_addr_random(dev);
398 399

	ether_setup(dev);
400
	dev->min_mtu = 0;
401 402 403
	dev->header_ops = &hsr_header_ops;
	dev->netdev_ops = &hsr_device_ops;
	SET_NETDEV_DEVTYPE(dev, &hsr_type);
404
	dev->priv_flags |= IFF_NO_QUEUE;
405

406 407
	dev->needs_free_netdev = true;
	dev->priv_destructor = hsr_dev_destroy;
408 409 410 411 412 413 414 415 416 417 418 419 420

	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;
421 422 423 424
	/* 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;
425 426 427 428 429
}


/* Return true if dev is a HSR master; return false otherwise.
 */
430
inline bool is_hsr_master(struct net_device *dev)
431 432 433 434 435
{
	return (dev->netdev_ops->ndo_start_xmit == hsr_dev_xmit);
}

/* Default multicast address for HSR Supervision frames */
J
Joe Perches 已提交
436
static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = {
437 438 439 440
	0x01, 0x15, 0x4e, 0x00, 0x01, 0x00
};

int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
P
Peter Heise 已提交
441
		     unsigned char multicast_spec, u8 protocol_version)
442
{
443
	struct hsr_priv *hsr;
444
	struct hsr_port *port;
445 446
	int res;

447
	hsr = netdev_priv(hsr_dev);
448
	INIT_LIST_HEAD(&hsr->ports);
449 450
	INIT_LIST_HEAD(&hsr->node_db);
	INIT_LIST_HEAD(&hsr->self_node_db);
451 452 453 454 455 456 457 458 459

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

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

460
	spin_lock_init(&hsr->seqnr_lock);
461
	/* Overflow soon to find bugs easier: */
A
Arvid Brodin 已提交
462
	hsr->sequence_nr = HSR_SEQNR_START;
P
Peter Heise 已提交
463
	hsr->sup_sequence_nr = HSR_SUP_SEQNR_START;
464

465
	setup_timer(&hsr->announce_timer, hsr_announce, (unsigned long)hsr);
466

467
	setup_timer(&hsr->prune_timer, hsr_prune_nodes, (unsigned long)hsr);
468

469 470
	ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr);
	hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
471

P
Peter Heise 已提交
472 473
	hsr->protVersion = protocol_version;

474 475 476 477 478 479 480 481 482
	/* 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?
	 */
483 484 485 486

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

487
	res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER);
488
	if (res)
489 490
		return res;

491
	res = register_netdevice(hsr_dev);
492
	if (res)
493 494 495 496 497 498 499 500
		goto fail;

	res = hsr_add_port(hsr, slave[0], HSR_PT_SLAVE_A);
	if (res)
		goto fail;
	res = hsr_add_port(hsr, slave[1], HSR_PT_SLAVE_B);
	if (res)
		goto fail;
501

502
	mod_timer(&hsr->prune_timer, jiffies + msecs_to_jiffies(PRUNE_PERIOD));
503

504
	return 0;
505 506 507 508 509 510

fail:
	hsr_for_each_port(hsr, port)
		hsr_del_port(port);

	return res;
511
}