distributed-arp-table.h 5.5 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/* Copyright (C) 2011-2018  B.A.T.M.A.N. contributors:
3 4 5 6 7 8 9 10 11 12 13 14 15
 *
 * Antonio Quartulli
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * 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 20
#ifndef _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_
#define _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_
21

22 23 24 25 26
#include "main.h"

#include <linux/compiler.h>
#include <linux/netdevice.h>
#include <linux/types.h>
27
#include <uapi/linux/batadv_packet.h>
28

29 30
#include "originator.h"

31
struct netlink_callback;
32 33 34 35
struct seq_file;
struct sk_buff;

#ifdef CONFIG_BATMAN_ADV_DAT
36

37
/* BATADV_DAT_ADDR_MAX - maximum address value in the DHT space */
38 39
#define BATADV_DAT_ADDR_MAX ((batadv_dat_addr_t)~(batadv_dat_addr_t)0)

40
void batadv_dat_status_update(struct net_device *net_dev);
41 42 43 44 45 46 47 48
bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
					   struct sk_buff *skb);
bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
					   struct sk_buff *skb, int hdr_size);
void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
					 struct sk_buff *skb);
bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
					 struct sk_buff *skb, int hdr_size);
49 50 51 52 53 54
void batadv_dat_snoop_outgoing_dhcp_ack(struct batadv_priv *bat_priv,
					struct sk_buff *skb,
					__be16 proto,
					unsigned short vid);
void batadv_dat_snoop_incoming_dhcp_ack(struct batadv_priv *bat_priv,
					struct sk_buff *skb, int hdr_size);
55 56 57
bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
				      struct batadv_forw_packet *forw_packet);

58
/**
59
 * batadv_dat_init_orig_node_addr() - assign a DAT address to the orig_node
60 61 62 63 64
 * @orig_node: the node to assign the DAT address to
 */
static inline void
batadv_dat_init_orig_node_addr(struct batadv_orig_node *orig_node)
{
65
	u32 addr;
66 67 68 69 70 71

	addr = batadv_choose_orig(orig_node->orig, BATADV_DAT_ADDR_MAX);
	orig_node->dat_addr = (batadv_dat_addr_t)addr;
}

/**
72
 * batadv_dat_init_own_addr() - assign a DAT address to the node itself
73 74 75 76 77 78 79
 * @bat_priv: the bat priv with all the soft interface information
 * @primary_if: a pointer to the primary interface
 */
static inline void
batadv_dat_init_own_addr(struct batadv_priv *bat_priv,
			 struct batadv_hard_iface *primary_if)
{
80
	u32 addr;
81 82 83 84 85 86 87

	addr = batadv_choose_orig(primary_if->net_dev->dev_addr,
				  BATADV_DAT_ADDR_MAX);

	bat_priv->dat.addr = (batadv_dat_addr_t)addr;
}

88 89 90
int batadv_dat_init(struct batadv_priv *bat_priv);
void batadv_dat_free(struct batadv_priv *bat_priv);
int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset);
91
int batadv_dat_cache_dump(struct sk_buff *msg, struct netlink_callback *cb);
92

93
/**
94
 * batadv_dat_inc_counter() - increment the correct DAT packet counter
95 96 97 98 99 100
 * @bat_priv: the bat priv with all the soft interface information
 * @subtype: the 4addr subtype of the packet to be counted
 *
 * Updates the ethtool statistics for the received packet if it is a DAT subtype
 */
static inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv,
101
					  u8 subtype)
102 103 104 105 106 107 108 109 110 111 112 113 114
{
	switch (subtype) {
	case BATADV_P_DAT_DHT_GET:
		batadv_inc_counter(bat_priv,
				   BATADV_CNT_DAT_GET_RX);
		break;
	case BATADV_P_DAT_DHT_PUT:
		batadv_inc_counter(bat_priv,
				   BATADV_CNT_DAT_PUT_RX);
		break;
	}
}

115 116
#else

117 118 119 120
static inline void batadv_dat_status_update(struct net_device *net_dev)
{
}

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
static inline bool
batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
				      struct sk_buff *skb)
{
	return false;
}

static inline bool
batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
				      struct sk_buff *skb, int hdr_size)
{
	return false;
}

static inline bool
batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
				    struct sk_buff *skb)
{
	return false;
}

static inline bool
batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
				    struct sk_buff *skb, int hdr_size)
{
	return false;
}

149 150 151 152 153 154 155 156 157 158 159 160 161
static inline void
batadv_dat_snoop_outgoing_dhcp_ack(struct batadv_priv *bat_priv,
				   struct sk_buff *skb, __be16 proto,
				   unsigned short vid)
{
}

static inline void
batadv_dat_snoop_incoming_dhcp_ack(struct batadv_priv *bat_priv,
				   struct sk_buff *skb, int hdr_size)
{
}

162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
static inline bool
batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
				 struct batadv_forw_packet *forw_packet)
{
	return false;
}

static inline void
batadv_dat_init_orig_node_addr(struct batadv_orig_node *orig_node)
{
}

static inline void batadv_dat_init_own_addr(struct batadv_priv *bat_priv,
					    struct batadv_hard_iface *iface)
{
}

static inline void batadv_arp_change_timeout(struct net_device *soft_iface,
					     const char *name)
{
}

static inline int batadv_dat_init(struct batadv_priv *bat_priv)
{
	return 0;
}

static inline void batadv_dat_free(struct batadv_priv *bat_priv)
{
}

193 194 195 196 197 198
static inline int
batadv_dat_cache_dump(struct sk_buff *msg, struct netlink_callback *cb)
{
	return -EOPNOTSUPP;
}

199
static inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv,
200
					  u8 subtype)
201 202 203
{
}

204 205
#endif /* CONFIG_BATMAN_ADV_DAT */

206
#endif /* _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_ */