2017-11-19 17:05:11 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
2021-01-01 02:00:01 +03:00
/* Copyright (C) B.A.T.M.A.N. contributors:
2010-12-13 14:19:28 +03:00
*
* Marek Lindner , Simon Wunderlich
*/
# ifndef _NET_BATMAN_ADV_ORIGINATOR_H_
# define _NET_BATMAN_ADV_ORIGINATOR_H_
2015-04-17 20:40:28 +03:00
# include "main.h"
# include <linux/compiler.h>
# include <linux/if_ether.h>
# include <linux/jhash.h>
2021-08-08 20:56:17 +03:00
# include <linux/kref.h>
2019-05-24 21:11:17 +03:00
# include <linux/netlink.h>
# include <linux/skbuff.h>
2015-04-17 20:40:28 +03:00
# include <linux/types.h>
2016-02-22 23:02:39 +03:00
bool batadv_compare_orig ( const struct hlist_node * node , const void * data2 ) ;
2012-06-06 00:31:31 +04:00
int batadv_originator_init ( struct batadv_priv * bat_priv ) ;
void batadv_originator_free ( struct batadv_priv * bat_priv ) ;
void batadv_purge_orig_ref ( struct batadv_priv * bat_priv ) ;
2021-08-08 20:56:17 +03:00
void batadv_orig_node_release ( struct kref * ref ) ;
2013-09-02 14:15:02 +04:00
struct batadv_orig_node * batadv_orig_node_new ( struct batadv_priv * bat_priv ,
2015-05-26 19:34:26 +03:00
const u8 * addr ) ;
2015-08-04 16:09:55 +03:00
struct batadv_hardif_neigh_node *
batadv_hardif_neigh_get ( const struct batadv_hard_iface * hard_iface ,
const u8 * neigh_addr ) ;
2021-08-08 20:56:17 +03:00
void batadv_hardif_neigh_release ( struct kref * ref ) ;
2012-06-06 00:31:31 +04:00
struct batadv_neigh_node *
2016-05-02 20:52:08 +03:00
batadv_neigh_node_get_or_create ( struct batadv_orig_node * orig_node ,
struct batadv_hard_iface * hard_iface ,
const u8 * neigh_addr ) ;
2021-08-08 20:56:17 +03:00
void batadv_neigh_node_release ( struct kref * ref ) ;
2012-06-06 00:31:31 +04:00
struct batadv_neigh_node *
2013-11-13 22:14:47 +04:00
batadv_orig_router_get ( struct batadv_orig_node * orig_node ,
const struct batadv_hard_iface * if_outgoing ) ;
2013-11-13 22:14:46 +04:00
struct batadv_neigh_ifinfo *
batadv_neigh_ifinfo_new ( struct batadv_neigh_node * neigh ,
struct batadv_hard_iface * if_outgoing ) ;
struct batadv_neigh_ifinfo *
batadv_neigh_ifinfo_get ( struct batadv_neigh_node * neigh ,
struct batadv_hard_iface * if_outgoing ) ;
2021-08-08 20:56:17 +03:00
void batadv_neigh_ifinfo_release ( struct kref * ref ) ;
2013-11-13 22:14:47 +04:00
2016-07-03 14:31:39 +03:00
int batadv_hardif_neigh_dump ( struct sk_buff * msg , struct netlink_callback * cb ) ;
2015-08-04 16:09:57 +03:00
2013-11-13 22:14:47 +04:00
struct batadv_orig_ifinfo *
batadv_orig_ifinfo_get ( struct batadv_orig_node * orig_node ,
struct batadv_hard_iface * if_outgoing ) ;
struct batadv_orig_ifinfo *
batadv_orig_ifinfo_new ( struct batadv_orig_node * orig_node ,
struct batadv_hard_iface * if_outgoing ) ;
2021-08-08 20:56:17 +03:00
void batadv_orig_ifinfo_release ( struct kref * ref ) ;
2013-11-13 22:14:47 +04:00
2016-07-03 14:31:39 +03:00
int batadv_orig_dump ( struct sk_buff * msg , struct netlink_callback * cb ) ;
2013-07-31 00:16:25 +04:00
struct batadv_orig_node_vlan *
batadv_orig_node_vlan_new ( struct batadv_orig_node * orig_node ,
unsigned short vid ) ;
struct batadv_orig_node_vlan *
batadv_orig_node_vlan_get ( struct batadv_orig_node * orig_node ,
unsigned short vid ) ;
2021-08-08 20:56:17 +03:00
void batadv_orig_node_vlan_release ( struct kref * ref ) ;
2010-12-13 14:19:28 +03:00
2017-12-02 21:51:52 +03:00
/**
* batadv_choose_orig ( ) - Return the index of the orig entry in the hash table
* @ data : mac address of the originator node
* @ size : the size of the hash table
*
* Return : the hash index where the object represented by @ data should be
* stored at .
2012-05-12 04:09:43 +04:00
*/
2015-05-26 19:34:26 +03:00
static inline u32 batadv_choose_orig ( const void * data , u32 size )
2010-12-13 14:19:28 +03:00
{
2015-05-26 19:34:26 +03:00
u32 hash = 0 ;
2010-12-13 14:19:28 +03:00
2015-03-01 11:46:18 +03:00
hash = jhash ( data , ETH_ALEN , hash ) ;
2010-12-13 14:19:28 +03:00
return hash % size ;
}
2017-11-19 19:59:13 +03:00
struct batadv_orig_node *
batadv_orig_hash_find ( struct batadv_priv * bat_priv , const void * data ) ;
2011-02-18 15:28:09 +03:00
2021-08-08 20:56:17 +03:00
/**
* batadv_orig_node_vlan_put ( ) - decrement the refcounter and possibly release
* the originator - vlan object
* @ orig_vlan : the originator - vlan object to release
*/
static inline void
batadv_orig_node_vlan_put ( struct batadv_orig_node_vlan * orig_vlan )
{
if ( ! orig_vlan )
return ;
kref_put ( & orig_vlan - > refcount , batadv_orig_node_vlan_release ) ;
}
/**
* batadv_neigh_ifinfo_put ( ) - decrement the refcounter and possibly release
* the neigh_ifinfo
* @ neigh_ifinfo : the neigh_ifinfo object to release
*/
static inline void
batadv_neigh_ifinfo_put ( struct batadv_neigh_ifinfo * neigh_ifinfo )
{
if ( ! neigh_ifinfo )
return ;
kref_put ( & neigh_ifinfo - > refcount , batadv_neigh_ifinfo_release ) ;
}
/**
* batadv_hardif_neigh_put ( ) - decrement the hardif neighbors refcounter
* and possibly release it
* @ hardif_neigh : hardif neigh neighbor to free
*/
static inline void
batadv_hardif_neigh_put ( struct batadv_hardif_neigh_node * hardif_neigh )
{
if ( ! hardif_neigh )
return ;
kref_put ( & hardif_neigh - > refcount , batadv_hardif_neigh_release ) ;
}
/**
* batadv_neigh_node_put ( ) - decrement the neighbors refcounter and possibly
* release it
* @ neigh_node : neigh neighbor to free
*/
static inline void batadv_neigh_node_put ( struct batadv_neigh_node * neigh_node )
{
if ( ! neigh_node )
return ;
kref_put ( & neigh_node - > refcount , batadv_neigh_node_release ) ;
}
/**
* batadv_orig_ifinfo_put ( ) - decrement the refcounter and possibly release
* the orig_ifinfo
* @ orig_ifinfo : the orig_ifinfo object to release
*/
static inline void
batadv_orig_ifinfo_put ( struct batadv_orig_ifinfo * orig_ifinfo )
{
if ( ! orig_ifinfo )
return ;
kref_put ( & orig_ifinfo - > refcount , batadv_orig_ifinfo_release ) ;
}
/**
* batadv_orig_node_put ( ) - decrement the orig node refcounter and possibly
* release it
* @ orig_node : the orig node to free
*/
static inline void batadv_orig_node_put ( struct batadv_orig_node * orig_node )
{
if ( ! orig_node )
return ;
kref_put ( & orig_node - > refcount , batadv_orig_node_release ) ;
}
2010-12-13 14:19:28 +03:00
# endif /* _NET_BATMAN_ADV_ORIGINATOR_H_ */