forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/net/hsr/hsr_device.c
....@@ -1,15 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /* 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.
73 *
84 * Author(s):
95 * 2011-2014 Arvid Brodin, arvid.brodin@alten.se
10
- *
116 * This file contains device methods for creating, using and destroying
12
- * virtual HSR devices.
7
+ * virtual HSR or PRP devices.
138 */
149
1510 #include <linux/netdevice.h>
....@@ -22,7 +17,6 @@
2217 #include "hsr_framereg.h"
2318 #include "hsr_main.h"
2419 #include "hsr_forward.h"
25
-
2620
2721 static bool is_admin_up(struct net_device *dev)
2822 {
....@@ -62,26 +56,20 @@
6256 static bool hsr_check_carrier(struct hsr_port *master)
6357 {
6458 struct hsr_port *port;
65
- bool has_carrier;
6659
67
- has_carrier = false;
60
+ ASSERT_RTNL();
6861
69
- rcu_read_lock();
70
- hsr_for_each_port(master->hsr, port)
71
- if ((port->type != HSR_PT_MASTER) && is_slave_up(port->dev)) {
72
- has_carrier = true;
73
- break;
62
+ hsr_for_each_port(master->hsr, port) {
63
+ if (port->type != HSR_PT_MASTER && is_slave_up(port->dev)) {
64
+ netif_carrier_on(master->dev);
65
+ return true;
7466 }
75
- rcu_read_unlock();
67
+ }
7668
77
- if (has_carrier)
78
- netif_carrier_on(master->dev);
79
- else
80
- netif_carrier_off(master->dev);
69
+ netif_carrier_off(master->dev);
8170
82
- return has_carrier;
71
+ return false;
8372 }
84
-
8573
8674 static void hsr_check_announce(struct net_device *hsr_dev,
8775 unsigned char old_operstate)
....@@ -90,15 +78,14 @@
9078
9179 hsr = netdev_priv(hsr_dev);
9280
93
- if ((hsr_dev->operstate == IF_OPER_UP)
94
- && (old_operstate != IF_OPER_UP)) {
81
+ if (hsr_dev->operstate == IF_OPER_UP && old_operstate != IF_OPER_UP) {
9582 /* Went up */
9683 hsr->announce_count = 0;
9784 mod_timer(&hsr->announce_timer,
9885 jiffies + msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL));
9986 }
10087
101
- if ((hsr_dev->operstate != IF_OPER_UP) && (old_operstate == IF_OPER_UP))
88
+ if (hsr_dev->operstate != IF_OPER_UP && old_operstate == IF_OPER_UP)
10289 /* Went down */
10390 del_timer(&hsr->announce_timer);
10491 }
....@@ -125,28 +112,23 @@
125112 struct hsr_port *port;
126113
127114 mtu_max = ETH_DATA_LEN;
128
- rcu_read_lock();
129115 hsr_for_each_port(hsr, port)
130116 if (port->type != HSR_PT_MASTER)
131117 mtu_max = min(port->dev->mtu, mtu_max);
132
- rcu_read_unlock();
133118
134119 if (mtu_max < HSR_HLEN)
135120 return 0;
136121 return mtu_max - HSR_HLEN;
137122 }
138123
139
-
140124 static int hsr_dev_change_mtu(struct net_device *dev, int new_mtu)
141125 {
142126 struct hsr_priv *hsr;
143
- struct hsr_port *master;
144127
145128 hsr = netdev_priv(dev);
146
- master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
147129
148130 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",
131
+ 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",
150132 HSR_HLEN);
151133 return -EINVAL;
152134 }
....@@ -165,7 +147,6 @@
165147 hsr = netdev_priv(dev);
166148 designation = '\0';
167149
168
- rcu_read_lock();
169150 hsr_for_each_port(hsr, port) {
170151 if (port->type == HSR_PT_MASTER)
171152 continue;
....@@ -183,7 +164,6 @@
183164 netdev_warn(dev, "Slave %c (%s) is not up; please bring it up to get a fully working HSR network\n",
184165 designation, port->dev->name);
185166 }
186
- rcu_read_unlock();
187167
188168 if (designation == '\0')
189169 netdev_warn(dev, "No slave devices configured\n");
....@@ -191,13 +171,11 @@
191171 return 0;
192172 }
193173
194
-
195174 static int hsr_dev_close(struct net_device *dev)
196175 {
197176 /* Nothing to do here. */
198177 return 0;
199178 }
200
-
201179
202180 static netdev_features_t hsr_features_recompute(struct hsr_priv *hsr,
203181 netdev_features_t features)
....@@ -231,101 +209,188 @@
231209 return hsr_features_recompute(hsr, features);
232210 }
233211
234
-
235
-static int hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
212
+static netdev_tx_t hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
236213 {
237214 struct hsr_priv *hsr = netdev_priv(dev);
238215 struct hsr_port *master;
239216
240217 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
241
- skb->dev = master->dev;
242
- hsr_forward_skb(skb, master);
243
-
218
+ if (master) {
219
+ skb->dev = master->dev;
220
+ skb_reset_mac_header(skb);
221
+ skb_reset_mac_len(skb);
222
+ hsr_forward_skb(skb, master);
223
+ } else {
224
+ atomic_long_inc(&dev->tx_dropped);
225
+ dev_kfree_skb_any(skb);
226
+ }
244227 return NETDEV_TX_OK;
245228 }
246
-
247229
248230 static const struct header_ops hsr_header_ops = {
249231 .create = eth_header,
250232 .parse = eth_header_parse,
251233 };
252234
253
-static void send_hsr_supervision_frame(struct hsr_port *master,
254
- u8 type, u8 hsrVer)
235
+static struct sk_buff *hsr_init_skb(struct hsr_port *master, u16 proto)
255236 {
237
+ struct hsr_priv *hsr = master->hsr;
256238 struct sk_buff *skb;
257239 int hlen, tlen;
258
- struct hsr_tag *hsr_tag;
259
- struct hsr_sup_tag *hsr_stag;
260
- struct hsr_sup_payload *hsr_sp;
261
- unsigned long irqflags;
262240
263241 hlen = LL_RESERVED_SPACE(master->dev);
264242 tlen = master->dev->needed_tailroom;
265
- skb = dev_alloc_skb(
266
- sizeof(struct hsr_tag) +
267
- sizeof(struct hsr_sup_tag) +
268
- sizeof(struct hsr_sup_payload) + hlen + tlen);
243
+ /* skb size is same for PRP/HSR frames, only difference
244
+ * being, for PRP it is a trailer and for HSR it is a
245
+ * header
246
+ */
247
+ skb = dev_alloc_skb(sizeof(struct hsr_tag) +
248
+ sizeof(struct hsr_sup_tag) +
249
+ sizeof(struct hsr_sup_payload) + hlen + tlen);
269250
270
- if (skb == NULL)
271
- return;
251
+ if (!skb)
252
+ return skb;
272253
273254 skb_reserve(skb, hlen);
274
-
275255 skb->dev = master->dev;
276
- skb->protocol = htons(hsrVer ? ETH_P_HSR : ETH_P_PRP);
256
+ skb->protocol = htons(proto);
277257 skb->priority = TC_PRIO_CONTROL;
278258
279
- if (dev_hard_header(skb, skb->dev, (hsrVer ? ETH_P_HSR : ETH_P_PRP),
280
- master->hsr->sup_multicast_addr,
259
+ if (dev_hard_header(skb, skb->dev, proto,
260
+ hsr->sup_multicast_addr,
281261 skb->dev->dev_addr, skb->len) <= 0)
282262 goto out;
263
+
283264 skb_reset_mac_header(skb);
265
+ skb_reset_mac_len(skb);
284266 skb_reset_network_header(skb);
285267 skb_reset_transport_header(skb);
286268
287
- if (hsrVer > 0) {
269
+ return skb;
270
+out:
271
+ kfree_skb(skb);
272
+
273
+ return NULL;
274
+}
275
+
276
+static void send_hsr_supervision_frame(struct hsr_port *master,
277
+ unsigned long *interval)
278
+{
279
+ struct hsr_priv *hsr = master->hsr;
280
+ __u8 type = HSR_TLV_LIFE_CHECK;
281
+ struct hsr_tag *hsr_tag = NULL;
282
+ struct hsr_sup_payload *hsr_sp;
283
+ struct hsr_sup_tag *hsr_stag;
284
+ unsigned long irqflags;
285
+ struct sk_buff *skb;
286
+ u16 proto;
287
+
288
+ *interval = msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
289
+ if (hsr->announce_count < 3 && hsr->prot_version == 0) {
290
+ type = HSR_TLV_ANNOUNCE;
291
+ *interval = msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
292
+ hsr->announce_count++;
293
+ }
294
+
295
+ if (!hsr->prot_version)
296
+ proto = ETH_P_PRP;
297
+ else
298
+ proto = ETH_P_HSR;
299
+
300
+ skb = hsr_init_skb(master, proto);
301
+ if (!skb) {
302
+ WARN_ONCE(1, "HSR: Could not send supervision frame\n");
303
+ return;
304
+ }
305
+
306
+ if (hsr->prot_version > 0) {
288307 hsr_tag = skb_put(skb, sizeof(struct hsr_tag));
289308 hsr_tag->encap_proto = htons(ETH_P_PRP);
290309 set_hsr_tag_LSDU_size(hsr_tag, HSR_V1_SUP_LSDUSIZE);
291310 }
292311
293312 hsr_stag = skb_put(skb, sizeof(struct hsr_sup_tag));
294
- set_hsr_stag_path(hsr_stag, (hsrVer ? 0x0 : 0xf));
295
- set_hsr_stag_HSR_Ver(hsr_stag, hsrVer);
313
+ set_hsr_stag_path(hsr_stag, (hsr->prot_version ? 0x0 : 0xf));
314
+ set_hsr_stag_HSR_ver(hsr_stag, hsr->prot_version);
296315
297316 /* From HSRv1 on we have separate supervision sequence numbers. */
298317 spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
299
- if (hsrVer > 0) {
300
- hsr_stag->sequence_nr = htons(master->hsr->sup_sequence_nr);
301
- hsr_tag->sequence_nr = htons(master->hsr->sequence_nr);
302
- master->hsr->sup_sequence_nr++;
303
- master->hsr->sequence_nr++;
318
+ if (hsr->prot_version > 0) {
319
+ hsr_stag->sequence_nr = htons(hsr->sup_sequence_nr);
320
+ hsr->sup_sequence_nr++;
321
+ hsr_tag->sequence_nr = htons(hsr->sequence_nr);
322
+ hsr->sequence_nr++;
304323 } else {
305
- hsr_stag->sequence_nr = htons(master->hsr->sequence_nr);
306
- master->hsr->sequence_nr++;
324
+ hsr_stag->sequence_nr = htons(hsr->sequence_nr);
325
+ hsr->sequence_nr++;
307326 }
308327 spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
309328
310
- hsr_stag->HSR_TLV_Type = type;
329
+ hsr_stag->HSR_TLV_type = type;
311330 /* TODO: Why 12 in HSRv0? */
312
- hsr_stag->HSR_TLV_Length = hsrVer ? sizeof(struct hsr_sup_payload) : 12;
331
+ hsr_stag->HSR_TLV_length = hsr->prot_version ?
332
+ sizeof(struct hsr_sup_payload) : 12;
313333
314334 /* Payload: MacAddressA */
315335 hsr_sp = skb_put(skb, sizeof(struct hsr_sup_payload));
316
- ether_addr_copy(hsr_sp->MacAddressA, master->dev->dev_addr);
336
+ ether_addr_copy(hsr_sp->macaddress_A, master->dev->dev_addr);
317337
318338 if (skb_put_padto(skb, ETH_ZLEN + HSR_HLEN))
319339 return;
320340
321341 hsr_forward_skb(skb, master);
322
- return;
323342
324
-out:
325
- WARN_ONCE(1, "HSR: Could not send supervision frame\n");
326
- kfree_skb(skb);
343
+ return;
327344 }
328345
346
+static void send_prp_supervision_frame(struct hsr_port *master,
347
+ unsigned long *interval)
348
+{
349
+ struct hsr_priv *hsr = master->hsr;
350
+ struct hsr_sup_payload *hsr_sp;
351
+ struct hsr_sup_tag *hsr_stag;
352
+ unsigned long irqflags;
353
+ struct sk_buff *skb;
354
+ struct prp_rct *rct;
355
+ u8 *tail;
356
+
357
+ skb = hsr_init_skb(master, ETH_P_PRP);
358
+ if (!skb) {
359
+ WARN_ONCE(1, "PRP: Could not send supervision frame\n");
360
+ return;
361
+ }
362
+
363
+ *interval = msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
364
+ hsr_stag = skb_put(skb, sizeof(struct hsr_sup_tag));
365
+ set_hsr_stag_path(hsr_stag, (hsr->prot_version ? 0x0 : 0xf));
366
+ set_hsr_stag_HSR_ver(hsr_stag, (hsr->prot_version ? 1 : 0));
367
+
368
+ /* From HSRv1 on we have separate supervision sequence numbers. */
369
+ spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
370
+ hsr_stag->sequence_nr = htons(hsr->sup_sequence_nr);
371
+ hsr->sup_sequence_nr++;
372
+ hsr_stag->HSR_TLV_type = PRP_TLV_LIFE_CHECK_DD;
373
+ hsr_stag->HSR_TLV_length = sizeof(struct hsr_sup_payload);
374
+
375
+ /* Payload: MacAddressA */
376
+ hsr_sp = skb_put(skb, sizeof(struct hsr_sup_payload));
377
+ ether_addr_copy(hsr_sp->macaddress_A, master->dev->dev_addr);
378
+
379
+ if (skb_put_padto(skb, ETH_ZLEN + HSR_HLEN)) {
380
+ spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
381
+ return;
382
+ }
383
+
384
+ tail = skb_tail_pointer(skb) - HSR_HLEN;
385
+ rct = (struct prp_rct *)tail;
386
+ rct->PRP_suffix = htons(ETH_P_PRP);
387
+ set_prp_LSDU_size(rct, HSR_V1_SUP_LSDUSIZE);
388
+ rct->sequence_nr = htons(hsr->sequence_nr);
389
+ hsr->sequence_nr++;
390
+ spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
391
+
392
+ hsr_forward_skb(skb, master);
393
+}
329394
330395 /* Announce (supervision frame) timer function
331396 */
....@@ -339,19 +404,7 @@
339404
340405 rcu_read_lock();
341406 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
342
-
343
- if (hsr->announce_count < 3 && hsr->protVersion == 0) {
344
- send_hsr_supervision_frame(master, HSR_TLV_ANNOUNCE,
345
- hsr->protVersion);
346
- hsr->announce_count++;
347
-
348
- interval = msecs_to_jiffies(HSR_ANNOUNCE_INTERVAL);
349
- } else {
350
- send_hsr_supervision_frame(master, HSR_TLV_LIFE_CHECK,
351
- hsr->protVersion);
352
-
353
- interval = msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
354
- }
407
+ hsr->proto_ops->send_sv_frame(master, &interval);
355408
356409 if (is_admin_up(master->dev))
357410 mod_timer(&hsr->announce_timer, jiffies + interval);
....@@ -359,26 +412,21 @@
359412 rcu_read_unlock();
360413 }
361414
362
-
363
-/* According to comments in the declaration of struct net_device, this function
364
- * is "Called from unregister, can be used to call free_netdev". Ok then...
365
- */
366
-static void hsr_dev_destroy(struct net_device *hsr_dev)
415
+void hsr_del_ports(struct hsr_priv *hsr)
367416 {
368
- struct hsr_priv *hsr;
369417 struct hsr_port *port;
370418
371
- hsr = netdev_priv(hsr_dev);
372
-
373
- rtnl_lock();
374
- hsr_for_each_port(hsr, port)
419
+ port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_A);
420
+ if (port)
375421 hsr_del_port(port);
376
- rtnl_unlock();
377422
378
- del_timer_sync(&hsr->prune_timer);
379
- del_timer_sync(&hsr->announce_timer);
423
+ port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_B);
424
+ if (port)
425
+ hsr_del_port(port);
380426
381
- synchronize_rcu();
427
+ port = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
428
+ if (port)
429
+ hsr_del_port(port);
382430 }
383431
384432 static const struct net_device_ops hsr_device_ops = {
....@@ -393,6 +441,24 @@
393441 .name = "hsr",
394442 };
395443
444
+static struct hsr_proto_ops hsr_ops = {
445
+ .send_sv_frame = send_hsr_supervision_frame,
446
+ .create_tagged_frame = hsr_create_tagged_frame,
447
+ .get_untagged_frame = hsr_get_untagged_frame,
448
+ .fill_frame_info = hsr_fill_frame_info,
449
+ .invalid_dan_ingress_frame = hsr_invalid_dan_ingress_frame,
450
+};
451
+
452
+static struct hsr_proto_ops prp_ops = {
453
+ .send_sv_frame = send_prp_supervision_frame,
454
+ .create_tagged_frame = prp_create_tagged_frame,
455
+ .get_untagged_frame = prp_get_untagged_frame,
456
+ .drop_frame = prp_drop_frame,
457
+ .fill_frame_info = prp_fill_frame_info,
458
+ .handle_san_frame = prp_handle_san_frame,
459
+ .update_san_info = prp_update_san_info,
460
+};
461
+
396462 void hsr_dev_setup(struct net_device *dev)
397463 {
398464 eth_hw_addr_random(dev);
....@@ -405,7 +471,6 @@
405471 dev->priv_flags |= IFF_NO_QUEUE;
406472
407473 dev->needs_free_netdev = true;
408
- dev->priv_destructor = hsr_dev_destroy;
409474
410475 dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
411476 NETIF_F_GSO_MASK | NETIF_F_HW_CSUM |
....@@ -425,7 +490,6 @@
425490 dev->features |= NETIF_F_NETNS_LOCAL;
426491 }
427492
428
-
429493 /* Return true if dev is a HSR master; return false otherwise.
430494 */
431495 inline bool is_hsr_master(struct net_device *dev)
....@@ -439,21 +503,34 @@
439503 };
440504
441505 int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
442
- unsigned char multicast_spec, u8 protocol_version)
506
+ unsigned char multicast_spec, u8 protocol_version,
507
+ struct netlink_ext_ack *extack)
443508 {
509
+ bool unregister = false;
444510 struct hsr_priv *hsr;
445
- struct hsr_port *port;
446511 int res;
447512
448513 hsr = netdev_priv(hsr_dev);
449514 INIT_LIST_HEAD(&hsr->ports);
450515 INIT_LIST_HEAD(&hsr->node_db);
451516 INIT_LIST_HEAD(&hsr->self_node_db);
517
+ spin_lock_init(&hsr->list_lock);
452518
453519 ether_addr_copy(hsr_dev->dev_addr, slave[0]->dev_addr);
454520
521
+ /* initialize protocol specific functions */
522
+ if (protocol_version == PRP_V1) {
523
+ /* For PRP, lan_id has most significant 3 bits holding
524
+ * the net_id of PRP_LAN_ID
525
+ */
526
+ hsr->net_id = PRP_LAN_ID << 1;
527
+ hsr->proto_ops = &prp_ops;
528
+ } else {
529
+ hsr->proto_ops = &hsr_ops;
530
+ }
531
+
455532 /* Make sure we recognize frames from ourselves in hsr_rcv() */
456
- res = hsr_create_self_node(&hsr->self_node_db, hsr_dev->dev_addr,
533
+ res = hsr_create_self_node(hsr, hsr_dev->dev_addr,
457534 slave[1]->dev_addr);
458535 if (res < 0)
459536 return res;
....@@ -469,7 +546,7 @@
469546 ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr);
470547 hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
471548
472
- hsr->protVersion = protocol_version;
549
+ hsr->prot_version = protocol_version;
473550
474551 /* FIXME: should I modify the value of these?
475552 *
....@@ -484,30 +561,35 @@
484561 /* Make sure the 1st call to netif_carrier_on() gets through */
485562 netif_carrier_off(hsr_dev);
486563
487
- res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER);
564
+ res = hsr_add_port(hsr, hsr_dev, HSR_PT_MASTER, extack);
488565 if (res)
489
- goto err_add_port;
566
+ goto err_add_master;
490567
491568 res = register_netdevice(hsr_dev);
492569 if (res)
493
- goto fail;
570
+ goto err_unregister;
494571
495
- res = hsr_add_port(hsr, slave[0], HSR_PT_SLAVE_A);
496
- if (res)
497
- goto fail;
498
- res = hsr_add_port(hsr, slave[1], HSR_PT_SLAVE_B);
499
- if (res)
500
- goto fail;
572
+ unregister = true;
501573
574
+ res = hsr_add_port(hsr, slave[0], HSR_PT_SLAVE_A, extack);
575
+ if (res)
576
+ goto err_unregister;
577
+
578
+ res = hsr_add_port(hsr, slave[1], HSR_PT_SLAVE_B, extack);
579
+ if (res)
580
+ goto err_unregister;
581
+
582
+ hsr_debugfs_init(hsr, hsr_dev);
502583 mod_timer(&hsr->prune_timer, jiffies + msecs_to_jiffies(PRUNE_PERIOD));
503584
504585 return 0;
505586
506
-fail:
507
- hsr_for_each_port(hsr, port)
508
- hsr_del_port(port);
509
-err_add_port:
510
- hsr_del_node(&hsr->self_node_db);
587
+err_unregister:
588
+ hsr_del_ports(hsr);
589
+err_add_master:
590
+ hsr_del_self_node(hsr);
511591
592
+ if (unregister)
593
+ unregister_netdevice(hsr_dev);
512594 return res;
513595 }