/*
 *	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 <linux/netdevice.h>
#include <net/route.h>
#include <linux/if_bridge.h>
/*
 * Move some structure and APIs from br_private.h to here
 * and define QTN specific bridge APIs here
 * to accommodate QTN bridge changes and
 * allow QTN modules to refer to bridge private
 * structure without referring to br_private.h.
 *
 * Need to delete the same definition in br_private.h
 * if already been moved here to avoid duplicate declaration.
 */

#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;


	unsigned long			updated;
	unsigned long			used;
	mac_addr			addr;
	__u16				vlan_id;
	unsigned char			is_local:1,
					is_static:1,
					added_by_user:1,
					added_by_external_learn:1;
	struct rcu_head			rcu;
	port_id sub_port;
};

#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
/* our own querier */
struct bridge_mcast_own_query {
	struct timer_list	timer;
	u32			startup_sent;
};

/* other querier */
struct bridge_mcast_other_query {
	struct timer_list		timer;
	unsigned long			delay_time;
};

/* selected querier */
struct bridge_mcast_querier {
	struct br_ip addr;
	struct net_bridge_port __rcu	*port;
};
#endif

struct net_bridge
{
	spinlock_t			lock;
	struct list_head		port_list;
	struct net_device		*dev;
	struct net_device_stats		statistics;

	struct pcpu_sw_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;
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
	struct rtable			fake_rtable;
	bool				nf_call_iptables;
	bool				nf_call_ip6tables;
	bool				nf_call_arptables;
#endif
	u16				group_fwd_mask;
	u16				group_fwd_mask_required;

	/* 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];
	bool				group_addr_set;
	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;
	u8				multicast_querier:1;
	u8				multicast_query_use_ifaddr:1;
	u8				has_ipv6_addr: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_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 timer_list		multicast_router_timer;
	struct bridge_mcast_other_query	ip4_other_query;
	struct bridge_mcast_querier	ip4_querier;
	struct bridge_mcast_own_query	ip4_own_query;
#if IS_ENABLED(CONFIG_IPV6)
	struct bridge_mcast_other_query	ip6_other_query;
	struct bridge_mcast_querier	ip6_querier;
	struct bridge_mcast_own_query	ip6_own_query;
#endif
#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;
	u32				auto_cnt;
	uint16_t			vlan_id;

	/* 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,
		BR_IGMP_SNOOP_HYBRID,
	} igmp_snoop_enabled;
	enum {
		BR_SSDP_FLOOD_DISABLED,
		BR_SSDP_FLOOD_ENABLED
	} ssdp_flood_state;
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
	struct net_bridge_vlan_group	__rcu *vlgrp;
	u8				vlan_enabled;
	u8				vlan_stats_enabled;
	__be16				vlan_proto;
	u16				default_pvid;
#endif
};

#define BR_MCAST_SUBPORT_REQ_LIMIT      32
#define BR_SUB_PORT_BITMAP_SIZE		(4)	/* holds QTN_NODE_NUMBER bits */

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;
	unsigned long                   designated_age;

	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;

#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
	struct bridge_mcast_own_query	ip4_own_query;
#if IS_ENABLED(CONFIG_IPV6)
	struct bridge_mcast_own_query	ip6_own_query;
#endif /* IS_ENABLED(CONFIG_IPV6) */
	unsigned char			multicast_router;
	struct timer_list		multicast_router_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

#ifdef CONFIG_NET_POLL_CONTROLLER
	struct netpoll			*np;
#endif
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
	struct net_port_vlans __rcu	*vlan_info;
	struct net_bridge_vlan_group	__rcu *vlgrp;
#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__))


/* br.c */
extern void (*br_fdb_update_const_hook)(struct net_bridge *br,
					struct net_bridge_port *source,
					const unsigned char *addr, u16 vid, bool added_by_user,
					port_id sub_port);

extern unsigned char (*br_fdb_get_attached_hook)(struct net_bridge *br,
						unsigned char *addr);
extern unsigned char (*br_fdb_update_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);

extern int (*br_fdb_fillbuf_hook)(struct net_bridge *br,
			void *buf,
			unsigned long maxnum,
			unsigned long skip);
/* new added APIs */
void br_vlan_set_promisc(int enable);
void br_set_ap_isolate(int enable);
int br_get_ap_isolate(void);

#if 1
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);

typedef struct net_bridge_port *(*br_get_node_port_cbk)(const uint16_t sub_port);
void br_register_node_hooks_cbk_t(br_get_node_port_cbk get_node_port_func);
#else
typedef int (*br_add_entry_cbk)(const uint8_t *mac_be, uint16_t vid, uint8_t port_id,
				uint16_t sub_port, const struct br_ip *group);
typedef int(*br_delete_entry_cbk)(const uint8_t *mac_be, uint16_t vid);
typedef int (*br_fwt_ageing_time_cbk)(const uint8_t *mac_be, const uint16_t vid);
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)(uint16_t sub_port, uint8_t port_id, uint16_t vid,
				const struct br_ip *group);
typedef int(*br_leave_multicast_cbk)(uint16_t sub_port, uint8_t port_id, uint16_t vid,
				const struct br_ip *group);
typedef uint16_t(*br_fwt_get_ent_cnt)(void);
typedef struct net_bridge_port *(*br_get_node_port_cbk)(const uint16_t sub_port);

/* 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);

void br_register_node_hooks_cbk_t(br_get_node_port_cbk get_node_port_func);
#endif

#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);
}
void br_set_ap_isolate(int enable);
int br_get_ap_isolate(void);

struct net_bridge_port *get_br_port(const struct net_device *dev);

uint16_t br_get_vlan_id(struct net_device *dev);
int br_set_vlan_id(struct net_device *dev, uint16_t vlan_id);
#endif
