2010-12-13 14:19:28 +03:00
/*
2011-01-27 12:38:15 +03:00
* Copyright ( C ) 2007 - 2011 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
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA
* 02110 - 1301 , USA
*
*/
# ifndef _NET_BATMAN_ADV_HARD_INTERFACE_H_
# define _NET_BATMAN_ADV_HARD_INTERFACE_H_
2011-06-04 13:26:00 +04:00
enum hard_if_state {
IF_NOT_IN_USE ,
IF_TO_BE_REMOVED ,
IF_INACTIVE ,
IF_ACTIVE ,
IF_TO_BE_ACTIVATED ,
IF_I_WANT_YOU
} ;
2010-12-13 14:19:28 +03:00
extern struct notifier_block hard_if_notifier ;
2011-05-15 01:14:50 +04:00
struct hard_iface *
hardif_get_by_netdev ( const struct net_device * net_dev ) ;
int hardif_enable_interface ( struct hard_iface * hard_iface ,
const char * iface_name ) ;
2011-02-18 15:33:20 +03:00
void hardif_disable_interface ( struct hard_iface * hard_iface ) ;
2010-12-13 14:19:28 +03:00
void hardif_remove_interfaces ( void ) ;
int hardif_min_mtu ( struct net_device * soft_iface ) ;
void update_min_mtu ( struct net_device * soft_iface ) ;
2011-02-10 17:33:51 +03:00
void hardif_free_rcu ( struct rcu_head * rcu ) ;
2010-12-13 14:19:28 +03:00
2011-02-18 15:33:20 +03:00
static inline void hardif_free_ref ( struct 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 ) )
call_rcu ( & hard_iface - > rcu , hardif_free_rcu ) ;
2010-12-13 14:19:28 +03:00
}
2011-04-20 17:40:58 +04:00
static inline struct hard_iface * primary_if_get_selected (
struct bat_priv * bat_priv )
{
struct hard_iface * hard_iface ;
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_ */