Lines Matching +full:primary +full:- +full:bond

1 // SPDX-License-Identifier: GPL-2.0
9 * attached VF as a 'primary' netdev. This enables live migration of
13 * Some of the netdev management routines are based on bond/team driver as
14 * this driver provides active-backup functionality similar to those drivers.
41 primary_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_open()
48 standby_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_open()
78 slave_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_close()
82 slave_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_close()
103 /* Try xmit via primary netdev followed by standby netdev */ in net_failover_start_xmit()
104 xmit_dev = rcu_dereference_bh(nfo_info->primary_dev); in net_failover_start_xmit()
106 xmit_dev = rcu_dereference_bh(nfo_info->standby_dev); in net_failover_start_xmit()
111 skb->dev = xmit_dev; in net_failover_start_xmit()
112 skb->queue_mapping = qdisc_skb_cb(skb)->slave_dev_queue_mapping; in net_failover_start_xmit()
125 primary_dev = rcu_dereference(nfo_info->primary_dev); in net_failover_select_queue()
127 const struct net_device_ops *ops = primary_dev->netdev_ops; in net_failover_select_queue()
129 if (ops->ndo_select_queue) in net_failover_select_queue()
130 txq = ops->ndo_select_queue(primary_dev, skb, sb_dev); in net_failover_select_queue()
138 qdisc_skb_cb(skb)->slave_dev_queue_mapping = skb->queue_mapping; in net_failover_select_queue()
140 if (unlikely(txq >= dev->real_num_tx_queues)) { in net_failover_select_queue()
142 txq -= dev->real_num_tx_queues; in net_failover_select_queue()
143 } while (txq >= dev->real_num_tx_queues); in net_failover_select_queue()
164 s64 delta = nv - ov; in net_failover_fold_stats()
168 delta = (s64)(s32)((u32)nv - (u32)ov); in net_failover_fold_stats()
186 spin_lock(&nfo_info->stats_lock); in net_failover_get_stats()
187 memcpy(stats, &nfo_info->failover_stats, sizeof(*stats)); in net_failover_get_stats()
191 slave_dev = rcu_dereference(nfo_info->primary_dev); in net_failover_get_stats()
194 net_failover_fold_stats(stats, new, &nfo_info->primary_stats); in net_failover_get_stats()
195 memcpy(&nfo_info->primary_stats, new, sizeof(*new)); in net_failover_get_stats()
198 slave_dev = rcu_dereference(nfo_info->standby_dev); in net_failover_get_stats()
201 net_failover_fold_stats(stats, new, &nfo_info->standby_stats); in net_failover_get_stats()
202 memcpy(&nfo_info->standby_stats, new, sizeof(*new)); in net_failover_get_stats()
207 memcpy(&nfo_info->failover_stats, stats, sizeof(*stats)); in net_failover_get_stats()
208 spin_unlock(&nfo_info->stats_lock); in net_failover_get_stats()
217 primary_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_change_mtu()
224 standby_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_change_mtu()
229 dev_set_mtu(primary_dev, dev->mtu); in net_failover_change_mtu()
234 WRITE_ONCE(dev->mtu, new_mtu); in net_failover_change_mtu()
246 slave_dev = rcu_dereference(nfo_info->primary_dev); in net_failover_set_rx_mode()
252 slave_dev = rcu_dereference(nfo_info->standby_dev); in net_failover_set_rx_mode()
268 primary_dev = rcu_dereference(nfo_info->primary_dev); in net_failover_vlan_rx_add_vid()
275 standby_dev = rcu_dereference(nfo_info->standby_dev); in net_failover_vlan_rx_add_vid()
292 slave_dev = rcu_dereference(nfo_info->primary_dev); in net_failover_vlan_rx_kill_vid()
296 slave_dev = rcu_dereference(nfo_info->standby_dev); in net_failover_vlan_rx_kill_vid()
323 strscpy(drvinfo->driver, FAILOVER_NAME, sizeof(drvinfo->driver)); in nfo_ethtool_get_drvinfo()
324 strscpy(drvinfo->version, FAILOVER_VERSION, sizeof(drvinfo->version)); in nfo_ethtool_get_drvinfo()
333 slave_dev = rtnl_dereference(nfo_info->primary_dev); in nfo_ethtool_get_link_ksettings()
335 slave_dev = rtnl_dereference(nfo_info->standby_dev); in nfo_ethtool_get_link_ksettings()
337 cmd->base.duplex = DUPLEX_UNKNOWN; in nfo_ethtool_get_link_ksettings()
338 cmd->base.port = PORT_OTHER; in nfo_ethtool_get_link_ksettings()
339 cmd->base.speed = SPEED_UNKNOWN; in nfo_ethtool_get_link_ksettings()
361 struct net_device *dev = rcu_dereference(skb->dev->rx_handler_data); in net_failover_handle_frame()
365 primary_dev = rcu_dereference(nfo_info->primary_dev); in net_failover_handle_frame()
366 standby_dev = rcu_dereference(nfo_info->standby_dev); in net_failover_handle_frame()
368 if (primary_dev && skb->dev == standby_dev) in net_failover_handle_frame()
371 skb->dev = dev; in net_failover_handle_frame()
387 primary_dev = rcu_dereference(nfo_info->primary_dev); in net_failover_compute_features()
391 primary_dev->vlan_features, in net_failover_compute_features()
395 primary_dev->hw_enc_features, in net_failover_compute_features()
398 dst_release_flag &= primary_dev->priv_flags; in net_failover_compute_features()
399 if (primary_dev->hard_header_len > max_hard_header_len) in net_failover_compute_features()
400 max_hard_header_len = primary_dev->hard_header_len; in net_failover_compute_features()
403 standby_dev = rcu_dereference(nfo_info->standby_dev); in net_failover_compute_features()
407 standby_dev->vlan_features, in net_failover_compute_features()
411 standby_dev->hw_enc_features, in net_failover_compute_features()
414 dst_release_flag &= standby_dev->priv_flags; in net_failover_compute_features()
415 if (standby_dev->hard_header_len > max_hard_header_len) in net_failover_compute_features()
416 max_hard_header_len = standby_dev->hard_header_len; in net_failover_compute_features()
419 dev->vlan_features = vlan_features; in net_failover_compute_features()
420 dev->hw_enc_features = enc_features | NETIF_F_GSO_ENCAP_ALL; in net_failover_compute_features()
421 dev->hard_header_len = max_hard_header_len; in net_failover_compute_features()
423 dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; in net_failover_compute_features()
426 dev->priv_flags |= IFF_XMIT_DST_RELEASE; in net_failover_compute_features()
466 standby_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_slave_pre_register()
467 primary_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_slave_pre_register()
468 slave_is_standby = slave_dev->dev.parent == failover_dev->dev.parent; in net_failover_slave_pre_register()
471 slave_dev->name, in net_failover_slave_pre_register()
472 slave_is_standby ? "standby" : "primary"); in net_failover_slave_pre_register()
473 return -EINVAL; in net_failover_slave_pre_register()
476 /* We want to allow only a direct attached VF device as a primary in net_failover_slave_pre_register()
480 if (!slave_is_standby && (!slave_dev->dev.parent || in net_failover_slave_pre_register()
481 !dev_is_pci(slave_dev->dev.parent))) in net_failover_slave_pre_register()
482 return -EINVAL; in net_failover_slave_pre_register()
484 if (failover_dev->features & NETIF_F_VLAN_CHALLENGED && in net_failover_slave_pre_register()
487 failover_dev->name); in net_failover_slave_pre_register()
488 return -EINVAL; in net_failover_slave_pre_register()
504 orig_mtu = slave_dev->mtu; in net_failover_slave_register()
505 err = dev_set_mtu(slave_dev, failover_dev->mtu); in net_failover_slave_register()
508 slave_dev->name, failover_dev->mtu); in net_failover_slave_register()
516 if (err && (err != -EBUSY)) { in net_failover_slave_register()
518 slave_dev->name, err); in net_failover_slave_register()
531 slave_dev->name, err); in net_failover_slave_register()
536 standby_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_slave_register()
537 primary_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_slave_register()
538 slave_is_standby = slave_dev->dev.parent == failover_dev->dev.parent; in net_failover_slave_register()
541 rcu_assign_pointer(nfo_info->standby_dev, slave_dev); in net_failover_slave_register()
543 dev_get_stats(standby_dev, &nfo_info->standby_stats); in net_failover_slave_register()
545 rcu_assign_pointer(nfo_info->primary_dev, slave_dev); in net_failover_slave_register()
547 dev_get_stats(primary_dev, &nfo_info->primary_stats); in net_failover_slave_register()
548 failover_dev->min_mtu = slave_dev->min_mtu; in net_failover_slave_register()
549 failover_dev->max_mtu = slave_dev->max_mtu; in net_failover_slave_register()
558 slave_is_standby ? "standby" : "primary", slave_dev->name); in net_failover_slave_register()
580 primary_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_slave_pre_unregister()
581 standby_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_slave_pre_unregister()
584 return -ENODEV; in net_failover_slave_pre_unregister()
597 primary_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_slave_unregister()
598 standby_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_slave_unregister()
601 return -ENODEV; in net_failover_slave_unregister()
609 dev_get_stats(failover_dev, &nfo_info->failover_stats); in net_failover_slave_unregister()
611 slave_is_standby = slave_dev->dev.parent == failover_dev->dev.parent; in net_failover_slave_unregister()
613 RCU_INIT_POINTER(nfo_info->standby_dev, NULL); in net_failover_slave_unregister()
615 RCU_INIT_POINTER(nfo_info->primary_dev, NULL); in net_failover_slave_unregister()
617 failover_dev->min_mtu = standby_dev->min_mtu; in net_failover_slave_unregister()
618 failover_dev->max_mtu = standby_dev->max_mtu; in net_failover_slave_unregister()
627 slave_is_standby ? "standby" : "primary", slave_dev->name); in net_failover_slave_unregister()
640 primary_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_slave_link_change()
641 standby_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_slave_link_change()
644 return -ENODEV; in net_failover_slave_link_change()
651 dev_get_stats(failover_dev, &nfo_info->failover_stats); in net_failover_slave_link_change()
669 primary_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_slave_name_change()
670 standby_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_slave_name_change()
673 return -ENODEV; in net_failover_slave_name_change()
694 * net_failover_create - Create and register a failover instance
699 * netdev. Used by paravirtual drivers that use 3-netdev model.
700 * The failover netdev acts as a master device and controls 2 slave devices -
702 * registered as primary netdev.
708 struct device *dev = standby_dev->dev.parent; in net_failover_create()
719 return ERR_PTR(-ENOMEM); in net_failover_create()
725 failover_dev->netdev_ops = &failover_dev_ops; in net_failover_create()
726 failover_dev->ethtool_ops = &failover_ethtool_ops; in net_failover_create()
729 failover_dev->priv_flags |= IFF_UNICAST_FLT | IFF_NO_QUEUE; in net_failover_create()
730 failover_dev->priv_flags &= ~(IFF_XMIT_DST_RELEASE | in net_failover_create()
734 failover_dev->lltx = true; in net_failover_create()
737 failover_dev->netns_local = true; in net_failover_create()
739 failover_dev->hw_features = FAILOVER_VLAN_FEATURES | in net_failover_create()
744 failover_dev->hw_features |= NETIF_F_GSO_ENCAP_ALL; in net_failover_create()
745 failover_dev->features |= failover_dev->hw_features; in net_failover_create()
747 dev_addr_set(failover_dev, standby_dev->dev_addr); in net_failover_create()
749 failover_dev->min_mtu = standby_dev->min_mtu; in net_failover_create()
750 failover_dev->max_mtu = standby_dev->max_mtu; in net_failover_create()
778 * net_failover_destroy - Destroy a failover instance
785 * netdev. Used by paravirtual drivers that use 3-netdev model.
797 failover_dev = rcu_dereference(failover->failover_dev); in net_failover_destroy()
804 slave_dev = rtnl_dereference(nfo_info->primary_dev); in net_failover_destroy()
808 slave_dev = rtnl_dereference(nfo_info->standby_dev); in net_failover_destroy()