blob: edb0284017ee11adbc5c5db5d812ad2efe678b67 [file] [log] [blame]
/*
* Public APIs declaration.
*
* 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_PUBLIC_H
#define _BR_PUBLIC_H
#include <qtn/br_types.h>
#define BR_HASH_BITS 8
#define BR_HASH_SIZE (1 << BR_HASH_BITS)
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;
port_id sub_port;
struct rcu_head rcu;
unsigned long ageing_timer;
mac_addr addr;
unsigned char is_local;
unsigned char is_static;
unsigned char is_constant;
};
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;
unsigned long flags;
#define BR_HAIRPIN_MODE 0x00000001
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
#define BR_SUB_PORT_BITMAP_SIZE (4)
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;
u32 router_port_bitmap[BR_SUB_PORT_BITMAP_SIZE];
#endif
#ifdef CONFIG_SYSFS
char sysfs_name[IFNAMSIZ];
#endif
};
#define BR_SUBPORT_UNMAP(__SUB_PORT__) ((__SUB_PORT__) &~ 0x8000)
#define BR_SUBPORT_MAP(__SUB_PORT__) ((__SUB_PORT__) | 0x8000)
#define BR_SUBPORT_IDX(__SUB_PORT__) (((__SUB_PORT__) >> 5) & 0x7)
#define BR_SUBPORT_BITMAP(__SUB_PORT__) (1U << ((__SUB_PORT__) & 0x1F))
#define BR_SUBPORT(__IDX__, __BIT__) (((__IDX__) << 5) + (__BIT__))
struct br_cpu_netstats {
unsigned long rx_packets;
unsigned long rx_bytes;
unsigned long tx_packets;
unsigned long tx_bytes;
};
struct net_bridge
{
spinlock_t lock;
struct list_head port_list;
struct net_device *dev;
struct net_device_stats statistics;
struct br_cpu_netstats __percpu *stats;
spinlock_t hash_lock;
struct hlist_head hash[BR_HASH_SIZE];
struct hlist_head mcast_hash[BR_HASH_SIZE];
unsigned long feature_mask;
#ifdef CONFIG_BRIDGE_NETFILTER
struct rtable fake_rtable;
#endif
unsigned long flags;
#define BR_SET_MAC_ADDR 0x00000001
/* 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;
u8 group_addr[ETH_ALEN];
u16 root_port;
enum {
BR_NO_STP, /* no spanning tree */
BR_KERNEL_STP, /* old STP in kernel */
BR_USER_STP, /* new RSTP in userspace */
} stp_enabled;
unsigned char topology_change;
unsigned char topology_change_detected;
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
unsigned char multicast_router;
u8 multicast_disabled:1;
u32 hash_elasticity;
u32 hash_max;
#define BR_ALWAYS_FLOOD_REPORT (-1U)
u32 report_flood_interval;
u32 wlan_report_flood_enable;
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;
struct net_bridge_mdb_htable *mdb;
struct hlist_head router_list;
struct hlist_head mglist;
struct timer_list multicast_router_timer;
struct timer_list multicast_querier_timer;
struct timer_list multicast_query_timer;
#endif
struct timer_list hello_timer;
struct timer_list tcn_timer;
struct timer_list topology_change_timer;
struct timer_list gc_timer;
struct kobject *ifobj;
/* address of attached device when in 3-addr mode */
struct net_bridge_fdb_entry *br_fdb_attached;
enum {
BR_IGMP_SNOOP_DISABLED,
BR_IGMP_SNOOP_ENABLED,
} igmp_snoop_enabled;
enum {
BR_SSDP_FLOOD_DISABLED,
BR_SSDP_FLOOD_ENABLED
} ssdp_flood_state;
};
/* br.c */
extern unsigned char (*br_fdb_get_attached_hook)(struct net_bridge *br,
unsigned char *addr);
extern unsigned char (*br_fdb_update_const_hook)(struct net_bridge *br,
struct net_bridge_port *source,
const unsigned char *addr, uint32_t sub_port);
extern unsigned char (*br_fdb_delete_by_sub_port_hook)(struct net_bridge *br,
const struct net_bridge_port *p,
port_id sub_port);
extern int (*br_fdb_get_active_sub_port_hook)(const struct net_bridge_port *p,
uint32_t *sub_port_bitmap, int size);
extern int (*br_fdb_check_active_sub_port_hook)(const struct net_bridge_port *p,
const uint32_t sub_port);
extern struct net_bridge_fdb_entry *(*br_fdb_get_hook)(struct net_bridge *br,
struct sk_buff *skb,
unsigned char *addr);
extern void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent);
/* new added APIs */
void br_vlan_set_promisc(int enable);
void br_set_ap_isolate(int enable);
int br_get_ap_isolate(void);
typedef int (*br_add_entry_cbk)(const uint8_t *mac_be, uint8_t port_id,
uint8_t sub_port, const struct br_ip *group);
typedef int (*br_delete_entry_cbk)(const uint8_t *mac_be);
typedef int (*br_fwt_ageing_time_cbk)(const uint8_t *mac_be);
typedef int (*br_mult_get_fwt_ts_hook)(const struct br_ip *group);
typedef int (*br_acquire_time_res_cbk)(void);
typedef int (*br_join_multicast_cbk)(uint8_t sub_port, uint8_t port_id, const struct br_ip *group);
typedef int (*br_leave_multicast_cbk)(uint8_t sub_port, uint8_t port_id, const struct br_ip *group);
typedef uint16_t(*br_fwt_get_ent_cnt)(void);
/* register CBK for copying bridge database to fwt interface */
void br_register_hooks_cbk_t(br_add_entry_cbk add_func, br_delete_entry_cbk delete_func,
br_fwt_ageing_time_cbk ageing_func, br_fwt_get_ent_cnt entries_cnt);
void br_register_mult_cbk_t(br_leave_multicast_cbk leave_func, br_join_multicast_cbk join_func);
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
static inline void br_set_sub_port_bitmap(uint32_t *sub_port_map, port_id sub_port)
{
port_id unmap_sub_port;
unmap_sub_port = BR_SUBPORT_UNMAP(sub_port);
BUG_ON(BR_SUB_PORT_BITMAP_SIZE < BR_SUBPORT_IDX(unmap_sub_port));
sub_port_map[BR_SUBPORT_IDX(unmap_sub_port)] |= BR_SUBPORT_BITMAP(unmap_sub_port);
}
#else
static inline void br_set_sub_port_bitmap(uint32_t *sub_port_map, port_id sub_port)
{
}
#endif
static inline int br_is_wlan_dev(struct net_device *dev)
{
return !!(dev->qtn_flags & QTN_FLAG_WIFI_DEVICE);
}
#endif