Lines Matching refs:hard_iface

51 	struct batadv_hard_iface *hard_iface;
53 hard_iface = container_of(ref, struct batadv_hard_iface, refcount);
54 dev_put(hard_iface->net_dev);
56 kfree_rcu(hard_iface, rcu);
68 struct batadv_hard_iface *hard_iface;
71 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
72 if (hard_iface->net_dev == net_dev &&
73 kref_get_unless_zero(&hard_iface->refcount))
77 hard_iface = NULL;
81 return hard_iface;
218 struct batadv_hard_iface *hard_iface = NULL;
235 hard_iface = batadv_hardif_get_by_netdev(netdev);
236 if (!hard_iface || !hard_iface->soft_iface)
239 net = dev_net(hard_iface->soft_iface);
252 batadv_hardif_put(hard_iface);
359 * @hard_iface: the device to check
364 bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface)
371 return !!(hard_iface->wifi_flags & allowed_flags);
376 * @hard_iface: the device to check
380 bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface)
382 if (!hard_iface)
385 return hard_iface->wifi_flags != 0;
443 struct batadv_hard_iface *hard_iface;
446 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
447 if (hard_iface->soft_iface != soft_iface)
450 if (hard_iface->if_status == BATADV_IF_ACTIVE &&
451 kref_get_unless_zero(&hard_iface->refcount))
455 hard_iface = NULL;
459 return hard_iface;
501 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface)
503 if (hard_iface->net_dev->flags & IFF_UP)
511 const struct batadv_hard_iface *hard_iface;
514 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
515 if (hard_iface->if_status != BATADV_IF_ACTIVE &&
516 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
519 if (hard_iface->net_dev == net_dev)
522 if (!batadv_compare_eth(hard_iface->net_dev->dev_addr,
527 net_dev->dev_addr, hard_iface->net_dev->name);
539 const struct batadv_hard_iface *hard_iface;
546 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
547 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
550 if (hard_iface->soft_iface != soft_iface)
554 hard_iface->net_dev->hard_header_len);
557 hard_iface->net_dev->needed_headroom);
560 hard_iface->net_dev->needed_tailroom);
584 const struct batadv_hard_iface *hard_iface;
588 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
589 if (hard_iface->if_status != BATADV_IF_ACTIVE &&
590 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
593 if (hard_iface->soft_iface != soft_iface)
596 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu);
655 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface)
660 if (hard_iface->if_status != BATADV_IF_INACTIVE)
663 bat_priv = netdev_priv(hard_iface->soft_iface);
665 bat_priv->algo_ops->iface.update_mac(hard_iface);
666 hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED;
673 batadv_primary_if_select(bat_priv, hard_iface);
675 batadv_info(hard_iface->soft_iface, "Interface activated: %s\n",
676 hard_iface->net_dev->name);
678 batadv_update_min_mtu(hard_iface->soft_iface);
681 bat_priv->algo_ops->iface.activate(hard_iface);
688 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface)
690 if (hard_iface->if_status != BATADV_IF_ACTIVE &&
691 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
694 hard_iface->if_status = BATADV_IF_INACTIVE;
696 batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
697 hard_iface->net_dev->name);
699 batadv_update_min_mtu(hard_iface->soft_iface);
704 * @hard_iface: hard interface to add to soft interface
709 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
719 hardif_mtu = READ_ONCE(hard_iface->net_dev->mtu);
725 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
728 kref_get(&hard_iface->refcount);
731 hard_iface->soft_iface = soft_iface;
732 bat_priv = netdev_priv(hard_iface->soft_iface);
734 ret = netdev_master_upper_dev_link(hard_iface->net_dev,
739 ret = bat_priv->algo_ops->iface.enable(hard_iface);
743 hard_iface->if_status = BATADV_IF_INACTIVE;
745 kref_get(&hard_iface->refcount);
746 hard_iface->batman_adv_ptype.type = ethertype;
747 hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv;
748 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev;
749 dev_add_pack(&hard_iface->batman_adv_ptype);
751 batadv_info(hard_iface->soft_iface, "Adding interface: %s\n",
752 hard_iface->net_dev->name);
756 batadv_info(hard_iface->soft_iface,
758 hard_iface->net_dev->name, hardif_mtu,
763 batadv_info(hard_iface->soft_iface,
765 hard_iface->net_dev->name, hardif_mtu,
768 if (batadv_hardif_is_iface_up(hard_iface))
769 batadv_hardif_activate_interface(hard_iface);
771 batadv_err(hard_iface->soft_iface,
773 hard_iface->net_dev->name);
778 bat_priv->algo_ops->iface.enabled(hard_iface);
784 netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface);
786 hard_iface->soft_iface = NULL;
788 batadv_hardif_put(hard_iface);
804 struct batadv_hard_iface *hard_iface;
808 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
809 if (hard_iface->soft_iface != soft_iface)
821 * @hard_iface: hard interface to be removed
823 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface)
825 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
828 batadv_hardif_deactivate_interface(hard_iface);
830 if (hard_iface->if_status != BATADV_IF_INACTIVE)
833 batadv_info(hard_iface->soft_iface, "Removing interface: %s\n",
834 hard_iface->net_dev->name);
835 dev_remove_pack(&hard_iface->batman_adv_ptype);
836 batadv_hardif_put(hard_iface);
839 if (hard_iface == primary_if) {
842 new_if = batadv_hardif_get_active(hard_iface->soft_iface);
848 bat_priv->algo_ops->iface.disable(hard_iface);
849 hard_iface->if_status = BATADV_IF_NOT_IN_USE;
851 /* delete all references to this hard_iface */
853 batadv_purge_outstanding_packets(bat_priv, hard_iface);
854 dev_put(hard_iface->soft_iface);
856 netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface);
857 batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
860 if (batadv_hardif_cnt(hard_iface->soft_iface) <= 1)
863 hard_iface->soft_iface = NULL;
864 batadv_hardif_put(hard_iface);
873 struct batadv_hard_iface *hard_iface;
882 hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC);
883 if (!hard_iface)
886 hard_iface->net_dev = net_dev;
887 hard_iface->soft_iface = NULL;
888 hard_iface->if_status = BATADV_IF_NOT_IN_USE;
890 INIT_LIST_HEAD(&hard_iface->list);
891 INIT_HLIST_HEAD(&hard_iface->neigh_list);
893 mutex_init(&hard_iface->bat_iv.ogm_buff_mutex);
894 spin_lock_init(&hard_iface->neigh_list_lock);
895 kref_init(&hard_iface->refcount);
897 hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
898 hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
899 if (batadv_is_wifi_hardif(hard_iface))
900 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
902 atomic_set(&hard_iface->hop_penalty, 0);
904 batadv_v_hardif_init(hard_iface);
906 batadv_check_known_mac_addr(hard_iface->net_dev);
907 kref_get(&hard_iface->refcount);
908 list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list);
911 return hard_iface;
919 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
924 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
925 batadv_hardif_disable_interface(hard_iface);
927 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
930 hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
931 batadv_hardif_put(hard_iface);
960 struct batadv_hard_iface *hard_iface;
967 hard_iface = batadv_hardif_get_by_netdev(net_dev);
968 if (!hard_iface && (event == NETDEV_REGISTER ||
970 hard_iface = batadv_hardif_add_interface(net_dev);
972 if (!hard_iface)
977 batadv_hardif_activate_interface(hard_iface);
981 batadv_hardif_deactivate_interface(hard_iface);
985 list_del_rcu(&hard_iface->list);
988 batadv_hardif_remove_interface(hard_iface);
991 if (hard_iface->soft_iface)
992 batadv_update_min_mtu(hard_iface->soft_iface);
995 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
998 batadv_check_known_mac_addr(hard_iface->net_dev);
1000 bat_priv = netdev_priv(hard_iface->soft_iface);
1001 bat_priv->algo_ops->iface.update_mac(hard_iface);
1007 if (hard_iface == primary_if)
1011 hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
1012 if (batadv_is_wifi_hardif(hard_iface))
1013 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
1020 batadv_hardif_put(hard_iface);