hsr_device.c (79e24da00b1137031245f3341828e4215b1b5b59) hsr_device.c (ee1c27977284907d40f7f72c2d078d709f15811f)
1/* Copyright 2011-2014 Autronica Fire and Security AS
2 *
3 * This program is free software; you can redistribute it and/or modify it
4 * under the terms of the GNU General Public License as published by the Free
5 * Software Foundation; either version 2 of the License, or (at your option)
6 * any later version.
7 *
8 * Author(s):

--- 76 unchanged lines hidden (view full) ---

85
86static void hsr_check_announce(struct net_device *hsr_dev,
87 unsigned char old_operstate)
88{
89 struct hsr_priv *hsr;
90
91 hsr = netdev_priv(hsr_dev);
92
1/* Copyright 2011-2014 Autronica Fire and Security AS
2 *
3 * This program is free software; you can redistribute it and/or modify it
4 * under the terms of the GNU General Public License as published by the Free
5 * Software Foundation; either version 2 of the License, or (at your option)
6 * any later version.
7 *
8 * Author(s):

--- 76 unchanged lines hidden (view full) ---

85
86static void hsr_check_announce(struct net_device *hsr_dev,
87 unsigned char old_operstate)
88{
89 struct hsr_priv *hsr;
90
91 hsr = netdev_priv(hsr_dev);
92
93 if ((hsr_dev->operstate == IF_OPER_UP) && (old_operstate != IF_OPER_UP)) {
93 if ((hsr_dev->operstate == IF_OPER_UP)
94 && (old_operstate != IF_OPER_UP)) {
94 /* Went up */
95 hsr->announce_count = 0;
96 hsr->announce_timer.expires = jiffies +
97 msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
98 add_timer(&hsr->announce_timer);
99 }
100
101 if ((hsr_dev->operstate != IF_OPER_UP) && (old_operstate == IF_OPER_UP))

--- 143 unchanged lines hidden (view full) ---

245}
246
247
248static const struct header_ops hsr_header_ops = {
249 .create = eth_header,
250 .parse = eth_header_parse,
251};
252
95 /* Went up */
96 hsr->announce_count = 0;
97 hsr->announce_timer.expires = jiffies +
98 msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
99 add_timer(&hsr->announce_timer);
100 }
101
102 if ((hsr_dev->operstate != IF_OPER_UP) && (old_operstate == IF_OPER_UP))

--- 143 unchanged lines hidden (view full) ---

246}
247
248
249static const struct header_ops hsr_header_ops = {
250 .create = eth_header,
251 .parse = eth_header_parse,
252};
253
253
254/* HSR:2010 supervision frames should be padded so that the whole frame,
255 * including headers and FCS, is 64 bytes (without VLAN).
256 */
257static int hsr_pad(int size)
254static void send_hsr_supervision_frame(struct hsr_port *master,
255 u8 type, u8 hsrVer)
258{
256{
259 const int min_size = ETH_ZLEN - HSR_HLEN - ETH_HLEN;
260
261 if (size >= min_size)
262 return size;
263 return min_size;
264}
265
266static void send_hsr_supervision_frame(struct hsr_port *master, u8 type)
267{
268 struct sk_buff *skb;
269 int hlen, tlen;
257 struct sk_buff *skb;
258 int hlen, tlen;
259 struct hsr_tag *hsr_tag;
270 struct hsr_sup_tag *hsr_stag;
271 struct hsr_sup_payload *hsr_sp;
272 unsigned long irqflags;
273
274 hlen = LL_RESERVED_SPACE(master->dev);
275 tlen = master->dev->needed_tailroom;
260 struct hsr_sup_tag *hsr_stag;
261 struct hsr_sup_payload *hsr_sp;
262 unsigned long irqflags;
263
264 hlen = LL_RESERVED_SPACE(master->dev);
265 tlen = master->dev->needed_tailroom;
276 skb = alloc_skb(hsr_pad(sizeof(struct hsr_sup_payload)) + hlen + tlen,
277 GFP_ATOMIC);
266 skb = dev_alloc_skb(
267 sizeof(struct hsr_tag) +
268 sizeof(struct hsr_sup_tag) +
269 sizeof(struct hsr_sup_payload) + hlen + tlen);
278
279 if (skb == NULL)
280 return;
281
282 skb_reserve(skb, hlen);
283
284 skb->dev = master->dev;
270
271 if (skb == NULL)
272 return;
273
274 skb_reserve(skb, hlen);
275
276 skb->dev = master->dev;
285 skb->protocol = htons(ETH_P_PRP);
277 skb->protocol = htons(hsrVer ? ETH_P_HSR : ETH_P_PRP);
286 skb->priority = TC_PRIO_CONTROL;
287
278 skb->priority = TC_PRIO_CONTROL;
279
288 if (dev_hard_header(skb, skb->dev, ETH_P_PRP,
280 if (dev_hard_header(skb, skb->dev, (hsrVer ? ETH_P_HSR : ETH_P_PRP),
289 master->hsr->sup_multicast_addr,
290 skb->dev->dev_addr, skb->len) <= 0)
291 goto out;
292 skb_reset_mac_header(skb);
293
281 master->hsr->sup_multicast_addr,
282 skb->dev->dev_addr, skb->len) <= 0)
283 goto out;
284 skb_reset_mac_header(skb);
285
294 hsr_stag = (typeof(hsr_stag)) skb_put(skb, sizeof(*hsr_stag));
286 if (hsrVer > 0) {
287 hsr_tag = (typeof(hsr_tag)) skb_put(skb, sizeof(struct hsr_tag));
288 hsr_tag->encap_proto = htons(ETH_P_PRP);
289 set_hsr_tag_LSDU_size(hsr_tag, HSR_V1_SUP_LSDUSIZE);
290 }
295
291
296 set_hsr_stag_path(hsr_stag, 0xf);
297 set_hsr_stag_HSR_Ver(hsr_stag, 0);
292 hsr_stag = (typeof(hsr_stag)) skb_put(skb, sizeof(struct hsr_sup_tag));
293 set_hsr_stag_path(hsr_stag, (hsrVer ? 0x0 : 0xf));
294 set_hsr_stag_HSR_Ver(hsr_stag, hsrVer);
298
295
296 /* From HSRv1 on we have separate supervision sequence numbers. */
299 spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
297 spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
300 hsr_stag->sequence_nr = htons(master->hsr->sequence_nr);
301 master->hsr->sequence_nr++;
298 if (hsrVer > 0) {
299 hsr_stag->sequence_nr = htons(master->hsr->sup_sequence_nr);
300 hsr_tag->sequence_nr = htons(master->hsr->sequence_nr);
301 master->hsr->sup_sequence_nr++;
302 master->hsr->sequence_nr++;
303 } else {
304 hsr_stag->sequence_nr = htons(master->hsr->sequence_nr);
305 master->hsr->sequence_nr++;
306 }
302 spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
303
304 hsr_stag->HSR_TLV_Type = type;
307 spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
308
309 hsr_stag->HSR_TLV_Type = type;
305 hsr_stag->HSR_TLV_Length = 12;
310 /* TODO: Why 12 in HSRv0? */
311 hsr_stag->HSR_TLV_Length = hsrVer ? sizeof(struct hsr_sup_payload) : 12;
306
307 /* Payload: MacAddressA */
312
313 /* Payload: MacAddressA */
308 hsr_sp = (typeof(hsr_sp)) skb_put(skb, sizeof(*hsr_sp));
314 hsr_sp = (typeof(hsr_sp)) skb_put(skb, sizeof(struct hsr_sup_payload));
309 ether_addr_copy(hsr_sp->MacAddressA, master->dev->dev_addr);
310
315 ether_addr_copy(hsr_sp->MacAddressA, master->dev->dev_addr);
316
317 skb_put_padto(skb, ETH_ZLEN + HSR_HLEN);
318
311 hsr_forward_skb(skb, master);
312 return;
313
314out:
315 WARN_ONCE(1, "HSR: Could not send supervision frame\n");
316 kfree_skb(skb);
317}
318

--- 5 unchanged lines hidden (view full) ---

324 struct hsr_priv *hsr;
325 struct hsr_port *master;
326
327 hsr = (struct hsr_priv *) data;
328
329 rcu_read_lock();
330 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
331
319 hsr_forward_skb(skb, master);
320 return;
321
322out:
323 WARN_ONCE(1, "HSR: Could not send supervision frame\n");
324 kfree_skb(skb);
325}
326

--- 5 unchanged lines hidden (view full) ---

332 struct hsr_priv *hsr;
333 struct hsr_port *master;
334
335 hsr = (struct hsr_priv *) data;
336
337 rcu_read_lock();
338 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
339
332 if (hsr->announce_count < 3) {
333 send_hsr_supervision_frame(master, HSR_TLV_ANNOUNCE);
340 if (hsr->announce_count < 3 && hsr->protVersion == 0) {
341 send_hsr_supervision_frame(master, HSR_TLV_ANNOUNCE,
342 hsr->protVersion);
334 hsr->announce_count++;
343 hsr->announce_count++;
335 } else {
336 send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK);
337 }
338
344
339 if (hsr->announce_count < 3)
340 hsr->announce_timer.expires = jiffies +
341 msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
345 hsr->announce_timer.expires = jiffies +
346 msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
342 else
347 } else {
348 send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK,
349 hsr->protVersion);
350
343 hsr->announce_timer.expires = jiffies +
344 msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
351 hsr->announce_timer.expires = jiffies +
352 msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
353 }
345
346 if (is_admin_up(master->dev))
347 add_timer(&hsr->announce_timer);
348
349 rcu_read_unlock();
350}
351
352

--- 70 unchanged lines hidden (view full) ---

423}
424
425/* Default multicast address for HSR Supervision frames */
426static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = {
427 0x01, 0x15, 0x4e, 0x00, 0x01, 0x00
428};
429
430int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
354
355 if (is_admin_up(master->dev))
356 add_timer(&hsr->announce_timer);
357
358 rcu_read_unlock();
359}
360
361

--- 70 unchanged lines hidden (view full) ---

432}
433
434/* Default multicast address for HSR Supervision frames */
435static const unsigned char def_multicast_addr[ETH_ALEN] __aligned(2) = {
436 0x01, 0x15, 0x4e, 0x00, 0x01, 0x00
437};
438
439int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
431 unsigned char multicast_spec)
440 unsigned char multicast_spec, u8 protocol_version)
432{
433 struct hsr_priv *hsr;
434 struct hsr_port *port;
435 int res;
436
437 hsr = netdev_priv(hsr_dev);
438 INIT_LIST_HEAD(&hsr->ports);
439 INIT_LIST_HEAD(&hsr->node_db);

--- 5 unchanged lines hidden (view full) ---

445 res = hsr_create_self_node(&hsr->self_node_db, hsr_dev->dev_addr,
446 slave[1]->dev_addr);
447 if (res < 0)
448 return res;
449
450 spin_lock_init(&hsr->seqnr_lock);
451 /* Overflow soon to find bugs easier: */
452 hsr->sequence_nr = HSR_SEQNR_START;
441{
442 struct hsr_priv *hsr;
443 struct hsr_port *port;
444 int res;
445
446 hsr = netdev_priv(hsr_dev);
447 INIT_LIST_HEAD(&hsr->ports);
448 INIT_LIST_HEAD(&hsr->node_db);

--- 5 unchanged lines hidden (view full) ---

454 res = hsr_create_self_node(&hsr->self_node_db, hsr_dev->dev_addr,
455 slave[1]->dev_addr);
456 if (res < 0)
457 return res;
458
459 spin_lock_init(&hsr->seqnr_lock);
460 /* Overflow soon to find bugs easier: */
461 hsr->sequence_nr = HSR_SEQNR_START;
462 hsr->sup_sequence_nr = HSR_SUP_SEQNR_START;
453
454 init_timer(&hsr->announce_timer);
455 hsr->announce_timer.function = hsr_announce;
456 hsr->announce_timer.data = (unsigned long) hsr;
457
458 init_timer(&hsr->prune_timer);
459 hsr->prune_timer.function = hsr_prune_nodes;
460 hsr->prune_timer.data = (unsigned long) hsr;
461
462 ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr);
463 hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
464
463
464 init_timer(&hsr->announce_timer);
465 hsr->announce_timer.function = hsr_announce;
466 hsr->announce_timer.data = (unsigned long) hsr;
467
468 init_timer(&hsr->prune_timer);
469 hsr->prune_timer.function = hsr_prune_nodes;
470 hsr->prune_timer.data = (unsigned long) hsr;
471
472 ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr);
473 hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
474
475 hsr->protVersion = protocol_version;
476
465 /* FIXME: should I modify the value of these?
466 *
467 * - hsr_dev->flags - i.e.
468 * IFF_MASTER/SLAVE?
469 * - hsr_dev->priv_flags - i.e.
470 * IFF_EBRIDGE?
471 * IFF_TX_SKB_SHARING?
472 * IFF_HSR_MASTER/SLAVE?

--- 31 unchanged lines hidden ---
477 /* FIXME: should I modify the value of these?
478 *
479 * - hsr_dev->flags - i.e.
480 * IFF_MASTER/SLAVE?
481 * - hsr_dev->priv_flags - i.e.
482 * IFF_EBRIDGE?
483 * IFF_TX_SKB_SHARING?
484 * IFF_HSR_MASTER/SLAVE?

--- 31 unchanged lines hidden ---