Reworking layer2 subsystem
[oonf.git] / src-api / subsystems / oonf_layer2.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2013, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #ifndef OONF_LAYER2_H_
43 #define OONF_LAYER2_H_
44
45 #include "common/avl.h"
46 #include "common/common_types.h"
47 #include "core/oonf_subsystem.h"
48 #include "subsystems/oonf_timer.h"
49
50 #define LAYER2_CLASS_NEIGHBOR  "layer2_neighbor"
51 #define LAYER2_CLASS_NETWORK   "layer2_network"
52
53 #define OONF_LAYER2_NET_MAX_BITRATE_KEY  "max_bitrate"
54 #define OONF_LAYER2_NET_FREQUENCY_KEY    "frequency"
55
56 #define OONF_LAYER2_NEIGH_SIGNAL_KEY     "signal"
57 #define OONF_LAYER2_NEIGH_TX_BITRATE_KEY "tx_bitrate"
58 #define OONF_LAYER2_NEIGH_RX_BITRATE_KEY "rx_bitrate"
59 #define OONF_LAYER2_NEIGH_TX_BYTES_KEY   "tx_bytes"
60 #define OONF_LAYER2_NEIGH_RX_BYTES_KEY   "rx_bytes"
61 #define OONF_LAYER2_NEIGH_TX_FRAMES_KEY  "tx_frames"
62 #define OONF_LAYER2_NEIGH_RX_FRAMES_KEY  "rx_frames"
63 #define OONF_LAYER2_NEIGH_TX_RETRIES_KEY "tx_retries"
64 #define OONF_LAYER2_NEIGH_TX_FAILED_KEY  "tx_failed"
65
66 struct oonf_layer2_data {
67   int64_t _value;
68   bool _has_value;
69   uint32_t _origin;
70 };
71
72 enum oonf_layer2_network_index {
73   OONF_LAYER2_NET_FREQUENCY,
74   OONF_LAYER2_NET_MAX_BITRATE,
75
76   /* last entry */
77   OONF_LAYER2_NET_COUNT,
78 };
79
80 enum oonf_layer2_network_type {
81   OONF_LAYER2_TYPE_UNDEFINED,
82   OONF_LAYER2_TYPE_WIRELESS,
83   OONF_LAYER2_TYPE_ETHERNET,
84   OONF_LAYER2_TYPE_TUNNEL,
85 };
86
87 enum oonf_layer2_neighbor_index {
88   OONF_LAYER2_NEIGH_SIGNAL,
89   OONF_LAYER2_NEIGH_TX_BITRATE,
90   OONF_LAYER2_NEIGH_RX_BITRATE,
91   OONF_LAYER2_NEIGH_TX_BYTES,
92   OONF_LAYER2_NEIGH_RX_BYTES,
93   OONF_LAYER2_NEIGH_TX_FRAMES,
94   OONF_LAYER2_NEIGH_RX_FRAMES,
95   OONF_LAYER2_NEIGH_TX_RETRIES,
96   OONF_LAYER2_NEIGH_TX_FAILED,
97
98   /* last entry */
99   OONF_LAYER2_NEIGH_COUNT,
100 };
101
102 struct oonf_layer2_net {
103   struct avl_node _node;
104   struct netaddr addr;
105
106   int  if_index;
107   char if_name[IF_NAMESIZE];
108   char if_ident[64];
109   enum oonf_layer2_network_type if_type;
110
111   struct avl_tree neighbors;
112   struct avl_tree _ip_defaults;
113
114   uint64_t last_seen;
115
116   struct oonf_layer2_data data[OONF_LAYER2_NET_COUNT];
117   struct oonf_layer2_data neighdata[OONF_LAYER2_NEIGH_COUNT];
118 };
119
120 struct oonf_layer2_neigh {
121   struct avl_node _node;
122   struct netaddr addr;
123
124   struct list_entity _neigh_ring;
125
126   struct oonf_layer2_net *network;
127
128   uint64_t last_seen;
129
130   struct oonf_layer2_data data[OONF_LAYER2_NEIGH_COUNT];
131 };
132
133 struct oonf_layer2_metadata {
134   const char key[16];
135   const char unit[8];
136   const int fraction;
137   const bool binary;
138 };
139
140 #define LOG_LAYER2 oonf_layer2_subsystem.logging
141 EXPORT extern struct oonf_subsystem oonf_layer2_subsystem;
142
143 EXPORT extern const struct oonf_layer2_metadata oonf_layer2_metadata_neigh[OONF_LAYER2_NEIGH_COUNT];
144 EXPORT extern const struct oonf_layer2_metadata oonf_layer2_metadata_net[OONF_LAYER2_NET_COUNT];
145
146 EXPORT extern struct avl_tree oonf_layer2_net_tree;
147
148 EXPORT uint32_t oonf_layer2_register_origin(void);
149 EXPORT void oonf_layer2_unregister_origin(uint32_t);
150
151 EXPORT struct oonf_layer2_net *oonf_layer2_net_add(struct netaddr *);
152 EXPORT void oonf_layer2_net_remove(
153     struct oonf_layer2_net *, uint32_t origin);
154 EXPORT bool oonf_layer2_net_commit(struct oonf_layer2_net *);
155
156 EXPORT struct oonf_layer2_neigh *oonf_layer2_neigh_add(
157     struct oonf_layer2_net *, struct netaddr *l2neigh);
158 EXPORT void oonf_layer2_neigh_remove(
159     struct oonf_layer2_neigh *l2neigh, uint32_t origin);
160 EXPORT bool oonf_layer2_neigh_commit(struct oonf_layer2_neigh *l2neigh);
161
162 EXPORT const struct oonf_layer2_data *oonf_layer2_neigh_query(
163     const struct netaddr *l2net, const struct netaddr *l2neigh,
164     enum oonf_layer2_neighbor_index idx);
165
166 /**
167  * Get a layer-2 addr object from the database
168  * @param addr local mac address of addr
169  * @return layer-2 addr object, NULL if not found
170  */
171 static inline struct oonf_layer2_net *
172 oonf_layer2_net_get(const struct netaddr *addr) {
173   struct oonf_layer2_net *l2net;
174   return avl_find_element(&oonf_layer2_net_tree, addr, l2net, _node);
175 }
176
177 /**
178  * Get a layer-2 neighbor object from the database
179  * @param l2net layer-2 addr object
180  * @param addr remote mac address of neighbor
181  * @return layer-2 neighbor object, NULL if not found
182  */
183 static inline struct oonf_layer2_neigh *
184 oonf_layer2_neigh_get(const struct oonf_layer2_net *l2net,
185     const struct netaddr *addr) {
186   struct oonf_layer2_neigh *l2neigh;
187   return avl_find_element(&l2net->neighbors, addr, l2neigh, _node);
188 }
189
190 /**
191  * @param l2data layer-2 data object
192  * @return true if object contains a value, false otherwise
193  */
194 static inline bool
195 oonf_layer2_has_value(const struct oonf_layer2_data *l2data) {
196   return l2data->_has_value;
197 }
198
199 /**
200  * @param l2data layer-2 data object
201  * @return value of data object
202  */
203 static inline int64_t
204 oonf_layer2_get_value(const struct oonf_layer2_data *l2data) {
205   return l2data->_value;
206 }
207
208 /**
209  * @param l2data layer-2 data object
210  * @return originator of data value
211  */
212 static inline uint32_t
213 oonf_layer2_get_origin(const struct oonf_layer2_data *l2data) {
214   return l2data->_origin;
215 }
216
217 /**
218  * Set the value of a layer-2 data object
219  * @param l2data layer-2 data object
220  * @param origin originator of value
221  * @param value new value for data object
222  */
223 static inline void
224 oonf_layer2_set_value(struct oonf_layer2_data *l2data,
225     uint32_t origin, int64_t value) {
226   l2data->_has_value = true;
227   l2data->_value = value;
228   l2data->_origin = origin;
229 }
230
231 /**
232  * Removes the value of a layer-2 data object
233  * @param l2data layer-2 data object
234  */
235 static inline void
236 oonf_layer2_reset_value(struct oonf_layer2_data *l2data) {
237   l2data->_has_value = false;
238   l2data->_origin = 0;
239 }
240
241 #endif /* OONF_LAYER2_H_ */