2006-01-02 19:04:38 +01:00
/*
* net / tipc / core . h : Include file for TIPC global declarations
2007-02-09 23:25:21 +09:00
*
2006-01-11 19:14:19 +01:00
* Copyright ( c ) 2005 - 2006 , Ericsson AB
2008-05-05 01:22:59 -07:00
* Copyright ( c ) 2005 - 2007 , Wind River Systems
2006-01-02 19:04:38 +01:00
* All rights reserved .
*
2006-01-11 13:30:43 +01:00
* Redistribution and use in source and binary forms , with or without
2006-01-02 19:04:38 +01:00
* modification , are permitted provided that the following conditions are met :
*
2006-01-11 13:30:43 +01:00
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. Neither the names of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission .
2006-01-02 19:04:38 +01:00
*
2006-01-11 13:30:43 +01:00
* Alternatively , this software may be distributed under the terms of the
* GNU General Public License ( " GPL " ) version 2 as published by the Free
* Software Foundation .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
* CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
2006-01-02 19:04:38 +01:00
* POSSIBILITY OF SUCH DAMAGE .
*/
# ifndef _TIPC_CORE_H
# define _TIPC_CORE_H
2006-01-13 10:45:44 +00:00
# include <linux/tipc.h>
# include <linux/tipc_config.h>
# include <net/tipc/tipc_msg.h>
# include <net/tipc/tipc_port.h>
# include <net/tipc/tipc_bearer.h>
2006-01-02 19:04:38 +01:00
# include <net/tipc/tipc.h>
# include <linux/types.h>
# include <linux/kernel.h>
# include <linux/errno.h>
# include <linux/mm.h>
# include <linux/timer.h>
# include <linux/string.h>
# include <asm/uaccess.h>
# include <linux/interrupt.h>
# include <asm/atomic.h>
# include <asm/hardirq.h>
# include <linux/netdevice.h>
2007-02-09 23:25:21 +09:00
# include <linux/in.h>
2006-01-02 19:04:38 +01:00
# include <linux/list.h>
# include <linux/vmalloc.h>
/*
2008-05-05 01:23:34 -07:00
* TIPC sanity test macros
2006-01-02 19:04:38 +01:00
*/
# define assert(i) BUG_ON(!(i))
/*
2008-05-05 01:23:34 -07:00
* TIPC system monitoring code
2006-01-02 19:04:38 +01:00
*/
2007-02-09 23:25:21 +09:00
/*
2008-05-05 01:23:34 -07:00
* TIPC ' s print buffer subsystem supports the following print buffers :
2006-01-02 19:04:38 +01:00
*
2008-05-05 01:23:34 -07:00
* TIPC_NULL : null buffer ( i . e . print nowhere )
* TIPC_CONS : system console
* TIPC_LOG : TIPC log buffer
* & buf : user - defined buffer ( struct print_buf * )
2008-05-05 01:22:30 -07:00
*
* Note : TIPC_LOG is configured to echo its output to the system console ;
* user - defined buffers can be configured to do the same thing .
2006-01-02 19:04:38 +01:00
*/
2008-05-05 01:23:34 -07:00
extern struct print_buf * const TIPC_NULL ;
extern struct print_buf * const TIPC_CONS ;
extern struct print_buf * const TIPC_LOG ;
void tipc_printf ( struct print_buf * , const char * fmt , . . . ) ;
/*
* TIPC_OUTPUT is the destination print buffer for system messages .
*/
2006-01-02 19:04:38 +01:00
# ifndef TIPC_OUTPUT
2008-05-05 01:22:30 -07:00
# define TIPC_OUTPUT TIPC_LOG
2006-01-02 19:04:38 +01:00
# endif
/*
2008-05-05 01:23:34 -07:00
* TIPC can be configured to send system messages to TIPC_OUTPUT
* or to the system console only .
2006-01-02 19:04:38 +01:00
*/
2008-05-05 01:23:34 -07:00
# ifdef CONFIG_TIPC_DEBUG
# define err(fmt, arg...) tipc_printf(TIPC_OUTPUT, \
KERN_ERR " TIPC: " fmt , # # arg )
# define warn(fmt, arg...) tipc_printf(TIPC_OUTPUT, \
KERN_WARNING " TIPC: " fmt , # # arg )
# define info(fmt, arg...) tipc_printf(TIPC_OUTPUT, \
KERN_NOTICE " TIPC: " fmt , # # arg )
# else
2006-01-11 13:52:51 +01:00
# define err(fmt, arg...) printk(KERN_ERR "TIPC: " fmt , ## arg)
# define info(fmt, arg...) printk(KERN_INFO "TIPC: " fmt , ## arg)
# define warn(fmt, arg...) printk(KERN_WARNING "TIPC: " fmt , ## arg)
2006-01-02 19:04:38 +01:00
2008-05-05 01:23:34 -07:00
# endif
2006-01-02 19:04:38 +01:00
2008-05-05 01:23:34 -07:00
/*
* DBG_OUTPUT is the destination print buffer for debug messages .
* It defaults to the the null print buffer , but can be redefined
* ( typically in the individual . c files being debugged ) to allow
* selected debug messages to be generated where needed .
*/
# ifndef DBG_OUTPUT
# define DBG_OUTPUT TIPC_NULL
# endif
2006-06-25 23:40:35 -07:00
2007-02-09 23:25:21 +09:00
/*
2008-05-05 01:23:34 -07:00
* TIPC can be configured to send debug messages to the specified print buffer
* ( typically DBG_OUTPUT ) or to suppress them entirely .
2006-06-25 23:40:35 -07:00
*/
2008-05-05 01:23:34 -07:00
# ifdef CONFIG_TIPC_DEBUG
2006-06-25 23:40:35 -07:00
2008-05-05 01:23:34 -07:00
# define dbg(fmt, arg...) \
do { \
if ( DBG_OUTPUT ! = TIPC_NULL ) \
tipc_printf ( DBG_OUTPUT , fmt , # # arg ) ; \
} while ( 0 )
# define msg_dbg(msg, txt) \
do { \
if ( DBG_OUTPUT ! = TIPC_NULL ) \
2008-05-05 01:24:06 -07:00
tipc_msg_dbg ( DBG_OUTPUT , msg , txt ) ; \
2008-05-05 01:23:34 -07:00
} while ( 0 )
# define dump(fmt, arg...) \
do { \
if ( DBG_OUTPUT ! = TIPC_NULL ) \
2008-05-05 01:24:06 -07:00
tipc_dump_dbg ( DBG_OUTPUT , fmt , # # arg ) ; \
2008-05-05 01:23:34 -07:00
} while ( 0 )
2008-05-05 01:24:06 -07:00
void tipc_msg_dbg ( struct print_buf * , struct tipc_msg * , const char * ) ;
void tipc_dump_dbg ( struct print_buf * , const char * fmt , . . . ) ;
2008-05-05 01:23:34 -07:00
# else
# define dbg(fmt, arg...) do {} while (0)
# define msg_dbg(msg, txt) do {} while (0)
# define dump(fmt, arg...) do {} while (0)
2008-05-05 01:24:06 -07:00
# define tipc_msg_dbg(...) do {} while (0)
# define tipc_dump_dbg(...) do {} while (0)
2006-06-25 23:40:35 -07:00
2007-02-09 23:25:21 +09:00
# endif
2006-01-02 19:04:38 +01:00
2007-02-09 23:25:21 +09:00
/*
2006-01-02 19:04:38 +01:00
* TIPC - specific error codes
*/
# define ELINKCONG EAGAIN /* link congestion <=> resource unavailable */
/*
* Global configuration variables
*/
extern u32 tipc_own_addr ;
extern int tipc_max_zones ;
extern int tipc_max_clusters ;
extern int tipc_max_nodes ;
extern int tipc_max_slaves ;
extern int tipc_max_ports ;
extern int tipc_max_subscriptions ;
extern int tipc_max_publications ;
extern int tipc_net_id ;
extern int tipc_remote_management ;
/*
* Other global variables
*/
extern int tipc_mode ;
extern int tipc_random ;
extern const char tipc_alphabet [ ] ;
extern atomic_t tipc_user_count ;
/*
* Routines available to privileged subsystems
*/
2006-01-18 00:38:21 +01:00
extern int tipc_core_start ( void ) ;
extern void tipc_core_stop ( void ) ;
2008-05-21 14:55:04 -07:00
extern int tipc_core_start_net ( unsigned long addr ) ;
2006-01-18 00:38:21 +01:00
extern void tipc_core_stop_net ( void ) ;
2008-03-06 15:06:06 -08:00
extern int tipc_handler_start ( void ) ;
extern void tipc_handler_stop ( void ) ;
extern int tipc_netlink_start ( void ) ;
extern void tipc_netlink_stop ( void ) ;
extern int tipc_socket_init ( void ) ;
extern void tipc_socket_stop ( void ) ;
2006-01-02 19:04:38 +01:00
static inline int delimit ( int val , int min , int max )
{
if ( val > max )
return max ;
if ( val < min )
return min ;
return val ;
}
/*
* TIPC timer and signal code
*/
typedef void ( * Handler ) ( unsigned long ) ;
2006-01-18 00:38:21 +01:00
u32 tipc_k_signal ( Handler routine , unsigned long argument ) ;
2006-01-02 19:04:38 +01:00
/**
* k_init_timer - initialize a timer
* @ timer : pointer to timer structure
* @ routine : pointer to routine to invoke when timer expires
* @ argument : value to pass to routine when timer expires
2007-02-09 23:25:21 +09:00
*
2006-01-02 19:04:38 +01:00
* Timer must be initialized before use ( and terminated when no longer needed ) .
*/
2007-02-09 23:25:21 +09:00
static inline void k_init_timer ( struct timer_list * timer , Handler routine ,
2006-01-02 19:04:38 +01:00
unsigned long argument )
{
dbg ( " initializing timer %p \n " , timer ) ;
2008-01-23 21:20:07 -08:00
setup_timer ( timer , routine , argument ) ;
2006-01-02 19:04:38 +01:00
}
/**
* k_start_timer - start a timer
* @ timer : pointer to timer structure
* @ msec : time to delay ( in ms )
2007-02-09 23:25:21 +09:00
*
2006-01-02 19:04:38 +01:00
* Schedules a previously initialized timer for later execution .
* If timer is already running , the new timeout overrides the previous request .
2007-02-09 23:25:21 +09:00
*
2006-01-02 19:04:38 +01:00
* To ensure the timer doesn ' t expire before the specified delay elapses ,
* the amount of delay is rounded up when converting to the jiffies
2007-02-09 23:25:21 +09:00
* then an additional jiffy is added to account for the fact that
2006-01-02 19:04:38 +01:00
* the starting time may be in the middle of the current jiffy .
*/
static inline void k_start_timer ( struct timer_list * timer , unsigned long msec )
{
dbg ( " starting timer %p for %u \n " , timer , msec ) ;
mod_timer ( timer , jiffies + msecs_to_jiffies ( msec ) + 1 ) ;
}
/**
* k_cancel_timer - cancel a timer
* @ timer : pointer to timer structure
2007-02-09 23:25:21 +09:00
*
* Cancels a previously initialized timer .
2006-01-02 19:04:38 +01:00
* Can be called safely even if the timer is already inactive .
2007-02-09 23:25:21 +09:00
*
2006-01-02 19:04:38 +01:00
* WARNING : Must not be called when holding locks required by the timer ' s
* timeout routine , otherwise deadlock can occur on SMP systems !
*/
static inline void k_cancel_timer ( struct timer_list * timer )
{
dbg ( " cancelling timer %p \n " , timer ) ;
del_timer_sync ( timer ) ;
}
/**
* k_term_timer - terminate a timer
* @ timer : pointer to timer structure
2007-02-09 23:25:21 +09:00
*
2006-01-02 19:04:38 +01:00
* Prevents further use of a previously initialized timer .
2007-02-09 23:25:21 +09:00
*
2006-01-02 19:04:38 +01:00
* WARNING : Caller must ensure timer isn ' t currently running .
2007-02-09 23:25:21 +09:00
*
2006-01-02 19:04:38 +01:00
* ( Do not " enhance " this routine to automatically cancel an active timer ,
* otherwise deadlock can arise when a timeout routine calls k_term_timer . )
*/
static inline void k_term_timer ( struct timer_list * timer )
{
dbg ( " terminating timer %p \n " , timer ) ;
}
/*
* TIPC message buffer code
*
2008-05-08 21:38:24 -07:00
* TIPC message buffer headroom reserves space for the worst - case
* link - level device header ( in case the message is sent off - node ) .
2006-10-16 21:50:20 -07:00
*
2008-05-08 21:38:24 -07:00
* Note : Headroom should be a multiple of 4 to ensure the TIPC header fields
* are word aligned for quicker access
2006-01-02 19:04:38 +01:00
*/
2008-05-08 21:38:24 -07:00
# define BUF_HEADROOM LL_MAX_HEADER
2006-01-02 19:04:38 +01:00
struct tipc_skb_cb {
void * handle ;
} ;
# define TIPC_SKB_CB(__skb) ((struct tipc_skb_cb *)&((__skb)->cb[0]))
static inline struct tipc_msg * buf_msg ( struct sk_buff * skb )
{
return ( struct tipc_msg * ) skb - > data ;
}
/**
* buf_acquire - creates a TIPC message buffer
* @ size : message size ( including TIPC header )
*
2006-07-03 19:39:36 -07:00
* Returns a new buffer with data pointers set to the specified size .
2007-02-09 23:25:21 +09:00
*
2006-07-03 19:39:36 -07:00
* NOTE : Headroom is reserved to allow prepending of a data link header .
* There may also be unrequested tailroom present at the buffer ' s end .
2006-01-02 19:04:38 +01:00
*/
static inline struct sk_buff * buf_acquire ( u32 size )
{
struct sk_buff * skb ;
unsigned int buf_size = ( BUF_HEADROOM + size + 3 ) & ~ 3u ;
2008-04-15 19:02:30 -07:00
skb = alloc_skb_fclone ( buf_size , GFP_ATOMIC ) ;
2006-01-02 19:04:38 +01:00
if ( skb ) {
skb_reserve ( skb , BUF_HEADROOM ) ;
skb_put ( skb , size ) ;
skb - > next = NULL ;
}
return skb ;
}
/**
* buf_discard - frees a TIPC message buffer
* @ skb : message buffer
*
2006-06-25 23:42:19 -07:00
* Frees a message buffer . If passed NULL , just returns .
2006-01-02 19:04:38 +01:00
*/
static inline void buf_discard ( struct sk_buff * skb )
{
2008-04-15 19:01:43 -07:00
kfree_skb ( skb ) ;
2006-01-02 19:04:38 +01:00
}
2008-04-15 19:03:23 -07:00
/**
* buf_linearize - convert a TIPC message buffer into a single contiguous piece
* @ skb : message buffer
*
* Returns 0 on success .
*/
static inline int buf_linearize ( struct sk_buff * skb )
{
return skb_linearize ( skb ) ;
}
2007-02-09 23:25:21 +09:00
# endif