Lines Matching refs:hard_iface

37 	struct batadv_hard_iface *hard_iface;  in batadv_hardif_free_rcu()  local
39 hard_iface = container_of(rcu, struct batadv_hard_iface, rcu); in batadv_hardif_free_rcu()
40 dev_put(hard_iface->net_dev); in batadv_hardif_free_rcu()
41 kfree(hard_iface); in batadv_hardif_free_rcu()
47 struct batadv_hard_iface *hard_iface; in batadv_hardif_get_by_netdev() local
50 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_get_by_netdev()
51 if (hard_iface->net_dev == net_dev && in batadv_hardif_get_by_netdev()
52 atomic_inc_not_zero(&hard_iface->refcount)) in batadv_hardif_get_by_netdev()
56 hard_iface = NULL; in batadv_hardif_get_by_netdev()
60 return hard_iface; in batadv_hardif_get_by_netdev()
149 struct batadv_hard_iface *hard_iface; in batadv_hardif_get_active() local
152 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_get_active()
153 if (hard_iface->soft_iface != soft_iface) in batadv_hardif_get_active()
156 if (hard_iface->if_status == BATADV_IF_ACTIVE && in batadv_hardif_get_active()
157 atomic_inc_not_zero(&hard_iface->refcount)) in batadv_hardif_get_active()
161 hard_iface = NULL; in batadv_hardif_get_active()
165 return hard_iface; in batadv_hardif_get_active()
209 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface) in batadv_hardif_is_iface_up() argument
211 if (hard_iface->net_dev->flags & IFF_UP) in batadv_hardif_is_iface_up()
219 const struct batadv_hard_iface *hard_iface; in batadv_check_known_mac_addr() local
222 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_check_known_mac_addr()
223 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_check_known_mac_addr()
224 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_check_known_mac_addr()
227 if (hard_iface->net_dev == net_dev) in batadv_check_known_mac_addr()
230 if (!batadv_compare_eth(hard_iface->net_dev->dev_addr, in batadv_check_known_mac_addr()
235 net_dev->dev_addr, hard_iface->net_dev->name); in batadv_check_known_mac_addr()
244 const struct batadv_hard_iface *hard_iface; in batadv_hardif_min_mtu() local
248 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_min_mtu()
249 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_hardif_min_mtu()
250 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_hardif_min_mtu()
253 if (hard_iface->soft_iface != soft_iface) in batadv_hardif_min_mtu()
256 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu); in batadv_hardif_min_mtu()
299 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_activate_interface() argument
304 if (hard_iface->if_status != BATADV_IF_INACTIVE) in batadv_hardif_activate_interface()
307 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_activate_interface()
309 bat_priv->bat_algo_ops->bat_iface_update_mac(hard_iface); in batadv_hardif_activate_interface()
310 hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED; in batadv_hardif_activate_interface()
317 batadv_primary_if_select(bat_priv, hard_iface); in batadv_hardif_activate_interface()
319 batadv_info(hard_iface->soft_iface, "Interface activated: %s\n", in batadv_hardif_activate_interface()
320 hard_iface->net_dev->name); in batadv_hardif_activate_interface()
322 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hardif_activate_interface()
330 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_deactivate_interface() argument
332 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_hardif_deactivate_interface()
333 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_hardif_deactivate_interface()
336 hard_iface->if_status = BATADV_IF_INACTIVE; in batadv_hardif_deactivate_interface()
338 batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n", in batadv_hardif_deactivate_interface()
339 hard_iface->net_dev->name); in batadv_hardif_deactivate_interface()
341 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hardif_deactivate_interface()
368 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, in batadv_hardif_enable_interface() argument
377 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_enable_interface()
380 if (!atomic_inc_not_zero(&hard_iface->refcount)) in batadv_hardif_enable_interface()
407 master = netdev_master_upper_dev_get(hard_iface->net_dev); in batadv_hardif_enable_interface()
408 ret = batadv_master_del_slave(hard_iface, master); in batadv_hardif_enable_interface()
412 hard_iface->soft_iface = soft_iface; in batadv_hardif_enable_interface()
413 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_enable_interface()
415 ret = netdev_master_upper_dev_link(hard_iface->net_dev, soft_iface); in batadv_hardif_enable_interface()
419 ret = bat_priv->bat_algo_ops->bat_iface_enable(hard_iface); in batadv_hardif_enable_interface()
423 hard_iface->if_num = bat_priv->num_ifaces; in batadv_hardif_enable_interface()
425 hard_iface->if_status = BATADV_IF_INACTIVE; in batadv_hardif_enable_interface()
426 ret = batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces); in batadv_hardif_enable_interface()
428 bat_priv->bat_algo_ops->bat_iface_disable(hard_iface); in batadv_hardif_enable_interface()
430 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_enable_interface()
434 hard_iface->batman_adv_ptype.type = ethertype; in batadv_hardif_enable_interface()
435 hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv; in batadv_hardif_enable_interface()
436 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev; in batadv_hardif_enable_interface()
437 dev_add_pack(&hard_iface->batman_adv_ptype); in batadv_hardif_enable_interface()
439 batadv_info(hard_iface->soft_iface, "Adding interface: %s\n", in batadv_hardif_enable_interface()
440 hard_iface->net_dev->name); in batadv_hardif_enable_interface()
443 hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len) in batadv_hardif_enable_interface()
444 batadv_info(hard_iface->soft_iface, in batadv_hardif_enable_interface()
446 hard_iface->net_dev->name, hard_iface->net_dev->mtu, in batadv_hardif_enable_interface()
450 hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len) in batadv_hardif_enable_interface()
451 batadv_info(hard_iface->soft_iface, in batadv_hardif_enable_interface()
453 hard_iface->net_dev->name, hard_iface->net_dev->mtu, in batadv_hardif_enable_interface()
456 if (batadv_hardif_is_iface_up(hard_iface)) in batadv_hardif_enable_interface()
457 batadv_hardif_activate_interface(hard_iface); in batadv_hardif_enable_interface()
459 batadv_err(hard_iface->soft_iface, in batadv_hardif_enable_interface()
461 hard_iface->net_dev->name); in batadv_hardif_enable_interface()
464 batadv_schedule_bat_ogm(hard_iface); in batadv_hardif_enable_interface()
470 netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface); in batadv_hardif_enable_interface()
472 hard_iface->soft_iface = NULL; in batadv_hardif_enable_interface()
475 batadv_hardif_free_ref(hard_iface); in batadv_hardif_enable_interface()
479 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface, in batadv_hardif_disable_interface() argument
482 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_disable_interface()
485 if (hard_iface->if_status == BATADV_IF_ACTIVE) in batadv_hardif_disable_interface()
486 batadv_hardif_deactivate_interface(hard_iface); in batadv_hardif_disable_interface()
488 if (hard_iface->if_status != BATADV_IF_INACTIVE) in batadv_hardif_disable_interface()
491 batadv_info(hard_iface->soft_iface, "Removing interface: %s\n", in batadv_hardif_disable_interface()
492 hard_iface->net_dev->name); in batadv_hardif_disable_interface()
493 dev_remove_pack(&hard_iface->batman_adv_ptype); in batadv_hardif_disable_interface()
496 batadv_orig_hash_del_if(hard_iface, bat_priv->num_ifaces); in batadv_hardif_disable_interface()
499 if (hard_iface == primary_if) { in batadv_hardif_disable_interface()
502 new_if = batadv_hardif_get_active(hard_iface->soft_iface); in batadv_hardif_disable_interface()
509 bat_priv->bat_algo_ops->bat_iface_disable(hard_iface); in batadv_hardif_disable_interface()
510 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_disable_interface()
514 batadv_purge_outstanding_packets(bat_priv, hard_iface); in batadv_hardif_disable_interface()
515 dev_put(hard_iface->soft_iface); in batadv_hardif_disable_interface()
522 batadv_softif_destroy_sysfs(hard_iface->soft_iface); in batadv_hardif_disable_interface()
525 netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface); in batadv_hardif_disable_interface()
526 hard_iface->soft_iface = NULL; in batadv_hardif_disable_interface()
527 batadv_hardif_free_ref(hard_iface); in batadv_hardif_disable_interface()
543 struct batadv_hard_iface *hard_iface; in batadv_hardif_remove_interface_finish() local
545 hard_iface = container_of(work, struct batadv_hard_iface, in batadv_hardif_remove_interface_finish()
548 batadv_debugfs_del_hardif(hard_iface); in batadv_hardif_remove_interface_finish()
549 batadv_sysfs_del_hardif(&hard_iface->hardif_obj); in batadv_hardif_remove_interface_finish()
550 batadv_hardif_free_ref(hard_iface); in batadv_hardif_remove_interface_finish()
556 struct batadv_hard_iface *hard_iface; in batadv_hardif_add_interface() local
567 hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC); in batadv_hardif_add_interface()
568 if (!hard_iface) in batadv_hardif_add_interface()
571 ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev); in batadv_hardif_add_interface()
575 hard_iface->if_num = -1; in batadv_hardif_add_interface()
576 hard_iface->net_dev = net_dev; in batadv_hardif_add_interface()
577 hard_iface->soft_iface = NULL; in batadv_hardif_add_interface()
578 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_add_interface()
580 ret = batadv_debugfs_add_hardif(hard_iface); in batadv_hardif_add_interface()
584 INIT_LIST_HEAD(&hard_iface->list); in batadv_hardif_add_interface()
585 INIT_WORK(&hard_iface->cleanup_work, in batadv_hardif_add_interface()
588 hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT; in batadv_hardif_add_interface()
590 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; in batadv_hardif_add_interface()
593 atomic_set(&hard_iface->refcount, 2); in batadv_hardif_add_interface()
595 batadv_check_known_mac_addr(hard_iface->net_dev); in batadv_hardif_add_interface()
596 list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list); in batadv_hardif_add_interface()
598 return hard_iface; in batadv_hardif_add_interface()
601 batadv_sysfs_del_hardif(&hard_iface->hardif_obj); in batadv_hardif_add_interface()
603 kfree(hard_iface); in batadv_hardif_add_interface()
610 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_remove_interface() argument
615 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_remove_interface()
616 batadv_hardif_disable_interface(hard_iface, in batadv_hardif_remove_interface()
619 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_remove_interface()
622 hard_iface->if_status = BATADV_IF_TO_BE_REMOVED; in batadv_hardif_remove_interface()
623 queue_work(batadv_event_workqueue, &hard_iface->cleanup_work); in batadv_hardif_remove_interface()
628 struct batadv_hard_iface *hard_iface, *hard_iface_tmp; in batadv_hardif_remove_interfaces() local
631 list_for_each_entry_safe(hard_iface, hard_iface_tmp, in batadv_hardif_remove_interfaces()
633 list_del_rcu(&hard_iface->list); in batadv_hardif_remove_interfaces()
634 batadv_hardif_remove_interface(hard_iface); in batadv_hardif_remove_interfaces()
643 struct batadv_hard_iface *hard_iface; in batadv_hard_if_event() local
654 hard_iface = batadv_hardif_get_by_netdev(net_dev); in batadv_hard_if_event()
655 if (!hard_iface && event == NETDEV_REGISTER) in batadv_hard_if_event()
656 hard_iface = batadv_hardif_add_interface(net_dev); in batadv_hard_if_event()
658 if (!hard_iface) in batadv_hard_if_event()
663 batadv_hardif_activate_interface(hard_iface); in batadv_hard_if_event()
667 batadv_hardif_deactivate_interface(hard_iface); in batadv_hard_if_event()
670 list_del_rcu(&hard_iface->list); in batadv_hard_if_event()
672 batadv_hardif_remove_interface(hard_iface); in batadv_hard_if_event()
675 if (hard_iface->soft_iface) in batadv_hard_if_event()
676 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hard_if_event()
679 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) in batadv_hard_if_event()
682 batadv_check_known_mac_addr(hard_iface->net_dev); in batadv_hard_if_event()
684 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hard_if_event()
685 bat_priv->bat_algo_ops->bat_iface_update_mac(hard_iface); in batadv_hard_if_event()
691 if (hard_iface == primary_if) in batadv_hard_if_event()
699 batadv_hardif_free_ref(hard_iface); in batadv_hard_if_event()