hsr_device.c 11.7 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 93 94

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

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

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

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

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

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

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

139

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

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

148
	if (new_mtu > hsr_get_max_mtu(hsr)) {
149
		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",
150
			    HSR_HLEN);
151 152 153 154 155 156 157 158 159 160
		return -EINVAL;
	}

	dev->mtu = new_mtu;

	return 0;
}

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

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

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

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

	return 0;
}

194

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


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


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

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

	return NETDEV_TX_OK;
}


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


/* HSR:2010 supervision frames should be padded so that the whole frame,
 * including headers and FCS, is 64 bytes (without VLAN).
 */
static int hsr_pad(int size)
{
259
	const int min_size = ETH_ZLEN - HSR_HLEN - ETH_HLEN;
260 261 262 263 264 265

	if (size >= min_size)
		return size;
	return min_size;
}

A
Arvid Brodin 已提交
266
static void send_hsr_supervision_frame(struct hsr_port *master, u8 type)
267 268 269 270 271 272 273
{
	struct sk_buff *skb;
	int hlen, tlen;
	struct hsr_sup_tag *hsr_stag;
	struct hsr_sup_payload *hsr_sp;
	unsigned long irqflags;

274 275
	hlen = LL_RESERVED_SPACE(master->dev);
	tlen = master->dev->needed_tailroom;
276 277 278 279 280 281 282 283
	skb = alloc_skb(hsr_pad(sizeof(struct hsr_sup_payload)) + hlen + tlen,
			GFP_ATOMIC);

	if (skb == NULL)
		return;

	skb_reserve(skb, hlen);

284
	skb->dev = master->dev;
285 286 287
	skb->protocol = htons(ETH_P_PRP);
	skb->priority = TC_PRIO_CONTROL;

A
Arvid Brodin 已提交
288 289 290
	if (dev_hard_header(skb, skb->dev, ETH_P_PRP,
			    master->hsr->sup_multicast_addr,
			    skb->dev->dev_addr, skb->len) <= 0)
291
		goto out;
A
Arvid Brodin 已提交
292
	skb_reset_mac_header(skb);
293

A
Arvid Brodin 已提交
294
	hsr_stag = (typeof(hsr_stag)) skb_put(skb, sizeof(*hsr_stag));
295 296 297 298

	set_hsr_stag_path(hsr_stag, 0xf);
	set_hsr_stag_HSR_Ver(hsr_stag, 0);

A
Arvid Brodin 已提交
299 300 301 302
	spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
	hsr_stag->sequence_nr = htons(master->hsr->sequence_nr);
	master->hsr->sequence_nr++;
	spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
303 304 305 306 307 308

	hsr_stag->HSR_TLV_Type = type;
	hsr_stag->HSR_TLV_Length = 12;

	/* Payload: MacAddressA */
	hsr_sp = (typeof(hsr_sp)) skb_put(skb, sizeof(*hsr_sp));
309
	ether_addr_copy(hsr_sp->MacAddressA, master->dev->dev_addr);
310

A
Arvid Brodin 已提交
311
	hsr_forward_skb(skb, master);
312 313 314
	return;

out:
315
	WARN_ON_ONCE("HSR: Could not send supervision frame\n");
316 317 318 319 320 321 322 323
	kfree_skb(skb);
}


/* Announce (supervision frame) timer function
 */
static void hsr_announce(unsigned long data)
{
324
	struct hsr_priv *hsr;
325
	struct hsr_port *master;
326

327
	hsr = (struct hsr_priv *) data;
A
Arvid Brodin 已提交
328 329

	rcu_read_lock();
330
	master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
331

332
	if (hsr->announce_count < 3) {
A
Arvid Brodin 已提交
333
		send_hsr_supervision_frame(master, HSR_TLV_ANNOUNCE);
334
		hsr->announce_count++;
335
	} else {
A
Arvid Brodin 已提交
336
		send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK);
337 338
	}

339 340
	if (hsr->announce_count < 3)
		hsr->announce_timer.expires = jiffies +
341 342
				msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
	else
343
		hsr->announce_timer.expires = jiffies +
344 345
				msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);

346
	if (is_admin_up(master->dev))
347
		add_timer(&hsr->announce_timer);
A
Arvid Brodin 已提交
348 349

	rcu_read_unlock();
350 351 352 353 354 355 356 357
}


/* 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)
{
358
	struct hsr_priv *hsr;
359
	struct hsr_port *port;
360

361
	hsr = netdev_priv(hsr_dev);
362 363

	rtnl_lock();
364 365
	hsr_for_each_port(hsr, port)
		hsr_del_port(port);
366
	rtnl_unlock();
367

368 369
	del_timer_sync(&hsr->prune_timer);
	del_timer_sync(&hsr->announce_timer);
370 371 372

	synchronize_rcu();
	free_netdev(hsr_dev);
373 374 375 376 377 378 379
}

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,
380
	.ndo_fix_features = hsr_fix_features,
381 382
};

383 384 385
static struct device_type hsr_type = {
	.name = "hsr",
};
386 387 388 389 390 391

void hsr_dev_setup(struct net_device *dev)
{
	random_ether_addr(dev->dev_addr);

	ether_setup(dev);
392 393 394 395
	dev->header_ops = &hsr_header_ops;
	dev->netdev_ops = &hsr_device_ops;
	SET_NETDEV_DEVTYPE(dev, &hsr_type);
	dev->tx_queue_len = 0;
396 397

	dev->destructor = hsr_dev_destroy;
398 399 400 401 402 403 404 405 406 407 408 409 410

	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;
411 412 413 414
	/* 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;
415 416 417 418 419
}


/* Return true if dev is a HSR master; return false otherwise.
 */
420
inline bool is_hsr_master(struct net_device *dev)
421 422 423 424 425
{
	return (dev->netdev_ops->ndo_start_xmit == hsr_dev_xmit);
}

/* Default multicast address for HSR Supervision frames */
J
Joe Perches 已提交
426
static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = {
427 428 429 430 431 432
	0x01, 0x15, 0x4e, 0x00, 0x01, 0x00
};

int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
		     unsigned char multicast_spec)
{
433
	struct hsr_priv *hsr;
434
	struct hsr_port *port;
435 436
	int res;

437
	hsr = netdev_priv(hsr_dev);
438
	INIT_LIST_HEAD(&hsr->ports);
439 440
	INIT_LIST_HEAD(&hsr->node_db);
	INIT_LIST_HEAD(&hsr->self_node_db);
441 442 443 444 445 446 447 448 449

	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;

450
	spin_lock_init(&hsr->seqnr_lock);
451
	/* Overflow soon to find bugs easier: */
A
Arvid Brodin 已提交
452
	hsr->sequence_nr = HSR_SEQNR_START;
453

454 455 456
	init_timer(&hsr->announce_timer);
	hsr->announce_timer.function = hsr_announce;
	hsr->announce_timer.data = (unsigned long) hsr;
457

458 459 460 461
	init_timer(&hsr->prune_timer);
	hsr->prune_timer.function = hsr_prune_nodes;
	hsr->prune_timer.data = (unsigned long) hsr;

462 463
	ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr);
	hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
464

465 466 467 468 469 470 471 472 473
	/* 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?
	 */
474 475 476 477

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

478
	res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER);
479
	if (res)
480 481
		return res;

482
	res = register_netdevice(hsr_dev);
483
	if (res)
484 485 486 487 488 489 490 491
		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;
492

493 494 495
	hsr->prune_timer.expires = jiffies + msecs_to_jiffies(PRUNE_PERIOD);
	add_timer(&hsr->prune_timer);

496
	return 0;
497 498 499 500 501 502

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

	return res;
503
}