1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (C) 2011-2017 B.A.T.M.A.N. contributors: 3 * 4 * Antonio Quartulli 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of version 2 of the GNU General Public 8 * License as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #ifndef _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_ 20 #define _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_ 21 22 #include "main.h" 23 24 #include <linux/compiler.h> 25 #include <linux/netdevice.h> 26 #include <linux/types.h> 27 #include <uapi/linux/batadv_packet.h> 28 29 #include "originator.h" 30 31 struct seq_file; 32 struct sk_buff; 33 34 #ifdef CONFIG_BATMAN_ADV_DAT 35 36 /* BATADV_DAT_ADDR_MAX - maximum address value in the DHT space */ 37 #define BATADV_DAT_ADDR_MAX ((batadv_dat_addr_t)~(batadv_dat_addr_t)0) 38 39 void batadv_dat_status_update(struct net_device *net_dev); 40 bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, 41 struct sk_buff *skb); 42 bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv, 43 struct sk_buff *skb, int hdr_size); 44 void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv, 45 struct sk_buff *skb); 46 bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv, 47 struct sk_buff *skb, int hdr_size); 48 bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv, 49 struct batadv_forw_packet *forw_packet); 50 51 /** 52 * batadv_dat_init_orig_node_addr() - assign a DAT address to the orig_node 53 * @orig_node: the node to assign the DAT address to 54 */ 55 static inline void 56 batadv_dat_init_orig_node_addr(struct batadv_orig_node *orig_node) 57 { 58 u32 addr; 59 60 addr = batadv_choose_orig(orig_node->orig, BATADV_DAT_ADDR_MAX); 61 orig_node->dat_addr = (batadv_dat_addr_t)addr; 62 } 63 64 /** 65 * batadv_dat_init_own_addr() - assign a DAT address to the node itself 66 * @bat_priv: the bat priv with all the soft interface information 67 * @primary_if: a pointer to the primary interface 68 */ 69 static inline void 70 batadv_dat_init_own_addr(struct batadv_priv *bat_priv, 71 struct batadv_hard_iface *primary_if) 72 { 73 u32 addr; 74 75 addr = batadv_choose_orig(primary_if->net_dev->dev_addr, 76 BATADV_DAT_ADDR_MAX); 77 78 bat_priv->dat.addr = (batadv_dat_addr_t)addr; 79 } 80 81 int batadv_dat_init(struct batadv_priv *bat_priv); 82 void batadv_dat_free(struct batadv_priv *bat_priv); 83 int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset); 84 85 /** 86 * batadv_dat_inc_counter() - increment the correct DAT packet counter 87 * @bat_priv: the bat priv with all the soft interface information 88 * @subtype: the 4addr subtype of the packet to be counted 89 * 90 * Updates the ethtool statistics for the received packet if it is a DAT subtype 91 */ 92 static inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv, 93 u8 subtype) 94 { 95 switch (subtype) { 96 case BATADV_P_DAT_DHT_GET: 97 batadv_inc_counter(bat_priv, 98 BATADV_CNT_DAT_GET_RX); 99 break; 100 case BATADV_P_DAT_DHT_PUT: 101 batadv_inc_counter(bat_priv, 102 BATADV_CNT_DAT_PUT_RX); 103 break; 104 } 105 } 106 107 #else 108 109 static inline void batadv_dat_status_update(struct net_device *net_dev) 110 { 111 } 112 113 static inline bool 114 batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, 115 struct sk_buff *skb) 116 { 117 return false; 118 } 119 120 static inline bool 121 batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv, 122 struct sk_buff *skb, int hdr_size) 123 { 124 return false; 125 } 126 127 static inline bool 128 batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv, 129 struct sk_buff *skb) 130 { 131 return false; 132 } 133 134 static inline bool 135 batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv, 136 struct sk_buff *skb, int hdr_size) 137 { 138 return false; 139 } 140 141 static inline bool 142 batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv, 143 struct batadv_forw_packet *forw_packet) 144 { 145 return false; 146 } 147 148 static inline void 149 batadv_dat_init_orig_node_addr(struct batadv_orig_node *orig_node) 150 { 151 } 152 153 static inline void batadv_dat_init_own_addr(struct batadv_priv *bat_priv, 154 struct batadv_hard_iface *iface) 155 { 156 } 157 158 static inline void batadv_arp_change_timeout(struct net_device *soft_iface, 159 const char *name) 160 { 161 } 162 163 static inline int batadv_dat_init(struct batadv_priv *bat_priv) 164 { 165 return 0; 166 } 167 168 static inline void batadv_dat_free(struct batadv_priv *bat_priv) 169 { 170 } 171 172 static inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv, 173 u8 subtype) 174 { 175 } 176 177 #endif /* CONFIG_BATMAN_ADV_DAT */ 178 179 #endif /* _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_ */ 180