2014-01-04 21:04:25 +04:00
/* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors:
2010-12-13 14:19:28 +03:00
*
* Marek Lindner , Simon Wunderlich
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2013-11-03 23:40:48 +04:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2010-12-13 14:19:28 +03:00
*/
# ifndef _NET_BATMAN_ADV_HARD_INTERFACE_H_
# define _NET_BATMAN_ADV_HARD_INTERFACE_H_
2012-06-04 00:19:19 +04:00
enum batadv_hard_if_state {
BATADV_IF_NOT_IN_USE ,
BATADV_IF_TO_BE_REMOVED ,
BATADV_IF_INACTIVE ,
BATADV_IF_ACTIVE ,
BATADV_IF_TO_BE_ACTIVATED ,
BATADV_IF_I_WANT_YOU ,
2011-06-04 13:26:00 +04:00
} ;
2010-12-13 14:19:28 +03:00
2013-02-11 13:10:24 +04:00
/**
* enum batadv_hard_if_cleanup - Cleanup modi for soft_iface after slave removal
* @ BATADV_IF_CLEANUP_KEEP : Don ' t automatically delete soft - interface
* @ BATADV_IF_CLEANUP_AUTO : Delete soft - interface after last slave was removed
*/
enum batadv_hard_if_cleanup {
BATADV_IF_CLEANUP_KEEP ,
BATADV_IF_CLEANUP_AUTO ,
} ;
2012-05-12 04:09:31 +04:00
extern struct notifier_block batadv_hard_if_notifier ;
2010-12-13 14:19:28 +03:00
2013-10-13 04:50:18 +04:00
bool batadv_is_wifi_netdev ( struct net_device * net_device ) ;
2013-11-13 22:14:48 +04:00
bool batadv_is_wifi_iface ( int ifindex ) ;
2012-06-06 00:31:31 +04:00
struct batadv_hard_iface *
2012-05-12 04:09:31 +04:00
batadv_hardif_get_by_netdev ( const struct net_device * net_dev ) ;
2012-06-06 00:31:31 +04:00
int batadv_hardif_enable_interface ( struct batadv_hard_iface * hard_iface ,
2012-05-12 04:09:31 +04:00
const char * iface_name ) ;
2013-02-11 13:10:24 +04:00
void batadv_hardif_disable_interface ( struct batadv_hard_iface * hard_iface ,
enum batadv_hard_if_cleanup autodel ) ;
2012-05-12 04:09:31 +04:00
void batadv_hardif_remove_interfaces ( void ) ;
int batadv_hardif_min_mtu ( struct net_device * soft_iface ) ;
void batadv_update_min_mtu ( struct net_device * soft_iface ) ;
void batadv_hardif_free_rcu ( struct rcu_head * rcu ) ;
2010-12-13 14:19:28 +03:00
2013-11-13 22:14:46 +04:00
/**
* batadv_hardif_free_ref - decrement the hard interface refcounter and
* possibly free it
* @ hard_iface : the hard interface to free
*/
2012-05-12 15:48:54 +04:00
static inline void
2012-06-06 00:31:31 +04:00
batadv_hardif_free_ref ( struct batadv_hard_iface * hard_iface )
2010-12-13 14:19:28 +03:00
{
2011-02-18 15:33:20 +03:00
if ( atomic_dec_and_test ( & hard_iface - > refcount ) )
2012-05-12 04:09:31 +04:00
call_rcu ( & hard_iface - > rcu , batadv_hardif_free_rcu ) ;
2010-12-13 14:19:28 +03:00
}
2013-11-13 22:14:46 +04:00
/**
* batadv_hardif_free_ref_now - decrement the hard interface refcounter and
* possibly free it ( without rcu callback )
* @ hard_iface : the hard interface to free
*/
static inline void
batadv_hardif_free_ref_now ( struct batadv_hard_iface * hard_iface )
{
if ( atomic_dec_and_test ( & hard_iface - > refcount ) )
batadv_hardif_free_rcu ( & hard_iface - > rcu ) ;
}
2012-06-06 00:31:31 +04:00
static inline struct batadv_hard_iface *
batadv_primary_if_get_selected ( struct batadv_priv * bat_priv )
2011-04-20 17:40:58 +04:00
{
2012-06-06 00:31:31 +04:00
struct batadv_hard_iface * hard_iface ;
2011-04-20 17:40:58 +04:00
rcu_read_lock ( ) ;
hard_iface = rcu_dereference ( bat_priv - > primary_if ) ;
if ( ! hard_iface )
goto out ;
if ( ! atomic_inc_not_zero ( & hard_iface - > refcount ) )
hard_iface = NULL ;
out :
rcu_read_unlock ( ) ;
return hard_iface ;
}
2010-12-13 14:19:28 +03:00
# endif /* _NET_BATMAN_ADV_HARD_INTERFACE_H_ */