2012-05-12 04:09:43 +04:00
/* Copyright (C) 2007-2012 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_MAIN_H_
# define _NET_BATMAN_ADV_MAIN_H_
2012-06-04 00:19:17 +04:00
# define BATADV_DRIVER_AUTHOR "Marek Lindner <lindner_marek@yahoo.de>, " \
" Simon Wunderlich <siwu@hrz.tu-chemnitz.de> "
# define BATADV_DRIVER_DESC "B.A.T.M.A.N. advanced"
# define BATADV_DRIVER_DEVICE "batman-adv"
2010-12-13 14:19:28 +03:00
2012-06-04 00:19:17 +04:00
# ifndef BATADV_SOURCE_VERSION
2012-08-19 23:48:25 +04:00
# define BATADV_SOURCE_VERSION "2012.4.0"
2011-07-05 12:42:51 +04:00
# endif
2010-12-13 14:19:28 +03:00
/* B.A.T.M.A.N. parameters */
2012-06-04 00:19:17 +04:00
# define BATADV_TQ_MAX_VALUE 255
# define BATADV_JITTER 20
2010-12-13 14:19:28 +03:00
2012-05-12 04:09:43 +04:00
/* Time To Live of broadcast messages */
2012-06-04 00:19:17 +04:00
# define BATADV_TTL 50
2011-05-08 14:45:45 +04:00
/* purge originators after time in seconds if no valid packet comes in
2012-06-04 00:19:17 +04:00
* - > TODO : check influence on BATADV_TQ_LOCAL_WINDOW_SIZE
2012-05-12 04:09:43 +04:00
*/
2012-06-04 00:19:17 +04:00
# define BATADV_PURGE_TIMEOUT 200000 /* 200 seconds */
2012-07-01 21:07:31 +04:00
# define BATADV_TT_LOCAL_TIMEOUT 3600000 /* in milliseconds */
# define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000 /* in milliseconds */
2012-07-06 01:38:29 +04:00
# define BATADV_TT_CLIENT_TEMP_TIMEOUT 600000 /* in milliseconds */
2011-07-09 19:52:13 +04:00
/* sliding packet range of received originator messages in sequence numbers
2012-05-12 04:09:43 +04:00
* ( should be a multiple of our word size )
*/
2012-06-04 00:19:17 +04:00
# define BATADV_TQ_LOCAL_WINDOW_SIZE 64
2012-07-01 21:07:31 +04:00
/* milliseconds we have to keep pending tt_req */
2012-06-04 00:19:17 +04:00
# define BATADV_TT_REQUEST_TIMEOUT 3000
2011-04-27 16:27:44 +04:00
2012-06-04 00:19:17 +04:00
# define BATADV_TQ_GLOBAL_WINDOW_SIZE 5
# define BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
# define BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM 1
# define BATADV_TQ_TOTAL_BIDRECT_LIMIT 1
2010-12-13 14:19:28 +03:00
2012-06-04 00:19:17 +04:00
/* number of OGMs sent with the last tt diff */
# define BATADV_TT_OGM_APPEND_MAX 3
2011-04-27 16:27:44 +04:00
2012-05-12 04:09:43 +04:00
/* Time in which a client can roam at most ROAMING_MAX_COUNT times in
2012-07-01 21:07:31 +04:00
* milliseconds
2012-05-12 04:09:43 +04:00
*/
2012-06-04 00:19:17 +04:00
# define BATADV_ROAMING_MAX_TIME 20000
# define BATADV_ROAMING_MAX_COUNT 5
2011-04-27 16:27:57 +04:00
2012-06-04 00:19:17 +04:00
# define BATADV_NO_FLAGS 0
2011-06-09 19:13:09 +04:00
2012-06-04 00:19:17 +04:00
# define BATADV_NULL_IFINDEX 0 /* dummy ifindex used to avoid iface checks */
2011-07-07 17:35:35 +04:00
2012-06-04 00:19:17 +04:00
# define BATADV_NUM_WORDS BITS_TO_LONGS(BATADV_TQ_LOCAL_WINDOW_SIZE)
2010-12-13 14:19:28 +03:00
2012-06-04 00:19:17 +04:00
# define BATADV_LOG_BUF_LEN 8192 /* has to be a power of 2 */
2010-12-13 14:19:28 +03:00
2012-06-04 00:19:17 +04:00
# define BATADV_VIS_INTERVAL 5000 /* 5 seconds */
2010-12-13 14:19:28 +03:00
2011-05-08 14:45:45 +04:00
/* how much worse secondary interfaces may be to be considered as bonding
2012-05-12 04:09:43 +04:00
* candidates
*/
2012-06-04 00:19:17 +04:00
# define BATADV_BONDING_TQ_THRESHOLD 50
2010-12-13 14:19:28 +03:00
2011-05-08 14:45:45 +04:00
/* should not be bigger than 512 bytes or change the size of
2012-05-12 04:09:43 +04:00
* forw_packet - > direct_link_flags
*/
2012-06-04 00:19:17 +04:00
# define BATADV_MAX_AGGREGATION_BYTES 512
# define BATADV_MAX_AGGREGATION_MS 100
2010-12-13 14:19:28 +03:00
2012-06-04 00:19:17 +04:00
# define BATADV_BLA_PERIOD_LENGTH 10000 /* 10 seconds */
# define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3)
# define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10)
2012-01-22 23:00:24 +04:00
2012-06-04 00:19:17 +04:00
# define BATADV_DUPLIST_SIZE 16
# define BATADV_DUPLIST_TIMEOUT 500 /* 500 ms */
2011-05-08 14:45:45 +04:00
/* don't reset again within 30 seconds */
2012-06-04 00:19:17 +04:00
# define BATADV_RESET_PROTECTION_MS 30000
# define BATADV_EXPECTED_SEQNO_RANGE 65536
2010-12-13 14:19:28 +03:00
2012-06-04 00:19:22 +04:00
enum batadv_mesh_state {
BATADV_MESH_INACTIVE ,
BATADV_MESH_ACTIVE ,
BATADV_MESH_DEACTIVATING ,
2011-06-04 13:26:00 +04:00
} ;
2010-12-13 14:19:28 +03:00
2012-06-04 00:19:17 +04:00
# define BATADV_BCAST_QUEUE_LEN 256
# define BATADV_BATMAN_QUEUE_LEN 256
2010-12-13 14:19:28 +03:00
2012-06-04 00:19:22 +04:00
enum batadv_uev_action {
BATADV_UEV_ADD = 0 ,
BATADV_UEV_DEL ,
BATADV_UEV_CHANGE ,
2011-04-26 20:26:01 +04:00
} ;
2012-06-04 00:19:22 +04:00
enum batadv_uev_type {
BATADV_UEV_GW = 0 ,
2011-04-26 20:26:01 +04:00
} ;
2012-06-04 00:19:17 +04:00
# define BATADV_GW_THRESHOLD 50
2011-04-26 23:31:45 +04:00
2012-03-07 12:07:46 +04:00
/* Debug Messages */
2010-12-13 14:19:28 +03:00
# ifdef pr_fmt
# undef pr_fmt
# endif
2011-05-08 14:45:45 +04:00
/* Append 'batman-adv: ' before kernel messages */
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2010-12-13 14:19:28 +03:00
2012-03-07 12:07:46 +04:00
/* Kernel headers */
2010-12-13 14:19:28 +03:00
# include <linux/mutex.h> /* mutex */
# include <linux/module.h> /* needed by all modules */
# include <linux/netdevice.h> /* netdevice */
2011-07-09 19:52:13 +04:00
# include <linux/etherdevice.h> /* ethernet address classification */
2010-12-13 14:19:28 +03:00
# include <linux/if_ether.h> /* ethernet header */
# include <linux/poll.h> /* poll_table */
# include <linux/kthread.h> /* kernel threads */
# include <linux/pkt_sched.h> /* schedule types */
# include <linux/workqueue.h> /* workqueue */
2012-04-20 19:02:45 +04:00
# include <linux/percpu.h>
2010-12-13 14:19:28 +03:00
# include <linux/slab.h>
# include <net/sock.h> /* struct sock */
# include <linux/jiffies.h>
# include <linux/seq_file.h>
# include "types.h"
2012-05-12 04:09:42 +04:00
extern char batadv_routing_algo [ ] ;
extern struct list_head batadv_hardif_list ;
extern unsigned char batadv_broadcast_addr [ ] ;
extern struct workqueue_struct * batadv_event_workqueue ;
int batadv_mesh_init ( struct net_device * soft_iface ) ;
void batadv_mesh_free ( struct net_device * soft_iface ) ;
void batadv_inc_module_count ( void ) ;
void batadv_dec_module_count ( void ) ;
int batadv_is_my_mac ( const uint8_t * addr ) ;
int batadv_batman_skb_recv ( struct sk_buff * skb , struct net_device * dev ,
struct packet_type * ptype ,
struct net_device * orig_dev ) ;
2012-06-06 00:31:31 +04:00
int
batadv_recv_handler_register ( uint8_t packet_type ,
int ( * recv_handler ) ( struct sk_buff * ,
struct batadv_hard_iface * ) ) ;
2012-05-12 04:09:42 +04:00
void batadv_recv_handler_unregister ( uint8_t packet_type ) ;
2012-06-06 00:31:31 +04:00
int batadv_algo_register ( struct batadv_algo_ops * bat_algo_ops ) ;
int batadv_algo_select ( struct batadv_priv * bat_priv , char * name ) ;
2012-05-12 04:09:42 +04:00
int batadv_algo_seq_print_text ( struct seq_file * seq , void * offset ) ;
2010-12-13 14:19:28 +03:00
2012-07-08 18:32:09 +04:00
/* all messages related to routing / flooding / broadcasting / etc */
enum batadv_dbg_level {
BATADV_DBG_BATMAN = BIT ( 0 ) ,
BATADV_DBG_ROUTES = BIT ( 1 ) , /* route added / changed / deleted */
BATADV_DBG_TT = BIT ( 2 ) , /* translation table operations */
BATADV_DBG_BLA = BIT ( 3 ) , /* bridge loop avoidance */
BATADV_DBG_ALL = 15 ,
} ;
2010-12-13 14:19:28 +03:00
# ifdef CONFIG_BATMAN_ADV_DEBUG
2012-06-06 00:31:31 +04:00
int batadv_debug_log ( struct batadv_priv * bat_priv , const char * fmt , . . . )
2012-05-12 04:09:23 +04:00
__printf ( 2 , 3 ) ;
2010-12-13 14:19:28 +03:00
2012-05-12 15:48:58 +04:00
# define batadv_dbg(type, bat_priv, fmt, arg...) \
2010-12-13 14:19:28 +03:00
do { \
if ( atomic_read ( & bat_priv - > log_level ) & type ) \
2012-05-12 04:09:23 +04:00
batadv_debug_log ( bat_priv , fmt , # # arg ) ; \
2010-12-13 14:19:28 +03:00
} \
while ( 0 )
# else /* !CONFIG_BATMAN_ADV_DEBUG */
2011-05-15 01:14:46 +04:00
__printf ( 3 , 4 )
2012-05-12 15:48:58 +04:00
static inline void batadv_dbg ( int type __always_unused ,
2012-06-06 00:31:31 +04:00
struct batadv_priv * bat_priv __always_unused ,
2012-05-12 15:48:58 +04:00
const char * fmt __always_unused , . . . )
2010-12-13 14:19:28 +03:00
{
}
# endif
2012-05-16 22:23:22 +04:00
# define batadv_info(net_dev, fmt, arg...) \
2010-12-13 14:19:28 +03:00
do { \
struct net_device * _netdev = ( net_dev ) ; \
2012-06-06 00:31:31 +04:00
struct batadv_priv * _batpriv = netdev_priv ( _netdev ) ; \
2012-06-04 00:19:22 +04:00
batadv_dbg ( BATADV_DBG_ALL , _batpriv , fmt , # # arg ) ; \
2010-12-13 14:19:28 +03:00
pr_info ( " %s: " fmt , _netdev - > name , # # arg ) ; \
} while ( 0 )
2012-05-16 22:23:22 +04:00
# define batadv_err(net_dev, fmt, arg...) \
2010-12-13 14:19:28 +03:00
do { \
struct net_device * _netdev = ( net_dev ) ; \
2012-06-06 00:31:31 +04:00
struct batadv_priv * _batpriv = netdev_priv ( _netdev ) ; \
2012-06-04 00:19:22 +04:00
batadv_dbg ( BATADV_DBG_ALL , _batpriv , fmt , # # arg ) ; \
2010-12-13 14:19:28 +03:00
pr_err ( " %s: " fmt , _netdev - > name , # # arg ) ; \
} while ( 0 )
2012-05-12 04:09:43 +04:00
/* returns 1 if they are the same ethernet addr
2011-02-18 15:28:08 +03:00
*
* note : can ' t use compare_ether_addr ( ) as it requires aligned memory
*/
2012-05-12 15:48:58 +04:00
static inline int batadv_compare_eth ( const void * data1 , const void * data2 )
2011-02-18 15:28:08 +03:00
{
return ( memcmp ( data1 , data2 , ETH_ALEN ) = = 0 ? 1 : 0 ) ;
}
2012-07-10 14:55:09 +04:00
/**
* has_timed_out - compares current time ( jiffies ) and timestamp + timeout
2011-12-08 16:32:41 +04:00
* @ timestamp : base value to compare with ( in jiffies )
* @ timeout : added to base value before comparing ( in milliseconds )
*
* Returns true if current time is after timestamp + timeout
*/
2012-05-12 15:48:58 +04:00
static inline bool batadv_has_timed_out ( unsigned long timestamp ,
unsigned int timeout )
2011-12-08 16:32:41 +04:00
{
return time_is_before_jiffies ( timestamp + msecs_to_jiffies ( timeout ) ) ;
}
2011-05-15 01:14:50 +04:00
2012-05-16 22:23:22 +04:00
# define batadv_atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0)
2011-04-20 11:52:56 +04:00
2011-05-18 11:20:50 +04:00
/* Returns the smallest signed integer in two's complement with the sizeof x */
2012-05-16 22:23:22 +04:00
# define batadv_smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
2011-05-18 11:20:50 +04:00
/* Checks if a sequence number x is a predecessor/successor of y.
* they handle overflows / underflows and can correctly check for a
* predecessor / successor unless the variable sequence number has grown by
* more then 2 * * ( bitwidth ( x ) - 1 ) - 1.
* This means that for a uint8_t with the maximum value 255 , it would think :
* - when adding nothing - it is neither a predecessor nor a successor
* - before adding more than 127 to the starting value - it is a predecessor ,
* - when adding 128 - it is neither a predecessor nor a successor ,
2012-05-12 04:09:43 +04:00
* - after adding more than 127 to the starting value - it is a successor
*/
2012-05-16 22:23:22 +04:00
# define batadv_seq_before(x, y) ({typeof(x) _d1 = (x); \
typeof ( y ) _d2 = ( y ) ; \
typeof ( x ) _dummy = ( _d1 - _d2 ) ; \
( void ) ( & _d1 = = & _d2 ) ; \
_dummy > batadv_smallest_signed_int ( _dummy ) ; } )
# define batadv_seq_after(x, y) batadv_seq_before(y, x)
2011-05-18 11:20:50 +04:00
2012-04-20 19:02:45 +04:00
/* Stop preemption on local cpu while incrementing the counter */
2012-06-06 00:31:31 +04:00
static inline void batadv_add_counter ( struct batadv_priv * bat_priv , size_t idx ,
2012-04-20 19:02:45 +04:00
size_t count )
{
int cpu = get_cpu ( ) ;
per_cpu_ptr ( bat_priv - > bat_counters , cpu ) [ idx ] + = count ;
put_cpu ( ) ;
}
# define batadv_inc_counter(b, i) batadv_add_counter(b, i, 1)
/* Sum and return the cpu-local counters for index 'idx' */
2012-06-06 00:31:31 +04:00
static inline uint64_t batadv_sum_counter ( struct batadv_priv * bat_priv ,
size_t idx )
2012-04-20 19:02:45 +04:00
{
2012-06-23 13:46:05 +04:00
uint64_t * counters , sum = 0 ;
2012-04-20 19:02:45 +04:00
int cpu ;
for_each_possible_cpu ( cpu ) {
counters = per_cpu_ptr ( bat_priv - > bat_counters , cpu ) ;
sum + = counters [ idx ] ;
}
return sum ;
}
2010-12-13 14:19:28 +03:00
# endif /* _NET_BATMAN_ADV_MAIN_H_ */