net/batman-adv/hard-interface.c

Source file repositories/reference/linux-study-clean/net/batman-adv/hard-interface.c

File Facts

System
Linux kernel
Corpus path
net/batman-adv/hard-interface.c
Extension
.c
Size
32975 bytes
Lines
1194
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.

Dependency Surface

Detected Declarations

Annotated Snippet

batadv_compare_eth(hardif_neigh->orig, orig_neigh)) {
		ret = BATADV_HARDIF_BCAST_DUPFWD;
	}

out:
	rcu_read_unlock();
	return ret;
}

static struct batadv_hard_iface *
batadv_hardif_get_active(struct net_device *mesh_iface)
{
	struct batadv_hard_iface *hard_iface;
	struct list_head *iter;

	rcu_read_lock();
	netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) {
		if (hard_iface->if_status == BATADV_IF_ACTIVE &&
		    kref_get_unless_zero(&hard_iface->refcount))
			goto out;
	}

	hard_iface = NULL;

out:
	rcu_read_unlock();
	return hard_iface;
}

static void batadv_primary_if_update_addr(struct batadv_priv *bat_priv,
					  struct batadv_hard_iface *oldif)
{
	struct batadv_hard_iface *primary_if;

	primary_if = batadv_primary_if_get_selected(bat_priv);
	if (!primary_if)
		goto out;

	batadv_dat_init_own_addr(bat_priv, primary_if);
	batadv_bla_update_orig_address(bat_priv, primary_if, oldif);
out:
	batadv_hardif_put(primary_if);
}

static void batadv_primary_if_select(struct batadv_priv *bat_priv,
				     struct batadv_hard_iface *new_hard_iface)
{
	struct batadv_hard_iface *curr_hard_iface;

	ASSERT_RTNL();

	if (new_hard_iface)
		kref_get(&new_hard_iface->refcount);

	curr_hard_iface = rcu_replace_pointer(bat_priv->primary_if,
					      new_hard_iface, 1);

	if (!new_hard_iface)
		goto out;

	bat_priv->algo_ops->iface.primary_set(new_hard_iface);
	batadv_primary_if_update_addr(bat_priv, curr_hard_iface);

out:
	batadv_hardif_put(curr_hard_iface);
}

static bool
batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface)
{
	if (hard_iface->net_dev->flags & IFF_UP)
		return true;

	return false;
}

static void batadv_check_known_mac_addr(const struct batadv_hard_iface *hard_iface)
{
	struct net_device *mesh_iface = hard_iface->mesh_iface;
	const struct batadv_hard_iface *tmp_hard_iface;
	struct list_head *iter;

	if (!mesh_iface)
		return;

	netdev_for_each_lower_private(mesh_iface, tmp_hard_iface, iter) {
		if (tmp_hard_iface == hard_iface)
			continue;

		if (tmp_hard_iface->if_status == BATADV_IF_NOT_IN_USE)

Annotation

Implementation Notes