Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/batman-adv/originator.h
26278 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/* Copyright (C) B.A.T.M.A.N. contributors:
3
*
4
* Marek Lindner, Simon Wunderlich
5
*/
6
7
#ifndef _NET_BATMAN_ADV_ORIGINATOR_H_
8
#define _NET_BATMAN_ADV_ORIGINATOR_H_
9
10
#include "main.h"
11
12
#include <linux/compiler.h>
13
#include <linux/if_ether.h>
14
#include <linux/jhash.h>
15
#include <linux/kref.h>
16
#include <linux/netlink.h>
17
#include <linux/skbuff.h>
18
#include <linux/types.h>
19
20
bool batadv_compare_orig(const struct hlist_node *node, const void *data2);
21
int batadv_originator_init(struct batadv_priv *bat_priv);
22
void batadv_originator_free(struct batadv_priv *bat_priv);
23
void batadv_purge_orig_ref(struct batadv_priv *bat_priv);
24
void batadv_orig_node_release(struct kref *ref);
25
struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
26
const u8 *addr);
27
struct batadv_hardif_neigh_node *
28
batadv_hardif_neigh_get(const struct batadv_hard_iface *hard_iface,
29
const u8 *neigh_addr);
30
void batadv_hardif_neigh_release(struct kref *ref);
31
struct batadv_neigh_node *
32
batadv_neigh_node_get_or_create(struct batadv_orig_node *orig_node,
33
struct batadv_hard_iface *hard_iface,
34
const u8 *neigh_addr);
35
void batadv_neigh_node_release(struct kref *ref);
36
struct batadv_neigh_node *
37
batadv_orig_router_get(struct batadv_orig_node *orig_node,
38
const struct batadv_hard_iface *if_outgoing);
39
struct batadv_neigh_node *
40
batadv_orig_to_router(struct batadv_priv *bat_priv, u8 *orig_addr,
41
struct batadv_hard_iface *if_outgoing);
42
struct batadv_neigh_ifinfo *
43
batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh,
44
struct batadv_hard_iface *if_outgoing);
45
struct batadv_neigh_ifinfo *
46
batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh,
47
struct batadv_hard_iface *if_outgoing);
48
void batadv_neigh_ifinfo_release(struct kref *ref);
49
50
int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb);
51
52
struct batadv_orig_ifinfo *
53
batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node,
54
struct batadv_hard_iface *if_outgoing);
55
struct batadv_orig_ifinfo *
56
batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node,
57
struct batadv_hard_iface *if_outgoing);
58
void batadv_orig_ifinfo_release(struct kref *ref);
59
60
int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb);
61
struct batadv_orig_node_vlan *
62
batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
63
unsigned short vid);
64
struct batadv_orig_node_vlan *
65
batadv_orig_node_vlan_get(struct batadv_orig_node *orig_node,
66
unsigned short vid);
67
void batadv_orig_node_vlan_release(struct kref *ref);
68
69
/**
70
* batadv_choose_orig() - Return the index of the orig entry in the hash table
71
* @data: mac address of the originator node
72
* @size: the size of the hash table
73
*
74
* Return: the hash index where the object represented by @data should be
75
* stored at.
76
*/
77
static inline u32 batadv_choose_orig(const void *data, u32 size)
78
{
79
u32 hash = 0;
80
81
hash = jhash(data, ETH_ALEN, hash);
82
return hash % size;
83
}
84
85
struct batadv_orig_node *
86
batadv_orig_hash_find(struct batadv_priv *bat_priv, const void *data);
87
88
/**
89
* batadv_orig_node_vlan_put() - decrement the refcounter and possibly release
90
* the originator-vlan object
91
* @orig_vlan: the originator-vlan object to release
92
*/
93
static inline void
94
batadv_orig_node_vlan_put(struct batadv_orig_node_vlan *orig_vlan)
95
{
96
if (!orig_vlan)
97
return;
98
99
kref_put(&orig_vlan->refcount, batadv_orig_node_vlan_release);
100
}
101
102
/**
103
* batadv_neigh_ifinfo_put() - decrement the refcounter and possibly release
104
* the neigh_ifinfo
105
* @neigh_ifinfo: the neigh_ifinfo object to release
106
*/
107
static inline void
108
batadv_neigh_ifinfo_put(struct batadv_neigh_ifinfo *neigh_ifinfo)
109
{
110
if (!neigh_ifinfo)
111
return;
112
113
kref_put(&neigh_ifinfo->refcount, batadv_neigh_ifinfo_release);
114
}
115
116
/**
117
* batadv_hardif_neigh_put() - decrement the hardif neighbors refcounter
118
* and possibly release it
119
* @hardif_neigh: hardif neigh neighbor to free
120
*/
121
static inline void
122
batadv_hardif_neigh_put(struct batadv_hardif_neigh_node *hardif_neigh)
123
{
124
if (!hardif_neigh)
125
return;
126
127
kref_put(&hardif_neigh->refcount, batadv_hardif_neigh_release);
128
}
129
130
/**
131
* batadv_neigh_node_put() - decrement the neighbors refcounter and possibly
132
* release it
133
* @neigh_node: neigh neighbor to free
134
*/
135
static inline void batadv_neigh_node_put(struct batadv_neigh_node *neigh_node)
136
{
137
if (!neigh_node)
138
return;
139
140
kref_put(&neigh_node->refcount, batadv_neigh_node_release);
141
}
142
143
/**
144
* batadv_orig_ifinfo_put() - decrement the refcounter and possibly release
145
* the orig_ifinfo
146
* @orig_ifinfo: the orig_ifinfo object to release
147
*/
148
static inline void
149
batadv_orig_ifinfo_put(struct batadv_orig_ifinfo *orig_ifinfo)
150
{
151
if (!orig_ifinfo)
152
return;
153
154
kref_put(&orig_ifinfo->refcount, batadv_orig_ifinfo_release);
155
}
156
157
/**
158
* batadv_orig_node_put() - decrement the orig node refcounter and possibly
159
* release it
160
* @orig_node: the orig node to free
161
*/
162
static inline void batadv_orig_node_put(struct batadv_orig_node *orig_node)
163
{
164
if (!orig_node)
165
return;
166
167
kref_put(&orig_node->refcount, batadv_orig_node_release);
168
}
169
170
#endif /* _NET_BATMAN_ADV_ORIGINATOR_H_ */
171
172