Rename "subsystems" directory to "base"
[oonf.git] / include / oonf / olsrv2 / olsrv2 / olsrv2_lan.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 OLSRV2_LAN_H_
47 #define OLSRV2_LAN_H_
48
49 #include <oonf/libcommon/avl.h>
50 #include <oonf/oonf.h>
51 #include <oonf/libcommon/netaddr.h>
52
53 #include <oonf/nhdp/nhdp/nhdp.h>
54 #include <oonf/olsrv2/olsrv2/olsrv2.h>
55 #include <oonf/base/os_routing.h>
56
57 /**
58  * per-domain data for locally attached networks
59  */
60 struct olsrv2_lan_domaindata {
61   /*! outgoing metric value for LAN */
62   uint32_t outgoing_metric;
63
64   /*! routing metric (distance) for LAN */
65   uint8_t distance;
66
67   /*! true if LAN is active for this domain */
68   bool active;
69 };
70
71 /**
72  *  one locally attached network
73  */
74 struct olsrv2_lan_entry {
75   /*! unique key for LAN entry */
76   struct os_route_key prefix;
77
78   /*! hook into global tree of LANs */
79   struct avl_node _node;
80
81   /*! true if LAN has same distance on all active domains */
82   bool same_distance;
83
84   /*! domain specific LAN data */
85   struct olsrv2_lan_domaindata _domaindata[NHDP_MAXIMUM_DOMAINS];
86 };
87
88 void olsrv2_lan_init(void);
89 void olsrv2_lan_cleanup(void);
90
91 EXPORT struct olsrv2_lan_entry *olsrv2_lan_add(
92   struct nhdp_domain *domain, const struct os_route_key *prefix, uint32_t metric, uint8_t distance);
93 EXPORT void olsrv2_lan_remove(struct nhdp_domain *, const struct os_route_key *prefix);
94
95 EXPORT struct avl_tree *olsrv2_lan_get_tree(void);
96
97 /**
98  * @param prefix source specific prefix
99  * @return pointer to LAN set entry, NULL if not found
100  */
101 static INLINE struct olsrv2_lan_entry *
102 olsrv2_lan_get(const struct os_route_key *prefix) {
103   struct olsrv2_lan_entry *entry;
104
105   return avl_find_element(olsrv2_lan_get_tree(), prefix, entry, _node);
106 }
107
108 /**
109  * @param domain NHDP domain
110  * @param lan OLSRv2 locally attached network
111  * @return domain data of specified lan
112  */
113 static INLINE struct olsrv2_lan_domaindata *
114 olsrv2_lan_get_domaindata(struct nhdp_domain *domain, struct olsrv2_lan_entry *lan) {
115   return &lan->_domaindata[domain->index];
116 }
117
118 #endif /* OLSRV2_LAN_H_ */