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