#ifndef _NET_IF_BRIDGEVAR_H
#define _NET_IF_BRIDGEVAR_H
#include <sys/callout.h>
#include <sys/queue.h>
#ifdef _KERNEL
#include <net/netisr2.h>
#endif
#define BRDGADD 0
#define BRDGDEL 1
#define BRDGGIFFLGS 2
#define BRDGSIFFLGS 3
#define BRDGSCACHE 4
#define BRDGGCACHE 5
#define BRDGGIFS 6
#define BRDGRTS 7
#define BRDGSADDR 8
#define BRDGSTO 9
#define BRDGGTO 10
#define BRDGDADDR 11
#define BRDGFLUSH 12
#define BRDGGPRI 13
#define BRDGSPRI 14
#define BRDGGHT 15
#define BRDGSHT 16
#define BRDGGFD 17
#define BRDGSFD 18
#define BRDGGMA 19
#define BRDGSMA 20
#define BRDGSIFPRIO 21
#define BRDGSIFCOST 22
#define BRDGADDS 23
#define BRDGDELS 24
#define BRDGSBONDWGHT 25
struct ifbreq {
char ifbr_ifsname[IFNAMSIZ];
uint32_t ifbr_ifsflags;
uint8_t ifbr_state;
uint8_t ifbr_priority;
uint8_t ifbr_path_cost;
uint8_t ifbr_portno;
uint64_t ifbr_designated_root;
uint64_t ifbr_designated_bridge;
uint32_t ifbr_designated_cost;
uint16_t ifbr_designated_port;
uint16_t unused01;
uint64_t ifbr_peer_root;
uint64_t ifbr_peer_bridge;
uint32_t ifbr_peer_cost;
uint16_t ifbr_peer_port;
uint16_t unused02;
uint16_t ifbr_bond_weight;
uint16_t unused03;
uint32_t unused04[8];
};
#define IFBIF_LEARNING 0x01
#define IFBIF_DISCOVER 0x02
#define IFBIF_STP 0x04
#define IFBIF_SPAN 0x08
#define IFBIF_DESIGNATED 0x10
#define IFBIF_ROOT 0x20
#define IFBIF_KEEPMASK (IFBIF_SPAN | IFBIF_DESIGNATED | IFBIF_ROOT)
#define IFBIFBITS "\020\1LEARNING\2DISCOVER\3STP\4SPAN\5DESIGNATED" \
"\6ROOT"
#define IFBF_FLUSHDYN 0x00
#define IFBF_FLUSHALL 0x01
#define IFBF_FLUSHSYNC 0x02
#define BSTP_IFSTATE_DISABLED 0
#define BSTP_IFSTATE_LISTENING 1
#define BSTP_IFSTATE_LEARNING 2
#define BSTP_IFSTATE_FORWARDING 3
#define BSTP_IFSTATE_BLOCKING 4
#define BSTP_IFSTATE_BONDED 5
#define BSTP_IFSTATE_L1BLOCKING 6
struct ifbifconf {
uint32_t ifbic_len;
union {
caddr_t ifbicu_buf;
struct ifbreq *ifbicu_req;
} ifbic_ifbicu;
#define ifbic_buf ifbic_ifbicu.ifbicu_buf
#define ifbic_req ifbic_ifbicu.ifbicu_req
};
struct ifbareq {
char ifba_ifsname[IFNAMSIZ];
time_t ifba_expire;
uint8_t ifba_flags;
uint8_t ifba_dst[ETHER_ADDR_LEN];
};
#define IFBAF_TYPEMASK 0x03
#define IFBAF_DYNAMIC 0x00
#define IFBAF_STATIC 0x01
#define IFBAFBITS "\020\1STATIC"
struct ifbaconf {
uint32_t ifbac_len;
union {
caddr_t ifbacu_buf;
struct ifbareq *ifbacu_req;
} ifbac_ifbacu;
#define ifbac_buf ifbac_ifbacu.ifbacu_buf
#define ifbac_req ifbac_ifbacu.ifbacu_req
};
struct ifbrparam {
union {
uint32_t ifbrpu_int32;
uint16_t ifbrpu_int16;
uint8_t ifbrpu_int8;
} ifbrp_ifbrpu;
};
#define ifbrp_csize ifbrp_ifbrpu.ifbrpu_int32
#define ifbrp_ctime ifbrp_ifbrpu.ifbrpu_int32
#define ifbrp_prio ifbrp_ifbrpu.ifbrpu_int16
#define ifbrp_hellotime ifbrp_ifbrpu.ifbrpu_int8
#define ifbrp_fwddelay ifbrp_ifbrpu.ifbrpu_int8
#define ifbrp_maxage ifbrp_ifbrpu.ifbrpu_int8
#ifdef _KERNEL
struct bridge_timer {
uint16_t active;
uint16_t value;
};
struct bstp_config_unit {
uint64_t cu_rootid;
uint64_t cu_bridge_id;
uint32_t cu_root_path_cost;
uint16_t cu_message_age;
uint16_t cu_max_age;
uint16_t cu_hello_time;
uint16_t cu_forward_delay;
uint16_t cu_port_id;
uint8_t cu_message_type;
uint8_t cu_topology_change_acknowledgment;
uint8_t cu_topology_change;
};
struct bstp_tcn_unit {
uint8_t tu_message_type;
};
struct bridge_ifinfo {
uint64_t bifi_peer_root;
uint64_t bifi_peer_bridge;
uint32_t bifi_peer_cost;
uint16_t bifi_peer_port;
uint16_t bifi_unused02;
uint16_t bifi_port_id;
uint32_t bifi_path_cost;
struct bridge_timer bifi_hold_timer;
struct bridge_timer bifi_message_age_timer;
struct bridge_timer bifi_forward_delay_timer;
struct bridge_timer bifi_link1_timer;
struct bstp_config_unit bifi_config_bpdu;
uint32_t bifi_flags;
uint8_t bifi_state;
uint8_t bifi_topology_change_acknowledge;
uint8_t bifi_config_pending;
uint8_t bifi_change_detection_enabled;
uint8_t bifi_priority;
struct ifnet *bifi_ifp;
int bifi_mutecap;
int bifi_bond_weight;
};
#define bif_peer_root bif_info->bifi_peer_root
#define bif_peer_bridge bif_info->bifi_peer_bridge
#define bif_peer_cost bif_info->bifi_peer_cost
#define bif_peer_port bif_info->bifi_peer_port
#define bif_path_cost bif_info->bifi_path_cost
#define bif_hold_timer bif_info->bifi_hold_timer
#define bif_message_age_timer bif_info->bifi_message_age_timer
#define bif_forward_delay_timer bif_info->bifi_forward_delay_timer
#define bif_link1_timer bif_info->bifi_link1_timer
#define bif_config_bpdu bif_info->bifi_config_bpdu
#define bif_port_id bif_info->bifi_port_id
#define bif_state bif_info->bifi_state
#define bif_flags bif_info->bifi_flags
#define bif_topology_change_acknowledge \
bif_info->bifi_topology_change_acknowledge
#define bif_config_pending bif_info->bifi_config_pending
#define bif_change_detection_enabled bif_info->bifi_change_detection_enabled
#define bif_priority bif_info->bifi_priority
#define bif_message_age_timer bif_info->bifi_message_age_timer
#define bif_bond_weight bif_info->bifi_bond_weight
struct bridge_iflist {
TAILQ_ENTRY(bridge_iflist) bif_next;
struct ifnet *bif_ifp;
int bif_onlist;
struct bridge_ifinfo *bif_info;
int bif_bond_count;
};
TAILQ_HEAD(bridge_iflist_head, bridge_iflist);
struct bridge_rtinfo {
struct ifnet *bri_ifp;
time_t bri_expire;
uint8_t bri_flags;
uint8_t bri_dead;
uint8_t bri_pad[2];
uint32_t bri_refs;
};
struct bridge_rtnode {
LIST_ENTRY(bridge_rtnode) brt_hash;
LIST_ENTRY(bridge_rtnode) brt_list;
uint8_t brt_addr[ETHER_ADDR_LEN];
uint8_t brt_pad[2];
struct bridge_rtinfo *brt_info;
};
LIST_HEAD(bridge_rtnode_head, bridge_rtnode);
struct bridge_softc {
struct arpcom sc_arp;
struct ifnet *sc_ifp;
LIST_ENTRY(bridge_softc) sc_list;
uint64_t sc_bridge_id;
uint64_t sc_designated_root;
uint64_t sc_designated_bridge;
uint32_t sc_designated_cost;
uint16_t sc_designated_port;
uint16_t sc_unused01;
struct bridge_iflist *sc_root_port;
uint16_t sc_max_age;
uint16_t sc_hello_time;
uint16_t sc_forward_delay;
uint16_t sc_bridge_max_age;
uint16_t sc_bridge_hello_time;
uint16_t sc_bridge_forward_delay;
uint16_t sc_topology_change_time;
uint16_t sc_hold_time;
uint16_t sc_bridge_priority;
uint8_t sc_topology_change_detected;
uint8_t sc_topology_change;
struct bridge_timer sc_hello_timer;
struct bridge_timer sc_topology_change_timer;
struct bridge_timer sc_tcn_timer;
uint32_t sc_brtmax;
uint32_t sc_brtcnt;
uint32_t sc_brttimeout;
struct callout sc_brcallout;
struct netmsg_base sc_brtimemsg;
struct callout sc_bstpcallout;
struct netmsg_base sc_bstptimemsg;
struct bridge_iflist_head *sc_iflists;
struct bridge_rtnode_head **sc_rthashs;
struct bridge_rtnode_head *sc_rtlists;
uint32_t sc_rthash_key;
struct bridge_iflist_head sc_spanlist;
int sc_span;
struct bridge_timer sc_link_timer;
int sc_copy_flags;
};
#define sc_if sc_arp.ac_if
#define BRIDGE_CFGCPU 0
#define BRIDGE_CFGPORT netisr_cpuport(BRIDGE_CFGCPU)
extern const uint8_t bstp_etheraddr[];
void bridge_rtdelete(struct bridge_softc *, struct ifnet *ifp, int);
extern void (*bstp_linkstate_p)(struct ifnet *ifp, int state);
void bstp_initialization(struct bridge_softc *);
void bstp_linkstate(struct ifnet *, int);
void bstp_stop(struct bridge_softc *);
void bstp_input(struct bridge_softc *, struct bridge_iflist *,
struct mbuf *);
void bstp_tick_handler(netmsg_t);
int bstp_supersedes_port_info(struct bridge_softc *,
struct bridge_iflist *);
void bridge_enqueue(struct ifnet *, struct mbuf *);
#endif
#endif