@@ -1509,14 +1509,59 @@ static netdev_features_t bond_fix_features(struct net_device *dev,
15091509 return features ;
15101510}
15111511
1512+ static int bond_header_create (struct sk_buff * skb , struct net_device * bond_dev ,
1513+ unsigned short type , const void * daddr ,
1514+ const void * saddr , unsigned int len )
1515+ {
1516+ struct bonding * bond = netdev_priv (bond_dev );
1517+ const struct header_ops * slave_ops ;
1518+ struct slave * slave ;
1519+ int ret = 0 ;
1520+
1521+ rcu_read_lock ();
1522+ slave = rcu_dereference (bond -> curr_active_slave );
1523+ if (slave ) {
1524+ slave_ops = READ_ONCE (slave -> dev -> header_ops );
1525+ if (slave_ops && slave_ops -> create )
1526+ ret = slave_ops -> create (skb , slave -> dev ,
1527+ type , daddr , saddr , len );
1528+ }
1529+ rcu_read_unlock ();
1530+ return ret ;
1531+ }
1532+
1533+ static int bond_header_parse (const struct sk_buff * skb , unsigned char * haddr )
1534+ {
1535+ struct bonding * bond = netdev_priv (skb -> dev );
1536+ const struct header_ops * slave_ops ;
1537+ struct slave * slave ;
1538+ int ret = 0 ;
1539+
1540+ rcu_read_lock ();
1541+ slave = rcu_dereference (bond -> curr_active_slave );
1542+ if (slave ) {
1543+ slave_ops = READ_ONCE (slave -> dev -> header_ops );
1544+ if (slave_ops && slave_ops -> parse )
1545+ ret = slave_ops -> parse (skb , haddr );
1546+ }
1547+ rcu_read_unlock ();
1548+ return ret ;
1549+ }
1550+
1551+ static const struct header_ops bond_header_ops = {
1552+ .create = bond_header_create ,
1553+ .parse = bond_header_parse ,
1554+ };
1555+
15121556static void bond_setup_by_slave (struct net_device * bond_dev ,
15131557 struct net_device * slave_dev )
15141558{
15151559 bool was_up = !!(bond_dev -> flags & IFF_UP );
15161560
15171561 dev_close (bond_dev );
15181562
1519- bond_dev -> header_ops = slave_dev -> header_ops ;
1563+ bond_dev -> header_ops = slave_dev -> header_ops ?
1564+ & bond_header_ops : NULL ;
15201565
15211566 bond_dev -> type = slave_dev -> type ;
15221567 bond_dev -> hard_header_len = slave_dev -> hard_header_len ;
@@ -2801,8 +2846,14 @@ static void bond_miimon_commit(struct bonding *bond)
28012846
28022847 continue ;
28032848
2849+ case BOND_LINK_FAIL :
2850+ case BOND_LINK_BACK :
2851+ slave_dbg (bond -> dev , slave -> dev , "link_new_state %d on slave\n" ,
2852+ slave -> link_new_state );
2853+ continue ;
2854+
28042855 default :
2805- slave_err (bond -> dev , slave -> dev , "invalid new link %d on slave\n" ,
2856+ slave_err (bond -> dev , slave -> dev , "invalid link_new_state %d on slave\n" ,
28062857 slave -> link_new_state );
28072858 bond_propose_link_state (slave , BOND_LINK_NOCHANGE );
28082859
@@ -3377,7 +3428,7 @@ int bond_rcv_validate(const struct sk_buff *skb, struct bonding *bond,
33773428 } else if (is_arp ) {
33783429 return bond_arp_rcv (skb , bond , slave );
33793430#if IS_ENABLED (CONFIG_IPV6 )
3380- } else if (is_ipv6 ) {
3431+ } else if (is_ipv6 && likely ( ipv6_mod_enabled ()) ) {
33813432 return bond_na_rcv (skb , bond , slave );
33823433#endif
33833434 } else {
@@ -5069,13 +5120,18 @@ static void bond_set_slave_arr(struct bonding *bond,
50695120{
50705121 struct bond_up_slave * usable , * all ;
50715122
5072- usable = rtnl_dereference (bond -> usable_slaves );
5073- rcu_assign_pointer (bond -> usable_slaves , usable_slaves );
5074- kfree_rcu (usable , rcu );
5075-
50765123 all = rtnl_dereference (bond -> all_slaves );
50775124 rcu_assign_pointer (bond -> all_slaves , all_slaves );
50785125 kfree_rcu (all , rcu );
5126+
5127+ if (BOND_MODE (bond ) == BOND_MODE_BROADCAST ) {
5128+ kfree_rcu (usable_slaves , rcu );
5129+ return ;
5130+ }
5131+
5132+ usable = rtnl_dereference (bond -> usable_slaves );
5133+ rcu_assign_pointer (bond -> usable_slaves , usable_slaves );
5134+ kfree_rcu (usable , rcu );
50795135}
50805136
50815137static void bond_reset_slave_arr (struct bonding * bond )
0 commit comments