2016-01-01 00:01:03 +01:00
/* Copyright (C) 2007-2016 B.A.T.M.A.N. contributors:
2010-12-13 11:19:28 +00: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 20:40:48 +01:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2010-12-13 11:19:28 +00:00
*/
# ifndef _NET_BATMAN_ADV_HARD_INTERFACE_H_
# define _NET_BATMAN_ADV_HARD_INTERFACE_H_
2015-04-17 19:40:28 +02:00
# include "main.h"
# include <linux/compiler.h>
2016-01-16 10:29:54 +01:00
# include <linux/kref.h>
2015-04-17 19:40:28 +02:00
# include <linux/notifier.h>
# include <linux/rcupdate.h>
# include <linux/stddef.h>
# include <linux/types.h>
struct net_device ;
2016-04-21 12:57:27 +02:00
struct net ;
2015-04-17 19:40:28 +02:00
2012-06-03 22:19:19 +02: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 11:26:00 +02:00
} ;
2010-12-13 11:19:28 +00:00
2013-02-11 17:10:24 +08: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 02:09:31 +02:00
extern struct notifier_block batadv_hard_if_notifier ;
2010-12-13 11:19:28 +00:00
2013-10-13 02:50:18 +02:00
bool batadv_is_wifi_netdev ( struct net_device * net_device ) ;
2013-11-13 19:14:48 +01:00
bool batadv_is_wifi_iface ( int ifindex ) ;
2012-06-05 22:31:31 +02:00
struct batadv_hard_iface *
2012-05-12 02:09:31 +02:00
batadv_hardif_get_by_netdev ( const struct net_device * net_dev ) ;
2012-06-05 22:31:31 +02:00
int batadv_hardif_enable_interface ( struct batadv_hard_iface * hard_iface ,
2016-04-21 12:57:27 +02:00
struct net * net , const char * iface_name ) ;
2013-02-11 17:10:24 +08:00
void batadv_hardif_disable_interface ( struct batadv_hard_iface * hard_iface ,
enum batadv_hard_if_cleanup autodel ) ;
2012-05-12 02:09:31 +02: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 ) ;
2016-01-16 10:29:54 +01:00
void batadv_hardif_release ( struct kref * ref ) ;
2010-12-13 11:19:28 +00:00
2013-11-13 19:14:46 +01:00
/**
2016-01-17 11:01:10 +01:00
* batadv_hardif_put - decrement the hard interface refcounter and possibly
2016-01-16 10:29:54 +01:00
* release it
2013-11-13 19:14:46 +01:00
* @ hard_iface : the hard interface to free
*/
2016-01-17 11:01:10 +01:00
static inline void batadv_hardif_put ( struct batadv_hard_iface * hard_iface )
2010-12-13 11:19:28 +00:00
{
2016-01-16 10:29:54 +01:00
kref_put ( & hard_iface - > refcount , batadv_hardif_release ) ;
2010-12-13 11:19:28 +00:00
}
2012-06-05 22:31:31 +02:00
static inline struct batadv_hard_iface *
batadv_primary_if_get_selected ( struct batadv_priv * bat_priv )
2011-04-20 15:40:58 +02:00
{
2012-06-05 22:31:31 +02:00
struct batadv_hard_iface * hard_iface ;
2011-04-20 15:40:58 +02:00
rcu_read_lock ( ) ;
hard_iface = rcu_dereference ( bat_priv - > primary_if ) ;
if ( ! hard_iface )
goto out ;
2016-01-16 10:29:54 +01:00
if ( ! kref_get_unless_zero ( & hard_iface - > refcount ) )
2011-04-20 15:40:58 +02:00
hard_iface = NULL ;
out :
rcu_read_unlock ( ) ;
return hard_iface ;
}
2010-12-13 11:19:28 +00:00
# endif /* _NET_BATMAN_ADV_HARD_INTERFACE_H_ */