net/batman-adv/multicast.c
Source file repositories/reference/linux-study-clean/net/batman-adv/multicast.c
File Facts
- System
- Linux kernel
- Corpus path
net/batman-adv/multicast.c- Extension
.c- Size
- 68169 bytes
- Lines
- 2196
- 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
multicast.hmain.hlinux/atomic.hlinux/bitops.hlinux/bug.hlinux/byteorder/generic.hlinux/container_of.hlinux/err.hlinux/errno.hlinux/etherdevice.hlinux/gfp.hlinux/icmpv6.hlinux/if_bridge.hlinux/if_ether.hlinux/igmp.hlinux/in.hlinux/in6.hlinux/inetdevice.hlinux/ip.hlinux/ipv6.hlinux/jiffies.hlinux/list.hlinux/lockdep.hlinux/netdevice.hlinux/netlink.hlinux/printk.hlinux/rculist.hlinux/rcupdate.hlinux/skbuff.hlinux/slab.hlinux/spinlock.hlinux/sprintf.h
Detected Declarations
function batadv_mcast_start_timerfunction batadv_mcast_get_bridgefunction batadv_mcast_mla_rtr_flags_meshif_get_ipv4function batadv_mcast_mla_rtr_flags_meshif_get_ipv6function batadv_mcast_mla_rtr_flags_meshif_get_ipv6function batadv_mcast_mla_rtr_flags_meshif_getfunction batadv_mcast_mla_rtr_flags_bridge_getfunction batadv_mcast_mla_rtr_flags_getfunction batadv_mcast_mla_forw_flags_getfunction batadv_mcast_mla_flags_getfunction batadv_mcast_mla_is_duplicatefunction batadv_mcast_mla_meshif_get_ipv4function batadv_mcast_mla_meshif_get_ipv6function batadv_mcast_mla_meshif_get_ipv6function batadv_mcast_mla_meshif_getfunction batadv_mcast_mla_br_addr_cpyfunction batadv_mcast_mla_bridge_getfunction list_for_each_entryfunction batadv_mcast_mla_list_freefunction hlist_for_each_entry_safefunction batadv_mcast_mla_tt_retractfunction hlist_for_each_entry_safefunction batadv_mcast_mla_tt_addfunction hlist_for_each_entry_safefunction batadv_mcast_querier_logfunction batadv_mcast_bridge_logfunction batadv_mcast_flags_logfunction batadv_mcast_mla_flags_updatefunction __batadv_mcast_mla_updatefunction batadv_mcast_mla_updatefunction batadv_mcast_is_report_ipv4function batadv_mcast_forw_mode_check_ipv4function batadv_mcast_is_report_ipv6function batadv_mcast_forw_mode_check_ipv6function batadv_mcast_forw_mode_checkfunction batadv_mcast_forw_want_all_ip_countfunction batadv_mcast_forw_rtr_countfunction batadv_mcast_forw_mode_by_countfunction batadv_mcast_forw_modefunction batadv_mcast_forw_send_origfunction batadv_mcast_forw_ttfunction batadv_mcast_forw_want_all_ipv4function batadv_mcast_forw_want_all_ipv6function batadv_mcast_forw_want_allfunction batadv_mcast_forw_want_all_rtr4function batadv_mcast_forw_want_all_rtr6function batadv_mcast_forw_want_rtrfunction batadv_mcast_forw_send
Annotated Snippet
if (hard_iface->net_dev->mtu < IPV6_MIN_MTU) {
rcu_read_unlock();
return BATADV_NO_FLAGS;
}
}
rcu_read_unlock();
return BATADV_MCAST_HAVE_MC_PTYPE_CAPA;
}
/**
* batadv_mcast_mla_flags_get() - get the new multicast flags
* @bat_priv: the bat priv with all the mesh interface information
*
* Return: A set of flags for the current/next TVLV, querier and
* bridge state.
*/
static struct batadv_mcast_mla_flags
batadv_mcast_mla_flags_get(struct batadv_priv *bat_priv)
{
struct net_device *dev = bat_priv->mesh_iface;
struct batadv_mcast_querier_state *qr4, *qr6;
struct batadv_mcast_mla_flags mla_flags;
struct net_device *bridge;
bridge = batadv_mcast_get_bridge(dev);
memset(&mla_flags, 0, sizeof(mla_flags));
mla_flags.enabled = 1;
mla_flags.tvlv_flags |= batadv_mcast_mla_rtr_flags_get(bat_priv,
bridge);
mla_flags.tvlv_flags |= batadv_mcast_mla_forw_flags_get(bat_priv);
if (!bridge)
return mla_flags;
dev_put(bridge);
mla_flags.bridged = 1;
qr4 = &mla_flags.querier_ipv4;
qr6 = &mla_flags.querier_ipv6;
if (!IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING))
pr_warn_once("No bridge IGMP snooping compiled - multicast optimizations disabled\n");
qr4->exists = br_multicast_has_querier_anywhere(dev, ETH_P_IP);
qr4->shadowing = br_multicast_has_querier_adjacent(dev, ETH_P_IP);
qr6->exists = br_multicast_has_querier_anywhere(dev, ETH_P_IPV6);
qr6->shadowing = br_multicast_has_querier_adjacent(dev, ETH_P_IPV6);
mla_flags.tvlv_flags |= BATADV_MCAST_WANT_ALL_UNSNOOPABLES;
/* 1) If no querier exists at all, then multicast listeners on
* our local TT clients behind the bridge will keep silent.
* 2) If the selected querier is on one of our local TT clients,
* behind the bridge, then this querier might shadow multicast
* listeners on our local TT clients, behind this bridge.
*
* In both cases, we will signalize other batman nodes that
* we need all multicast traffic of the according protocol.
*/
if (!qr4->exists || qr4->shadowing) {
mla_flags.tvlv_flags |= BATADV_MCAST_WANT_ALL_IPV4;
mla_flags.tvlv_flags &= ~BATADV_MCAST_WANT_NO_RTR4;
}
if (!qr6->exists || qr6->shadowing) {
mla_flags.tvlv_flags |= BATADV_MCAST_WANT_ALL_IPV6;
mla_flags.tvlv_flags &= ~BATADV_MCAST_WANT_NO_RTR6;
}
return mla_flags;
}
/**
* batadv_mcast_mla_is_duplicate() - check whether an address is in a list
* @mcast_addr: the multicast address to check
* @mcast_list: the list with multicast addresses to search in
*
* Return: true if the given address is already in the given list.
* Otherwise returns false.
*/
static bool batadv_mcast_mla_is_duplicate(u8 *mcast_addr,
struct hlist_head *mcast_list)
{
struct batadv_hw_addr *mcast_entry;
hlist_for_each_entry(mcast_entry, mcast_list, list)
if (batadv_compare_eth(mcast_entry->addr, mcast_addr))
Annotation
- Immediate include surface: `multicast.h`, `main.h`, `linux/atomic.h`, `linux/bitops.h`, `linux/bug.h`, `linux/byteorder/generic.h`, `linux/container_of.h`, `linux/err.h`.
- Detected declarations: `function batadv_mcast_start_timer`, `function batadv_mcast_get_bridge`, `function batadv_mcast_mla_rtr_flags_meshif_get_ipv4`, `function batadv_mcast_mla_rtr_flags_meshif_get_ipv6`, `function batadv_mcast_mla_rtr_flags_meshif_get_ipv6`, `function batadv_mcast_mla_rtr_flags_meshif_get`, `function batadv_mcast_mla_rtr_flags_bridge_get`, `function batadv_mcast_mla_rtr_flags_get`, `function batadv_mcast_mla_forw_flags_get`, `function batadv_mcast_mla_flags_get`.
- 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.