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 if (hard_iface)
253 batadv_hardif_put(hard_iface);
358 * @hard_iface: the device to check
363 bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface)
370 return !!(hard_iface->wifi_flags & allowed_flags);
375 * @hard_iface: the device to check
379 bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface)
381 if (!hard_iface)
384 return hard_iface->wifi_flags != 0;
442 struct batadv_hard_iface *hard_iface;
445 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
446 if (hard_iface->soft_iface != soft_iface)
449 if (hard_iface->if_status == BATADV_IF_ACTIVE &&
450 kref_get_unless_zero(&hard_iface->refcount))
454 hard_iface = NULL;
458 return hard_iface;
502 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface)
504 if (hard_iface->net_dev->flags & IFF_UP)
512 const struct batadv_hard_iface *hard_iface;
515 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
516 if (hard_iface->if_status != BATADV_IF_ACTIVE &&
517 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
520 if (hard_iface->net_dev == net_dev)
523 if (!batadv_compare_eth(hard_iface->net_dev->dev_addr,
528 net_dev->dev_addr, hard_iface->net_dev->name);
540 const struct batadv_hard_iface *hard_iface;
547 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
548 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
551 if (hard_iface->soft_iface != soft_iface)
555 hard_iface->net_dev->hard_header_len);
558 hard_iface->net_dev->needed_headroom);
561 hard_iface->net_dev->needed_tailroom);
585 const struct batadv_hard_iface *hard_iface;
589 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
590 if (hard_iface->if_status != BATADV_IF_ACTIVE &&
591 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
594 if (hard_iface->soft_iface != soft_iface)
597 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu);
656 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface)
661 if (hard_iface->if_status != BATADV_IF_INACTIVE)
664 bat_priv = netdev_priv(hard_iface->soft_iface);
666 bat_priv->algo_ops->iface.update_mac(hard_iface);
667 hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED;
674 batadv_primary_if_select(bat_priv, hard_iface);
676 batadv_info(hard_iface->soft_iface, "Interface activated: %s\n",
677 hard_iface->net_dev->name);
679 batadv_update_min_mtu(hard_iface->soft_iface);
682 bat_priv->algo_ops->iface.activate(hard_iface);
690 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface)
692 if (hard_iface->if_status != BATADV_IF_ACTIVE &&
693 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
696 hard_iface->if_status = BATADV_IF_INACTIVE;
698 batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
699 hard_iface->net_dev->name);
701 batadv_update_min_mtu(hard_iface->soft_iface);
705 * batadv_master_del_slave() - remove hard_iface from the current master iface
731 * @hard_iface: hard interface to add to soft interface
737 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
746 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
749 kref_get(&hard_iface->refcount);
775 master = netdev_master_upper_dev_get(hard_iface->net_dev);
776 ret = batadv_master_del_slave(hard_iface, master);
780 hard_iface->soft_iface = soft_iface;
781 bat_priv = netdev_priv(hard_iface->soft_iface);
783 ret = netdev_master_upper_dev_link(hard_iface->net_dev,
788 ret = bat_priv->algo_ops->iface.enable(hard_iface);
792 hard_iface->if_status = BATADV_IF_INACTIVE;
794 kref_get(&hard_iface->refcount);
795 hard_iface->batman_adv_ptype.type = ethertype;
796 hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv;
797 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev;
798 dev_add_pack(&hard_iface->batman_adv_ptype);
800 batadv_info(hard_iface->soft_iface, "Adding interface: %s\n",
801 hard_iface->net_dev->name);
804 hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
805 batadv_info(hard_iface->soft_iface,
807 hard_iface->net_dev->name, hard_iface->net_dev->mtu,
811 hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
812 batadv_info(hard_iface->soft_iface,
814 hard_iface->net_dev->name, hard_iface->net_dev->mtu,
817 if (batadv_hardif_is_iface_up(hard_iface))
818 batadv_hardif_activate_interface(hard_iface);
820 batadv_err(hard_iface->soft_iface,
822 hard_iface->net_dev->name);
827 bat_priv->algo_ops->iface.enabled(hard_iface);
833 netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface);
835 hard_iface->soft_iface = NULL;
838 batadv_hardif_put(hard_iface);
854 struct batadv_hard_iface *hard_iface;
858 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
859 if (hard_iface->soft_iface != soft_iface)
871 * @hard_iface: hard interface to be removed
875 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
878 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
881 batadv_hardif_deactivate_interface(hard_iface);
883 if (hard_iface->if_status != BATADV_IF_INACTIVE)
886 batadv_info(hard_iface->soft_iface, "Removing interface: %s\n",
887 hard_iface->net_dev->name);
888 dev_remove_pack(&hard_iface->batman_adv_ptype);
889 batadv_hardif_put(hard_iface);
892 if (hard_iface == primary_if) {
895 new_if = batadv_hardif_get_active(hard_iface->soft_iface);
902 bat_priv->algo_ops->iface.disable(hard_iface);
903 hard_iface->if_status = BATADV_IF_NOT_IN_USE;
905 /* delete all references to this hard_iface */
907 batadv_purge_outstanding_packets(bat_priv, hard_iface);
908 dev_put(hard_iface->soft_iface);
910 netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface);
911 batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
914 if (batadv_hardif_cnt(hard_iface->soft_iface) <= 1) {
918 batadv_softif_destroy_sysfs(hard_iface->soft_iface);
921 hard_iface->soft_iface = NULL;
922 batadv_hardif_put(hard_iface);
932 struct batadv_hard_iface *hard_iface;
942 hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC);
943 if (!hard_iface)
946 ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev);
950 hard_iface->net_dev = net_dev;
951 hard_iface->soft_iface = NULL;
952 hard_iface->if_status = BATADV_IF_NOT_IN_USE;
954 batadv_debugfs_add_hardif(hard_iface);
956 INIT_LIST_HEAD(&hard_iface->list);
957 INIT_HLIST_HEAD(&hard_iface->neigh_list);
959 mutex_init(&hard_iface->bat_iv.ogm_buff_mutex);
960 spin_lock_init(&hard_iface->neigh_list_lock);
961 kref_init(&hard_iface->refcount);
963 hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
964 hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
965 if (batadv_is_wifi_hardif(hard_iface))
966 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
968 atomic_set(&hard_iface->hop_penalty, 0);
970 batadv_v_hardif_init(hard_iface);
972 batadv_check_known_mac_addr(hard_iface->net_dev);
973 kref_get(&hard_iface->refcount);
974 list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list);
977 return hard_iface;
980 kfree(hard_iface);
987 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
992 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
993 batadv_hardif_disable_interface(hard_iface,
996 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
999 hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
1000 batadv_debugfs_del_hardif(hard_iface);
1001 batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
1002 batadv_hardif_put(hard_iface);
1035 struct batadv_hard_iface *hard_iface;
1042 hard_iface = batadv_hardif_get_by_netdev(net_dev);
1043 if (!hard_iface && (event == NETDEV_REGISTER ||
1045 hard_iface = batadv_hardif_add_interface(net_dev);
1047 if (!hard_iface)
1052 batadv_hardif_activate_interface(hard_iface);
1056 batadv_hardif_deactivate_interface(hard_iface);
1060 list_del_rcu(&hard_iface->list);
1063 batadv_hardif_remove_interface(hard_iface);
1066 if (hard_iface->soft_iface)
1067 batadv_update_min_mtu(hard_iface->soft_iface);
1070 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
1073 batadv_check_known_mac_addr(hard_iface->net_dev);
1075 bat_priv = netdev_priv(hard_iface->soft_iface);
1076 bat_priv->algo_ops->iface.update_mac(hard_iface);
1082 if (hard_iface == primary_if)
1086 hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
1087 if (batadv_is_wifi_hardif(hard_iface))
1088 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
1091 batadv_debugfs_rename_hardif(hard_iface);
1098 batadv_hardif_put(hard_iface);