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>
2010-06-10 20:12:50 +04:00
# include <linux/netpoll.h>
2010-06-24 00:00:48 +04:00
# include <linux/u64_stats_sync.h>
2008-07-31 03:27:55 +04:00
# include <net/route.h>
2013-02-13 16:00:09 +04:00
# include <linux/if_vlan.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)
2013-02-13 16:00:09 +04:00
# define BR_VLAN_BITMAP_LEN BITS_TO_LONGS(VLAN_N_VID)
2005-04-17 02:20:36 +04:00
2007-03-22 00:22:44 +03:00
# define BR_VERSION "2.3"
2011-10-03 22:14:46 +04:00
/* Control of forwarding link local multicast */
# define BR_GROUPFWD_DEFAULT 0
/* Don't allow forwarding control protocols like STP and LLDP */
# define BR_GROUPFWD_RESTRICTED 0x4007u
2007-03-22 00:22:44 +03:00
/* 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 ] ;
} ;
2010-04-18 07:42:07 +04:00
struct br_ip
{
union {
__be32 ip4 ;
2011-12-10 13:48:31 +04:00
# if IS_ENABLED(CONFIG_IPV6)
2010-04-22 20:54:22 +04:00
struct in6_addr ip6 ;
# endif
2010-04-18 07:42:07 +04:00
} u ;
__be16 proto ;
2013-02-13 16:00:17 +04:00
__u16 vid ;
2010-04-18 07:42:07 +04:00
} ;
2013-02-13 16:00:09 +04:00
struct net_port_vlans {
u16 port_idx ;
2013-02-13 16:00:14 +04:00
u16 pvid ;
2013-02-13 16:00:09 +04:00
union {
struct net_bridge_port * port ;
struct net_bridge * br ;
} parent ;
struct rcu_head rcu ;
unsigned long vlan_bitmap [ BR_VLAN_BITMAP_LEN ] ;
2013-02-13 16:00:20 +04:00
unsigned long untagged_bitmap [ BR_VLAN_BITMAP_LEN ] ;
2013-02-13 16:00:13 +04:00
u16 num_vlans ;
2013-02-13 16:00:09 +04:00
} ;
2005-04-17 02:20:36 +04:00
struct net_bridge_fdb_entry
{
struct hlist_node hlist ;
struct net_bridge_port * dst ;
struct rcu_head rcu ;
2011-04-04 18:03:28 +04:00
unsigned long updated ;
unsigned long used ;
2005-04-17 02:20:36 +04:00
mac_addr addr ;
unsigned char is_local ;
unsigned char is_static ;
2013-02-13 16:00:16 +04:00
__u16 vlan_id ;
2005-04-17 02:20:36 +04:00
} ;
2010-02-27 22:41:45 +03:00
struct net_bridge_port_group {
struct net_bridge_port * port ;
2010-11-15 09:38:10 +03:00
struct net_bridge_port_group __rcu * next ;
2010-02-27 22:41:45 +03:00
struct hlist_node mglist ;
struct rcu_head rcu ;
struct timer_list timer ;
2010-04-18 07:42:07 +04:00
struct br_ip addr ;
2012-12-15 02:09:51 +04:00
unsigned char state ;
2010-02-27 22:41:45 +03:00
} ;
struct net_bridge_mdb_entry
{
struct hlist_node hlist [ 2 ] ;
struct net_bridge * br ;
2010-11-15 09:38:10 +03:00
struct net_bridge_port_group __rcu * ports ;
2010-02-27 22:41:45 +03:00
struct rcu_head rcu ;
struct timer_list timer ;
2010-04-18 07:42:07 +04:00
struct br_ip addr ;
2011-02-12 12:05:42 +03:00
bool mglist ;
2010-02-27 22:41:45 +03:00
} ;
struct net_bridge_mdb_htable
{
struct hlist_head * mhash ;
struct rcu_head rcu ;
struct net_bridge_mdb_htable * old ;
u32 size ;
u32 max ;
u32 secret ;
u32 ver ;
} ;
2005-04-17 02:20:36 +04:00
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 ;
2011-07-22 11:47:06 +04:00
unsigned long designated_age ;
2005-04-17 02:20:36 +04:00
struct timer_list forward_delay_timer ;
struct timer_list hold_timer ;
struct timer_list message_age_timer ;
struct kobject kobj ;
struct rcu_head rcu ;
2009-08-13 10:55:16 +04:00
unsigned long flags ;
# define BR_HAIRPIN_MODE 0x00000001
2012-11-13 11:53:07 +04:00
# define BR_BPDU_GUARD 0x00000002
2012-11-13 11:53:08 +04:00
# define BR_ROOT_BLOCK 0x00000004
2012-12-06 01:24:45 +04:00
# define BR_MULTICAST_FAST_LEAVE 0x00000008
2010-02-27 22:41:45 +03:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
u32 multicast_startup_queries_sent ;
unsigned char multicast_router ;
struct timer_list multicast_router_timer ;
struct timer_list multicast_query_timer ;
struct hlist_head mglist ;
struct hlist_node rlist ;
# endif
2010-05-10 13:31:11 +04:00
# ifdef CONFIG_SYSFS
char sysfs_name [ IFNAMSIZ ] ;
# endif
2010-06-10 20:12:50 +04:00
# ifdef CONFIG_NET_POLL_CONTROLLER
struct netpoll * np ;
# endif
2013-02-13 16:00:09 +04:00
# ifdef CONFIG_BRIDGE_VLAN_FILTERING
struct net_port_vlans __rcu * vlan_info ;
# endif
2005-04-17 02:20:36 +04:00
} ;
2010-06-15 10:50:45 +04:00
# define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
2010-11-15 09:38:13 +03:00
static inline struct net_bridge_port * br_port_get_rcu ( const struct net_device * dev )
{
2012-10-24 12:13:03 +04:00
struct net_bridge_port * port =
rcu_dereference_rtnl ( dev - > rx_handler_data ) ;
2010-11-15 09:38:13 +03:00
return br_port_exists ( dev ) ? port : NULL ;
}
2010-11-15 09:38:14 +03:00
static inline struct net_bridge_port * br_port_get_rtnl ( struct net_device * dev )
2010-11-15 09:38:13 +03:00
{
2010-11-15 09:38:14 +03:00
return br_port_exists ( dev ) ?
rtnl_dereference ( dev - > rx_handler_data ) : NULL ;
2010-11-15 09:38:13 +03:00
}
2010-04-21 06:06:52 +04:00
struct br_cpu_netstats {
2010-06-24 00:00:48 +04:00
u64 rx_packets ;
u64 rx_bytes ;
u64 tx_packets ;
u64 tx_bytes ;
struct u64_stats_sync syncp ;
2010-04-21 06:06:52 +04:00
} ;
2005-04-17 02:20:36 +04:00
struct net_bridge
{
spinlock_t lock ;
struct list_head port_list ;
struct net_device * dev ;
2010-03-02 16:32:09 +03:00
2010-04-21 06:06:52 +04:00
struct br_cpu_netstats __percpu * stats ;
2005-04-17 02:20:36 +04:00
spinlock_t hash_lock ;
struct hlist_head hash [ BR_HASH_SIZE ] ;
2008-07-31 03:27:55 +04:00
# ifdef CONFIG_BRIDGE_NETFILTER
struct rtable fake_rtable ;
2010-07-02 11:32:57 +04:00
bool nf_call_iptables ;
bool nf_call_ip6tables ;
bool nf_call_arptables ;
2008-07-31 03:27:55 +04:00
# endif
2011-10-03 22:14:46 +04:00
u16 group_fwd_mask ;
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 ;
2010-02-27 22:41:45 +03:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
unsigned char multicast_router ;
u8 multicast_disabled : 1 ;
2012-04-13 06:37:42 +04:00
u8 multicast_querier : 1 ;
2010-02-27 22:41:45 +03:00
u32 hash_elasticity ;
u32 hash_max ;
u32 multicast_last_member_count ;
u32 multicast_startup_queries_sent ;
u32 multicast_startup_query_count ;
unsigned long multicast_last_member_interval ;
unsigned long multicast_membership_interval ;
unsigned long multicast_querier_interval ;
unsigned long multicast_query_interval ;
unsigned long multicast_query_response_interval ;
unsigned long multicast_startup_query_interval ;
spinlock_t multicast_lock ;
2010-11-15 09:38:10 +03:00
struct net_bridge_mdb_htable __rcu * mdb ;
2010-02-27 22:41:45 +03:00
struct hlist_head router_list ;
struct timer_list multicast_router_timer ;
struct timer_list multicast_querier_timer ;
struct timer_list multicast_query_timer ;
# endif
2005-04-17 02:20:36 +04:00
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 ;
2013-02-13 16:00:09 +04:00
# ifdef CONFIG_BRIDGE_VLAN_FILTERING
u8 vlan_enabled ;
struct net_port_vlans __rcu * vlan_info ;
# endif
2005-04-17 02:20:36 +04:00
} ;
2010-02-27 22:41:40 +03:00
struct br_input_skb_cb {
struct net_device * brdev ;
2010-03-16 00:51:18 +03:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
2010-02-27 22:41:45 +03:00
int igmp ;
int mrouters_only ;
2010-03-16 00:51:18 +03:00
# endif
2010-02-27 22:41:40 +03:00
} ;
# define BR_INPUT_SKB_CB(__skb) ((struct br_input_skb_cb *)(__skb)->cb)
2010-03-16 00:51:18 +03:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb) (BR_INPUT_SKB_CB(__skb)->mrouters_only)
# else
# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb) (0)
# endif
2010-05-10 13:31:09 +04:00
# define br_printk(level, br, format, args...) \
printk ( level " %s: " format , ( br ) - > dev - > name , # # args )
# define br_err(__br, format, args...) \
br_printk ( KERN_ERR , __br , format , # # args )
# define br_warn(__br, format, args...) \
br_printk ( KERN_WARNING , __br , format , # # args )
# define br_notice(__br, format, args...) \
br_printk ( KERN_NOTICE , __br , format , # # args )
# define br_info(__br, format, args...) \
br_printk ( KERN_INFO , __br , format , # # args )
# define br_debug(br, format, args...) \
pr_debug ( " %s: " format , ( br ) - > dev - > name , # # args )
2005-04-17 02:20:36 +04:00
extern struct notifier_block br_device_notifier ;
/* 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 ) ;
2011-10-06 15:19:41 +04:00
extern void br_dev_delete ( struct net_device * dev , struct list_head * list ) ;
2009-08-31 23:50:41 +04:00
extern netdev_tx_t br_dev_xmit ( struct sk_buff * skb ,
struct net_device * dev ) ;
2010-05-10 13:31:08 +04:00
# ifdef CONFIG_NET_POLL_CONTROLLER
2010-06-10 20:12:50 +04:00
static inline struct netpoll_info * br_netpoll_info ( struct net_bridge * br )
{
return br - > dev - > npinfo ;
}
static inline void br_netpoll_send_skb ( const struct net_bridge_port * p ,
struct sk_buff * skb )
{
struct netpoll * np = p - > np ;
if ( np )
netpoll_send_skb ( np , skb ) ;
}
2012-08-10 05:24:37 +04:00
extern int br_netpoll_enable ( struct net_bridge_port * p , gfp_t gfp ) ;
2010-06-10 20:12:50 +04:00
extern void br_netpoll_disable ( struct net_bridge_port * p ) ;
2010-05-10 13:31:08 +04:00
# else
2010-06-10 20:12:50 +04:00
static inline struct netpoll_info * br_netpoll_info ( struct net_bridge * br )
{
return NULL ;
}
2010-06-16 08:43:48 +04:00
static inline void br_netpoll_send_skb ( const struct net_bridge_port * p ,
2010-06-10 20:12:50 +04:00
struct sk_buff * skb )
{
}
2010-05-10 13:31:08 +04:00
2012-08-10 05:24:37 +04:00
static inline int br_netpoll_enable ( struct net_bridge_port * p , gfp_t gfp )
2010-06-10 20:12:50 +04:00
{
return 0 ;
}
static inline void br_netpoll_disable ( struct net_bridge_port * p )
{
}
2010-05-10 13:31:08 +04:00
# endif
2005-04-17 02:20:36 +04:00
/* 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 ) ;
2011-12-08 11:17:49 +04:00
extern void br_fdb_change_mac_address ( struct net_bridge * br , const u8 * newaddr ) ;
2005-04-17 02:20:36 +04:00
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 ,
2013-02-13 16:00:16 +04:00
const unsigned char * addr ,
__u16 vid ) ;
2009-06-05 09:35:28 +04:00
extern int br_fdb_test_addr ( struct net_device * dev , unsigned char * addr ) ;
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 ,
2013-02-13 16:00:19 +04:00
const unsigned char * addr ,
u16 vid ) ;
2005-04-17 02:20:36 +04:00
extern void br_fdb_update ( struct net_bridge * br ,
struct net_bridge_port * source ,
2013-02-13 16:00:16 +04:00
const unsigned char * addr ,
u16 vid ) ;
2013-02-13 16:00:19 +04:00
extern int fdb_delete_by_addr ( struct net_bridge * br , const u8 * addr , u16 vid ) ;
2012-04-15 10:43:56 +04:00
2013-02-13 16:00:18 +04:00
extern int br_fdb_delete ( struct ndmsg * ndm , struct nlattr * tb [ ] ,
2012-04-15 10:43:56 +04:00
struct net_device * dev ,
2012-09-17 14:03:26 +04:00
const unsigned char * addr ) ;
2012-10-01 16:32:33 +04:00
extern int br_fdb_add ( struct ndmsg * nlh , struct nlattr * tb [ ] ,
2012-04-15 10:43:56 +04:00
struct net_device * dev ,
2012-09-17 14:03:26 +04:00
const unsigned char * addr ,
2012-04-15 10:43:56 +04:00
u16 nlh_flags ) ;
extern int br_fdb_dump ( struct sk_buff * skb ,
struct netlink_callback * cb ,
struct net_device * dev ,
int idx ) ;
2005-04-17 02:20:36 +04:00
/* 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 ,
2010-03-16 10:26:22 +03:00
struct sk_buff * skb , struct sk_buff * skb0 ) ;
2005-04-17 02:20:36 +04:00
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 ) ;
2010-02-27 22:41:41 +03:00
extern void br_flood_forward ( struct net_bridge * br , struct sk_buff * skb ,
struct sk_buff * skb2 ) ;
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 ) ;
2011-11-15 19:29:55 +04:00
extern netdev_features_t br_features_recompute ( struct net_bridge * br ,
netdev_features_t features ) ;
2005-04-17 02:20:36 +04:00
/* br_input.c */
extern int br_handle_frame_finish ( struct sk_buff * skb ) ;
2011-03-12 06:14:39 +03:00
extern rx_handler_result_t br_handle_frame ( struct sk_buff * * pskb ) ;
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
2010-02-27 22:41:45 +03:00
/* br_multicast.c */
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
2012-12-10 06:15:35 +04:00
extern unsigned int br_mdb_rehash_seq ;
2010-02-27 22:41:45 +03:00
extern int br_multicast_rcv ( struct net_bridge * br ,
struct net_bridge_port * port ,
struct sk_buff * skb ) ;
extern struct net_bridge_mdb_entry * br_mdb_get ( struct net_bridge * br ,
struct sk_buff * skb ) ;
extern void br_multicast_add_port ( struct net_bridge_port * port ) ;
extern void br_multicast_del_port ( struct net_bridge_port * port ) ;
extern void br_multicast_enable_port ( struct net_bridge_port * port ) ;
extern void br_multicast_disable_port ( struct net_bridge_port * port ) ;
extern void br_multicast_init ( struct net_bridge * br ) ;
extern void br_multicast_open ( struct net_bridge * br ) ;
extern void br_multicast_stop ( struct net_bridge * br ) ;
2010-02-27 22:41:46 +03:00
extern void br_multicast_deliver ( struct net_bridge_mdb_entry * mdst ,
struct sk_buff * skb ) ;
extern void br_multicast_forward ( struct net_bridge_mdb_entry * mdst ,
struct sk_buff * skb , struct sk_buff * skb2 ) ;
2010-02-27 22:41:49 +03:00
extern int br_multicast_set_router ( struct net_bridge * br , unsigned long val ) ;
extern int br_multicast_set_port_router ( struct net_bridge_port * p ,
unsigned long val ) ;
2010-02-27 22:41:50 +03:00
extern int br_multicast_toggle ( struct net_bridge * br , unsigned long val ) ;
2012-04-13 06:37:42 +04:00
extern int br_multicast_set_querier ( struct net_bridge * br , unsigned long val ) ;
2010-02-27 22:41:51 +03:00
extern int br_multicast_set_hash_max ( struct net_bridge * br , unsigned long val ) ;
2012-12-12 02:23:08 +04:00
extern struct net_bridge_mdb_entry * br_mdb_ip_get (
struct net_bridge_mdb_htable * mdb ,
struct br_ip * dst ) ;
extern struct net_bridge_mdb_entry * br_multicast_new_group ( struct net_bridge * br ,
struct net_bridge_port * port , struct br_ip * group ) ;
extern void br_multicast_free_pg ( struct rcu_head * head ) ;
extern struct net_bridge_port_group * br_multicast_new_port_group (
struct net_bridge_port * port ,
struct br_ip * group ,
2012-12-15 02:09:51 +04:00
struct net_bridge_port_group * next ,
unsigned char state ) ;
2012-12-07 04:04:48 +04:00
extern void br_mdb_init ( void ) ;
2012-12-19 13:13:48 +04:00
extern void br_mdb_uninit ( void ) ;
2012-12-12 02:23:07 +04:00
extern void br_mdb_notify ( struct net_device * dev , struct net_bridge_port * port ,
struct br_ip * group , int type ) ;
2010-03-01 12:53:04 +03:00
2012-12-12 02:23:08 +04:00
# define mlock_dereference(X, br) \
rcu_dereference_protected ( X , lockdep_is_held ( & br - > multicast_lock ) )
# if IS_ENABLED(CONFIG_IPV6)
# include <net/addrconf.h>
static inline int ipv6_is_transient_multicast ( const struct in6_addr * addr )
{
if ( ipv6_addr_is_multicast ( addr ) & & IPV6_ADDR_MC_FLAG_TRANSIENT ( addr ) )
return 1 ;
return 0 ;
}
# endif
2010-03-01 12:53:04 +03:00
static inline bool br_multicast_is_router ( struct net_bridge * br )
{
return br - > multicast_router = = 2 | |
( br - > multicast_router = = 1 & &
timer_pending ( & br - > multicast_router_timer ) ) ;
}
2010-02-27 22:41:45 +03:00
# else
static inline int br_multicast_rcv ( struct net_bridge * br ,
struct net_bridge_port * port ,
struct sk_buff * skb )
{
return 0 ;
}
static inline struct net_bridge_mdb_entry * br_mdb_get ( struct net_bridge * br ,
struct sk_buff * skb )
{
return NULL ;
}
static inline void br_multicast_add_port ( struct net_bridge_port * port )
{
}
static inline void br_multicast_del_port ( struct net_bridge_port * port )
{
}
static inline void br_multicast_enable_port ( struct net_bridge_port * port )
{
}
static inline void br_multicast_disable_port ( struct net_bridge_port * port )
{
}
static inline void br_multicast_init ( struct net_bridge * br )
{
}
static inline void br_multicast_open ( struct net_bridge * br )
{
}
static inline void br_multicast_stop ( struct net_bridge * br )
{
}
2010-02-27 22:41:46 +03:00
static inline void br_multicast_deliver ( struct net_bridge_mdb_entry * mdst ,
struct sk_buff * skb )
{
}
static inline void br_multicast_forward ( struct net_bridge_mdb_entry * mdst ,
struct sk_buff * skb ,
struct sk_buff * skb2 )
{
}
2010-02-27 22:41:45 +03:00
static inline bool br_multicast_is_router ( struct net_bridge * br )
{
2010-03-01 12:53:04 +03:00
return 0 ;
2010-02-27 22:41:45 +03:00
}
2013-01-03 15:30:43 +04:00
static inline void br_mdb_init ( void )
{
}
static inline void br_mdb_uninit ( void )
{
}
2010-03-01 12:53:04 +03:00
# endif
2010-02-27 22:41:45 +03:00
2013-02-13 16:00:09 +04:00
/* br_vlan.c */
# ifdef CONFIG_BRIDGE_VLAN_FILTERING
2013-02-13 16:00:10 +04:00
extern bool br_allowed_ingress ( struct net_bridge * br , struct net_port_vlans * v ,
2013-02-13 16:00:14 +04:00
struct sk_buff * skb , u16 * vid ) ;
2013-02-13 16:00:11 +04:00
extern bool br_allowed_egress ( struct net_bridge * br ,
const struct net_port_vlans * v ,
const struct sk_buff * skb ) ;
2013-02-13 16:00:14 +04:00
extern struct sk_buff * br_handle_vlan ( struct net_bridge * br ,
const struct net_port_vlans * v ,
struct sk_buff * skb ) ;
2013-02-13 16:00:15 +04:00
extern int br_vlan_add ( struct net_bridge * br , u16 vid , u16 flags ) ;
2013-02-13 16:00:09 +04:00
extern int br_vlan_delete ( struct net_bridge * br , u16 vid ) ;
extern void br_vlan_flush ( struct net_bridge * br ) ;
extern int br_vlan_filter_toggle ( struct net_bridge * br , unsigned long val ) ;
2013-02-13 16:00:15 +04:00
extern int nbp_vlan_add ( struct net_bridge_port * port , u16 vid , u16 flags ) ;
2013-02-13 16:00:09 +04:00
extern int nbp_vlan_delete ( struct net_bridge_port * port , u16 vid ) ;
extern void nbp_vlan_flush ( struct net_bridge_port * port ) ;
2013-02-13 16:00:19 +04:00
extern bool nbp_vlan_find ( struct net_bridge_port * port , u16 vid ) ;
2013-02-13 16:00:10 +04:00
static inline struct net_port_vlans * br_get_vlan_info (
const struct net_bridge * br )
{
2013-02-13 16:00:18 +04:00
return rcu_dereference_rtnl ( br - > vlan_info ) ;
2013-02-13 16:00:10 +04:00
}
static inline struct net_port_vlans * nbp_get_vlan_info (
const struct net_bridge_port * p )
{
2013-02-13 16:00:18 +04:00
return rcu_dereference_rtnl ( p - > vlan_info ) ;
2013-02-13 16:00:10 +04:00
}
/* Since bridge now depends on 8021Q module, but the time bridge sees the
* skb , the vlan tag will always be present if the frame was tagged .
*/
static inline int br_vlan_get_tag ( const struct sk_buff * skb , u16 * vid )
{
int err = 0 ;
if ( vlan_tx_tag_present ( skb ) )
* vid = vlan_tx_tag_get ( skb ) & VLAN_VID_MASK ;
else {
* vid = 0 ;
err = - EINVAL ;
}
return err ;
}
2013-02-13 16:00:14 +04:00
static inline u16 br_get_pvid ( const struct net_port_vlans * v )
{
/* Return just the VID if it is set, or VLAN_N_VID (invalid vid) if
* vid wasn ' t set
*/
smp_rmb ( ) ;
return ( v - > pvid & VLAN_TAG_PRESENT ) ?
( v - > pvid & ~ VLAN_TAG_PRESENT ) :
VLAN_N_VID ;
}
2013-02-13 16:00:09 +04:00
# else
2013-02-13 16:00:10 +04:00
static inline bool br_allowed_ingress ( struct net_bridge * br ,
struct net_port_vlans * v ,
2013-02-13 16:00:14 +04:00
struct sk_buff * skb ,
u16 * vid )
2013-02-13 16:00:10 +04:00
{
return true ;
}
2013-02-13 16:00:11 +04:00
static inline bool br_allowed_egress ( struct net_bridge * br ,
const struct net_port_vlans * v ,
const struct sk_buff * skb )
{
return true ;
}
2013-02-13 16:00:14 +04:00
static inline struct sk_buff * br_handle_vlan ( struct net_bridge * br ,
const struct net_port_vlans * v ,
struct sk_buff * skb )
{
return skb ;
}
2013-02-13 16:00:15 +04:00
static inline int br_vlan_add ( struct net_bridge * br , u16 vid , u16 flags )
2013-02-13 16:00:09 +04:00
{
return - EOPNOTSUPP ;
}
static inline int br_vlan_delete ( struct net_bridge * br , u16 vid )
{
return - EOPNOTSUPP ;
}
static inline void br_vlan_flush ( struct net_bridge * br )
{
}
2013-02-13 16:00:15 +04:00
static inline int nbp_vlan_add ( struct net_bridge_port * port , u16 vid , u16 flags )
2013-02-13 16:00:09 +04:00
{
return - EOPNOTSUPP ;
}
static inline int nbp_vlan_delete ( struct net_bridge_port * port , u16 vid )
{
return - EOPNOTSUPP ;
}
static inline void nbp_vlan_flush ( struct net_bridge_port * port )
{
}
2013-02-13 16:00:10 +04:00
static inline struct net_port_vlans * br_get_vlan_info (
const struct net_bridge * br )
{
return NULL ;
}
static inline struct net_port_vlans * nbp_get_vlan_info (
const struct net_bridge_port * p )
{
return NULL ;
}
2013-02-13 16:00:19 +04:00
static inline bool nbp_vlan_find ( struct net_bridge_port * port , u16 vid )
{
return false ;
}
2013-02-13 16:00:14 +04:00
static inline u16 br_vlan_get_tag ( const struct sk_buff * skb , u16 * tag )
2013-02-13 16:00:10 +04:00
{
return 0 ;
}
2013-02-13 16:00:14 +04:00
static inline u16 br_get_pvid ( const struct net_port_vlans * v )
{
return VLAN_N_VID ; /* Returns invalid vid */
}
2013-02-13 16:00:09 +04:00
# endif
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 ) ;
2011-04-04 18:03:33 +04:00
extern int br_set_forward_delay ( struct net_bridge * br , unsigned long x ) ;
extern int br_set_hello_time ( struct net_bridge * br , unsigned long x ) ;
extern int br_set_max_age ( struct net_bridge * br , unsigned long x ) ;
2005-04-17 02:20:36 +04:00
/* 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 ) ;
2011-03-24 16:24:01 +03:00
extern bool 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 ) ;
2011-04-04 18:03:33 +04:00
extern int br_stp_set_port_priority ( struct net_bridge_port * p ,
unsigned long newprio ) ;
extern int br_stp_set_path_cost ( struct net_bridge_port * p ,
unsigned long path_cost ) ;
2005-04-17 02:20:36 +04:00
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 */
2011-12-12 06:58:25 +04:00
# if IS_ENABLED(CONFIG_ATM_LANE)
2009-06-05 09:35:28 +04:00
extern int ( * br_fdb_test_addr_hook ) ( struct net_device * dev , unsigned char * addr ) ;
# endif
2005-04-17 02:20:36 +04:00
2006-05-26 03:00:12 +04:00
/* br_netlink.c */
2012-06-26 09:48:45 +04:00
extern struct rtnl_link_ops br_link_ops ;
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 ) ;
2012-10-24 12:12:57 +04:00
extern int br_setlink ( struct net_device * dev , struct nlmsghdr * nlmsg ) ;
2013-02-13 16:00:12 +04:00
extern int br_dellink ( struct net_device * dev , struct nlmsghdr * nlmsg ) ;
2012-10-24 12:12:57 +04:00
extern int br_getlink ( struct sk_buff * skb , u32 pid , u32 seq ,
2013-02-13 16:00:13 +04:00
struct net_device * dev , u32 filter_mask ) ;
2006-05-26 03:00:12 +04:00
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_SYSFS
/* br_sysfs_if.c */
2010-01-19 04:58:23 +03:00
extern const struct sysfs_ops brport_sysfs_ops ;
2005-04-17 02:20:36 +04:00
extern int br_sysfs_addif ( struct net_bridge_port * p ) ;
2010-05-10 13:31:11 +04:00
extern int br_sysfs_renameif ( struct net_bridge_port * p ) ;
2005-04-17 02:20:36 +04:00
/* br_sysfs_br.c */
extern int br_sysfs_addbr ( struct net_device * dev ) ;
extern void br_sysfs_delbr ( struct net_device * dev ) ;
# else
2012-11-04 02:02:30 +04:00
static inline int br_sysfs_addif ( struct net_bridge_port * p ) { return 0 ; }
static inline int br_sysfs_renameif ( struct net_bridge_port * p ) { return 0 ; }
static inline int br_sysfs_addbr ( struct net_device * dev ) { return 0 ; }
static inline void br_sysfs_delbr ( struct net_device * dev ) { return ; }
2005-04-17 02:20:36 +04:00
# endif /* CONFIG_SYSFS */
# endif