Lines Matching refs:hard_iface
51 struct batadv_hard_iface *hard_iface; in batadv_hardif_release() local
53 hard_iface = container_of(ref, struct batadv_hard_iface, refcount); in batadv_hardif_release()
54 netdev_put(hard_iface->net_dev, &hard_iface->dev_tracker); in batadv_hardif_release()
56 kfree_rcu(hard_iface, rcu); in batadv_hardif_release()
68 struct batadv_hard_iface *hard_iface; in batadv_hardif_get_by_netdev() local
71 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_get_by_netdev()
72 if (hard_iface->net_dev == net_dev && in batadv_hardif_get_by_netdev()
73 kref_get_unless_zero(&hard_iface->refcount)) in batadv_hardif_get_by_netdev()
77 hard_iface = NULL; in batadv_hardif_get_by_netdev()
81 return hard_iface; in batadv_hardif_get_by_netdev()
218 struct batadv_hard_iface *hard_iface = NULL; in batadv_get_real_netdevice() local
235 hard_iface = batadv_hardif_get_by_netdev(netdev); in batadv_get_real_netdevice()
236 if (!hard_iface || !hard_iface->mesh_iface) in batadv_get_real_netdevice()
239 net = dev_net(hard_iface->mesh_iface); in batadv_get_real_netdevice()
252 batadv_hardif_put(hard_iface); in batadv_get_real_netdevice()
364 bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface) in batadv_is_cfg80211_hardif() argument
371 return !!(hard_iface->wifi_flags & allowed_flags); in batadv_is_cfg80211_hardif()
380 bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface) in batadv_is_wifi_hardif() argument
382 if (!hard_iface) in batadv_is_wifi_hardif()
385 return hard_iface->wifi_flags != 0; in batadv_is_wifi_hardif()
443 struct batadv_hard_iface *hard_iface; in batadv_hardif_get_active() local
447 netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) { in batadv_hardif_get_active()
448 if (hard_iface->if_status == BATADV_IF_ACTIVE && in batadv_hardif_get_active()
449 kref_get_unless_zero(&hard_iface->refcount)) in batadv_hardif_get_active()
453 hard_iface = NULL; in batadv_hardif_get_active()
457 return hard_iface; in batadv_hardif_get_active()
499 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface) in batadv_hardif_is_iface_up() argument
501 if (hard_iface->net_dev->flags & IFF_UP) in batadv_hardif_is_iface_up()
507 static void batadv_check_known_mac_addr(const struct batadv_hard_iface *hard_iface) in batadv_check_known_mac_addr() argument
509 struct net_device *mesh_iface = hard_iface->mesh_iface; in batadv_check_known_mac_addr()
517 if (tmp_hard_iface == hard_iface) in batadv_check_known_mac_addr()
524 hard_iface->net_dev->dev_addr)) in batadv_check_known_mac_addr()
528 hard_iface->net_dev->dev_addr, tmp_hard_iface->net_dev->name); in batadv_check_known_mac_addr()
539 const struct batadv_hard_iface *hard_iface; in batadv_hardif_recalc_extra_skbroom() local
547 netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) { in batadv_hardif_recalc_extra_skbroom()
548 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) in batadv_hardif_recalc_extra_skbroom()
552 hard_iface->net_dev->hard_header_len); in batadv_hardif_recalc_extra_skbroom()
555 hard_iface->net_dev->needed_headroom); in batadv_hardif_recalc_extra_skbroom()
558 hard_iface->net_dev->needed_tailroom); in batadv_hardif_recalc_extra_skbroom()
582 const struct batadv_hard_iface *hard_iface; in batadv_hardif_min_mtu() local
587 netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) { in batadv_hardif_min_mtu()
588 if (hard_iface->if_status != BATADV_IF_ACTIVE && in batadv_hardif_min_mtu()
589 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED) in batadv_hardif_min_mtu()
592 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu); in batadv_hardif_min_mtu()
649 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_activate_interface() argument
654 if (hard_iface->if_status != BATADV_IF_INACTIVE) in batadv_hardif_activate_interface()
657 bat_priv = netdev_priv(hard_iface->mesh_iface); in batadv_hardif_activate_interface()
659 bat_priv->algo_ops->iface.update_mac(hard_iface); in batadv_hardif_activate_interface()
660 hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED; in batadv_hardif_activate_interface()
667 batadv_primary_if_select(bat_priv, hard_iface); in batadv_hardif_activate_interface()
669 batadv_info(hard_iface->mesh_iface, "Interface activated: %s\n", in batadv_hardif_activate_interface()
670 hard_iface->net_dev->name); in batadv_hardif_activate_interface()
672 batadv_update_min_mtu(hard_iface->mesh_iface); in batadv_hardif_activate_interface()
675 bat_priv->algo_ops->iface.activate(hard_iface); in batadv_hardif_activate_interface()
682 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_deactivate_interface() argument
684 if (hard_iface->if_status != BATADV_IF_ACTIVE && in batadv_hardif_deactivate_interface()
685 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED) in batadv_hardif_deactivate_interface()
688 hard_iface->if_status = BATADV_IF_INACTIVE; in batadv_hardif_deactivate_interface()
690 batadv_info(hard_iface->mesh_iface, "Interface deactivated: %s\n", in batadv_hardif_deactivate_interface()
691 hard_iface->net_dev->name); in batadv_hardif_deactivate_interface()
693 batadv_update_min_mtu(hard_iface->mesh_iface); in batadv_hardif_deactivate_interface()
703 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, in batadv_hardif_enable_interface() argument
713 hardif_mtu = READ_ONCE(hard_iface->net_dev->mtu); in batadv_hardif_enable_interface()
719 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_enable_interface()
722 kref_get(&hard_iface->refcount); in batadv_hardif_enable_interface()
724 netdev_hold(mesh_iface, &hard_iface->meshif_dev_tracker, GFP_ATOMIC); in batadv_hardif_enable_interface()
725 hard_iface->mesh_iface = mesh_iface; in batadv_hardif_enable_interface()
726 bat_priv = netdev_priv(hard_iface->mesh_iface); in batadv_hardif_enable_interface()
728 ret = netdev_master_upper_dev_link(hard_iface->net_dev, in batadv_hardif_enable_interface()
729 mesh_iface, hard_iface, NULL, NULL); in batadv_hardif_enable_interface()
733 ret = bat_priv->algo_ops->iface.enable(hard_iface); in batadv_hardif_enable_interface()
737 hard_iface->if_status = BATADV_IF_INACTIVE; in batadv_hardif_enable_interface()
739 kref_get(&hard_iface->refcount); in batadv_hardif_enable_interface()
740 hard_iface->batman_adv_ptype.type = ethertype; in batadv_hardif_enable_interface()
741 hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv; in batadv_hardif_enable_interface()
742 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev; in batadv_hardif_enable_interface()
743 dev_add_pack(&hard_iface->batman_adv_ptype); in batadv_hardif_enable_interface()
745 batadv_info(hard_iface->mesh_iface, "Adding interface: %s\n", in batadv_hardif_enable_interface()
746 hard_iface->net_dev->name); in batadv_hardif_enable_interface()
750 batadv_info(hard_iface->mesh_iface, in batadv_hardif_enable_interface()
752 hard_iface->net_dev->name, hardif_mtu, in batadv_hardif_enable_interface()
757 batadv_info(hard_iface->mesh_iface, in batadv_hardif_enable_interface()
759 hard_iface->net_dev->name, hardif_mtu, in batadv_hardif_enable_interface()
762 batadv_check_known_mac_addr(hard_iface); in batadv_hardif_enable_interface()
764 if (batadv_hardif_is_iface_up(hard_iface)) in batadv_hardif_enable_interface()
765 batadv_hardif_activate_interface(hard_iface); in batadv_hardif_enable_interface()
767 batadv_err(hard_iface->mesh_iface, in batadv_hardif_enable_interface()
769 hard_iface->net_dev->name); in batadv_hardif_enable_interface()
774 bat_priv->algo_ops->iface.enabled(hard_iface); in batadv_hardif_enable_interface()
780 netdev_upper_dev_unlink(hard_iface->net_dev, mesh_iface); in batadv_hardif_enable_interface()
782 hard_iface->mesh_iface = NULL; in batadv_hardif_enable_interface()
783 netdev_put(mesh_iface, &hard_iface->meshif_dev_tracker); in batadv_hardif_enable_interface()
784 batadv_hardif_put(hard_iface); in batadv_hardif_enable_interface()
800 struct batadv_hard_iface *hard_iface; in batadv_hardif_cnt() local
805 netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) in batadv_hardif_cnt()
816 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_disable_interface() argument
818 struct batadv_priv *bat_priv = netdev_priv(hard_iface->mesh_iface); in batadv_hardif_disable_interface()
821 batadv_hardif_deactivate_interface(hard_iface); in batadv_hardif_disable_interface()
823 if (hard_iface->if_status != BATADV_IF_INACTIVE) in batadv_hardif_disable_interface()
826 batadv_info(hard_iface->mesh_iface, "Removing interface: %s\n", in batadv_hardif_disable_interface()
827 hard_iface->net_dev->name); in batadv_hardif_disable_interface()
828 dev_remove_pack(&hard_iface->batman_adv_ptype); in batadv_hardif_disable_interface()
829 batadv_hardif_put(hard_iface); in batadv_hardif_disable_interface()
832 if (hard_iface == primary_if) { in batadv_hardif_disable_interface()
835 new_if = batadv_hardif_get_active(hard_iface->mesh_iface); in batadv_hardif_disable_interface()
841 bat_priv->algo_ops->iface.disable(hard_iface); in batadv_hardif_disable_interface()
842 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_disable_interface()
846 batadv_purge_outstanding_packets(bat_priv, hard_iface); in batadv_hardif_disable_interface()
847 netdev_put(hard_iface->mesh_iface, &hard_iface->meshif_dev_tracker); in batadv_hardif_disable_interface()
849 netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->mesh_iface); in batadv_hardif_disable_interface()
850 batadv_hardif_recalc_extra_skbroom(hard_iface->mesh_iface); in batadv_hardif_disable_interface()
853 if (batadv_hardif_cnt(hard_iface->mesh_iface) <= 1) in batadv_hardif_disable_interface()
856 hard_iface->mesh_iface = NULL; in batadv_hardif_disable_interface()
857 batadv_hardif_put(hard_iface); in batadv_hardif_disable_interface()
866 struct batadv_hard_iface *hard_iface; in batadv_hardif_add_interface() local
873 hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC); in batadv_hardif_add_interface()
874 if (!hard_iface) in batadv_hardif_add_interface()
877 netdev_hold(net_dev, &hard_iface->dev_tracker, GFP_ATOMIC); in batadv_hardif_add_interface()
878 hard_iface->net_dev = net_dev; in batadv_hardif_add_interface()
880 hard_iface->mesh_iface = NULL; in batadv_hardif_add_interface()
881 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_add_interface()
883 INIT_LIST_HEAD(&hard_iface->list); in batadv_hardif_add_interface()
884 INIT_HLIST_HEAD(&hard_iface->neigh_list); in batadv_hardif_add_interface()
886 mutex_init(&hard_iface->bat_iv.ogm_buff_mutex); in batadv_hardif_add_interface()
887 spin_lock_init(&hard_iface->neigh_list_lock); in batadv_hardif_add_interface()
888 kref_init(&hard_iface->refcount); in batadv_hardif_add_interface()
890 hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT; in batadv_hardif_add_interface()
891 hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev); in batadv_hardif_add_interface()
892 if (batadv_is_wifi_hardif(hard_iface)) in batadv_hardif_add_interface()
893 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; in batadv_hardif_add_interface()
895 atomic_set(&hard_iface->hop_penalty, 0); in batadv_hardif_add_interface()
897 batadv_v_hardif_init(hard_iface); in batadv_hardif_add_interface()
899 kref_get(&hard_iface->refcount); in batadv_hardif_add_interface()
900 list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list); in batadv_hardif_add_interface()
903 return hard_iface; in batadv_hardif_add_interface()
906 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_remove_interface() argument
911 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_remove_interface()
912 batadv_hardif_disable_interface(hard_iface); in batadv_hardif_remove_interface()
914 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_remove_interface()
917 hard_iface->if_status = BATADV_IF_TO_BE_REMOVED; in batadv_hardif_remove_interface()
918 batadv_hardif_put(hard_iface); in batadv_hardif_remove_interface()
947 struct batadv_hard_iface *hard_iface; in batadv_hard_if_event() local
954 hard_iface = batadv_hardif_get_by_netdev(net_dev); in batadv_hard_if_event()
955 if (!hard_iface && (event == NETDEV_REGISTER || in batadv_hard_if_event()
957 hard_iface = batadv_hardif_add_interface(net_dev); in batadv_hard_if_event()
959 if (!hard_iface) in batadv_hard_if_event()
964 batadv_hardif_activate_interface(hard_iface); in batadv_hard_if_event()
968 batadv_hardif_deactivate_interface(hard_iface); in batadv_hard_if_event()
972 list_del_rcu(&hard_iface->list); in batadv_hard_if_event()
975 batadv_hardif_remove_interface(hard_iface); in batadv_hard_if_event()
978 if (hard_iface->mesh_iface) in batadv_hard_if_event()
979 batadv_update_min_mtu(hard_iface->mesh_iface); in batadv_hard_if_event()
982 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) in batadv_hard_if_event()
985 batadv_check_known_mac_addr(hard_iface); in batadv_hard_if_event()
987 bat_priv = netdev_priv(hard_iface->mesh_iface); in batadv_hard_if_event()
988 bat_priv->algo_ops->iface.update_mac(hard_iface); in batadv_hard_if_event()
994 if (hard_iface == primary_if) in batadv_hard_if_event()
998 hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev); in batadv_hard_if_event()
999 if (batadv_is_wifi_hardif(hard_iface)) in batadv_hard_if_event()
1000 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; in batadv_hard_if_event()
1007 batadv_hardif_put(hard_iface); in batadv_hard_if_event()