2013-01-04 06:05:31 +04:00
/* Copyright (C) 2007-2013 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>, " \
2013-10-11 01:59:10 +04:00
" Simon Wunderlich <sw@simonwunderlich.de> "
2012-06-04 00:19:17 +04:00
# 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
2013-07-22 01:03:15 +04:00
# define BATADV_SOURCE_VERSION "2013.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-11-09 01:16:15 +04:00
# define BATADV_TT_LOCAL_TIMEOUT 600000 /* in milliseconds */
2012-07-01 21:07:31 +04:00
# 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 */
2012-12-25 16:14:37 +04:00
# define BATADV_TT_WORK_PERIOD 5000 /* 5 seconds */
# define BATADV_ORIG_WORK_PERIOD 1000 /* 1 second */
2012-06-30 22:01:19 +04:00
# define BATADV_DAT_ENTRY_TIMEOUT (5*60000) /* 5 mins 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
2013-03-10 02:14:23 +04:00
/* number of packets to send for broadcasts on different interface types */
# define BATADV_NUM_BCASTS_DEFAULT 1
# define BATADV_NUM_BCASTS_WIRELESS 3
# define BATADV_NUM_BCASTS_MAX 3
2011-06-26 05:37:18 +04:00
/* msecs after which an ARP_REQUEST is sent in broadcast as fallback */
# define ARP_REQ_DELAY 250
2011-11-23 14:35:44 +04:00
/* numbers of originator to contact for any PUT/GET DHT operation */
# define BATADV_DAT_CANDIDATES_NUM 3
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-09-13 20:18:46 +04:00
# define BATADV_BLA_WAIT_PERIODS 3
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
2013-01-25 14:12:39 +04:00
# define BATADV_NC_NODE_TIMEOUT 10000 /* Milliseconds */
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
2013-05-23 18:53:02 +04:00
/* Number of fragment chains for each orig_node */
# define BATADV_FRAG_BUFFER_COUNT 8
/* Maximum number of fragments for one packet */
# define BATADV_FRAG_MAX_FRAGMENTS 16
/* Maxumim size of each fragment */
# define BATADV_FRAG_MAX_FRAG_SIZE 1400
/* Time to keep fragments while waiting for rest of the fragments */
# define BATADV_FRAG_TIMEOUT 10000
2011-11-23 14:35:44 +04:00
# define BATADV_DAT_CANDIDATE_NOT_FOUND 0
# define BATADV_DAT_CANDIDATE_ORIG 1
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 */
2013-02-11 13:10:26 +04:00
# include <net/rtnetlink.h>
2010-12-13 14:19:28 +03:00
# include <linux/jiffies.h>
# include <linux/seq_file.h>
# include "types.h"
2013-04-19 20:07:00 +04:00
/**
* batadv_vlan_flags - flags for the four MSB of any vlan ID field
* @ BATADV_VLAN_HAS_TAG : whether the field contains a valid vlan tag or not
*/
enum batadv_vlan_flags {
BATADV_VLAN_HAS_TAG = BIT ( 15 ) ,
} ;
# define BATADV_PRINT_VID(vid) (vid & BATADV_VLAN_HAS_TAG ? \
( int ) ( vid & VLAN_VID_MASK ) : - 1 )
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 ) ;
2013-04-03 21:10:26 +04:00
int batadv_is_my_mac ( struct batadv_priv * bat_priv , const uint8_t * addr ) ;
2012-08-03 19:15:46 +04:00
struct batadv_hard_iface *
batadv_seq_print_text_primary_if_get ( struct seq_file * seq ) ;
2013-05-08 09:31:59 +04:00
int batadv_max_header_len ( void ) ;
2013-07-29 19:56:44 +04:00
void batadv_skb_set_priority ( struct sk_buff * skb , int offset ) ;
2012-05-12 04:09:42 +04:00
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 ) ;
2012-10-17 23:10:39 +04:00
__be32 batadv_skb_crc32 ( struct sk_buff * skb , u8 * payload_ptr ) ;
2010-12-13 14:19:28 +03:00
2012-08-27 13:45:37 +04:00
/**
* enum batadv_dbg_level - available log levels
* @ BATADV_DBG_BATMAN : OGM and TQ computations related messages
* @ BATADV_DBG_ROUTES : route added / changed / deleted
* @ BATADV_DBG_TT : translation table messages
* @ BATADV_DBG_BLA : bridge loop avoidance messages
2012-10-01 11:57:36 +04:00
* @ BATADV_DBG_DAT : ARP snooping and DAT related messages
2013-01-25 14:12:38 +04:00
* @ BATADV_DBG_NC : network coding related messages
2012-08-27 13:45:37 +04:00
* @ BATADV_DBG_ALL : the union of all the above log levels
*/
2012-07-08 18:32:09 +04:00
enum batadv_dbg_level {
BATADV_DBG_BATMAN = BIT ( 0 ) ,
2012-08-27 13:45:37 +04:00
BATADV_DBG_ROUTES = BIT ( 1 ) ,
BATADV_DBG_TT = BIT ( 2 ) ,
BATADV_DBG_BLA = BIT ( 3 ) ,
2012-10-01 11:57:36 +04:00
BATADV_DBG_DAT = BIT ( 4 ) ,
2013-01-25 14:12:38 +04:00
BATADV_DBG_NC = BIT ( 5 ) ,
BATADV_DBG_ALL = 63 ,
2012-07-08 18:32:09 +04:00
} ;
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
*
2013-09-02 02:45:08 +04:00
* note : can ' t use ether_addr_equal ( ) as it requires aligned memory
2011-02-18 15:28:08 +03:00
*/
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 )
{
2012-11-13 05:53:26 +04:00
this_cpu_add ( bat_priv - > bat_counters [ idx ] , count ) ;
2012-04-20 19:02:45 +04:00
}
# 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 ;
}
2013-01-25 14:12:41 +04:00
/* Define a macro to reach the control buffer of the skb. The members of the
* control buffer are defined in struct batadv_skb_cb in types . h .
* The macro is inspired by the similar macro TCP_SKB_CB ( ) in tcp . h .
*/
# define BATADV_SKB_CB(__skb) ((struct batadv_skb_cb *)&((__skb)->cb[0]))
2013-04-23 17:39:57 +04:00
void batadv_tvlv_container_register ( struct batadv_priv * bat_priv ,
uint8_t type , uint8_t version ,
void * tvlv_value , uint16_t tvlv_value_len ) ;
uint16_t batadv_tvlv_container_ogm_append ( struct batadv_priv * bat_priv ,
unsigned char * * packet_buff ,
int * packet_buff_len ,
int packet_min_len ) ;
void batadv_tvlv_ogm_receive ( struct batadv_priv * bat_priv ,
struct batadv_ogm_packet * batadv_ogm_packet ,
struct batadv_orig_node * orig_node ) ;
void batadv_tvlv_container_unregister ( struct batadv_priv * bat_priv ,
uint8_t type , uint8_t version ) ;
void batadv_tvlv_handler_register ( struct batadv_priv * bat_priv ,
void ( * optr ) ( struct batadv_priv * bat_priv ,
struct batadv_orig_node * orig ,
uint8_t flags ,
void * tvlv_value ,
uint16_t tvlv_value_len ) ,
int ( * uptr ) ( struct batadv_priv * bat_priv ,
uint8_t * src , uint8_t * dst ,
void * tvlv_value ,
uint16_t tvlv_value_len ) ,
uint8_t type , uint8_t version , uint8_t flags ) ;
void batadv_tvlv_handler_unregister ( struct batadv_priv * bat_priv ,
uint8_t type , uint8_t version ) ;
int batadv_tvlv_containers_process ( struct batadv_priv * bat_priv ,
bool ogm_source ,
struct batadv_orig_node * orig_node ,
uint8_t * src , uint8_t * dst ,
void * tvlv_buff , uint16_t tvlv_buff_len ) ;
void batadv_tvlv_unicast_send ( struct batadv_priv * bat_priv , uint8_t * src ,
uint8_t * dst , uint8_t type , uint8_t version ,
void * tvlv_value , uint16_t tvlv_value_len ) ;
2010-12-13 14:19:28 +03:00
# endif /* _NET_BATMAN_ADV_MAIN_H_ */