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()
123 struct batadv_hard_iface *hard_iface; in batadv_hardif_get_active() local
126 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_get_active()
127 if (hard_iface->soft_iface != soft_iface) in batadv_hardif_get_active()
130 if (hard_iface->if_status == BATADV_IF_ACTIVE && in batadv_hardif_get_active()
131 atomic_inc_not_zero(&hard_iface->refcount)) in batadv_hardif_get_active()
135 hard_iface = NULL; in batadv_hardif_get_active()
139 return hard_iface; in batadv_hardif_get_active()
192 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface) in batadv_hardif_is_iface_up() argument
194 if (hard_iface->net_dev->flags & IFF_UP) in batadv_hardif_is_iface_up()
202 const struct batadv_hard_iface *hard_iface; in batadv_check_known_mac_addr() local
205 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_check_known_mac_addr()
206 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_check_known_mac_addr()
207 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_check_known_mac_addr()
210 if (hard_iface->net_dev == net_dev) in batadv_check_known_mac_addr()
213 if (!batadv_compare_eth(hard_iface->net_dev->dev_addr, in batadv_check_known_mac_addr()
218 net_dev->dev_addr, hard_iface->net_dev->name); in batadv_check_known_mac_addr()
227 const struct batadv_hard_iface *hard_iface; in batadv_hardif_min_mtu() local
237 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { in batadv_hardif_min_mtu()
238 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_hardif_min_mtu()
239 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_hardif_min_mtu()
242 if (hard_iface->soft_iface != soft_iface) in batadv_hardif_min_mtu()
246 hard_iface->net_dev->mtu - BATADV_HEADER_LEN, in batadv_hardif_min_mtu()
265 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_activate_interface() argument
270 if (hard_iface->if_status != BATADV_IF_INACTIVE) in batadv_hardif_activate_interface()
273 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_activate_interface()
275 bat_priv->bat_algo_ops->bat_iface_update_mac(hard_iface); in batadv_hardif_activate_interface()
276 hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED; in batadv_hardif_activate_interface()
283 batadv_primary_if_select(bat_priv, hard_iface); in batadv_hardif_activate_interface()
285 batadv_info(hard_iface->soft_iface, "Interface activated: %s\n", in batadv_hardif_activate_interface()
286 hard_iface->net_dev->name); in batadv_hardif_activate_interface()
288 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hardif_activate_interface()
296 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_deactivate_interface() argument
298 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && in batadv_hardif_deactivate_interface()
299 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) in batadv_hardif_deactivate_interface()
302 hard_iface->if_status = BATADV_IF_INACTIVE; in batadv_hardif_deactivate_interface()
304 batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n", in batadv_hardif_deactivate_interface()
305 hard_iface->net_dev->name); in batadv_hardif_deactivate_interface()
307 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hardif_deactivate_interface()
334 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, in batadv_hardif_enable_interface() argument
342 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_enable_interface()
345 if (!atomic_inc_not_zero(&hard_iface->refcount)) in batadv_hardif_enable_interface()
372 master = netdev_master_upper_dev_get(hard_iface->net_dev); in batadv_hardif_enable_interface()
373 ret = batadv_master_del_slave(hard_iface, master); in batadv_hardif_enable_interface()
377 hard_iface->soft_iface = soft_iface; in batadv_hardif_enable_interface()
378 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_enable_interface()
380 ret = netdev_master_upper_dev_link(hard_iface->net_dev, soft_iface); in batadv_hardif_enable_interface()
384 ret = bat_priv->bat_algo_ops->bat_iface_enable(hard_iface); in batadv_hardif_enable_interface()
388 hard_iface->if_num = bat_priv->num_ifaces; in batadv_hardif_enable_interface()
390 hard_iface->if_status = BATADV_IF_INACTIVE; in batadv_hardif_enable_interface()
391 ret = batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces); in batadv_hardif_enable_interface()
393 bat_priv->bat_algo_ops->bat_iface_disable(hard_iface); in batadv_hardif_enable_interface()
395 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_enable_interface()
399 hard_iface->batman_adv_ptype.type = ethertype; in batadv_hardif_enable_interface()
400 hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv; in batadv_hardif_enable_interface()
401 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev; in batadv_hardif_enable_interface()
402 dev_add_pack(&hard_iface->batman_adv_ptype); in batadv_hardif_enable_interface()
404 atomic_set(&hard_iface->frag_seqno, 1); in batadv_hardif_enable_interface()
405 batadv_info(hard_iface->soft_iface, "Adding interface: %s\n", in batadv_hardif_enable_interface()
406 hard_iface->net_dev->name); in batadv_hardif_enable_interface()
409 hard_iface->net_dev->mtu < ETH_DATA_LEN + BATADV_HEADER_LEN) in batadv_hardif_enable_interface()
410 batadv_info(hard_iface->soft_iface, in batadv_hardif_enable_interface()
412 hard_iface->net_dev->name, hard_iface->net_dev->mtu, in batadv_hardif_enable_interface()
416 hard_iface->net_dev->mtu < ETH_DATA_LEN + BATADV_HEADER_LEN) in batadv_hardif_enable_interface()
417 batadv_info(hard_iface->soft_iface, in batadv_hardif_enable_interface()
419 hard_iface->net_dev->name, hard_iface->net_dev->mtu, in batadv_hardif_enable_interface()
422 if (batadv_hardif_is_iface_up(hard_iface)) in batadv_hardif_enable_interface()
423 batadv_hardif_activate_interface(hard_iface); in batadv_hardif_enable_interface()
425 batadv_err(hard_iface->soft_iface, in batadv_hardif_enable_interface()
427 hard_iface->net_dev->name); in batadv_hardif_enable_interface()
430 batadv_schedule_bat_ogm(hard_iface); in batadv_hardif_enable_interface()
436 netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface); in batadv_hardif_enable_interface()
438 hard_iface->soft_iface = NULL; in batadv_hardif_enable_interface()
441 batadv_hardif_free_ref(hard_iface); in batadv_hardif_enable_interface()
445 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface, in batadv_hardif_disable_interface() argument
448 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hardif_disable_interface()
451 if (hard_iface->if_status == BATADV_IF_ACTIVE) in batadv_hardif_disable_interface()
452 batadv_hardif_deactivate_interface(hard_iface); in batadv_hardif_disable_interface()
454 if (hard_iface->if_status != BATADV_IF_INACTIVE) in batadv_hardif_disable_interface()
457 batadv_info(hard_iface->soft_iface, "Removing interface: %s\n", in batadv_hardif_disable_interface()
458 hard_iface->net_dev->name); in batadv_hardif_disable_interface()
459 dev_remove_pack(&hard_iface->batman_adv_ptype); in batadv_hardif_disable_interface()
462 batadv_orig_hash_del_if(hard_iface, bat_priv->num_ifaces); in batadv_hardif_disable_interface()
465 if (hard_iface == primary_if) { in batadv_hardif_disable_interface()
468 new_if = batadv_hardif_get_active(hard_iface->soft_iface); in batadv_hardif_disable_interface()
475 bat_priv->bat_algo_ops->bat_iface_disable(hard_iface); in batadv_hardif_disable_interface()
476 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_disable_interface()
480 batadv_purge_outstanding_packets(bat_priv, hard_iface); in batadv_hardif_disable_interface()
481 dev_put(hard_iface->soft_iface); in batadv_hardif_disable_interface()
485 batadv_softif_destroy_sysfs(hard_iface->soft_iface); in batadv_hardif_disable_interface()
487 netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface); in batadv_hardif_disable_interface()
488 hard_iface->soft_iface = NULL; in batadv_hardif_disable_interface()
489 batadv_hardif_free_ref(hard_iface); in batadv_hardif_disable_interface()
505 struct batadv_hard_iface *hard_iface; in batadv_hardif_remove_interface_finish() local
507 hard_iface = container_of(work, struct batadv_hard_iface, in batadv_hardif_remove_interface_finish()
510 batadv_sysfs_del_hardif(&hard_iface->hardif_obj); in batadv_hardif_remove_interface_finish()
511 batadv_hardif_free_ref(hard_iface); in batadv_hardif_remove_interface_finish()
517 struct batadv_hard_iface *hard_iface; in batadv_hardif_add_interface() local
528 hard_iface = kmalloc(sizeof(*hard_iface), GFP_ATOMIC); in batadv_hardif_add_interface()
529 if (!hard_iface) in batadv_hardif_add_interface()
532 ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev); in batadv_hardif_add_interface()
536 hard_iface->if_num = -1; in batadv_hardif_add_interface()
537 hard_iface->net_dev = net_dev; in batadv_hardif_add_interface()
538 hard_iface->soft_iface = NULL; in batadv_hardif_add_interface()
539 hard_iface->if_status = BATADV_IF_NOT_IN_USE; in batadv_hardif_add_interface()
540 INIT_LIST_HEAD(&hard_iface->list); in batadv_hardif_add_interface()
541 INIT_WORK(&hard_iface->cleanup_work, in batadv_hardif_add_interface()
545 atomic_set(&hard_iface->refcount, 2); in batadv_hardif_add_interface()
547 batadv_check_known_mac_addr(hard_iface->net_dev); in batadv_hardif_add_interface()
548 list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list); in batadv_hardif_add_interface()
553 atomic_set(&hard_iface->bat_iv.ogm_seqno, 1); in batadv_hardif_add_interface()
554 hard_iface->bat_iv.ogm_buff = NULL; in batadv_hardif_add_interface()
556 return hard_iface; in batadv_hardif_add_interface()
559 kfree(hard_iface); in batadv_hardif_add_interface()
566 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface) in batadv_hardif_remove_interface() argument
571 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_remove_interface()
572 batadv_hardif_disable_interface(hard_iface, in batadv_hardif_remove_interface()
575 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) in batadv_hardif_remove_interface()
578 hard_iface->if_status = BATADV_IF_TO_BE_REMOVED; in batadv_hardif_remove_interface()
579 queue_work(batadv_event_workqueue, &hard_iface->cleanup_work); in batadv_hardif_remove_interface()
584 struct batadv_hard_iface *hard_iface, *hard_iface_tmp; in batadv_hardif_remove_interfaces() local
587 list_for_each_entry_safe(hard_iface, hard_iface_tmp, in batadv_hardif_remove_interfaces()
589 list_del_rcu(&hard_iface->list); in batadv_hardif_remove_interfaces()
590 batadv_hardif_remove_interface(hard_iface); in batadv_hardif_remove_interfaces()
599 struct batadv_hard_iface *hard_iface; in batadv_hard_if_event() local
608 hard_iface = batadv_hardif_get_by_netdev(net_dev); in batadv_hard_if_event()
609 if (!hard_iface && event == NETDEV_REGISTER) in batadv_hard_if_event()
610 hard_iface = batadv_hardif_add_interface(net_dev); in batadv_hard_if_event()
612 if (!hard_iface) in batadv_hard_if_event()
617 batadv_hardif_activate_interface(hard_iface); in batadv_hard_if_event()
621 batadv_hardif_deactivate_interface(hard_iface); in batadv_hard_if_event()
624 list_del_rcu(&hard_iface->list); in batadv_hard_if_event()
626 batadv_hardif_remove_interface(hard_iface); in batadv_hard_if_event()
629 if (hard_iface->soft_iface) in batadv_hard_if_event()
630 batadv_update_min_mtu(hard_iface->soft_iface); in batadv_hard_if_event()
633 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) in batadv_hard_if_event()
636 batadv_check_known_mac_addr(hard_iface->net_dev); in batadv_hard_if_event()
638 bat_priv = netdev_priv(hard_iface->soft_iface); in batadv_hard_if_event()
639 bat_priv->bat_algo_ops->bat_iface_update_mac(hard_iface); in batadv_hard_if_event()
645 if (hard_iface == primary_if) in batadv_hard_if_event()
653 batadv_hardif_free_ref(hard_iface); in batadv_hard_if_event()