net/bridge/br_stp.c
Source file repositories/reference/linux-study-clean/net/bridge/br_stp.c
File Facts
- System
- Linux kernel
- Corpus path
net/bridge/br_stp.c- Extension
.c- Size
- 17310 bytes
- Lines
- 725
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/rculist.hnet/switchdev.hbr_private.hbr_private_stp.h
Detected Declarations
function br_set_statefunction br_port_get_stp_statefunction list_for_each_entry_rcufunction br_should_become_root_portfunction br_root_port_blockfunction br_root_selectionfunction list_for_each_entryfunction br_become_root_bridgefunction br_transmit_configfunction br_record_config_informationfunction br_record_config_timeout_valuesfunction br_transmit_tcnfunction br_should_become_designated_portfunction br_designated_port_selectionfunction list_for_each_entryfunction br_supersedes_port_infofunction br_topology_change_acknowledgedfunction br_topology_change_detectionfunction br_config_bpdu_generationfunction list_for_each_entryfunction br_replyfunction br_configuration_updatefunction br_become_designated_portfunction br_make_blockingfunction br_make_forwardingfunction br_port_state_selectionfunction list_for_each_entryfunction br_topology_change_acknowledgefunction br_received_config_bpdufunction br_received_tcn_bpdufunction br_set_hello_timefunction br_set_max_agefunction __set_ageing_timefunction br_set_ageing_timefunction br_get_ageing_timefunction __br_set_topology_changefunction __br_set_forward_delayfunction br_set_forward_delayexport br_port_get_stp_stateexport br_get_ageing_time
Annotated Snippet
switch (p->state) {
case BR_STATE_BLOCKING:
p->stp_xstats.transition_blk++;
break;
case BR_STATE_FORWARDING:
p->stp_xstats.transition_fwd++;
break;
}
}
}
u8 br_port_get_stp_state(const struct net_device *dev)
{
struct net_bridge_port *p;
ASSERT_RTNL();
p = br_port_get_rtnl(dev);
if (!p)
return BR_STATE_DISABLED;
return p->state;
}
EXPORT_SYMBOL_GPL(br_port_get_stp_state);
/* called under bridge lock */
struct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no)
{
struct net_bridge_port *p;
list_for_each_entry_rcu(p, &br->port_list, list,
lockdep_is_held(&br->lock)) {
if (p->port_no == port_no)
return p;
}
return NULL;
}
/* called under bridge lock */
static int br_should_become_root_port(const struct net_bridge_port *p,
u16 root_port)
{
u32 p_path_cost, rp_path_cost, p_designated_cost, rp_designated_cost;
struct net_bridge_port *rp;
struct net_bridge *br;
int t;
br = p->br;
if (p->state == BR_STATE_DISABLED ||
br_is_designated_port(p))
return 0;
if (memcmp(&br->bridge_id, &p->designated_root, 8) <= 0)
return 0;
if (!root_port)
return 1;
rp = br_get_port(br, root_port);
t = memcmp(&p->designated_root, &rp->designated_root, 8);
if (t < 0)
return 1;
else if (t > 0)
return 0;
p_path_cost = READ_ONCE(p->path_cost);
rp_path_cost = READ_ONCE(rp->path_cost);
p_designated_cost = READ_ONCE(p->designated_cost);
rp_designated_cost = READ_ONCE(rp->designated_cost);
if (p_designated_cost + p_path_cost <
rp_designated_cost + rp_path_cost)
return 1;
else if (p_designated_cost + p_path_cost >
rp_designated_cost + rp_path_cost)
return 0;
t = memcmp(&p->designated_bridge, &rp->designated_bridge, 8);
if (t < 0)
return 1;
else if (t > 0)
return 0;
if (p->designated_port < rp->designated_port)
return 1;
else if (p->designated_port > rp->designated_port)
return 0;
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/rculist.h`, `net/switchdev.h`, `br_private.h`, `br_private_stp.h`.
- Detected declarations: `function br_set_state`, `function br_port_get_stp_state`, `function list_for_each_entry_rcu`, `function br_should_become_root_port`, `function br_root_port_block`, `function br_root_selection`, `function list_for_each_entry`, `function br_become_root_bridge`, `function br_transmit_config`, `function br_record_config_information`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.