15
15
#include <linux/netdevice.h>
16
16
#include <linux/skbuff.h>
17
17
#include <linux/etherdevice.h>
18
- #include <linux/if_arp.h>
19
18
#include <linux/rtnetlink.h>
20
19
#include <linux/pkt_sched.h>
21
20
#include "hsr_device.h"
@@ -108,23 +107,27 @@ void hsr_check_carrier_and_operstate(struct hsr_priv *hsr)
108
107
hsr_check_announce (hsr -> dev , old_operstate );
109
108
}
110
109
111
-
112
110
int hsr_get_max_mtu (struct hsr_priv * hsr )
113
111
{
114
- int mtu_max ;
115
-
116
- if (hsr -> slave [0 ] && hsr -> slave [1 ])
117
- mtu_max = min (hsr -> slave [0 ]-> mtu , hsr -> slave [1 ]-> mtu );
118
- else if (hsr -> slave [0 ])
119
- mtu_max = hsr -> slave [0 ]-> mtu ;
120
- else if (hsr -> slave [1 ])
121
- mtu_max = hsr -> slave [1 ]-> mtu ;
122
- else
123
- mtu_max = HSR_HLEN ;
124
-
112
+ unsigned int mtu_max ;
113
+ struct net_device * slave ;
114
+
115
+ mtu_max = ETH_DATA_LEN ;
116
+ rcu_read_lock ();
117
+ slave = hsr -> slave [0 ];
118
+ if (slave )
119
+ mtu_max = min (slave -> mtu , mtu_max );
120
+ slave = hsr -> slave [1 ];
121
+ if (slave )
122
+ mtu_max = min (slave -> mtu , mtu_max );
123
+ rcu_read_unlock ();
124
+
125
+ if (mtu_max < HSR_HLEN )
126
+ return 0 ;
125
127
return mtu_max - HSR_HLEN ;
126
128
}
127
129
130
+
128
131
static int hsr_dev_change_mtu (struct net_device * dev , int new_mtu )
129
132
{
130
133
struct hsr_priv * hsr ;
@@ -145,18 +148,20 @@ static int hsr_dev_change_mtu(struct net_device *dev, int new_mtu)
145
148
static int hsr_dev_open (struct net_device * dev )
146
149
{
147
150
struct hsr_priv * hsr ;
151
+ struct net_device * slave ;
148
152
int i ;
149
153
char * slave_name ;
150
154
151
155
hsr = netdev_priv (dev );
152
156
153
157
for (i = 0 ; i < HSR_MAX_SLAVE ; i ++ ) {
154
- if (hsr -> slave [i ])
155
- slave_name = hsr -> slave [i ]-> name ;
158
+ slave = hsr -> slave [i ];
159
+ if (slave )
160
+ slave_name = slave -> name ;
156
161
else
157
162
slave_name = "null" ;
158
163
159
- if (!is_slave_up (hsr -> slave [ i ] ))
164
+ if (!is_slave_up (slave ))
160
165
netdev_warn (dev , "Slave %c (%s) is not up; please bring it up to get a working HSR network\n" ,
161
166
'A' + i , slave_name );
162
167
}
@@ -223,6 +228,8 @@ static int slave_xmit(struct sk_buff *skb, struct hsr_priv *hsr,
223
228
hsr_ethhdr = (struct hsr_ethhdr * ) skb -> data ;
224
229
225
230
skb -> dev = hsr -> slave [dev_idx ];
231
+ if (unlikely (!skb -> dev ))
232
+ return NET_XMIT_DROP ;
226
233
227
234
hsr_addr_subst_dest (hsr , & hsr_ethhdr -> ethhdr , dev_idx );
228
235
@@ -252,14 +259,8 @@ static int hsr_dev_xmit(struct sk_buff *skb, struct net_device *dev)
252
259
}
253
260
254
261
skb2 = pskb_copy (skb , GFP_ATOMIC );
255
-
256
- res1 = NET_XMIT_DROP ;
257
- if (likely (hsr -> slave [HSR_DEV_SLAVE_A ]))
258
- res1 = slave_xmit (skb , hsr , HSR_DEV_SLAVE_A );
259
-
260
- res2 = NET_XMIT_DROP ;
261
- if (likely (skb2 && hsr -> slave [HSR_DEV_SLAVE_B ]))
262
- res2 = slave_xmit (skb2 , hsr , HSR_DEV_SLAVE_B );
262
+ res1 = slave_xmit (skb , hsr , HSR_DEV_SLAVE_A );
263
+ res2 = slave_xmit (skb2 , hsr , HSR_DEV_SLAVE_B );
263
264
264
265
if (likely (res1 == NET_XMIT_SUCCESS || res1 == NET_XMIT_CN ||
265
266
res2 == NET_XMIT_SUCCESS || res2 == NET_XMIT_CN )) {
@@ -406,28 +407,10 @@ static void hsr_announce(unsigned long data)
406
407
static void restore_slaves (struct net_device * hsr_dev )
407
408
{
408
409
struct hsr_priv * hsr ;
409
- int i ;
410
- int res ;
411
410
412
411
hsr = netdev_priv (hsr_dev );
413
-
414
- rtnl_lock ();
415
-
416
- for (i = 0 ; i < HSR_MAX_SLAVE ; i ++ ) {
417
- if (!hsr -> slave [i ])
418
- continue ;
419
- res = dev_set_promiscuity (hsr -> slave [i ], -1 );
420
- if (res )
421
- netdev_info (hsr_dev ,
422
- "Cannot restore slave promiscuity (%s, %d)\n" ,
423
- hsr -> slave [i ]-> name , res );
424
-
425
- if (hsr -> slave [i ]-> rx_handler == hsr_handle_frame )
426
- netdev_rx_handler_unregister (hsr -> slave [i ]);
427
- }
428
-
429
-
430
- rtnl_unlock ();
412
+ hsr_del_slave (hsr , 1 );
413
+ hsr_del_slave (hsr , 0 );
431
414
}
432
415
433
416
static void reclaim_hsr_dev (struct rcu_head * rh )
@@ -483,38 +466,6 @@ bool is_hsr_master(struct net_device *dev)
483
466
return (dev -> netdev_ops -> ndo_start_xmit == hsr_dev_xmit );
484
467
}
485
468
486
- static int check_slave_ok (struct net_device * dev )
487
- {
488
- /* Don't allow HSR on non-ethernet like devices */
489
- if ((dev -> flags & IFF_LOOPBACK ) || (dev -> type != ARPHRD_ETHER ) ||
490
- (dev -> addr_len != ETH_ALEN )) {
491
- netdev_info (dev , "Cannot use loopback or non-ethernet device as HSR slave.\n" );
492
- return - EINVAL ;
493
- }
494
-
495
- /* Don't allow enslaving hsr devices */
496
- if (is_hsr_master (dev )) {
497
- netdev_info (dev , "Cannot create trees of HSR devices.\n" );
498
- return - EINVAL ;
499
- }
500
-
501
- if (is_hsr_slave (dev )) {
502
- netdev_info (dev , "This device is already a HSR slave.\n" );
503
- return - EINVAL ;
504
- }
505
-
506
- if (dev -> priv_flags & IFF_802_1Q_VLAN ) {
507
- netdev_info (dev , "HSR on top of VLAN is not yet supported in this driver.\n" );
508
- return - EINVAL ;
509
- }
510
-
511
- /* HSR over bonded devices has not been tested, but I'm not sure it
512
- * won't work...
513
- */
514
-
515
- return 0 ;
516
- }
517
-
518
469
519
470
/* Default multicast address for HSR Supervision frames */
520
471
static const unsigned char def_multicast_addr [ETH_ALEN ] __aligned (2 ) = {
@@ -525,15 +476,30 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
525
476
unsigned char multicast_spec )
526
477
{
527
478
struct hsr_priv * hsr ;
528
- int i ;
529
479
int res ;
530
480
531
481
hsr = netdev_priv (hsr_dev );
532
482
hsr -> dev = hsr_dev ;
483
+ hsr -> slave [0 ] = NULL ;
484
+ hsr -> slave [1 ] = NULL ;
533
485
INIT_LIST_HEAD (& hsr -> node_db );
534
486
INIT_LIST_HEAD (& hsr -> self_node_db );
535
- for (i = 0 ; i < HSR_MAX_SLAVE ; i ++ )
536
- hsr -> slave [i ] = slave [i ];
487
+
488
+ ether_addr_copy (hsr_dev -> dev_addr , slave [0 ]-> dev_addr );
489
+
490
+ /* Make sure we recognize frames from ourselves in hsr_rcv() */
491
+ res = hsr_create_self_node (& hsr -> self_node_db , hsr_dev -> dev_addr ,
492
+ slave [1 ]-> dev_addr );
493
+ if (res < 0 )
494
+ return res ;
495
+
496
+ hsr_dev -> features = slave [0 ]-> features & slave [1 ]-> features ;
497
+ /* Prevent recursive tx locking */
498
+ hsr_dev -> features |= NETIF_F_LLTX ;
499
+ /* VLAN on top of HSR needs testing and probably some work on
500
+ * hsr_header_create() etc.
501
+ */
502
+ hsr_dev -> features |= NETIF_F_VLAN_CHALLENGED ;
537
503
538
504
spin_lock_init (& hsr -> seqnr_lock );
539
505
/* Overflow soon to find bugs easier: */
@@ -560,74 +526,26 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
560
526
* IFF_HSR_MASTER/SLAVE?
561
527
*/
562
528
563
- for (i = 0 ; i < HSR_MAX_SLAVE ; i ++ ) {
564
- res = check_slave_ok (slave [i ]);
565
- if (res )
566
- return res ;
567
- }
568
-
569
- hsr_dev -> features = slave [0 ]-> features & slave [1 ]-> features ;
570
- /* Prevent recursive tx locking */
571
- hsr_dev -> features |= NETIF_F_LLTX ;
572
- /* VLAN on top of HSR needs testing and probably some work on
573
- * hsr_header_create() etc.
574
- */
575
- hsr_dev -> features |= NETIF_F_VLAN_CHALLENGED ;
576
-
577
- /* Set hsr_dev's MAC address to that of mac_slave1 */
578
- ether_addr_copy (hsr_dev -> dev_addr , hsr -> slave [0 ]-> dev_addr );
579
-
580
- /* Set required header length */
581
- for (i = 0 ; i < HSR_MAX_SLAVE ; i ++ ) {
582
- if (slave [i ]-> hard_header_len + HSR_HLEN >
583
- hsr_dev -> hard_header_len )
584
- hsr_dev -> hard_header_len =
585
- slave [i ]-> hard_header_len + HSR_HLEN ;
586
- }
587
-
588
- /* MTU */
589
- for (i = 0 ; i < HSR_MAX_SLAVE ; i ++ )
590
- if (slave [i ]-> mtu - HSR_HLEN < hsr_dev -> mtu )
591
- hsr_dev -> mtu = slave [i ]-> mtu - HSR_HLEN ;
592
-
593
529
/* Make sure the 1st call to netif_carrier_on() gets through */
594
530
netif_carrier_off (hsr_dev );
595
531
596
- /* Promiscuity */
597
- for (i = 0 ; i < HSR_MAX_SLAVE ; i ++ ) {
598
- res = dev_set_promiscuity (slave [i ], 1 );
599
- if (res ) {
600
- netdev_info (hsr_dev , "Cannot set slave promiscuity (%s, %d)\n" ,
601
- slave [i ]-> name , res );
602
- goto fail ;
603
- }
604
- }
605
-
606
- for (i = 0 ; i < HSR_MAX_SLAVE ; i ++ ) {
607
- res = netdev_rx_handler_register (slave [i ], hsr_handle_frame ,
608
- hsr );
609
- if (res )
610
- goto fail ;
611
- }
612
-
613
- /* Make sure we recognize frames from ourselves in hsr_rcv() */
614
- res = hsr_create_self_node (& hsr -> self_node_db , hsr_dev -> dev_addr ,
615
- hsr -> slave [1 ]-> dev_addr );
616
- if (res < 0 )
617
- goto fail ;
618
-
619
532
res = register_netdevice (hsr_dev );
620
533
if (res )
621
- goto fail ;
534
+ return res ;
535
+
536
+ res = hsr_add_slave (hsr , slave [0 ], 0 );
537
+ if (res )
538
+ return res ;
539
+ res = hsr_add_slave (hsr , slave [1 ], 1 );
540
+ if (res ) {
541
+ hsr_del_slave (hsr , 0 );
542
+ return res ;
543
+ }
622
544
623
545
hsr -> prune_timer .expires = jiffies + msecs_to_jiffies (PRUNE_PERIOD );
624
546
add_timer (& hsr -> prune_timer );
625
547
626
548
register_hsr_master (hsr );
627
549
628
550
return 0 ;
629
-
630
- fail :
631
- restore_slaves (hsr_dev );
632
- return res ;
633
551
}
0 commit comments