18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright (C) 2011-2020  B.A.T.M.A.N. contributors:
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Antonio Quartulli
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_
88c2ecf20Sopenharmony_ci#define _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include "main.h"
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/compiler.h>
138c2ecf20Sopenharmony_ci#include <linux/netdevice.h>
148c2ecf20Sopenharmony_ci#include <linux/netlink.h>
158c2ecf20Sopenharmony_ci#include <linux/seq_file.h>
168c2ecf20Sopenharmony_ci#include <linux/skbuff.h>
178c2ecf20Sopenharmony_ci#include <linux/types.h>
188c2ecf20Sopenharmony_ci#include <uapi/linux/batadv_packet.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#include "originator.h"
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#ifdef CONFIG_BATMAN_ADV_DAT
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci/* BATADV_DAT_ADDR_MAX - maximum address value in the DHT space */
258c2ecf20Sopenharmony_ci#define BATADV_DAT_ADDR_MAX ((batadv_dat_addr_t)~(batadv_dat_addr_t)0)
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_civoid batadv_dat_status_update(struct net_device *net_dev);
288c2ecf20Sopenharmony_cibool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
298c2ecf20Sopenharmony_ci					   struct sk_buff *skb);
308c2ecf20Sopenharmony_cibool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
318c2ecf20Sopenharmony_ci					   struct sk_buff *skb, int hdr_size);
328c2ecf20Sopenharmony_civoid batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
338c2ecf20Sopenharmony_ci					 struct sk_buff *skb);
348c2ecf20Sopenharmony_cibool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
358c2ecf20Sopenharmony_ci					 struct sk_buff *skb, int hdr_size);
368c2ecf20Sopenharmony_civoid batadv_dat_snoop_outgoing_dhcp_ack(struct batadv_priv *bat_priv,
378c2ecf20Sopenharmony_ci					struct sk_buff *skb,
388c2ecf20Sopenharmony_ci					__be16 proto,
398c2ecf20Sopenharmony_ci					unsigned short vid);
408c2ecf20Sopenharmony_civoid batadv_dat_snoop_incoming_dhcp_ack(struct batadv_priv *bat_priv,
418c2ecf20Sopenharmony_ci					struct sk_buff *skb, int hdr_size);
428c2ecf20Sopenharmony_cibool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
438c2ecf20Sopenharmony_ci				      struct batadv_forw_packet *forw_packet);
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci/**
468c2ecf20Sopenharmony_ci * batadv_dat_init_orig_node_addr() - assign a DAT address to the orig_node
478c2ecf20Sopenharmony_ci * @orig_node: the node to assign the DAT address to
488c2ecf20Sopenharmony_ci */
498c2ecf20Sopenharmony_cistatic inline void
508c2ecf20Sopenharmony_cibatadv_dat_init_orig_node_addr(struct batadv_orig_node *orig_node)
518c2ecf20Sopenharmony_ci{
528c2ecf20Sopenharmony_ci	u32 addr;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	addr = batadv_choose_orig(orig_node->orig, BATADV_DAT_ADDR_MAX);
558c2ecf20Sopenharmony_ci	orig_node->dat_addr = (batadv_dat_addr_t)addr;
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci/**
598c2ecf20Sopenharmony_ci * batadv_dat_init_own_addr() - assign a DAT address to the node itself
608c2ecf20Sopenharmony_ci * @bat_priv: the bat priv with all the soft interface information
618c2ecf20Sopenharmony_ci * @primary_if: a pointer to the primary interface
628c2ecf20Sopenharmony_ci */
638c2ecf20Sopenharmony_cistatic inline void
648c2ecf20Sopenharmony_cibatadv_dat_init_own_addr(struct batadv_priv *bat_priv,
658c2ecf20Sopenharmony_ci			 struct batadv_hard_iface *primary_if)
668c2ecf20Sopenharmony_ci{
678c2ecf20Sopenharmony_ci	u32 addr;
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci	addr = batadv_choose_orig(primary_if->net_dev->dev_addr,
708c2ecf20Sopenharmony_ci				  BATADV_DAT_ADDR_MAX);
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci	bat_priv->dat.addr = (batadv_dat_addr_t)addr;
738c2ecf20Sopenharmony_ci}
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ciint batadv_dat_init(struct batadv_priv *bat_priv);
768c2ecf20Sopenharmony_civoid batadv_dat_free(struct batadv_priv *bat_priv);
778c2ecf20Sopenharmony_ciint batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset);
788c2ecf20Sopenharmony_ciint batadv_dat_cache_dump(struct sk_buff *msg, struct netlink_callback *cb);
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci/**
818c2ecf20Sopenharmony_ci * batadv_dat_inc_counter() - increment the correct DAT packet counter
828c2ecf20Sopenharmony_ci * @bat_priv: the bat priv with all the soft interface information
838c2ecf20Sopenharmony_ci * @subtype: the 4addr subtype of the packet to be counted
848c2ecf20Sopenharmony_ci *
858c2ecf20Sopenharmony_ci * Updates the ethtool statistics for the received packet if it is a DAT subtype
868c2ecf20Sopenharmony_ci */
878c2ecf20Sopenharmony_cistatic inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv,
888c2ecf20Sopenharmony_ci					  u8 subtype)
898c2ecf20Sopenharmony_ci{
908c2ecf20Sopenharmony_ci	switch (subtype) {
918c2ecf20Sopenharmony_ci	case BATADV_P_DAT_DHT_GET:
928c2ecf20Sopenharmony_ci		batadv_inc_counter(bat_priv,
938c2ecf20Sopenharmony_ci				   BATADV_CNT_DAT_GET_RX);
948c2ecf20Sopenharmony_ci		break;
958c2ecf20Sopenharmony_ci	case BATADV_P_DAT_DHT_PUT:
968c2ecf20Sopenharmony_ci		batadv_inc_counter(bat_priv,
978c2ecf20Sopenharmony_ci				   BATADV_CNT_DAT_PUT_RX);
988c2ecf20Sopenharmony_ci		break;
998c2ecf20Sopenharmony_ci	}
1008c2ecf20Sopenharmony_ci}
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci#else
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_cistatic inline void batadv_dat_status_update(struct net_device *net_dev)
1058c2ecf20Sopenharmony_ci{
1068c2ecf20Sopenharmony_ci}
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_cistatic inline bool
1098c2ecf20Sopenharmony_cibatadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
1108c2ecf20Sopenharmony_ci				      struct sk_buff *skb)
1118c2ecf20Sopenharmony_ci{
1128c2ecf20Sopenharmony_ci	return false;
1138c2ecf20Sopenharmony_ci}
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_cistatic inline bool
1168c2ecf20Sopenharmony_cibatadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
1178c2ecf20Sopenharmony_ci				      struct sk_buff *skb, int hdr_size)
1188c2ecf20Sopenharmony_ci{
1198c2ecf20Sopenharmony_ci	return false;
1208c2ecf20Sopenharmony_ci}
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_cistatic inline bool
1238c2ecf20Sopenharmony_cibatadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
1248c2ecf20Sopenharmony_ci				    struct sk_buff *skb)
1258c2ecf20Sopenharmony_ci{
1268c2ecf20Sopenharmony_ci	return false;
1278c2ecf20Sopenharmony_ci}
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_cistatic inline bool
1308c2ecf20Sopenharmony_cibatadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
1318c2ecf20Sopenharmony_ci				    struct sk_buff *skb, int hdr_size)
1328c2ecf20Sopenharmony_ci{
1338c2ecf20Sopenharmony_ci	return false;
1348c2ecf20Sopenharmony_ci}
1358c2ecf20Sopenharmony_ci
1368c2ecf20Sopenharmony_cistatic inline void
1378c2ecf20Sopenharmony_cibatadv_dat_snoop_outgoing_dhcp_ack(struct batadv_priv *bat_priv,
1388c2ecf20Sopenharmony_ci				   struct sk_buff *skb, __be16 proto,
1398c2ecf20Sopenharmony_ci				   unsigned short vid)
1408c2ecf20Sopenharmony_ci{
1418c2ecf20Sopenharmony_ci}
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_cistatic inline void
1448c2ecf20Sopenharmony_cibatadv_dat_snoop_incoming_dhcp_ack(struct batadv_priv *bat_priv,
1458c2ecf20Sopenharmony_ci				   struct sk_buff *skb, int hdr_size)
1468c2ecf20Sopenharmony_ci{
1478c2ecf20Sopenharmony_ci}
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_cistatic inline bool
1508c2ecf20Sopenharmony_cibatadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
1518c2ecf20Sopenharmony_ci				 struct batadv_forw_packet *forw_packet)
1528c2ecf20Sopenharmony_ci{
1538c2ecf20Sopenharmony_ci	return false;
1548c2ecf20Sopenharmony_ci}
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_cistatic inline void
1578c2ecf20Sopenharmony_cibatadv_dat_init_orig_node_addr(struct batadv_orig_node *orig_node)
1588c2ecf20Sopenharmony_ci{
1598c2ecf20Sopenharmony_ci}
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_cistatic inline void batadv_dat_init_own_addr(struct batadv_priv *bat_priv,
1628c2ecf20Sopenharmony_ci					    struct batadv_hard_iface *iface)
1638c2ecf20Sopenharmony_ci{
1648c2ecf20Sopenharmony_ci}
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_cistatic inline int batadv_dat_init(struct batadv_priv *bat_priv)
1678c2ecf20Sopenharmony_ci{
1688c2ecf20Sopenharmony_ci	return 0;
1698c2ecf20Sopenharmony_ci}
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_cistatic inline void batadv_dat_free(struct batadv_priv *bat_priv)
1728c2ecf20Sopenharmony_ci{
1738c2ecf20Sopenharmony_ci}
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_cistatic inline int
1768c2ecf20Sopenharmony_cibatadv_dat_cache_dump(struct sk_buff *msg, struct netlink_callback *cb)
1778c2ecf20Sopenharmony_ci{
1788c2ecf20Sopenharmony_ci	return -EOPNOTSUPP;
1798c2ecf20Sopenharmony_ci}
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_cistatic inline void batadv_dat_inc_counter(struct batadv_priv *bat_priv,
1828c2ecf20Sopenharmony_ci					  u8 subtype)
1838c2ecf20Sopenharmony_ci{
1848c2ecf20Sopenharmony_ci}
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci#endif /* CONFIG_BATMAN_ADV_DAT */
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci#endif /* _NET_BATMAN_ADV_DISTRIBUTED_ARP_TABLE_H_ */
189