1 /* Copyright (C) 2007-2017 B.A.T.M.A.N. contributors: 2 * 3 * Marek Lindner, Simon Wunderlich 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of version 2 of the GNU General Public 7 * License as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #ifndef _NET_BATMAN_ADV_HARD_INTERFACE_H_ 19 #define _NET_BATMAN_ADV_HARD_INTERFACE_H_ 20 21 #include "main.h" 22 23 #include <linux/compiler.h> 24 #include <linux/kref.h> 25 #include <linux/notifier.h> 26 #include <linux/rcupdate.h> 27 #include <linux/stddef.h> 28 #include <linux/types.h> 29 30 struct net_device; 31 struct net; 32 33 enum batadv_hard_if_state { 34 BATADV_IF_NOT_IN_USE, 35 BATADV_IF_TO_BE_REMOVED, 36 BATADV_IF_INACTIVE, 37 BATADV_IF_ACTIVE, 38 BATADV_IF_TO_BE_ACTIVATED, 39 BATADV_IF_I_WANT_YOU, 40 }; 41 42 /** 43 * enum batadv_hard_if_bcast - broadcast avoidance options 44 * @BATADV_HARDIF_BCAST_OK: Do broadcast on according hard interface 45 * @BATADV_HARDIF_BCAST_NORECIPIENT: Broadcast not needed, there is no recipient 46 * @BATADV_HARDIF_BCAST_DUPFWD: There is just the neighbor we got it from 47 * @BATADV_HARDIF_BCAST_DUPORIG: There is just the originator 48 */ 49 enum batadv_hard_if_bcast { 50 BATADV_HARDIF_BCAST_OK = 0, 51 BATADV_HARDIF_BCAST_NORECIPIENT, 52 BATADV_HARDIF_BCAST_DUPFWD, 53 BATADV_HARDIF_BCAST_DUPORIG, 54 }; 55 56 /** 57 * enum batadv_hard_if_cleanup - Cleanup modi for soft_iface after slave removal 58 * @BATADV_IF_CLEANUP_KEEP: Don't automatically delete soft-interface 59 * @BATADV_IF_CLEANUP_AUTO: Delete soft-interface after last slave was removed 60 */ 61 enum batadv_hard_if_cleanup { 62 BATADV_IF_CLEANUP_KEEP, 63 BATADV_IF_CLEANUP_AUTO, 64 }; 65 66 extern struct notifier_block batadv_hard_if_notifier; 67 68 struct net_device *batadv_get_real_netdev(struct net_device *net_device); 69 bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface); 70 bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface); 71 struct batadv_hard_iface* 72 batadv_hardif_get_by_netdev(const struct net_device *net_dev); 73 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, 74 struct net *net, const char *iface_name); 75 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface, 76 enum batadv_hard_if_cleanup autodel); 77 void batadv_hardif_remove_interfaces(void); 78 int batadv_hardif_min_mtu(struct net_device *soft_iface); 79 void batadv_update_min_mtu(struct net_device *soft_iface); 80 void batadv_hardif_release(struct kref *ref); 81 int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing, 82 u8 *orig_addr, u8 *orig_neigh); 83 84 /** 85 * batadv_hardif_put - decrement the hard interface refcounter and possibly 86 * release it 87 * @hard_iface: the hard interface to free 88 */ 89 static inline void batadv_hardif_put(struct batadv_hard_iface *hard_iface) 90 { 91 kref_put(&hard_iface->refcount, batadv_hardif_release); 92 } 93 94 static inline struct batadv_hard_iface * 95 batadv_primary_if_get_selected(struct batadv_priv *bat_priv) 96 { 97 struct batadv_hard_iface *hard_iface; 98 99 rcu_read_lock(); 100 hard_iface = rcu_dereference(bat_priv->primary_if); 101 if (!hard_iface) 102 goto out; 103 104 if (!kref_get_unless_zero(&hard_iface->refcount)) 105 hard_iface = NULL; 106 107 out: 108 rcu_read_unlock(); 109 return hard_iface; 110 } 111 112 #endif /* _NET_BATMAN_ADV_HARD_INTERFACE_H_ */ 113