17db7d9f3SSven Eckelmann /* SPDX-License-Identifier: GPL-2.0 */
2cfa55c6dSSven Eckelmann /* Copyright (C) B.A.T.M.A.N. contributors:
3c6c8fea2SSven Eckelmann  *
4c6c8fea2SSven Eckelmann  * Marek Lindner, Simon Wunderlich
5c6c8fea2SSven Eckelmann  */
6c6c8fea2SSven Eckelmann 
7c6c8fea2SSven Eckelmann #ifndef _NET_BATMAN_ADV_HARD_INTERFACE_H_
8c6c8fea2SSven Eckelmann #define _NET_BATMAN_ADV_HARD_INTERFACE_H_
9c6c8fea2SSven Eckelmann 
101e2c2a4fSSven Eckelmann #include "main.h"
111e2c2a4fSSven Eckelmann 
121e2c2a4fSSven Eckelmann #include <linux/compiler.h>
137a659d56SSven Eckelmann #include <linux/kref.h>
1468a600deSSven Eckelmann #include <linux/netdevice.h>
151e2c2a4fSSven Eckelmann #include <linux/notifier.h>
161e2c2a4fSSven Eckelmann #include <linux/rcupdate.h>
171e2c2a4fSSven Eckelmann #include <linux/stddef.h>
181e2c2a4fSSven Eckelmann #include <linux/types.h>
191e2c2a4fSSven Eckelmann 
2073844a8cSSven Eckelmann /**
2173844a8cSSven Eckelmann  * enum batadv_hard_if_state - State of a hard interface
2273844a8cSSven Eckelmann  */
23e9a4f295SSven Eckelmann enum batadv_hard_if_state {
2473844a8cSSven Eckelmann 	/**
2573844a8cSSven Eckelmann 	 * @BATADV_IF_NOT_IN_USE: interface is not used as slave interface of a
2673844a8cSSven Eckelmann 	 * batman-adv soft interface
2773844a8cSSven Eckelmann 	 */
28e9a4f295SSven Eckelmann 	BATADV_IF_NOT_IN_USE,
2973844a8cSSven Eckelmann 
3073844a8cSSven Eckelmann 	/**
3173844a8cSSven Eckelmann 	 * @BATADV_IF_TO_BE_REMOVED: interface will be removed from soft
3273844a8cSSven Eckelmann 	 * interface
3373844a8cSSven Eckelmann 	 */
34e9a4f295SSven Eckelmann 	BATADV_IF_TO_BE_REMOVED,
3573844a8cSSven Eckelmann 
3673844a8cSSven Eckelmann 	/** @BATADV_IF_INACTIVE: interface is deactivated */
37e9a4f295SSven Eckelmann 	BATADV_IF_INACTIVE,
3873844a8cSSven Eckelmann 
3973844a8cSSven Eckelmann 	/** @BATADV_IF_ACTIVE: interface is used */
40e9a4f295SSven Eckelmann 	BATADV_IF_ACTIVE,
4173844a8cSSven Eckelmann 
4273844a8cSSven Eckelmann 	/** @BATADV_IF_TO_BE_ACTIVATED: interface is getting activated */
43e9a4f295SSven Eckelmann 	BATADV_IF_TO_BE_ACTIVATED,
44e8958dbfSSven Eckelmann };
45c6c8fea2SSven Eckelmann 
46a15fd361SSven Eckelmann /**
473111beedSLinus Lüssing  * enum batadv_hard_if_bcast - broadcast avoidance options
483111beedSLinus Lüssing  */
493111beedSLinus Lüssing enum batadv_hard_if_bcast {
508b84cc4fSSven Eckelmann 	/** @BATADV_HARDIF_BCAST_OK: Do broadcast on according hard interface */
513111beedSLinus Lüssing 	BATADV_HARDIF_BCAST_OK = 0,
528b84cc4fSSven Eckelmann 
538b84cc4fSSven Eckelmann 	/**
548b84cc4fSSven Eckelmann 	 * @BATADV_HARDIF_BCAST_NORECIPIENT: Broadcast not needed, there is no
558b84cc4fSSven Eckelmann 	 *  recipient
568b84cc4fSSven Eckelmann 	 */
573111beedSLinus Lüssing 	BATADV_HARDIF_BCAST_NORECIPIENT,
588b84cc4fSSven Eckelmann 
598b84cc4fSSven Eckelmann 	/**
608b84cc4fSSven Eckelmann 	 * @BATADV_HARDIF_BCAST_DUPFWD: There is just the neighbor we got it
618b84cc4fSSven Eckelmann 	 *  from
628b84cc4fSSven Eckelmann 	 */
633111beedSLinus Lüssing 	BATADV_HARDIF_BCAST_DUPFWD,
648b84cc4fSSven Eckelmann 
658b84cc4fSSven Eckelmann 	/** @BATADV_HARDIF_BCAST_DUPORIG: There is just the originator */
663111beedSLinus Lüssing 	BATADV_HARDIF_BCAST_DUPORIG,
673111beedSLinus Lüssing };
683111beedSLinus Lüssing 
699563877eSSven Eckelmann extern struct notifier_block batadv_hard_if_notifier;
70c6c8fea2SSven Eckelmann 
711942de1bSMarek Lindner struct net_device *batadv_get_real_netdev(struct net_device *net_device);
7210b1bbb4SSven Eckelmann bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface);
7310b1bbb4SSven Eckelmann bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface);
7456303d34SSven Eckelmann struct batadv_hard_iface*
759563877eSSven Eckelmann batadv_hardif_get_by_netdev(const struct net_device *net_dev);
7656303d34SSven Eckelmann int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
77fa205602SSven Eckelmann 				   struct net_device *soft_iface);
78a962cb29SSven Eckelmann void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface);
799563877eSSven Eckelmann int batadv_hardif_min_mtu(struct net_device *soft_iface);
809563877eSSven Eckelmann void batadv_update_min_mtu(struct net_device *soft_iface);
817a659d56SSven Eckelmann void batadv_hardif_release(struct kref *ref);
823111beedSLinus Lüssing int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing,
833111beedSLinus Lüssing 			       u8 *orig_addr, u8 *orig_neigh);
84c6c8fea2SSven Eckelmann 
8589652331SSimon Wunderlich /**
867e9a8c2cSSven Eckelmann  * batadv_hardif_put() - decrement the hard interface refcounter and possibly
877a659d56SSven Eckelmann  *  release it
8889652331SSimon Wunderlich  * @hard_iface: the hard interface to free
8989652331SSimon Wunderlich  */
batadv_hardif_put(struct batadv_hard_iface * hard_iface)9082047ad7SSven Eckelmann static inline void batadv_hardif_put(struct batadv_hard_iface *hard_iface)
91c6c8fea2SSven Eckelmann {
92*e78783daSSven Eckelmann 	if (!hard_iface)
93*e78783daSSven Eckelmann 		return;
94*e78783daSSven Eckelmann 
957a659d56SSven Eckelmann 	kref_put(&hard_iface->refcount, batadv_hardif_release);
96c6c8fea2SSven Eckelmann }
97c6c8fea2SSven Eckelmann 
98e57acf8eSSven Eckelmann /**
99e57acf8eSSven Eckelmann  * batadv_primary_if_get_selected() - Get reference to primary interface
100e57acf8eSSven Eckelmann  * @bat_priv: the bat priv with all the soft interface information
101e57acf8eSSven Eckelmann  *
102e57acf8eSSven Eckelmann  * Return: primary interface (with increased refcnt), otherwise NULL
103e57acf8eSSven Eckelmann  */
10456303d34SSven Eckelmann static inline struct batadv_hard_iface *
batadv_primary_if_get_selected(struct batadv_priv * bat_priv)10556303d34SSven Eckelmann batadv_primary_if_get_selected(struct batadv_priv *bat_priv)
10632ae9b22SMarek Lindner {
10756303d34SSven Eckelmann 	struct batadv_hard_iface *hard_iface;
10832ae9b22SMarek Lindner 
10932ae9b22SMarek Lindner 	rcu_read_lock();
11032ae9b22SMarek Lindner 	hard_iface = rcu_dereference(bat_priv->primary_if);
11132ae9b22SMarek Lindner 	if (!hard_iface)
11232ae9b22SMarek Lindner 		goto out;
11332ae9b22SMarek Lindner 
1147a659d56SSven Eckelmann 	if (!kref_get_unless_zero(&hard_iface->refcount))
11532ae9b22SMarek Lindner 		hard_iface = NULL;
11632ae9b22SMarek Lindner 
11732ae9b22SMarek Lindner out:
11832ae9b22SMarek Lindner 	rcu_read_unlock();
11932ae9b22SMarek Lindner 	return hard_iface;
12032ae9b22SMarek Lindner }
12132ae9b22SMarek Lindner 
122c6c8fea2SSven Eckelmann #endif /* _NET_BATMAN_ADV_HARD_INTERFACE_H_ */
123