Lines Matching refs:hard_iface

51 	struct batadv_hard_iface *hard_iface;  in batadv_hardif_free_rcu()  local
53 hard_iface = container_of(rcu, struct batadv_hard_iface, rcu); in batadv_hardif_free_rcu()
54 dev_put(hard_iface->net_dev); in batadv_hardif_free_rcu()
55 kfree(hard_iface); in batadv_hardif_free_rcu()
61 struct batadv_hard_iface *hard_iface; in batadv_hardif_get_by_netdev() local
64 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_get_by_netdev()
65 if (hard_iface->net_dev == net_dev && in batadv_hardif_get_by_netdev()
66 atomic_inc_not_zero(&hard_iface->refcount)) in batadv_hardif_get_by_netdev()
70 hard_iface = NULL; in batadv_hardif_get_by_netdev()
74 return hard_iface; in batadv_hardif_get_by_netdev()
163 struct batadv_hard_iface *hard_iface; in batadv_hardif_get_active() local
166 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_get_active()
167 if (hard_iface->soft_iface != soft_iface) in batadv_hardif_get_active()
170 if (hard_iface->if_status == BATADV_IF_ACTIVE && in batadv_hardif_get_active()
171 atomic_inc_not_zero(&hard_iface->refcount)) in batadv_hardif_get_active()
175 hard_iface = NULL; in batadv_hardif_get_active()
179 return hard_iface; in batadv_hardif_get_active()
223 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface) in batadv_hardif_is_iface_up() argument
225 if (hard_iface->net_dev->flags & IFF_UP) in batadv_hardif_is_iface_up()
233 const struct batadv_hard_iface *hard_iface; in batadv_check_known_mac_addr() local
236 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_check_known_mac_addr()
237 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_check_known_mac_addr()
238 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_check_known_mac_addr()
241 if (hard_iface->net_dev == net_dev) in batadv_check_known_mac_addr()
244 if (!batadv_compare_eth(hard_iface->net_dev->dev_addr, in batadv_check_known_mac_addr()
249 net_dev->dev_addr, hard_iface->net_dev->name); in batadv_check_known_mac_addr()
261 const struct batadv_hard_iface *hard_iface; in batadv_hardif_recalc_extra_skbroom() local
268 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_recalc_extra_skbroom()
269 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) in batadv_hardif_recalc_extra_skbroom()
272 if (hard_iface->soft_iface != soft_iface) in batadv_hardif_recalc_extra_skbroom()
276 hard_iface->net_dev->hard_header_len); in batadv_hardif_recalc_extra_skbroom()
279 hard_iface->net_dev->needed_headroom); in batadv_hardif_recalc_extra_skbroom()
282 hard_iface->net_dev->needed_tailroom); in batadv_hardif_recalc_extra_skbroom()
296 const struct batadv_hard_iface *hard_iface; in batadv_hardif_min_mtu() local
300 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_min_mtu()
301 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_hardif_min_mtu()
302 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_hardif_min_mtu()
305 if (hard_iface->soft_iface != soft_iface) in batadv_hardif_min_mtu()
308 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu); in batadv_hardif_min_mtu()
351 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_activate_interface() argument
356 if (hard_iface->if_status != BATADV_IF_INACTIVE) in batadv_hardif_activate_interface()
359 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_activate_interface()
361 bat_priv->bat_algo_ops->bat_iface_update_mac(hard_iface); in batadv_hardif_activate_interface()
362 hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED; in batadv_hardif_activate_interface()
369 batadv_primary_if_select(bat_priv, hard_iface); in batadv_hardif_activate_interface()
371 batadv_info(hard_iface->soft_iface, "Interface activated: %s\n", in batadv_hardif_activate_interface()
372 hard_iface->net_dev->name); in batadv_hardif_activate_interface()
374 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hardif_activate_interface()
382 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_deactivate_interface() argument
384 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_hardif_deactivate_interface()
385 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_hardif_deactivate_interface()
388 hard_iface->if_status = BATADV_IF_INACTIVE; in batadv_hardif_deactivate_interface()
390 batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n", in batadv_hardif_deactivate_interface()
391 hard_iface->net_dev->name); in batadv_hardif_deactivate_interface()
393 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hardif_deactivate_interface()
420 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, in batadv_hardif_enable_interface() argument
429 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_enable_interface()
432 if (!atomic_inc_not_zero(&hard_iface->refcount)) in batadv_hardif_enable_interface()
459 master = netdev_master_upper_dev_get(hard_iface->net_dev); in batadv_hardif_enable_interface()
460 ret = batadv_master_del_slave(hard_iface, master); in batadv_hardif_enable_interface()
464 hard_iface->soft_iface = soft_iface; in batadv_hardif_enable_interface()
465 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_enable_interface()
467 ret = netdev_master_upper_dev_link(hard_iface->net_dev, soft_iface); in batadv_hardif_enable_interface()
471 ret = bat_priv->bat_algo_ops->bat_iface_enable(hard_iface); in batadv_hardif_enable_interface()
475 hard_iface->if_num = bat_priv->num_ifaces; in batadv_hardif_enable_interface()
477 hard_iface->if_status = BATADV_IF_INACTIVE; in batadv_hardif_enable_interface()
478 ret = batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces); in batadv_hardif_enable_interface()
480 bat_priv->bat_algo_ops->bat_iface_disable(hard_iface); in batadv_hardif_enable_interface()
482 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_enable_interface()
486 hard_iface->batman_adv_ptype.type = ethertype; in batadv_hardif_enable_interface()
487 hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv; in batadv_hardif_enable_interface()
488 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev; in batadv_hardif_enable_interface()
489 dev_add_pack(&hard_iface->batman_adv_ptype); in batadv_hardif_enable_interface()
491 batadv_info(hard_iface->soft_iface, "Adding interface: %s\n", in batadv_hardif_enable_interface()
492 hard_iface->net_dev->name); in batadv_hardif_enable_interface()
495 hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len) in batadv_hardif_enable_interface()
496 batadv_info(hard_iface->soft_iface, in batadv_hardif_enable_interface()
498 hard_iface->net_dev->name, hard_iface->net_dev->mtu, in batadv_hardif_enable_interface()
502 hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len) in batadv_hardif_enable_interface()
503 batadv_info(hard_iface->soft_iface, in batadv_hardif_enable_interface()
505 hard_iface->net_dev->name, hard_iface->net_dev->mtu, in batadv_hardif_enable_interface()
508 if (batadv_hardif_is_iface_up(hard_iface)) in batadv_hardif_enable_interface()
509 batadv_hardif_activate_interface(hard_iface); in batadv_hardif_enable_interface()
511 batadv_err(hard_iface->soft_iface, in batadv_hardif_enable_interface()
513 hard_iface->net_dev->name); in batadv_hardif_enable_interface()
518 batadv_schedule_bat_ogm(hard_iface); in batadv_hardif_enable_interface()
524 netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface); in batadv_hardif_enable_interface()
526 hard_iface->soft_iface = NULL; in batadv_hardif_enable_interface()
529 batadv_hardif_free_ref(hard_iface); in batadv_hardif_enable_interface()
533 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface, in batadv_hardif_disable_interface() argument
536 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_disable_interface()
539 if (hard_iface->if_status == BATADV_IF_ACTIVE) in batadv_hardif_disable_interface()
540 batadv_hardif_deactivate_interface(hard_iface); in batadv_hardif_disable_interface()
542 if (hard_iface->if_status != BATADV_IF_INACTIVE) in batadv_hardif_disable_interface()
545 batadv_info(hard_iface->soft_iface, "Removing interface: %s\n", in batadv_hardif_disable_interface()
546 hard_iface->net_dev->name); in batadv_hardif_disable_interface()
547 dev_remove_pack(&hard_iface->batman_adv_ptype); in batadv_hardif_disable_interface()
550 batadv_orig_hash_del_if(hard_iface, bat_priv->num_ifaces); in batadv_hardif_disable_interface()
553 if (hard_iface == primary_if) { in batadv_hardif_disable_interface()
556 new_if = batadv_hardif_get_active(hard_iface->soft_iface); in batadv_hardif_disable_interface()
563 bat_priv->bat_algo_ops->bat_iface_disable(hard_iface); in batadv_hardif_disable_interface()
564 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_disable_interface()
568 batadv_purge_outstanding_packets(bat_priv, hard_iface); in batadv_hardif_disable_interface()
569 dev_put(hard_iface->soft_iface); in batadv_hardif_disable_interface()
571 netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface); in batadv_hardif_disable_interface()
572 batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface); in batadv_hardif_disable_interface()
579 batadv_softif_destroy_sysfs(hard_iface->soft_iface); in batadv_hardif_disable_interface()
582 hard_iface->soft_iface = NULL; in batadv_hardif_disable_interface()
583 batadv_hardif_free_ref(hard_iface); in batadv_hardif_disable_interface()
599 struct batadv_hard_iface *hard_iface; in batadv_hardif_remove_interface_finish() local
601 hard_iface = container_of(work, struct batadv_hard_iface, in batadv_hardif_remove_interface_finish()
604 batadv_debugfs_del_hardif(hard_iface); in batadv_hardif_remove_interface_finish()
605 batadv_sysfs_del_hardif(&hard_iface->hardif_obj); in batadv_hardif_remove_interface_finish()
606 batadv_hardif_free_ref(hard_iface); in batadv_hardif_remove_interface_finish()
612 struct batadv_hard_iface *hard_iface; in batadv_hardif_add_interface() local
623 hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC); in batadv_hardif_add_interface()
624 if (!hard_iface) in batadv_hardif_add_interface()
627 ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev); in batadv_hardif_add_interface()
631 hard_iface->if_num = -1; in batadv_hardif_add_interface()
632 hard_iface->net_dev = net_dev; in batadv_hardif_add_interface()
633 hard_iface->soft_iface = NULL; in batadv_hardif_add_interface()
634 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_add_interface()
636 ret = batadv_debugfs_add_hardif(hard_iface); in batadv_hardif_add_interface()
640 INIT_LIST_HEAD(&hard_iface->list); in batadv_hardif_add_interface()
641 INIT_WORK(&hard_iface->cleanup_work, in batadv_hardif_add_interface()
644 hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT; in batadv_hardif_add_interface()
646 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; in batadv_hardif_add_interface()
649 atomic_set(&hard_iface->refcount, 2); in batadv_hardif_add_interface()
651 batadv_check_known_mac_addr(hard_iface->net_dev); in batadv_hardif_add_interface()
652 list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list); in batadv_hardif_add_interface()
654 return hard_iface; in batadv_hardif_add_interface()
657 batadv_sysfs_del_hardif(&hard_iface->hardif_obj); in batadv_hardif_add_interface()
659 kfree(hard_iface); in batadv_hardif_add_interface()
666 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_remove_interface() argument
671 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_remove_interface()
672 batadv_hardif_disable_interface(hard_iface, in batadv_hardif_remove_interface()
675 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_remove_interface()
678 hard_iface->if_status = BATADV_IF_TO_BE_REMOVED; in batadv_hardif_remove_interface()
679 queue_work(batadv_event_workqueue, &hard_iface->cleanup_work); in batadv_hardif_remove_interface()
684 struct batadv_hard_iface *hard_iface, *hard_iface_tmp; in batadv_hardif_remove_interfaces() local
687 list_for_each_entry_safe(hard_iface, hard_iface_tmp, in batadv_hardif_remove_interfaces()
689 list_del_rcu(&hard_iface->list); in batadv_hardif_remove_interfaces()
690 batadv_hardif_remove_interface(hard_iface); in batadv_hardif_remove_interfaces()
699 struct batadv_hard_iface *hard_iface; in batadv_hard_if_event() local
710 hard_iface = batadv_hardif_get_by_netdev(net_dev); in batadv_hard_if_event()
711 if (!hard_iface && event == NETDEV_REGISTER) in batadv_hard_if_event()
712 hard_iface = batadv_hardif_add_interface(net_dev); in batadv_hard_if_event()
714 if (!hard_iface) in batadv_hard_if_event()
719 batadv_hardif_activate_interface(hard_iface); in batadv_hard_if_event()
723 batadv_hardif_deactivate_interface(hard_iface); in batadv_hard_if_event()
726 list_del_rcu(&hard_iface->list); in batadv_hard_if_event()
728 batadv_hardif_remove_interface(hard_iface); in batadv_hard_if_event()
731 if (hard_iface->soft_iface) in batadv_hard_if_event()
732 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hard_if_event()
735 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) in batadv_hard_if_event()
738 batadv_check_known_mac_addr(hard_iface->net_dev); in batadv_hard_if_event()
740 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hard_if_event()
741 bat_priv->bat_algo_ops->bat_iface_update_mac(hard_iface); in batadv_hard_if_event()
747 if (hard_iface == primary_if) in batadv_hard_if_event()
755 batadv_hardif_free_ref(hard_iface); in batadv_hard_if_event()