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

292
	hsr_stag = skb_put(skb, sizeof(struct hsr_sup_tag));
P
Peter Heise 已提交
293 294
	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 */
314
	hsr_sp = skb_put(skb, sizeof(struct hsr_sup_payload));
315
	ether_addr_copy(hsr_sp->MacAddressA, master->dev->dev_addr);
316

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

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

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


/* Announce (supervision frame) timer function
 */
331
static void hsr_announce(struct timer_list *t)
332
{
333
	struct hsr_priv *hsr;
334
	struct hsr_port *master;
335

336
	hsr = from_timer(hsr, t, announce_timer);
A
Arvid Brodin 已提交
337 338

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

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

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

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

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

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


/* 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)
{
368
	struct hsr_priv *hsr;
369
	struct hsr_port *port;
370

371
	hsr = netdev_priv(hsr_dev);
372 373

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

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

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

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

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

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

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

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

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


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

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

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

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

	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;

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

466 467
	timer_setup(&hsr->announce_timer, hsr_announce, 0);
	timer_setup(&hsr->prune_timer, hsr_prune_nodes, 0);
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
}