162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (C) B.A.T.M.A.N. contributors:
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Marek Lindner, Simon Wunderlich
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef _NET_BATMAN_ADV_HARD_INTERFACE_H_
862306a36Sopenharmony_ci#define _NET_BATMAN_ADV_HARD_INTERFACE_H_
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "main.h"
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/compiler.h>
1362306a36Sopenharmony_ci#include <linux/kref.h>
1462306a36Sopenharmony_ci#include <linux/netdevice.h>
1562306a36Sopenharmony_ci#include <linux/notifier.h>
1662306a36Sopenharmony_ci#include <linux/rcupdate.h>
1762306a36Sopenharmony_ci#include <linux/stddef.h>
1862306a36Sopenharmony_ci#include <linux/types.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/**
2162306a36Sopenharmony_ci * enum batadv_hard_if_state - State of a hard interface
2262306a36Sopenharmony_ci */
2362306a36Sopenharmony_cienum batadv_hard_if_state {
2462306a36Sopenharmony_ci	/**
2562306a36Sopenharmony_ci	 * @BATADV_IF_NOT_IN_USE: interface is not used as slave interface of a
2662306a36Sopenharmony_ci	 * batman-adv soft interface
2762306a36Sopenharmony_ci	 */
2862306a36Sopenharmony_ci	BATADV_IF_NOT_IN_USE,
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	/**
3162306a36Sopenharmony_ci	 * @BATADV_IF_TO_BE_REMOVED: interface will be removed from soft
3262306a36Sopenharmony_ci	 * interface
3362306a36Sopenharmony_ci	 */
3462306a36Sopenharmony_ci	BATADV_IF_TO_BE_REMOVED,
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	/** @BATADV_IF_INACTIVE: interface is deactivated */
3762306a36Sopenharmony_ci	BATADV_IF_INACTIVE,
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	/** @BATADV_IF_ACTIVE: interface is used */
4062306a36Sopenharmony_ci	BATADV_IF_ACTIVE,
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	/** @BATADV_IF_TO_BE_ACTIVATED: interface is getting activated */
4362306a36Sopenharmony_ci	BATADV_IF_TO_BE_ACTIVATED,
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/**
4762306a36Sopenharmony_ci * enum batadv_hard_if_bcast - broadcast avoidance options
4862306a36Sopenharmony_ci */
4962306a36Sopenharmony_cienum batadv_hard_if_bcast {
5062306a36Sopenharmony_ci	/** @BATADV_HARDIF_BCAST_OK: Do broadcast on according hard interface */
5162306a36Sopenharmony_ci	BATADV_HARDIF_BCAST_OK = 0,
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	/**
5462306a36Sopenharmony_ci	 * @BATADV_HARDIF_BCAST_NORECIPIENT: Broadcast not needed, there is no
5562306a36Sopenharmony_ci	 *  recipient
5662306a36Sopenharmony_ci	 */
5762306a36Sopenharmony_ci	BATADV_HARDIF_BCAST_NORECIPIENT,
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	/**
6062306a36Sopenharmony_ci	 * @BATADV_HARDIF_BCAST_DUPFWD: There is just the neighbor we got it
6162306a36Sopenharmony_ci	 *  from
6262306a36Sopenharmony_ci	 */
6362306a36Sopenharmony_ci	BATADV_HARDIF_BCAST_DUPFWD,
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	/** @BATADV_HARDIF_BCAST_DUPORIG: There is just the originator */
6662306a36Sopenharmony_ci	BATADV_HARDIF_BCAST_DUPORIG,
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciextern struct notifier_block batadv_hard_if_notifier;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistruct net_device *batadv_get_real_netdev(struct net_device *net_device);
7262306a36Sopenharmony_cibool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface);
7362306a36Sopenharmony_cibool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface);
7462306a36Sopenharmony_cistruct batadv_hard_iface*
7562306a36Sopenharmony_cibatadv_hardif_get_by_netdev(const struct net_device *net_dev);
7662306a36Sopenharmony_ciint batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
7762306a36Sopenharmony_ci				   struct net_device *soft_iface);
7862306a36Sopenharmony_civoid batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface);
7962306a36Sopenharmony_ciint batadv_hardif_min_mtu(struct net_device *soft_iface);
8062306a36Sopenharmony_civoid batadv_update_min_mtu(struct net_device *soft_iface);
8162306a36Sopenharmony_civoid batadv_hardif_release(struct kref *ref);
8262306a36Sopenharmony_ciint batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing,
8362306a36Sopenharmony_ci			       u8 *orig_addr, u8 *orig_neigh);
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/**
8662306a36Sopenharmony_ci * batadv_hardif_put() - decrement the hard interface refcounter and possibly
8762306a36Sopenharmony_ci *  release it
8862306a36Sopenharmony_ci * @hard_iface: the hard interface to free
8962306a36Sopenharmony_ci */
9062306a36Sopenharmony_cistatic inline void batadv_hardif_put(struct batadv_hard_iface *hard_iface)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	if (!hard_iface)
9362306a36Sopenharmony_ci		return;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	kref_put(&hard_iface->refcount, batadv_hardif_release);
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci/**
9962306a36Sopenharmony_ci * batadv_primary_if_get_selected() - Get reference to primary interface
10062306a36Sopenharmony_ci * @bat_priv: the bat priv with all the soft interface information
10162306a36Sopenharmony_ci *
10262306a36Sopenharmony_ci * Return: primary interface (with increased refcnt), otherwise NULL
10362306a36Sopenharmony_ci */
10462306a36Sopenharmony_cistatic inline struct batadv_hard_iface *
10562306a36Sopenharmony_cibatadv_primary_if_get_selected(struct batadv_priv *bat_priv)
10662306a36Sopenharmony_ci{
10762306a36Sopenharmony_ci	struct batadv_hard_iface *hard_iface;
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	rcu_read_lock();
11062306a36Sopenharmony_ci	hard_iface = rcu_dereference(bat_priv->primary_if);
11162306a36Sopenharmony_ci	if (!hard_iface)
11262306a36Sopenharmony_ci		goto out;
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	if (!kref_get_unless_zero(&hard_iface->refcount))
11562306a36Sopenharmony_ci		hard_iface = NULL;
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ciout:
11862306a36Sopenharmony_ci	rcu_read_unlock();
11962306a36Sopenharmony_ci	return hard_iface;
12062306a36Sopenharmony_ci}
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci#endif /* _NET_BATMAN_ADV_HARD_INTERFACE_H_ */
123