5ac87fc68de080e99b543553ec429e884984fef2
[oonf.git] / src-plugins / subsystems / oonf_layer2.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon version 2 (olsrd2)
4  * Copyright (c) 2004-2015, 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 /**
43  * @file
44  */
45
46 #ifndef OONF_LAYER2_H_
47 #define OONF_LAYER2_H_
48
49 #include "common/avl.h"
50 #include "common/common_types.h"
51 #include "core/oonf_subsystem.h"
52 #include "subsystems/os_interface.h"
53
54 /*! subsystem identifier */
55 #define OONF_LAYER2_SUBSYSTEM "layer2"
56
57 /*! memory class for layer2 neighbor */
58 #define LAYER2_CLASS_NEIGHBOR    "layer2_neighbor"
59
60 /*! memory class for layer2 network */
61 #define LAYER2_CLASS_NETWORK     "layer2_network"
62
63 /*! memory class for layer2 destination */
64 #define LAYER2_CLASS_DESTINATION "layer2_destination"
65
66 /*! memory class for layer2 network address */
67 #define LAYER2_CLASS_NETWORK_ADDRESS "layer2_network_address"
68
69 /*! memory class for layer2 neighbor address */
70 #define LAYER2_CLASS_NEIGHBOR_ADDRESS "layer2_neighbor_address"
71
72 /* configuration Macros for Layer2 keys */
73
74 /**
75  * Creates a cfg_schema_entry for a parameter that can be choosen
76  * from the layer2 interface keys
77  * @param p_name parameter name
78  * @param p_def parameter default value
79  * @param p_help help text for configuration entry
80  * @param args variable list of additional arguments
81  */
82 #define CFG_VALIDATE_LAYER2_NET_KEY(p_name, p_def, p_help, args...)   CFG_VALIDATE_CHOICE_CB_ARG(p_name, p_def, p_help, oonf_layer2_cfg_get_l2net_key, OONF_LAYER2_NET_COUNT, NULL, ##args )
83
84 /**
85  * Creates a cfg_schema_entry for a parameter that can be choosen
86  * from the layer2 interface keys
87  * @param p_name parameter name
88  * @param p_def parameter default value
89  * @param p_help help text for configuration entry
90  * @param args variable list of additional arguments
91  */
92 #define CFG_VALIDATE_LAYER2_NEIGH_KEY(p_name, p_def, p_help, args...)   CFG_VALIDATE_CHOICE_CB_ARG(p_name, p_def, p_help, oonf_layer2_cfg_get_l2neigh_key, OONF_LAYER2_NEIGH_COUNT, NULL, ##args )
93
94 /**
95  * Creates a cfg_schema_entry for a parameter that can be choosen
96  * from the layer2 data comparators
97  * @param p_name parameter name
98  * @param p_def parameter default value
99  * @param p_help help text for configuration entry
100  * @param args variable list of additional arguments
101  */
102 #define CFG_VALIDATE_LAYER2_COMP(p_name, p_def, p_help, args...)   CFG_VALIDATE_CHOICE_CB_ARG(p_name, p_def, p_help, oonf_layer2_cfg_get_l2comp, OONF_LAYER2_DATA_CMP_COUNT, NULL, ##args )
103
104 /**
105  * Creates a cfg_schema_entry for a parameter that can be choosen
106  * from the layer2 interface keys
107  * @param p_name parameter name
108  * @param p_def parameter default value
109  * @param p_help help text for configuration entry
110  * @param args variable list of additional arguments
111  */
112 #define CFG_MAP_CHOICE_L2NET(p_reference, p_field, p_name, p_def, p_help, args...)   CFG_MAP_CHOICE_CB_ARG(p_reference, p_field, p_name, p_def, p_help, oonf_layer2_cfg_get_l2net_key, OONF_LAYER2_NET_COUNT, NULL, ##args )
113
114 /**
115  * Creates a cfg_schema_entry for a parameter that can be choosen
116  * from the layer2 interface keys
117  * @param p_name parameter name
118  * @param p_def parameter default value
119  * @param p_help help text for configuration entry
120  * @param args variable list of additional arguments
121  */
122 #define CFG_MAP_CHOICE_L2NEIGH(p_reference, p_field, p_name, p_def, p_help, args...)   CFG_MAP_CHOICE_CB_ARG(p_reference, p_field, p_name, p_def, p_help, oonf_layer2_cfg_get_l2neigh_key, OONF_LAYER2_NEIGH_COUNT, NULL, ##args )
123
124 /**
125  * Creates a cfg_schema_entry for a parameter that can be choosen
126  * from the layer2 data comparators
127  * @param p_name parameter name
128  * @param p_def parameter default value
129  * @param p_help help text for configuration entry
130  * @param args variable list of additional arguments
131  */
132 #define CFG_MAP_CHOICE_L2COMP(p_reference, p_field, p_name, p_def, p_help, args...)   CFG_MAP_CHOICE_CB_ARG(p_reference, p_field, p_name, p_def, p_help, oonf_layer2_cfg_get_l2comp, OONF_LAYER2_DATA_CMP_COUNT, NULL, ##args )
133
134 /**
135  * priorities of layer2 originators
136  */
137 enum oonf_layer2_origin_priority {
138   OONF_LAYER2_ORIGIN_UNKNOWN,
139   OONF_LAYER2_ORIGIN_UNRELIABLE,
140   OONF_LAYER2_ORIGIN_CONFIGURED,
141   OONF_LAYER2_ORIGIN_RELIABLE,
142 };
143
144 /**
145  * Origin for layer2 data
146  */
147 struct oonf_layer2_origin {
148   const char *name;
149
150   /*! true if data will be constantly updated by a plugin */
151   bool proactive;
152
153   /*! priority of this originator */
154   enum oonf_layer2_origin_priority priority;
155
156   /*! node for tree of originators */
157   struct avl_node _node;
158 };
159
160 enum oonf_layer2_data_type {
161   OONF_LAYER2_NO_DATA,
162   OONF_LAYER2_INTEGER_DATA,
163   OONF_LAYER2_BOOLEAN_DATA,
164   OONF_LAYER2_NETWORK_DATA,
165
166   OONF_LAYER2_DATA_TYPE_COUNT,
167 };
168
169 union oonf_layer2_value {
170   int64_t        integer;
171   bool           boolean;
172   struct netaddr addr;
173 };
174
175 /**
176  * Single data entry of layer2 network or neighbor
177  */
178 struct oonf_layer2_data {
179   /*! data value */
180   union oonf_layer2_value _value;
181
182   /*! type of data contained in this element */
183   enum oonf_layer2_data_type _type;
184
185   /*! layer2 originator id */
186   const struct oonf_layer2_origin *_origin;
187 };
188
189 /**
190  * Metadata of layer2 data entry for automatic processing
191  */
192 struct oonf_layer2_metadata {
193   /*! type of data */
194   const char key[16];
195
196   /*! data type */
197   enum oonf_layer2_data_type type;
198
199   /*! unit (bit/s, byte, ...) */
200   const char unit[8];
201
202   /*! number of fractional digits of the data */
203   const int fraction;
204 };
205
206 /**
207  * Comparator options for layer2 data
208  */
209 enum oonf_layer2_data_comparator_type {
210   OONF_LAYER2_DATA_CMP_EQUALS,
211   OONF_LAYER2_DATA_CMP_NOT_EQUALS,
212   OONF_LAYER2_DATA_CMP_LESSER,
213   OONF_LAYER2_DATA_CMP_LESSER_OR_EQUALS,
214   OONF_LAYER2_DATA_CMP_GREATER,
215   OONF_LAYER2_DATA_CMP_GREATER_OR_EQUALS,
216
217   OONF_LAYER2_DATA_CMP_COUNT,
218
219   OONF_LAYER2_DATA_CMP_ILLEGAL = -1,
220 };
221
222 /**
223  * list of layer2 network metrics
224  */
225 enum oonf_layer2_network_index {
226   /*! primary center frequency */
227   OONF_LAYER2_NET_FREQUENCY_1,
228
229   /*! optional secondary center frequency */
230   OONF_LAYER2_NET_FREQUENCY_2,
231
232   /*! primary bandwidth */
233   OONF_LAYER2_NET_BANDWIDTH_1,
234
235   /*! optional secondary bandwidth */
236   OONF_LAYER2_NET_BANDWIDTH_2,
237
238   /*! noise level in dBm */
239   OONF_LAYER2_NET_NOISE,
240
241   /*! total time in ns the channel was active */
242   OONF_LAYER2_NET_CHANNEL_ACTIVE,
243
244   /*! total time in ns the channel was busy */
245   OONF_LAYER2_NET_CHANNEL_BUSY,
246
247   /*! total time in ns the channel was receiving */
248   OONF_LAYER2_NET_CHANNEL_RX,
249
250   /*! total time in ns the channel was transmitting */
251   OONF_LAYER2_NET_CHANNEL_TX,
252
253   /*! maixmum size of an IP packet for this interface */
254   OONF_LAYER2_NET_MTU,
255
256   /*! true if unicast traffic is necessary for ratecontrol */
257   OONF_LAYER2_NET_MCS_BY_PROBING,
258
259   /*! true if interface does not support incoming broadcast/multicast */
260   OONF_LAYER2_NET_RX_ONLY_UNICAST,
261
262   /*! true if interface does not support incoming broadcast/multicast */
263   OONF_LAYER2_NET_TX_ONLY_UNICAST,
264
265   /*! number of layer2 network metrics */
266   OONF_LAYER2_NET_COUNT,
267 };
268
269 /**
270  * list with types of layer2 networks
271  */
272 enum oonf_layer2_network_type {
273   OONF_LAYER2_TYPE_UNDEFINED,
274   OONF_LAYER2_TYPE_WIRELESS,
275   OONF_LAYER2_TYPE_ETHERNET,
276   OONF_LAYER2_TYPE_TUNNEL,
277
278   OONF_LAYER2_TYPE_COUNT,
279 };
280
281 /**
282  * list of layer2 neighbor metrics
283  */
284 enum oonf_layer2_neighbor_index {
285   /*! outgoing signal in milli dBm */
286   OONF_LAYER2_NEIGH_TX_SIGNAL,
287
288   /*! incoming signal in milli dBm */
289   OONF_LAYER2_NEIGH_RX_SIGNAL,
290
291   /*! outgoing bitrate in bit/s */
292   OONF_LAYER2_NEIGH_TX_BITRATE,
293
294   /*! incoming bitrate in bit/s */
295   OONF_LAYER2_NEIGH_RX_BITRATE,
296
297   /*! incoming broadcast bitrate in bit/s */
298   OONF_LAYER2_NEIGH_RX_BC_BITRATE,
299
300   /*! maximum possible outgoing bitrate in bit/s */
301   OONF_LAYER2_NEIGH_TX_MAX_BITRATE,
302
303   /*! maximum possible incoming bitrate in bit/s */
304   OONF_LAYER2_NEIGH_RX_MAX_BITRATE,
305
306   /*! total number of transmitted bytes */
307   OONF_LAYER2_NEIGH_TX_BYTES,
308
309   /*! total number of received bytes */
310   OONF_LAYER2_NEIGH_RX_BYTES,
311
312   /*! total number of transmitted frames */
313   OONF_LAYER2_NEIGH_TX_FRAMES,
314
315   /*! total number of received frames */
316   OONF_LAYER2_NEIGH_RX_FRAMES,
317
318   /*! average outgoing throughput in bit/s */
319   OONF_LAYER2_NEIGH_TX_THROUGHPUT,
320
321   /*! total number of frame retransmission */
322   OONF_LAYER2_NEIGH_TX_RETRIES,
323
324   /*! total number of failed frame transmissions */
325   OONF_LAYER2_NEIGH_TX_FAILED,
326
327   /*! latency to neighbor in microseconds */
328   OONF_LAYER2_NEIGH_LATENCY,
329
330   /*! available resources of radio (0-100) */
331   OONF_LAYER2_NEIGH_RESOURCES,
332
333   /*! relative transmission link quality (0-100) */
334   OONF_LAYER2_NEIGH_TX_RLQ,
335
336   /*! relative receiver link quality (0-100) */
337   OONF_LAYER2_NEIGH_RX_RLQ,
338
339   /*! number of neighbor metrics */
340   OONF_LAYER2_NEIGH_COUNT,
341 };
342
343 /**
344  * representation of a layer2 interface
345  */
346 struct oonf_layer2_net {
347   /*! name of local interface */
348   char name[IF_NAMESIZE];
349
350   /*! optional identification string */
351   char if_ident[64];
352
353   /*! interface type */
354   enum oonf_layer2_network_type if_type;
355
356   /*! interface data is delivered by DLEP */
357   bool if_dlep;
358
359   /*! interface listener to keep track of events and local mac address */
360   struct os_interface_listener if_listener;
361
362   /*! tree of remote neighbors */
363   struct avl_tree neighbors;
364
365   /*! tree of IP addresses/prefixes of local radio/modem */
366   struct avl_tree local_peer_ips;
367
368   /*! global tree of all remote neighbor IPs */
369   struct avl_tree remote_neighbor_ips;
370
371   /*! absolute timestamp when network has been active last */
372   uint64_t last_seen;
373
374   /*! network wide layer 2 data */
375   struct oonf_layer2_data data[OONF_LAYER2_NET_COUNT];
376
377   /*! default values of neighbor layer2 data */
378   struct oonf_layer2_data neighdata[OONF_LAYER2_NEIGH_COUNT];
379
380   /*! node to hook into global l2network tree */
381   struct avl_node _node;
382 };
383
384 /**
385  * IP addresses that are attached to a local radio/modem
386  */
387 struct oonf_layer2_peer_address {
388   /*! ip address attached to a local radio/modem */
389   struct netaddr ip;
390
391   /*! backlink to layer2 network */
392   struct oonf_layer2_net *l2net;
393
394   /*! origin of this address */
395   const struct oonf_layer2_origin *origin;
396
397   /*! node for global tree of network IP addresses */
398   struct avl_node _global_node;
399
400   /*! node for tree of ip addresses in network */
401   struct avl_node _net_node;
402 };
403
404 /**
405  * representation of a remote layer2 neighbor
406  */
407 struct oonf_layer2_neigh {
408   /*! remote mac address of neighbor */
409   struct netaddr addr;
410
411   /*! back pointer to layer2 network */
412   struct oonf_layer2_net *network;
413
414   /*! tree of proxied destinations */
415   struct avl_tree destinations;
416
417   /*! tree of IP addresses/prefixes of remote neighbor router */
418   struct avl_tree remote_neighbor_ips;
419
420   /*! absolute timestamp when neighbor has been active last */
421   uint64_t last_seen;
422
423   /*! neigbor layer 2 data */
424   struct oonf_layer2_data data[OONF_LAYER2_NEIGH_COUNT];
425
426   /*! node to hook into tree of layer2 network */
427   struct avl_node _node;
428 };
429
430 /**
431  * IP addresses that are attached to a remote router
432  */
433 struct oonf_layer2_neighbor_address {
434   /*! ip address attached to a remote router */
435   struct netaddr ip;
436
437   /*! backlink to layer2 neighbor*/
438   struct oonf_layer2_neigh *l2neigh;
439
440   /*! origin of this address */
441   const struct oonf_layer2_origin *origin;
442
443   /*! (interface) global tree of neighbor IP addresses */
444   struct avl_node _net_node;
445
446   /*! node for tree of ip addresses */
447   struct avl_node _neigh_node;
448 };
449
450 /**
451  * representation of a bridged MAC address behind a layer2 neighbor
452  */
453 struct oonf_layer2_destination {
454   /*! proxied mac address behind a layer2 neighbor */
455   struct netaddr destination;
456
457   /*! back pointer to layer2 neighbor */
458   struct oonf_layer2_neigh *neighbor;
459
460   /*! origin of this proxied address */
461   const struct oonf_layer2_origin *origin;
462
463   /*! node to hook into tree of layer2 neighbor */
464   struct avl_node _node;
465 };
466
467 EXPORT void oonf_layer2_origin_add(struct oonf_layer2_origin *origin);
468 EXPORT void oonf_layer2_origin_remove(struct oonf_layer2_origin *origin);
469
470 EXPORT int oonf_layer2_data_parse_string(union oonf_layer2_value *value,
471     const struct oonf_layer2_metadata *meta,
472     const char *input);
473 EXPORT const char *oonf_layer2_data_to_string(char *buffer, size_t length,
474     const struct oonf_layer2_data *data,
475     const struct oonf_layer2_metadata *meta, bool raw);
476 EXPORT bool oonf_layer2_data_set(struct oonf_layer2_data *data,
477     const struct oonf_layer2_origin *origin,
478     enum oonf_layer2_data_type type,
479     const union oonf_layer2_value *input);
480 EXPORT bool oonf_layer2_data_compare(const union oonf_layer2_value *left,
481     const union oonf_layer2_value *right,
482     enum oonf_layer2_data_comparator_type comparator,
483     enum oonf_layer2_data_type data_type);
484 EXPORT enum oonf_layer2_data_comparator_type oonf_layer2_data_get_comparator(const char *);
485 EXPORT const char *oonf_layer2_data_get_comparator_string(enum oonf_layer2_data_comparator_type type);
486 EXPORT const char *oonf_layer2_data_get_type_string(enum oonf_layer2_data_type type);
487
488 EXPORT struct oonf_layer2_net *oonf_layer2_net_add(const char *ifname);
489 EXPORT bool oonf_layer2_net_remove(
490     struct oonf_layer2_net *, const struct oonf_layer2_origin *origin);
491 EXPORT bool oonf_layer2_net_cleanup(struct oonf_layer2_net *l2net,
492     const struct oonf_layer2_origin *origin, bool cleanup_neigh);
493 EXPORT bool oonf_layer2_net_commit(struct oonf_layer2_net *);
494 EXPORT void oonf_layer2_net_relabel(struct oonf_layer2_net *l2net,
495     const struct oonf_layer2_origin *new_origin,
496     const struct oonf_layer2_origin *old_origin);
497 EXPORT struct oonf_layer2_peer_address *oonf_layer2_net_add_ip(
498     struct oonf_layer2_net *l2net,
499     const struct oonf_layer2_origin *origin, const struct netaddr *ip);
500 EXPORT int oonf_layer2_net_remove_ip(
501     struct oonf_layer2_peer_address *ip, const struct oonf_layer2_origin *origin);
502 EXPORT struct oonf_layer2_neighbor_address *oonf_layer2_net_get_best_neighbor_match(
503     const struct netaddr *addr);
504 EXPORT struct avl_tree *oonf_layer2_net_get_remote_ip_tree(void);
505
506 EXPORT struct oonf_layer2_neigh *oonf_layer2_neigh_add(
507     struct oonf_layer2_net *, const struct netaddr *l2neigh);
508 EXPORT bool oonf_layer2_neigh_cleanup(struct oonf_layer2_neigh *l2neigh,
509     const struct oonf_layer2_origin *origin);
510 EXPORT bool oonf_layer2_neigh_remove(
511     struct oonf_layer2_neigh *l2neigh,
512     const struct oonf_layer2_origin *origin);
513 EXPORT bool oonf_layer2_neigh_commit(struct oonf_layer2_neigh *l2neigh);
514 EXPORT void oonf_layer2_neigh_relabel(struct oonf_layer2_neigh *l2neigh,
515     const struct oonf_layer2_origin *new_origin,
516     const struct oonf_layer2_origin *old_origin);
517 EXPORT struct oonf_layer2_neighbor_address *oonf_layer2_neigh_add_ip(
518     struct oonf_layer2_neigh *l2neigh,
519     const struct oonf_layer2_origin *origin, const struct netaddr *ip);
520 EXPORT int oonf_layer2_neigh_remove_ip(
521     struct oonf_layer2_neighbor_address *ip, const struct oonf_layer2_origin *origin);
522
523 EXPORT struct oonf_layer2_destination *oonf_layer2_destination_add(
524     struct oonf_layer2_neigh *l2neigh, const struct netaddr *destination,
525     const struct oonf_layer2_origin *origin);
526 EXPORT void oonf_layer2_destination_remove(struct oonf_layer2_destination *);
527
528 EXPORT const struct oonf_layer2_data *oonf_layer2_neigh_query(
529     const char *ifname, const struct netaddr *l2neigh,
530     enum oonf_layer2_neighbor_index idx);
531 EXPORT const struct oonf_layer2_data *oonf_layer2_neigh_get_data(
532     const struct oonf_layer2_neigh *l2neigh, enum oonf_layer2_neighbor_index idx);
533
534 EXPORT const struct oonf_layer2_metadata *oonf_layer2_neigh_metadata_get(
535     enum oonf_layer2_neighbor_index);
536 EXPORT const struct oonf_layer2_metadata *oonf_layer2_net_metadata_get(
537     enum oonf_layer2_network_index);
538 EXPORT const char *oonf_layer2_cfg_get_l2net_key(size_t index, const void *unused);
539 EXPORT const char *oonf_layer2_cfg_get_l2neigh_key(size_t index, const void *unused);
540 EXPORT const char *oonf_layer2_cfg_get_l2comp(size_t index, const void *unused);
541
542 EXPORT const char *oonf_layer2_net_get_type_name(enum oonf_layer2_network_type);
543
544 EXPORT struct avl_tree *oonf_layer2_get_net_tree(void);
545 EXPORT struct avl_tree *oonf_layer2_get_origin_tree(void);
546
547 /**
548  * Checks if a layer2 originator is registered
549  * @param origin originator
550  * @return true if registered, false otherwise
551  */
552 static INLINE bool
553 oonf_layer2_origin_is_added(const struct oonf_layer2_origin *origin) {
554   return avl_is_node_added(&origin->_node);
555 }
556
557 /**
558  * Get a layer-2 interface object from the database
559  * @param ifname name of interface
560  * @return layer-2 addr object, NULL if not found
561  */
562 static INLINE struct oonf_layer2_net *
563 oonf_layer2_net_get(const char *ifname) {
564   struct oonf_layer2_net *l2net;
565   return avl_find_element(oonf_layer2_get_net_tree(), ifname, l2net, _node);
566 }
567
568 /**
569  * Get a layer-2 local peer ip address object from the database
570  * @param l2net layer-2 network/interface object
571  * @param ip ip address of local radio/modem
572  * @return layer-2 ip address object, NULL if not found
573  */
574 static INLINE struct oonf_layer2_peer_address *
575 oonf_layer2_net_get_local_ip(const struct oonf_layer2_net *l2net,
576     const struct netaddr *addr) {
577   struct oonf_layer2_peer_address *l2ip;
578   return avl_find_element(&l2net->local_peer_ips, addr, l2ip, _net_node);
579 }
580
581 /**
582  * Get a layer-2 ip address object from the database
583  * @param l2net layer-2 network object
584  * @param ip ip address of remote router
585  * @return layer-2 ip address object, NULL if not found
586  */
587 static INLINE struct oonf_layer2_neighbor_address *
588 oonf_layer2_net_get_remote_ip(const struct oonf_layer2_net *l2net,
589     const struct netaddr *addr) {
590   struct oonf_layer2_neighbor_address *l2ip;
591   return avl_find_element(&l2net->remote_neighbor_ips, addr, l2ip, _net_node);
592 }
593
594 /**
595  * Get a layer-2 neighbor object from the database
596  * @param l2net layer-2 network/interface object
597  * @param addr remote mac address of neighbor
598  * @return layer-2 neighbor object, NULL if not found
599  */
600 static INLINE struct oonf_layer2_neigh *
601 oonf_layer2_neigh_get(const struct oonf_layer2_net *l2net,
602     const struct netaddr *addr) {
603   struct oonf_layer2_neigh *l2neigh;
604   return avl_find_element(&l2net->neighbors, addr, l2neigh, _node);
605 }
606
607 /**
608  * Get a layer-2 ip address object from the database
609  * @param l2neigh layer-2 neighbor object
610  * @param ip ip address of remote router
611  * @return layer-2 ip address object, NULL if not found
612  */
613 static INLINE struct oonf_layer2_neighbor_address *
614 oonf_layer2_neigh_get_remote_ip(const struct oonf_layer2_neigh *l2neigh,
615     const struct netaddr *addr) {
616   struct oonf_layer2_neighbor_address *l2ip;
617   return avl_find_element(&l2neigh->remote_neighbor_ips, addr, l2ip, _neigh_node);
618 }
619
620 /**
621  * Get a layer-2 destination (secondary MAC) for a neighbor
622  * @param l2neigh layer-2 neighbor object
623  * @param destination mac address of destination
624  * @return layer-2 destination object, NULL if not found
625  */
626 static INLINE struct oonf_layer2_destination *
627 oonf_layer2_destination_get(const struct oonf_layer2_neigh *l2neigh,
628     const struct netaddr *destination) {
629   struct oonf_layer2_destination *l2dst;
630   return avl_find_element(&l2neigh->destinations, destination, l2dst, _node);
631 }
632
633 /**
634  * @param l2data layer-2 data object
635  * @return true if object contains a value, false otherwise
636  */
637 static INLINE bool
638 oonf_layer2_data_has_value(const struct oonf_layer2_data *l2data) {
639   return l2data->_type != OONF_LAYER2_NO_DATA;
640 }
641
642 /**
643  * @param l2data layer-2 data object
644  * @return type of data in object
645  */
646 static INLINE enum oonf_layer2_data_type
647 oonf_layer2_data_get_type(const struct oonf_layer2_data *l2data) {
648   return l2data->_type;
649 }
650
651 /**
652  * @param l2data layer-2 data object
653  * @param def default value to return
654  * @return value of data object, default value if not net
655  */
656 static INLINE int64_t
657 oonf_layer2_data_get_int64(const struct oonf_layer2_data *l2data, int64_t def) {
658   if (l2data->_type != OONF_LAYER2_INTEGER_DATA) {
659     return def;
660   }
661   return l2data->_value.integer;
662 }
663
664 /**
665  * @param l2data layer-2 data object
666  * @param def default value to return
667  * @return value of data object, default value if not net
668  */
669 static INLINE bool
670 oonf_layer2_data_get_boolean(const struct oonf_layer2_data *l2data, bool def) {
671   if (l2data->_type != OONF_LAYER2_BOOLEAN_DATA) {
672     return def;
673   }
674   return l2data->_value.boolean;
675 }
676
677 /**
678  * @param buffer pointer to int64 data storage
679  * @param l2data layer-2 data object
680  * @return 0 if value was read, -1 if it was the wrong type
681  */
682 static INLINE int
683 oonf_layer2_data_read_int64(int64_t *buffer, const struct oonf_layer2_data *l2data) {
684   if (l2data->_type != OONF_LAYER2_INTEGER_DATA) {
685     return -1;
686   }
687   *buffer = l2data->_value.integer;
688   return 0;
689 }
690
691 /**
692  * @param buffer pointer to boolean data storage
693  * @param l2data layer-2 data object
694  * @return 0 if value was read, -1 if it was the wrong type
695  */
696 static INLINE int
697 oonf_layer2_data_read_boolean(bool *buffer, const struct oonf_layer2_data *l2data) {
698   if (l2data->_type != OONF_LAYER2_BOOLEAN_DATA) {
699     return -1;
700   }
701   *buffer = l2data->_value.boolean;
702   return 0;
703 }
704
705 /**
706  * @param l2data layer-2 data object
707  * @return originator of data value
708  */
709 static INLINE const struct oonf_layer2_origin *
710 oonf_layer2_data_get_origin(const struct oonf_layer2_data *l2data) {
711   return l2data->_origin;
712 }
713
714 /**
715  * Sets the originator of a layer-2 data object
716  * @param l2data layer-2 data object
717  * @param origin originator of data value
718  */
719 static INLINE void
720 oonf_layer2_data_set_origin(struct oonf_layer2_data *l2data,
721     const struct oonf_layer2_origin *origin) {
722   l2data->_origin = origin;
723 }
724
725 static INLINE bool
726 oonf_layer2_data_from_string(struct oonf_layer2_data *data,
727     const struct oonf_layer2_origin *origin,
728     const struct oonf_layer2_metadata *meta,
729     const char *input) {
730   union oonf_layer2_value value;
731
732   if (oonf_layer2_data_parse_string(&value, meta, input)) {
733     return false;
734   }
735   return oonf_layer2_data_set(data, origin, meta->type, &value);
736 }
737
738 static INLINE const char *
739 oonf_layer2_net_data_to_string(char *buffer, size_t length,
740     const struct oonf_layer2_data *data, enum oonf_layer2_network_index idx, bool raw) {
741   return oonf_layer2_data_to_string(buffer, length, data,
742       oonf_layer2_net_metadata_get(idx), raw);
743 }
744
745 static INLINE const char *
746 oonf_layer2_neigh_data_to_string(char *buffer, size_t length,
747     const struct oonf_layer2_data *data, enum oonf_layer2_neighbor_index idx, bool raw) {
748   return oonf_layer2_data_to_string(buffer, length, data,
749       oonf_layer2_neigh_metadata_get(idx), raw);
750 }
751
752 /**
753  * Set the value of a layer-2 data object
754  * @param l2data layer-2 data object
755  * @param origin originator of value
756  * @param integer new value for data object
757  * @return true if value was overwrite, false otherwise
758  */
759 static INLINE bool
760 oonf_layer2_data_set_int64(struct oonf_layer2_data *l2data,
761     const struct oonf_layer2_origin *origin, int64_t integer) {
762   union oonf_layer2_value value = {0};
763   value.integer = integer;
764
765   return oonf_layer2_data_set(l2data, origin, OONF_LAYER2_INTEGER_DATA, &value);
766 }
767
768 /**
769  * Set the value of a layer-2 data object
770  * @param l2data layer-2 data object
771  * @param origin originator of value
772  * @param boolean new value for data object
773  * @return true if value was overwrite, false otherwise
774  */
775 static INLINE bool
776 oonf_layer2_data_set_bool(struct oonf_layer2_data *l2data,
777     const struct oonf_layer2_origin *origin, bool boolean) {
778   union oonf_layer2_value value = {0};
779   value.boolean = boolean;
780   return oonf_layer2_data_set(l2data, origin, OONF_LAYER2_BOOLEAN_DATA, &value);
781 }
782
783 static INLINE int
784 oonf_layer2_net_data_from_string(
785     struct oonf_layer2_data *data, enum oonf_layer2_network_index idx,
786     struct oonf_layer2_origin *origin, const char *input) {
787   return oonf_layer2_data_from_string(
788       data, origin, oonf_layer2_net_metadata_get(idx), input);
789 }
790
791 static INLINE int
792 oonf_layer2_neigh_data_from_string(
793     struct oonf_layer2_data *data, enum oonf_layer2_neighbor_index idx,
794     struct oonf_layer2_origin *origin, const char *input) {
795   return oonf_layer2_data_from_string(
796       data, origin, oonf_layer2_neigh_metadata_get(idx), input);
797 }
798
799 /**
800  * Removes the value of a layer-2 data object
801  * @param l2data layer-2 data object
802  */
803 static INLINE void
804 oonf_layer2_data_reset(struct oonf_layer2_data *l2data) {
805   l2data->_type = OONF_LAYER2_NO_DATA;
806   l2data->_origin = NULL;
807 }
808
809 #endif /* OONF_LAYER2_H_ */