net/bridge/br_vlan.c
Source file repositories/reference/linux-study-clean/net/bridge/br_vlan.c
File Facts
- System
- Linux kernel
- Corpus path
net/bridge/br_vlan.c- Extension
.c- Size
- 57511 bytes
- Lines
- 2356
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/netdevice.hlinux/rtnetlink.hlinux/slab.hnet/switchdev.hbr_private.hbr_private_tunnel.h
Detected Declarations
struct br_vlan_bind_walk_datastruct br_vlan_link_state_walk_datafunction br_vlan_cmpfunction __vlan_add_pvidfunction __vlan_delete_pvidfunction __vlan_flags_updatefunction __vlan_flags_would_changefunction __vlan_flags_commitfunction __vlan_vid_addfunction __vlan_add_listfunction __vlan_del_listfunction __vlan_vid_delfunction br_vlan_get_masterfunction br_master_vlan_rcu_freefunction br_vlan_put_masterfunction nbp_vlan_rcu_freefunction br_vlan_init_statefunction nowfunction __vlan_delfunction __vlan_group_freefunction __vlan_flushfunction __allowed_ingressfunction br_allowed_ingressfunction br_allowed_egressfunction br_should_learnfunction br_vlan_add_existingfunction br_vlan_addfunction br_vlan_deletefunction br_vlan_flushfunction recalculate_group_addrfunction br_recalculate_fwd_maskfunction br_vlan_filter_togglefunction br_vlan_enabledfunction br_vlan_get_protofunction __br_vlan_set_protofunction list_for_each_entryfunction list_for_each_entryfunction list_for_each_entry_continue_reversefunction list_for_each_entry_continue_reversefunction list_for_each_entryfunction br_vlan_set_protofunction br_vlan_set_statsfunction br_vlan_set_stats_per_portfunction vlan_default_pvidfunction br_vlan_disable_default_pvidfunction list_for_each_entryfunction __br_vlan_set_default_pvidfunction list_for_each_entry
Annotated Snippet
struct br_vlan_bind_walk_data {
u16 vid;
struct net_device *result;
};
static int br_vlan_match_bind_vlan_dev_fn(struct net_device *dev,
struct netdev_nested_priv *priv)
{
struct br_vlan_bind_walk_data *data = priv->data;
int found = 0;
if (br_vlan_is_bind_vlan_dev(dev) &&
vlan_dev_priv(dev)->vlan_id == data->vid) {
data->result = dev;
found = 1;
}
return found;
}
static struct net_device *
br_vlan_get_upper_bind_vlan_dev(struct net_device *dev, u16 vid)
{
struct br_vlan_bind_walk_data data = {
.vid = vid,
};
struct netdev_nested_priv priv = {
.data = (void *)&data,
};
rcu_read_lock();
netdev_walk_all_upper_dev_rcu(dev, br_vlan_match_bind_vlan_dev_fn,
&priv);
rcu_read_unlock();
return data.result;
}
static bool br_vlan_is_dev_up(const struct net_device *dev)
{
return !!(dev->flags & IFF_UP) && netif_oper_up(dev);
}
static void br_vlan_set_vlan_dev_state(const struct net_bridge *br,
struct net_device *vlan_dev)
{
u16 vid = vlan_dev_priv(vlan_dev)->vlan_id;
struct net_bridge_vlan_group *vg;
struct net_bridge_port *p;
bool has_carrier = false;
if (!netif_carrier_ok(br->dev)) {
netif_carrier_off(vlan_dev);
return;
}
list_for_each_entry(p, &br->port_list, list) {
vg = nbp_vlan_group(p);
if (br_vlan_find(vg, vid) && br_vlan_is_dev_up(p->dev)) {
has_carrier = true;
break;
}
}
if (has_carrier)
netif_carrier_on(vlan_dev);
else
netif_carrier_off(vlan_dev);
}
static void br_vlan_set_all_vlan_dev_state(struct net_bridge_port *p)
{
struct net_bridge_vlan_group *vg = nbp_vlan_group(p);
struct net_bridge_vlan *vlan;
struct net_device *vlan_dev;
list_for_each_entry(vlan, &vg->vlan_list, vlist) {
vlan_dev = br_vlan_get_upper_bind_vlan_dev(p->br->dev,
vlan->vid);
if (vlan_dev) {
if (br_vlan_is_dev_up(p->dev)) {
if (netif_carrier_ok(p->br->dev))
netif_carrier_on(vlan_dev);
} else {
br_vlan_set_vlan_dev_state(p->br, vlan_dev);
}
}
}
}
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/netdevice.h`, `linux/rtnetlink.h`, `linux/slab.h`, `net/switchdev.h`, `br_private.h`, `br_private_tunnel.h`.
- Detected declarations: `struct br_vlan_bind_walk_data`, `struct br_vlan_link_state_walk_data`, `function br_vlan_cmp`, `function __vlan_add_pvid`, `function __vlan_delete_pvid`, `function __vlan_flags_update`, `function __vlan_flags_would_change`, `function __vlan_flags_commit`, `function __vlan_vid_add`, `function __vlan_add_list`.
- 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.