2005-04-17 02:20:36 +04:00
/*
* Linux ethernet bridge
*
* Authors :
* Lennert Buytenhek < buytenh @ gnu . org >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# ifndef _BR_PRIVATE_H
# define _BR_PRIVATE_H
# include <linux/netdevice.h>
# include <linux/if_bridge.h>
2008-07-31 03:27:55 +04:00
# include <net/route.h>
2005-04-17 02:20:36 +04:00
# define BR_HASH_BITS 8
# define BR_HASH_SIZE (1 << BR_HASH_BITS)
# define BR_HOLD_TIME (1*HZ)
# define BR_PORT_BITS 10
# define BR_MAX_PORTS (1<<BR_PORT_BITS)
2007-03-22 00:22:44 +03:00
# define BR_VERSION "2.3"
/* Path to usermode spanning tree program */
# define BR_STP_PROG " / sbin / bridge-stp"
2005-12-22 06:01:30 +03:00
2005-04-17 02:20:36 +04:00
typedef struct bridge_id bridge_id ;
typedef struct mac_addr mac_addr ;
typedef __u16 port_id ;
struct bridge_id
{
unsigned char prio [ 2 ] ;
unsigned char addr [ 6 ] ;
} ;
struct mac_addr
{
unsigned char addr [ 6 ] ;
} ;
struct net_bridge_fdb_entry
{
struct hlist_node hlist ;
struct net_bridge_port * dst ;
struct rcu_head rcu ;
atomic_t use_count ;
unsigned long ageing_timer ;
mac_addr addr ;
unsigned char is_local ;
unsigned char is_static ;
} ;
struct net_bridge_port
{
struct net_bridge * br ;
struct net_device * dev ;
struct list_head list ;
/* STP */
u8 priority ;
u8 state ;
u16 port_no ;
unsigned char topology_change_ack ;
unsigned char config_pending ;
port_id port_id ;
port_id designated_port ;
bridge_id designated_root ;
bridge_id designated_bridge ;
u32 path_cost ;
u32 designated_cost ;
struct timer_list forward_delay_timer ;
struct timer_list hold_timer ;
struct timer_list message_age_timer ;
struct kobject kobj ;
struct rcu_head rcu ;
} ;
struct net_bridge
{
spinlock_t lock ;
struct list_head port_list ;
struct net_device * dev ;
spinlock_t hash_lock ;
struct hlist_head hash [ BR_HASH_SIZE ] ;
struct list_head age_list ;
2005-12-22 06:00:58 +03:00
unsigned long feature_mask ;
2008-07-31 03:27:55 +04:00
# ifdef CONFIG_BRIDGE_NETFILTER
struct rtable fake_rtable ;
# endif
2008-06-18 03:10:06 +04:00
unsigned long flags ;
# define BR_SET_MAC_ADDR 0x00000001
2005-04-17 02:20:36 +04:00
/* STP */
bridge_id designated_root ;
bridge_id bridge_id ;
u32 root_path_cost ;
unsigned long max_age ;
unsigned long hello_time ;
unsigned long forward_delay ;
unsigned long bridge_max_age ;
unsigned long ageing_time ;
unsigned long bridge_hello_time ;
unsigned long bridge_forward_delay ;
2006-03-21 09:59:21 +03:00
u8 group_addr [ ETH_ALEN ] ;
2005-04-17 02:20:36 +04:00
u16 root_port ;
2007-03-22 00:22:44 +03:00
enum {
BR_NO_STP , /* no spanning tree */
BR_KERNEL_STP , /* old STP in kernel */
BR_USER_STP , /* new RSTP in userspace */
} stp_enabled ;
2005-04-17 02:20:36 +04:00
unsigned char topology_change ;
unsigned char topology_change_detected ;
struct timer_list hello_timer ;
struct timer_list tcn_timer ;
struct timer_list topology_change_timer ;
struct timer_list gc_timer ;
2007-12-17 22:54:39 +03:00
struct kobject * ifobj ;
2005-04-17 02:20:36 +04:00
} ;
extern struct notifier_block br_device_notifier ;
2006-03-21 09:59:21 +03:00
extern const u8 br_group_address [ ETH_ALEN ] ;
2005-04-17 02:20:36 +04:00
/* called under bridge lock */
static inline int br_is_root_bridge ( const struct net_bridge * br )
{
return ! memcmp ( & br - > bridge_id , & br - > designated_root , 8 ) ;
}
/* br_device.c */
extern void br_dev_setup ( struct net_device * dev ) ;
extern int br_dev_xmit ( struct sk_buff * skb , struct net_device * dev ) ;
/* br_fdb.c */
2007-04-07 13:57:07 +04:00
extern int br_fdb_init ( void ) ;
2005-04-17 02:20:36 +04:00
extern void br_fdb_fini ( void ) ;
2007-04-09 23:57:54 +04:00
extern void br_fdb_flush ( struct net_bridge * br ) ;
2005-04-17 02:20:36 +04:00
extern void br_fdb_changeaddr ( struct net_bridge_port * p ,
const unsigned char * newaddr ) ;
extern void br_fdb_cleanup ( unsigned long arg ) ;
extern void br_fdb_delete_by_port ( struct net_bridge * br ,
2006-10-13 01:45:38 +04:00
const struct net_bridge_port * p , int do_all ) ;
2005-04-17 02:20:36 +04:00
extern struct net_bridge_fdb_entry * __br_fdb_get ( struct net_bridge * br ,
const unsigned char * addr ) ;
extern struct net_bridge_fdb_entry * br_fdb_get ( struct net_bridge * br ,
unsigned char * addr ) ;
extern void br_fdb_put ( struct net_bridge_fdb_entry * ent ) ;
2007-02-09 17:24:35 +03:00
extern int br_fdb_fillbuf ( struct net_bridge * br , void * buf ,
2005-04-17 02:20:36 +04:00
unsigned long count , unsigned long off ) ;
extern int br_fdb_insert ( struct net_bridge * br ,
struct net_bridge_port * source ,
const unsigned char * addr ) ;
extern void br_fdb_update ( struct net_bridge * br ,
struct net_bridge_port * source ,
const unsigned char * addr ) ;
/* br_forward.c */
extern void br_deliver ( const struct net_bridge_port * to ,
struct sk_buff * skb ) ;
extern int br_dev_queue_push_xmit ( struct sk_buff * skb ) ;
extern void br_forward ( const struct net_bridge_port * to ,
struct sk_buff * skb ) ;
extern int br_forward_finish ( struct sk_buff * skb ) ;
2007-09-17 03:20:48 +04:00
extern void br_flood_deliver ( struct net_bridge * br , struct sk_buff * skb ) ;
extern void br_flood_forward ( struct net_bridge * br , struct sk_buff * skb ) ;
2005-04-17 02:20:36 +04:00
/* br_if.c */
2007-02-22 12:10:18 +03:00
extern void br_port_carrier_check ( struct net_bridge_port * p ) ;
2008-09-09 03:19:58 +04:00
extern int br_add_bridge ( struct net * net , const char * name ) ;
extern int br_del_bridge ( struct net * net , const char * name ) ;
2008-09-09 03:20:18 +04:00
extern void br_net_exit ( struct net * net ) ;
2005-04-17 02:20:36 +04:00
extern int br_add_if ( struct net_bridge * br ,
struct net_device * dev ) ;
extern int br_del_if ( struct net_bridge * br ,
struct net_device * dev ) ;
extern int br_min_mtu ( const struct net_bridge * br ) ;
2005-05-30 01:15:17 +04:00
extern void br_features_recompute ( struct net_bridge * br ) ;
2005-04-17 02:20:36 +04:00
/* br_input.c */
extern int br_handle_frame_finish ( struct sk_buff * skb ) ;
2007-03-21 23:38:47 +03:00
extern struct sk_buff * br_handle_frame ( struct net_bridge_port * p ,
struct sk_buff * skb ) ;
2005-04-17 02:20:36 +04:00
/* br_ioctl.c */
extern int br_dev_ioctl ( struct net_device * dev , struct ifreq * rq , int cmd ) ;
2007-09-17 22:56:21 +04:00
extern int br_ioctl_deviceless_stub ( struct net * net , unsigned int cmd , void __user * arg ) ;
2005-04-17 02:20:36 +04:00
/* br_netfilter.c */
2006-05-26 02:59:33 +04:00
# ifdef CONFIG_BRIDGE_NETFILTER
2005-04-17 02:20:36 +04:00
extern int br_netfilter_init ( void ) ;
extern void br_netfilter_fini ( void ) ;
2008-07-31 03:27:55 +04:00
extern void br_netfilter_rtable_init ( struct net_bridge * ) ;
2006-05-26 02:59:33 +04:00
# else
# define br_netfilter_init() (0)
# define br_netfilter_fini() do { } while(0)
2008-07-31 03:27:55 +04:00
# define br_netfilter_rtable_init(x)
2006-05-26 02:59:33 +04:00
# endif
2005-04-17 02:20:36 +04:00
/* br_stp.c */
extern void br_log_state ( const struct net_bridge_port * p ) ;
extern struct net_bridge_port * br_get_port ( struct net_bridge * br ,
2007-02-09 17:24:35 +03:00
u16 port_no ) ;
2005-04-17 02:20:36 +04:00
extern void br_init_port ( struct net_bridge_port * p ) ;
extern void br_become_designated_port ( struct net_bridge_port * p ) ;
/* br_stp_if.c */
extern void br_stp_enable_bridge ( struct net_bridge * br ) ;
extern void br_stp_disable_bridge ( struct net_bridge * br ) ;
2007-03-22 00:22:44 +03:00
extern void br_stp_set_enabled ( struct net_bridge * br , unsigned long val ) ;
2005-04-17 02:20:36 +04:00
extern void br_stp_enable_port ( struct net_bridge_port * p ) ;
extern void br_stp_disable_port ( struct net_bridge_port * p ) ;
extern void br_stp_recalculate_bridge_id ( struct net_bridge * br ) ;
2005-12-22 05:51:49 +03:00
extern void br_stp_change_bridge_id ( struct net_bridge * br , const unsigned char * a ) ;
2005-04-17 02:20:36 +04:00
extern void br_stp_set_bridge_priority ( struct net_bridge * br ,
u16 newprio ) ;
extern void br_stp_set_port_priority ( struct net_bridge_port * p ,
u8 newprio ) ;
extern void br_stp_set_path_cost ( struct net_bridge_port * p ,
u32 path_cost ) ;
extern ssize_t br_show_bridge_id ( char * buf , const struct bridge_id * id ) ;
/* br_stp_bpdu.c */
2008-07-06 08:25:56 +04:00
struct stp_proto ;
extern void br_stp_rcv ( const struct stp_proto * proto , struct sk_buff * skb ,
struct net_device * dev ) ;
2005-04-17 02:20:36 +04:00
/* br_stp_timer.c */
extern void br_stp_timer_init ( struct net_bridge * br ) ;
extern void br_stp_port_timer_init ( struct net_bridge_port * p ) ;
extern unsigned long br_timer_value ( const struct timer_list * timer ) ;
/* br.c */
extern struct net_bridge_fdb_entry * ( * br_fdb_get_hook ) ( struct net_bridge * br ,
unsigned char * addr ) ;
extern void ( * br_fdb_put_hook ) ( struct net_bridge_fdb_entry * ent ) ;
2006-05-26 03:00:12 +04:00
/* br_netlink.c */
2007-03-22 21:59:03 +03:00
extern int br_netlink_init ( void ) ;
2006-05-26 03:00:12 +04:00
extern void br_netlink_fini ( void ) ;
extern void br_ifinfo_notify ( int event , struct net_bridge_port * port ) ;
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_SYSFS
/* br_sysfs_if.c */
2006-02-10 04:10:12 +03:00
extern struct sysfs_ops brport_sysfs_ops ;
2005-04-17 02:20:36 +04:00
extern int br_sysfs_addif ( struct net_bridge_port * p ) ;
/* br_sysfs_br.c */
extern int br_sysfs_addbr ( struct net_device * dev ) ;
extern void br_sysfs_delbr ( struct net_device * dev ) ;
# else
# define br_sysfs_addif(p) (0)
# define br_sysfs_addbr(dev) (0)
# define br_sysfs_delbr(dev) do { } while(0)
# endif /* CONFIG_SYSFS */
# endif