2005-04-16 15:20:36 -07: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 16:12:50 +00:00
# include <linux/netpoll.h>
2010-06-23 13:00:48 -07:00
# include <linux/u64_stats_sync.h>
2008-07-30 16:27:55 -07:00
# include <net/route.h>
2013-02-13 12:00:09 +00:00
# include <linux/if_vlan.h>
2005-04-16 15:20:36 -07: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 12:00:09 +00:00
# define BR_VLAN_BITMAP_LEN BITS_TO_LONGS(VLAN_N_VID)
2005-04-16 15:20:36 -07:00
2007-03-21 14:22:44 -07:00
# define BR_VERSION "2.3"
2011-10-03 18:14:46 +00: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-21 14:22:44 -07:00
/* Path to usermode spanning tree program */
# define BR_STP_PROG " / sbin / bridge-stp"
2005-12-21 19:01:30 -08:00
2005-04-16 15:20:36 -07: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 12:42:07 +09:00
struct br_ip
{
union {
__be32 ip4 ;
2011-12-10 09:48:31 +00:00
# if IS_ENABLED(CONFIG_IPV6)
2010-04-23 01:54:22 +09:00
struct in6_addr ip6 ;
# endif
2010-04-18 12:42:07 +09:00
} u ;
__be16 proto ;
2013-02-13 12:00:17 +00:00
__u16 vid ;
2010-04-18 12:42:07 +09:00
} ;
2013-08-30 17:28:17 +02:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
/* our own querier */
struct bridge_mcast_query {
struct timer_list timer ;
u32 startup_sent ;
} ;
/* other querier */
struct bridge_mcast_querier {
struct timer_list timer ;
unsigned long delay_time ;
} ;
# endif
2013-02-13 12:00:09 +00:00
struct net_port_vlans {
u16 port_idx ;
2013-02-13 12:00:14 +00:00
u16 pvid ;
2013-02-13 12:00:09 +00: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 12:00:20 +00:00
unsigned long untagged_bitmap [ BR_VLAN_BITMAP_LEN ] ;
2013-02-13 12:00:13 +00:00
u16 num_vlans ;
2013-02-13 12:00:09 +00:00
} ;
2005-04-16 15:20:36 -07:00
struct net_bridge_fdb_entry
{
struct hlist_node hlist ;
struct net_bridge_port * dst ;
struct rcu_head rcu ;
2011-04-04 14:03:28 +00:00
unsigned long updated ;
unsigned long used ;
2005-04-16 15:20:36 -07:00
mac_addr addr ;
unsigned char is_local ;
unsigned char is_static ;
2013-02-13 12:00:16 +00:00
__u16 vlan_id ;
2005-04-16 15:20:36 -07:00
} ;
2010-02-27 19:41:45 +00:00
struct net_bridge_port_group {
struct net_bridge_port * port ;
2010-11-15 06:38:10 +00:00
struct net_bridge_port_group __rcu * next ;
2010-02-27 19:41:45 +00:00
struct hlist_node mglist ;
struct rcu_head rcu ;
struct timer_list timer ;
2010-04-18 12:42:07 +09:00
struct br_ip addr ;
2012-12-14 22:09:51 +00:00
unsigned char state ;
2010-02-27 19:41:45 +00:00
} ;
struct net_bridge_mdb_entry
{
struct hlist_node hlist [ 2 ] ;
struct net_bridge * br ;
2010-11-15 06:38:10 +00:00
struct net_bridge_port_group __rcu * ports ;
2010-02-27 19:41:45 +00:00
struct rcu_head rcu ;
struct timer_list timer ;
2010-04-18 12:42:07 +09:00
struct br_ip addr ;
2011-02-12 01:05:42 -08:00
bool mglist ;
2013-05-21 21:52:55 +00:00
bool timer_armed ;
2010-02-27 19:41:45 +00: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-16 15:20:36 -07: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 07:47:06 +00:00
unsigned long designated_age ;
2005-04-16 15:20:36 -07: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 06:55:16 +00:00
unsigned long flags ;
# define BR_HAIRPIN_MODE 0x00000001
2012-11-13 07:53:07 +00:00
# define BR_BPDU_GUARD 0x00000002
2012-11-13 07:53:08 +00:00
# define BR_ROOT_BLOCK 0x00000004
2012-12-05 16:24:45 -05:00
# define BR_MULTICAST_FAST_LEAVE 0x00000008
2013-04-13 14:06:07 +00:00
# define BR_ADMIN_COST 0x00000010
2013-06-05 10:08:00 -04:00
# define BR_LEARNING 0x00000020
2013-06-05 10:08:01 -04:00
# define BR_FLOOD 0x00000040
2010-02-27 19:41:45 +00:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
2013-08-30 17:28:17 +02:00
struct bridge_mcast_query ip4_query ;
# if IS_ENABLED(CONFIG_IPV6)
struct bridge_mcast_query ip6_query ;
# endif /* IS_ENABLED(CONFIG_IPV6) */
2010-02-27 19:41:45 +00:00
unsigned char multicast_router ;
struct timer_list multicast_router_timer ;
struct hlist_head mglist ;
struct hlist_node rlist ;
# endif
2010-05-10 09:31:11 +00:00
# ifdef CONFIG_SYSFS
char sysfs_name [ IFNAMSIZ ] ;
# endif
2010-06-10 16:12:50 +00:00
# ifdef CONFIG_NET_POLL_CONTROLLER
struct netpoll * np ;
# endif
2013-02-13 12:00:09 +00:00
# ifdef CONFIG_BRIDGE_VLAN_FILTERING
struct net_port_vlans __rcu * vlan_info ;
# endif
2005-04-16 15:20:36 -07:00
} ;
2010-06-15 06:50:45 +00:00
# define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
2010-11-15 06:38:13 +00:00
static inline struct net_bridge_port * br_port_get_rcu ( const struct net_device * dev )
{
2013-09-14 22:42:28 +08:00
return rcu_dereference ( dev - > rx_handler_data ) ;
2010-11-15 06:38:13 +00:00
}
2013-09-14 22:42:27 +08:00
static inline struct net_bridge_port * br_port_get_rtnl ( const struct net_device * dev )
2010-11-15 06:38:13 +00:00
{
2010-11-15 06:38:14 +00:00
return br_port_exists ( dev ) ?
rtnl_dereference ( dev - > rx_handler_data ) : NULL ;
2010-11-15 06:38:13 +00:00
}
2010-04-20 19:06:52 -07:00
struct br_cpu_netstats {
2010-06-23 13:00:48 -07:00
u64 rx_packets ;
u64 rx_bytes ;
u64 tx_packets ;
u64 tx_bytes ;
struct u64_stats_sync syncp ;
2010-04-20 19:06:52 -07:00
} ;
2005-04-16 15:20:36 -07:00
struct net_bridge
{
spinlock_t lock ;
struct list_head port_list ;
struct net_device * dev ;
2010-03-02 13:32:09 +00:00
2010-04-20 19:06:52 -07:00
struct br_cpu_netstats __percpu * stats ;
2005-04-16 15:20:36 -07:00
spinlock_t hash_lock ;
struct hlist_head hash [ BR_HASH_SIZE ] ;
2008-07-30 16:27:55 -07:00
# ifdef CONFIG_BRIDGE_NETFILTER
struct rtable fake_rtable ;
2010-07-02 09:32:57 +02:00
bool nf_call_iptables ;
bool nf_call_ip6tables ;
bool nf_call_arptables ;
2008-07-30 16:27:55 -07:00
# endif
2011-10-03 18:14:46 +00:00
u16 group_fwd_mask ;
2005-04-16 15:20:36 -07: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-20 22:59:21 -08:00
u8 group_addr [ ETH_ALEN ] ;
2005-04-16 15:20:36 -07:00
u16 root_port ;
2007-03-21 14:22:44 -07: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-16 15:20:36 -07:00
unsigned char topology_change ;
unsigned char topology_change_detected ;
2010-02-27 19:41:45 +00:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
unsigned char multicast_router ;
u8 multicast_disabled : 1 ;
2012-04-13 02:37:42 +00:00
u8 multicast_querier : 1 ;
2013-05-21 21:52:54 +00:00
u8 multicast_query_use_ifaddr : 1 ;
2010-02-27 19:41:45 +00:00
u32 hash_elasticity ;
u32 hash_max ;
u32 multicast_last_member_count ;
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 06:38:10 +00:00
struct net_bridge_mdb_htable __rcu * mdb ;
2010-02-27 19:41:45 +00:00
struct hlist_head router_list ;
struct timer_list multicast_router_timer ;
2013-08-30 17:28:17 +02:00
struct bridge_mcast_querier ip4_querier ;
struct bridge_mcast_query ip4_query ;
# if IS_ENABLED(CONFIG_IPV6)
struct bridge_mcast_querier ip6_querier ;
struct bridge_mcast_query ip6_query ;
# endif /* IS_ENABLED(CONFIG_IPV6) */
2010-02-27 19:41:45 +00:00
# endif
2005-04-16 15:20:36 -07: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 15:54:39 -04:00
struct kobject * ifobj ;
2013-02-13 12:00:09 +00:00
# ifdef CONFIG_BRIDGE_VLAN_FILTERING
u8 vlan_enabled ;
struct net_port_vlans __rcu * vlan_info ;
# endif
2005-04-16 15:20:36 -07:00
} ;
2010-02-27 19:41:40 +00:00
struct br_input_skb_cb {
struct net_device * brdev ;
2010-03-15 21:51:18 +00:00
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
2010-02-27 19:41:45 +00:00
int igmp ;
int mrouters_only ;
2010-03-15 21:51:18 +00:00
# endif
2010-02-27 19:41:40 +00:00
} ;
# define BR_INPUT_SKB_CB(__skb) ((struct br_input_skb_cb *)(__skb)->cb)
2010-03-15 21:51:18 +00: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 09:31:09 +00: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-16 15:20:36 -07: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 */
2013-10-18 13:48:22 -07:00
void br_dev_setup ( struct net_device * dev ) ;
void br_dev_delete ( struct net_device * dev , struct list_head * list ) ;
netdev_tx_t br_dev_xmit ( struct sk_buff * skb , struct net_device * dev ) ;
2010-05-10 09:31:08 +00:00
# ifdef CONFIG_NET_POLL_CONTROLLER
2010-06-10 16:12:50 +00:00
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 ) ;
}
2013-10-18 13:48:22 -07:00
int br_netpoll_enable ( struct net_bridge_port * p , gfp_t gfp ) ;
void br_netpoll_disable ( struct net_bridge_port * p ) ;
2010-05-10 09:31:08 +00:00
# else
2010-06-15 21:43:48 -07:00
static inline void br_netpoll_send_skb ( const struct net_bridge_port * p ,
2010-06-10 16:12:50 +00:00
struct sk_buff * skb )
{
}
2010-05-10 09:31:08 +00:00
2012-08-10 01:24:37 +00:00
static inline int br_netpoll_enable ( struct net_bridge_port * p , gfp_t gfp )
2010-06-10 16:12:50 +00:00
{
return 0 ;
}
static inline void br_netpoll_disable ( struct net_bridge_port * p )
{
}
2010-05-10 09:31:08 +00:00
# endif
2005-04-16 15:20:36 -07:00
/* br_fdb.c */
2013-10-18 13:48:22 -07:00
int br_fdb_init ( void ) ;
void br_fdb_fini ( void ) ;
void br_fdb_flush ( struct net_bridge * br ) ;
void br_fdb_changeaddr ( struct net_bridge_port * p , const unsigned char * newaddr ) ;
void br_fdb_change_mac_address ( struct net_bridge * br , const u8 * newaddr ) ;
void br_fdb_cleanup ( unsigned long arg ) ;
void br_fdb_delete_by_port ( struct net_bridge * br ,
const struct net_bridge_port * p , int do_all ) ;
struct net_bridge_fdb_entry * __br_fdb_get ( struct net_bridge * br ,
const unsigned char * addr , __u16 vid ) ;
int br_fdb_test_addr ( struct net_device * dev , unsigned char * addr ) ;
int br_fdb_fillbuf ( struct net_bridge * br , void * buf , unsigned long count ,
unsigned long off ) ;
int br_fdb_insert ( struct net_bridge * br , struct net_bridge_port * source ,
const unsigned char * addr , u16 vid ) ;
void br_fdb_update ( struct net_bridge * br , struct net_bridge_port * source ,
const unsigned char * addr , u16 vid ) ;
int fdb_delete_by_addr ( struct net_bridge * br , const u8 * addr , u16 vid ) ;
int br_fdb_delete ( struct ndmsg * ndm , struct nlattr * tb [ ] ,
struct net_device * dev , const unsigned char * addr ) ;
int br_fdb_add ( struct ndmsg * nlh , struct nlattr * tb [ ] , struct net_device * dev ,
const unsigned char * addr , u16 nlh_flags ) ;
int br_fdb_dump ( struct sk_buff * skb , struct netlink_callback * cb ,
struct net_device * dev , int idx ) ;
2005-04-16 15:20:36 -07:00
/* br_forward.c */
2013-10-18 13:48:22 -07:00
void br_deliver ( const struct net_bridge_port * to , struct sk_buff * skb ) ;
int br_dev_queue_push_xmit ( struct sk_buff * skb ) ;
void br_forward ( const struct net_bridge_port * to ,
2010-03-16 00:26:22 -07:00
struct sk_buff * skb , struct sk_buff * skb0 ) ;
2013-10-18 13:48:22 -07:00
int br_forward_finish ( struct sk_buff * skb ) ;
void br_flood_deliver ( struct net_bridge * br , struct sk_buff * skb , bool unicast ) ;
void br_flood_forward ( struct net_bridge * br , struct sk_buff * skb ,
struct sk_buff * skb2 , bool unicast ) ;
2005-04-16 15:20:36 -07:00
/* br_if.c */
2013-10-18 13:48:22 -07:00
void br_port_carrier_check ( struct net_bridge_port * p ) ;
int br_add_bridge ( struct net * net , const char * name ) ;
int br_del_bridge ( struct net * net , const char * name ) ;
void br_net_exit ( struct net * net ) ;
int br_add_if ( struct net_bridge * br , struct net_device * dev ) ;
int br_del_if ( struct net_bridge * br , struct net_device * dev ) ;
int br_min_mtu ( const struct net_bridge * br ) ;
netdev_features_t br_features_recompute ( struct net_bridge * br ,
netdev_features_t features ) ;
2005-04-16 15:20:36 -07:00
/* br_input.c */
2013-10-18 13:48:22 -07:00
int br_handle_frame_finish ( struct sk_buff * skb ) ;
rx_handler_result_t br_handle_frame ( struct sk_buff * * pskb ) ;
2005-04-16 15:20:36 -07:00
/* br_ioctl.c */
2013-10-18 13:48:22 -07:00
int br_dev_ioctl ( struct net_device * dev , struct ifreq * rq , int cmd ) ;
int br_ioctl_deviceless_stub ( struct net * net , unsigned int cmd ,
void __user * arg ) ;
2005-04-16 15:20:36 -07:00
2010-02-27 19:41:45 +00:00
/* br_multicast.c */
# ifdef CONFIG_BRIDGE_IGMP_SNOOPING
2012-12-10 02:15:35 +00:00
extern unsigned int br_mdb_rehash_seq ;
2013-10-18 13:48:22 -07:00
int br_multicast_rcv ( struct net_bridge * br , struct net_bridge_port * port ,
struct sk_buff * skb ) ;
struct net_bridge_mdb_entry * br_mdb_get ( struct net_bridge * br ,
struct sk_buff * skb , u16 vid ) ;
void br_multicast_add_port ( struct net_bridge_port * port ) ;
void br_multicast_del_port ( struct net_bridge_port * port ) ;
void br_multicast_enable_port ( struct net_bridge_port * port ) ;
void br_multicast_disable_port ( struct net_bridge_port * port ) ;
void br_multicast_init ( struct net_bridge * br ) ;
void br_multicast_open ( struct net_bridge * br ) ;
void br_multicast_stop ( struct net_bridge * br ) ;
void br_multicast_deliver ( struct net_bridge_mdb_entry * mdst ,
struct sk_buff * skb ) ;
void br_multicast_forward ( struct net_bridge_mdb_entry * mdst ,
struct sk_buff * skb , struct sk_buff * skb2 ) ;
int br_multicast_set_router ( struct net_bridge * br , unsigned long val ) ;
int br_multicast_set_port_router ( struct net_bridge_port * p , unsigned long val ) ;
int br_multicast_toggle ( struct net_bridge * br , unsigned long val ) ;
int br_multicast_set_querier ( struct net_bridge * br , unsigned long val ) ;
int br_multicast_set_hash_max ( struct net_bridge * br , unsigned long val ) ;
struct net_bridge_mdb_entry *
br_mdb_ip_get ( struct net_bridge_mdb_htable * mdb , struct br_ip * dst ) ;
struct net_bridge_mdb_entry *
br_multicast_new_group ( struct net_bridge * br , struct net_bridge_port * port ,
struct br_ip * group ) ;
void br_multicast_free_pg ( struct rcu_head * head ) ;
struct net_bridge_port_group *
br_multicast_new_port_group ( struct net_bridge_port * port , struct br_ip * group ,
struct net_bridge_port_group __rcu * next ,
unsigned char state ) ;
void br_mdb_init ( void ) ;
void br_mdb_uninit ( void ) ;
void br_mdb_notify ( struct net_device * dev , struct net_bridge_port * port ,
struct br_ip * group , int type ) ;
2010-03-01 09:53:04 +00:00
2012-12-11 22:23:08 +00:00
# define mlock_dereference(X, br) \
rcu_dereference_protected ( X , lockdep_is_held ( & br - > multicast_lock ) )
2010-03-01 09:53:04 +00: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 ) ) ;
}
2013-08-01 01:06:20 +02:00
2013-08-30 17:28:17 +02:00
static inline bool
__br_multicast_querier_exists ( struct net_bridge * br ,
struct bridge_mcast_querier * querier )
2013-08-01 01:06:20 +02:00
{
2013-08-30 17:28:17 +02:00
return time_is_before_jiffies ( querier - > delay_time ) & &
( br - > multicast_querier | | timer_pending ( & querier - > timer ) ) ;
}
static inline bool br_multicast_querier_exists ( struct net_bridge * br ,
struct ethhdr * eth )
{
switch ( eth - > h_proto ) {
case ( htons ( ETH_P_IP ) ) :
return __br_multicast_querier_exists ( br , & br - > ip4_querier ) ;
# if IS_ENABLED(CONFIG_IPV6)
case ( htons ( ETH_P_IPV6 ) ) :
return __br_multicast_querier_exists ( br , & br - > ip6_querier ) ;
# endif
default :
return false ;
}
2013-08-01 01:06:20 +02:00
}
2010-02-27 19:41:45 +00: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 ,
2013-03-07 03:05:33 +00:00
struct sk_buff * skb , u16 vid )
2010-02-27 19:41:45 +00:00
{
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 19:41:46 +00: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 19:41:45 +00:00
static inline bool br_multicast_is_router ( struct net_bridge * br )
{
2010-03-01 09:53:04 +00:00
return 0 ;
2010-02-27 19:41:45 +00:00
}
2013-08-30 17:28:17 +02:00
static inline bool br_multicast_querier_exists ( struct net_bridge * br ,
struct ethhdr * eth )
2013-08-01 01:06:20 +02:00
{
return false ;
}
2013-01-03 13:30:43 +02:00
static inline void br_mdb_init ( void )
{
}
static inline void br_mdb_uninit ( void )
{
}
2010-03-01 09:53:04 +00:00
# endif
2010-02-27 19:41:45 +00:00
2013-02-13 12:00:09 +00:00
/* br_vlan.c */
# ifdef CONFIG_BRIDGE_VLAN_FILTERING
2013-10-18 13:48:22 -07:00
bool br_allowed_ingress ( struct net_bridge * br , struct net_port_vlans * v ,
struct sk_buff * skb , u16 * vid ) ;
bool br_allowed_egress ( struct net_bridge * br , const struct net_port_vlans * v ,
const struct sk_buff * skb ) ;
struct sk_buff * br_handle_vlan ( struct net_bridge * br ,
const struct net_port_vlans * v ,
struct sk_buff * skb ) ;
int br_vlan_add ( struct net_bridge * br , u16 vid , u16 flags ) ;
int br_vlan_delete ( struct net_bridge * br , u16 vid ) ;
void br_vlan_flush ( struct net_bridge * br ) ;
int br_vlan_filter_toggle ( struct net_bridge * br , unsigned long val ) ;
int nbp_vlan_add ( struct net_bridge_port * port , u16 vid , u16 flags ) ;
int nbp_vlan_delete ( struct net_bridge_port * port , u16 vid ) ;
void nbp_vlan_flush ( struct net_bridge_port * port ) ;
bool nbp_vlan_find ( struct net_bridge_port * port , u16 vid ) ;
2013-02-13 12:00:10 +00:00
static inline struct net_port_vlans * br_get_vlan_info (
const struct net_bridge * br )
{
2013-02-13 12:00:18 +00:00
return rcu_dereference_rtnl ( br - > vlan_info ) ;
2013-02-13 12:00:10 +00:00
}
static inline struct net_port_vlans * nbp_get_vlan_info (
const struct net_bridge_port * p )
{
2013-02-13 12:00:18 +00:00
return rcu_dereference_rtnl ( p - > vlan_info ) ;
2013-02-13 12:00:10 +00: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 12:00:14 +00: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 12:00:09 +00:00
# else
2013-02-13 12:00:10 +00:00
static inline bool br_allowed_ingress ( struct net_bridge * br ,
struct net_port_vlans * v ,
2013-02-13 12:00:14 +00:00
struct sk_buff * skb ,
u16 * vid )
2013-02-13 12:00:10 +00:00
{
return true ;
}
2013-02-13 12:00:11 +00: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 12:00:14 +00: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 12:00:15 +00:00
static inline int br_vlan_add ( struct net_bridge * br , u16 vid , u16 flags )
2013-02-13 12:00:09 +00: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 12:00:15 +00:00
static inline int nbp_vlan_add ( struct net_bridge_port * port , u16 vid , u16 flags )
2013-02-13 12:00:09 +00: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 12:00:10 +00: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 12:00:19 +00:00
static inline bool nbp_vlan_find ( struct net_bridge_port * port , u16 vid )
{
return false ;
}
2013-02-13 12:00:14 +00:00
static inline u16 br_vlan_get_tag ( const struct sk_buff * skb , u16 * tag )
2013-02-13 12:00:10 +00:00
{
return 0 ;
}
2013-02-13 12:00:14 +00:00
static inline u16 br_get_pvid ( const struct net_port_vlans * v )
{
return VLAN_N_VID ; /* Returns invalid vid */
}
2013-02-13 12:00:09 +00:00
# endif
2005-04-16 15:20:36 -07:00
/* br_netfilter.c */
2006-05-25 15:59:33 -07:00
# ifdef CONFIG_BRIDGE_NETFILTER
2013-10-18 13:48:22 -07:00
int br_netfilter_init ( void ) ;
void br_netfilter_fini ( void ) ;
void br_netfilter_rtable_init ( struct net_bridge * ) ;
2006-05-25 15:59:33 -07:00
# else
# define br_netfilter_init() (0)
# define br_netfilter_fini() do { } while(0)
2008-07-30 16:27:55 -07:00
# define br_netfilter_rtable_init(x)
2006-05-25 15:59:33 -07:00
# endif
2005-04-16 15:20:36 -07:00
/* br_stp.c */
2013-10-18 13:48:22 -07:00
void br_log_state ( const struct net_bridge_port * p ) ;
struct net_bridge_port * br_get_port ( struct net_bridge * br , u16 port_no ) ;
void br_init_port ( struct net_bridge_port * p ) ;
void br_become_designated_port ( struct net_bridge_port * p ) ;
2005-04-16 15:20:36 -07:00
2013-10-18 13:48:22 -07:00
void __br_set_forward_delay ( struct net_bridge * br , unsigned long t ) ;
int br_set_forward_delay ( struct net_bridge * br , unsigned long x ) ;
int br_set_hello_time ( struct net_bridge * br , unsigned long x ) ;
int br_set_max_age ( struct net_bridge * br , unsigned long x ) ;
2011-04-04 14:03:33 +00:00
2005-04-16 15:20:36 -07:00
/* br_stp_if.c */
2013-10-18 13:48:22 -07:00
void br_stp_enable_bridge ( struct net_bridge * br ) ;
void br_stp_disable_bridge ( struct net_bridge * br ) ;
void br_stp_set_enabled ( struct net_bridge * br , unsigned long val ) ;
void br_stp_enable_port ( struct net_bridge_port * p ) ;
void br_stp_disable_port ( struct net_bridge_port * p ) ;
bool br_stp_recalculate_bridge_id ( struct net_bridge * br ) ;
void br_stp_change_bridge_id ( struct net_bridge * br , const unsigned char * a ) ;
void br_stp_set_bridge_priority ( struct net_bridge * br , u16 newprio ) ;
int br_stp_set_port_priority ( struct net_bridge_port * p , unsigned long newprio ) ;
int br_stp_set_path_cost ( struct net_bridge_port * p , unsigned long path_cost ) ;
ssize_t br_show_bridge_id ( char * buf , const struct bridge_id * id ) ;
2005-04-16 15:20:36 -07:00
/* br_stp_bpdu.c */
2008-07-05 21:25:56 -07:00
struct stp_proto ;
2013-10-18 13:48:22 -07:00
void br_stp_rcv ( const struct stp_proto * proto , struct sk_buff * skb ,
struct net_device * dev ) ;
2005-04-16 15:20:36 -07:00
/* br_stp_timer.c */
2013-10-18 13:48:22 -07:00
void br_stp_timer_init ( struct net_bridge * br ) ;
void br_stp_port_timer_init ( struct net_bridge_port * p ) ;
unsigned long br_timer_value ( const struct timer_list * timer ) ;
2005-04-16 15:20:36 -07:00
/* br.c */
2011-12-12 02:58:25 +00:00
# if IS_ENABLED(CONFIG_ATM_LANE)
2009-06-05 05:35:28 +00:00
extern int ( * br_fdb_test_addr_hook ) ( struct net_device * dev , unsigned char * addr ) ;
# endif
2005-04-16 15:20:36 -07:00
2006-05-25 16:00:12 -07:00
/* br_netlink.c */
2012-06-26 05:48:45 +00:00
extern struct rtnl_link_ops br_link_ops ;
2013-10-18 13:48:22 -07:00
int br_netlink_init ( void ) ;
void br_netlink_fini ( void ) ;
void br_ifinfo_notify ( int event , struct net_bridge_port * port ) ;
int br_setlink ( struct net_device * dev , struct nlmsghdr * nlmsg ) ;
int br_dellink ( struct net_device * dev , struct nlmsghdr * nlmsg ) ;
int br_getlink ( struct sk_buff * skb , u32 pid , u32 seq , struct net_device * dev ,
u32 filter_mask ) ;
2006-05-25 16:00:12 -07:00
2005-04-16 15:20:36 -07:00
# ifdef CONFIG_SYSFS
/* br_sysfs_if.c */
2010-01-19 02:58:23 +01:00
extern const struct sysfs_ops brport_sysfs_ops ;
2013-10-18 13:48:22 -07:00
int br_sysfs_addif ( struct net_bridge_port * p ) ;
int br_sysfs_renameif ( struct net_bridge_port * p ) ;
2005-04-16 15:20:36 -07:00
/* br_sysfs_br.c */
2013-10-18 13:48:22 -07:00
int br_sysfs_addbr ( struct net_device * dev ) ;
void br_sysfs_delbr ( struct net_device * dev ) ;
2005-04-16 15:20:36 -07:00
# else
2012-11-03 23:02:30 +01: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-16 15:20:36 -07:00
# endif /* CONFIG_SYSFS */
# endif