1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Linux ethernet bridge 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Authors: 6*4882a593Smuzhiyun * Lennert Buytenhek <buytenh@gnu.org> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _BR_PRIVATE_STP_H 10*4882a593Smuzhiyun #define _BR_PRIVATE_STP_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define BPDU_TYPE_CONFIG 0 13*4882a593Smuzhiyun #define BPDU_TYPE_TCN 0x80 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* IEEE 802.1D-1998 timer values */ 16*4882a593Smuzhiyun #define BR_MIN_HELLO_TIME (1*HZ) 17*4882a593Smuzhiyun #define BR_MAX_HELLO_TIME (10*HZ) 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define BR_MIN_FORWARD_DELAY (2*HZ) 20*4882a593Smuzhiyun #define BR_MAX_FORWARD_DELAY (30*HZ) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define BR_MIN_MAX_AGE (6*HZ) 23*4882a593Smuzhiyun #define BR_MAX_MAX_AGE (40*HZ) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define BR_MIN_PATH_COST 1 26*4882a593Smuzhiyun #define BR_MAX_PATH_COST 65535 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct br_config_bpdu { 29*4882a593Smuzhiyun unsigned int topology_change:1; 30*4882a593Smuzhiyun unsigned int topology_change_ack:1; 31*4882a593Smuzhiyun bridge_id root; 32*4882a593Smuzhiyun int root_path_cost; 33*4882a593Smuzhiyun bridge_id bridge_id; 34*4882a593Smuzhiyun port_id port_id; 35*4882a593Smuzhiyun int message_age; 36*4882a593Smuzhiyun int max_age; 37*4882a593Smuzhiyun int hello_time; 38*4882a593Smuzhiyun int forward_delay; 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* called under bridge lock */ br_is_designated_port(const struct net_bridge_port * p)42*4882a593Smuzhiyunstatic inline int br_is_designated_port(const struct net_bridge_port *p) 43*4882a593Smuzhiyun { 44*4882a593Smuzhiyun return !memcmp(&p->designated_bridge, &p->br->bridge_id, 8) && 45*4882a593Smuzhiyun (p->designated_port == p->port_id); 46*4882a593Smuzhiyun } 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* br_stp.c */ 50*4882a593Smuzhiyun void br_become_root_bridge(struct net_bridge *br); 51*4882a593Smuzhiyun void br_config_bpdu_generation(struct net_bridge *); 52*4882a593Smuzhiyun void br_configuration_update(struct net_bridge *); 53*4882a593Smuzhiyun void br_port_state_selection(struct net_bridge *); 54*4882a593Smuzhiyun void br_received_config_bpdu(struct net_bridge_port *p, 55*4882a593Smuzhiyun const struct br_config_bpdu *bpdu); 56*4882a593Smuzhiyun void br_received_tcn_bpdu(struct net_bridge_port *p); 57*4882a593Smuzhiyun void br_transmit_config(struct net_bridge_port *p); 58*4882a593Smuzhiyun void br_transmit_tcn(struct net_bridge *br); 59*4882a593Smuzhiyun void br_topology_change_detection(struct net_bridge *br); 60*4882a593Smuzhiyun void __br_set_topology_change(struct net_bridge *br, unsigned char val); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* br_stp_bpdu.c */ 63*4882a593Smuzhiyun void br_send_config_bpdu(struct net_bridge_port *, struct br_config_bpdu *); 64*4882a593Smuzhiyun void br_send_tcn_bpdu(struct net_bridge_port *); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #endif 67