net/batman-adv/bridge_loop_avoidance.c
Source file repositories/reference/linux-study-clean/net/batman-adv/bridge_loop_avoidance.c
File Facts
- System
- Linux kernel
- Corpus path
net/batman-adv/bridge_loop_avoidance.c- Extension
.c- Size
- 72484 bytes
- Lines
- 2539
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: implementation source
- Status
- source 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.
- 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
bridge_loop_avoidance.hmain.hlinux/atomic.hlinux/bug.hlinux/byteorder/generic.hlinux/compiler.hlinux/container_of.hlinux/crc16.hlinux/err.hlinux/errno.hlinux/etherdevice.hlinux/gfp.hlinux/if_arp.hlinux/if_ether.hlinux/if_vlan.hlinux/jhash.hlinux/jiffies.hlinux/kref.hlinux/list.hlinux/lockdep.hlinux/netdevice.hlinux/netlink.hlinux/rculist.hlinux/rcupdate.hlinux/skbuff.hlinux/slab.hlinux/spinlock.hlinux/sprintf.hlinux/stddef.hlinux/string.hlinux/string_choices.hlinux/workqueue.h
Detected Declarations
function batadv_choose_claimfunction batadv_choose_backbone_gwfunction batadv_compare_backbone_gwfunction batadv_compare_claimfunction batadv_backbone_gw_releasefunction batadv_backbone_gw_putfunction batadv_claim_releasefunction batadv_claim_putfunction batadv_claim_hash_findfunction batadv_backbone_hash_findfunction batadv_bla_del_backbone_claimsfunction hlist_for_each_entry_safefunction batadv_bla_send_claimfunction batadv_bla_loopdetect_reportfunction batadv_bla_get_backbone_gwfunction batadv_bla_update_own_backbone_gwfunction batadv_bla_answer_requestfunction hlist_for_each_entry_rcufunction batadv_bla_send_requestfunction batadv_bla_send_announcefunction batadv_bla_add_claimfunction batadv_bla_claim_get_backbone_gwfunction batadv_bla_del_claimfunction batadv_handle_announcefunction batadv_handle_requestfunction batadv_handle_unclaimfunction batadv_handle_claimfunction batadv_check_claim_groupfunction batadv_bla_process_claimfunction batadv_bla_purge_backbone_gwfunction hlist_for_each_entry_safefunction batadv_bla_purge_claimsfunction hlist_for_each_entry_rcufunction batadv_bla_update_orig_addressfunction hlist_for_each_entry_rcufunction batadv_bla_send_loopdetectfunction batadv_bla_status_updatefunction batadv_bla_periodic_workfunction hlist_for_each_entry_rcufunction batadv_bla_initfunction batadv_bla_check_duplistfunction batadv_bla_check_ucast_duplistfunction batadv_bla_check_bcast_duplistfunction batadv_bla_is_backbone_gw_origfunction hlist_for_each_entry_rcufunction batadv_bla_is_backbone_gwfunction batadv_bla_freefunction batadv_bla_loopdetect_check
Annotated Snippet
if (entry->state == BATADV_BLA_BACKBONE_GW_SYNCED) {
entry->state = BATADV_BLA_BACKBONE_GW_UNSYNCED;
entry->wait_periods = BATADV_BLA_WAIT_PERIODS;
atomic_inc(&bat_priv->bla.num_requests);
}
spin_unlock_bh(&bat_priv->bla.num_requests_lock);
}
return entry;
}
/**
* batadv_bla_update_own_backbone_gw() - updates the own backbone gw for a VLAN
* @bat_priv: the bat priv with all the mesh interface information
* @primary_if: the selected primary interface
* @vid: VLAN identifier
*
* update or add the own backbone gw to make sure we announce
* where we receive other backbone gws
*/
static void
batadv_bla_update_own_backbone_gw(struct batadv_priv *bat_priv,
struct batadv_hard_iface *primary_if,
unsigned short vid)
{
struct batadv_bla_backbone_gw *backbone_gw;
backbone_gw = batadv_bla_get_backbone_gw(bat_priv,
primary_if->net_dev->dev_addr,
vid, true);
if (unlikely(!backbone_gw))
return;
WRITE_ONCE(backbone_gw->lasttime, jiffies);
batadv_backbone_gw_put(backbone_gw);
}
/**
* batadv_bla_answer_request() - answer a bla request by sending own claims
* @bat_priv: the bat priv with all the mesh interface information
* @primary_if: interface where the request came on
* @vid: the vid where the request came on
*
* Repeat all of our own claims, and finally send an ANNOUNCE frame
* to allow the requester another check if the CRC is correct now.
*/
static void batadv_bla_answer_request(struct batadv_priv *bat_priv,
struct batadv_hard_iface *primary_if,
unsigned short vid)
{
struct hlist_head *head;
struct batadv_hashtable *hash;
struct batadv_bla_claim *claim;
struct batadv_bla_backbone_gw *backbone_gw;
int i;
batadv_dbg(BATADV_DBG_BLA, bat_priv,
"%s(): received a claim request, send all of our own claims again\n",
__func__);
backbone_gw = batadv_backbone_hash_find(bat_priv,
primary_if->net_dev->dev_addr,
vid);
if (!backbone_gw)
return;
hash = bat_priv->bla.claim_hash;
for (i = 0; i < hash->size; i++) {
head = &hash->table[i];
rcu_read_lock();
hlist_for_each_entry_rcu(claim, head, hash_entry) {
/* only own claims are interesting */
if (claim->backbone_gw != backbone_gw)
continue;
batadv_bla_send_claim(bat_priv, claim->addr, claim->vid,
BATADV_CLAIM_TYPE_CLAIM);
}
rcu_read_unlock();
}
/* finally, send an announcement frame */
batadv_bla_send_announce(bat_priv, backbone_gw);
batadv_backbone_gw_put(backbone_gw);
}
/**
* batadv_bla_send_request() - send a request to repeat claims
* @backbone_gw: the backbone gateway from whom we are out of sync
Annotation
- Immediate include surface: `bridge_loop_avoidance.h`, `main.h`, `linux/atomic.h`, `linux/bug.h`, `linux/byteorder/generic.h`, `linux/compiler.h`, `linux/container_of.h`, `linux/crc16.h`.
- Detected declarations: `function batadv_choose_claim`, `function batadv_choose_backbone_gw`, `function batadv_compare_backbone_gw`, `function batadv_compare_claim`, `function batadv_backbone_gw_release`, `function batadv_backbone_gw_put`, `function batadv_claim_release`, `function batadv_claim_put`, `function batadv_claim_hash_find`, `function batadv_backbone_hash_find`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: source 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.