1*2874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Linux ethernet bridge 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Authors: 61da177e4SLinus Torvalds * Lennert Buytenhek <buytenh@gnu.org> 71da177e4SLinus Torvalds */ 81da177e4SLinus Torvalds 91da177e4SLinus Torvalds #ifndef _BR_PRIVATE_STP_H 101da177e4SLinus Torvalds #define _BR_PRIVATE_STP_H 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #define BPDU_TYPE_CONFIG 0 131da177e4SLinus Torvalds #define BPDU_TYPE_TCN 0x80 141da177e4SLinus Torvalds 1514f98f25Sstephen hemminger /* IEEE 802.1D-1998 timer values */ 1614f98f25Sstephen hemminger #define BR_MIN_HELLO_TIME (1*HZ) 1714f98f25Sstephen hemminger #define BR_MAX_HELLO_TIME (10*HZ) 1814f98f25Sstephen hemminger 1914f98f25Sstephen hemminger #define BR_MIN_FORWARD_DELAY (2*HZ) 2014f98f25Sstephen hemminger #define BR_MAX_FORWARD_DELAY (30*HZ) 2114f98f25Sstephen hemminger 2214f98f25Sstephen hemminger #define BR_MIN_MAX_AGE (6*HZ) 2314f98f25Sstephen hemminger #define BR_MAX_MAX_AGE (40*HZ) 2414f98f25Sstephen hemminger 2514f98f25Sstephen hemminger #define BR_MIN_PATH_COST 1 2614f98f25Sstephen hemminger #define BR_MAX_PATH_COST 65535 2714f98f25Sstephen hemminger 2895c96174SEric Dumazet struct br_config_bpdu { 2995c96174SEric Dumazet unsigned int topology_change:1; 3095c96174SEric Dumazet unsigned int topology_change_ack:1; 311da177e4SLinus Torvalds bridge_id root; 321da177e4SLinus Torvalds int root_path_cost; 331da177e4SLinus Torvalds bridge_id bridge_id; 341da177e4SLinus Torvalds port_id port_id; 351da177e4SLinus Torvalds int message_age; 361da177e4SLinus Torvalds int max_age; 371da177e4SLinus Torvalds int hello_time; 381da177e4SLinus Torvalds int forward_delay; 391da177e4SLinus Torvalds }; 401da177e4SLinus Torvalds 411da177e4SLinus Torvalds /* called under bridge lock */ br_is_designated_port(const struct net_bridge_port * p)421da177e4SLinus Torvaldsstatic inline int br_is_designated_port(const struct net_bridge_port *p) 431da177e4SLinus Torvalds { 441da177e4SLinus Torvalds return !memcmp(&p->designated_bridge, &p->br->bridge_id, 8) && 451da177e4SLinus Torvalds (p->designated_port == p->port_id); 461da177e4SLinus Torvalds } 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds /* br_stp.c */ 50348662a1SJoe Perches void br_become_root_bridge(struct net_bridge *br); 51348662a1SJoe Perches void br_config_bpdu_generation(struct net_bridge *); 52348662a1SJoe Perches void br_configuration_update(struct net_bridge *); 53348662a1SJoe Perches void br_port_state_selection(struct net_bridge *); 54348662a1SJoe Perches void br_received_config_bpdu(struct net_bridge_port *p, 55160d73b8Sstephen hemminger const struct br_config_bpdu *bpdu); 56348662a1SJoe Perches void br_received_tcn_bpdu(struct net_bridge_port *p); 57348662a1SJoe Perches void br_transmit_config(struct net_bridge_port *p); 58348662a1SJoe Perches void br_transmit_tcn(struct net_bridge *br); 59348662a1SJoe Perches void br_topology_change_detection(struct net_bridge *br); 608384b5f5SVivien Didelot void __br_set_topology_change(struct net_bridge *br, unsigned char val); 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds /* br_stp_bpdu.c */ 63348662a1SJoe Perches void br_send_config_bpdu(struct net_bridge_port *, struct br_config_bpdu *); 64348662a1SJoe Perches void br_send_tcn_bpdu(struct net_bridge_port *); 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds #endif 67