Rename "subsystems" directory to "base"
[oonf.git] / src / generic / dlep / ext_base_metric / metric.c
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 #include <oonf/libcommon/autobuf.h>
47 #include <oonf/libcommon/avl.h>
48 #include <oonf/oonf.h>
49 #include <oonf/base/oonf_timer.h>
50
51 #include <oonf/generic/dlep/dlep_extension.h>
52 #include <oonf/generic/dlep/dlep_iana.h>
53 #include <oonf/generic/dlep/dlep_reader.h>
54 #include <oonf/generic/dlep/dlep_writer.h>
55
56 #include <oonf/generic/dlep/ext_base_metric/metric.h>
57
58 /* peer initialization ack */
59 static const uint16_t _session_initack_tlvs[] = {
60   DLEP_MDRR_TLV,
61   DLEP_MDRT_TLV,
62   DLEP_CDRR_TLV,
63   DLEP_CDRT_TLV,
64   DLEP_LATENCY_TLV,
65   DLEP_RESOURCES_TLV,
66   DLEP_RLQR_TLV,
67   DLEP_RLQT_TLV,
68   DLEP_MTU_TLV,
69 };
70 static const uint16_t _session_initack_mandatory[] = {
71   DLEP_MDRR_TLV,
72   DLEP_MDRT_TLV,
73   DLEP_CDRR_TLV,
74   DLEP_CDRT_TLV,
75   DLEP_LATENCY_TLV,
76 };
77
78 /* peer update */
79 static const uint16_t _peer_update_tlvs[] = {
80   DLEP_MDRR_TLV,
81   DLEP_MDRT_TLV,
82   DLEP_CDRR_TLV,
83   DLEP_CDRT_TLV,
84   DLEP_LATENCY_TLV,
85   DLEP_RESOURCES_TLV,
86   DLEP_RLQR_TLV,
87   DLEP_RLQT_TLV,
88 };
89
90 /* destination up/update */
91 static const uint16_t _dst_tlvs[] = {
92   DLEP_MAC_ADDRESS_TLV,
93   DLEP_MDRR_TLV,
94   DLEP_MDRT_TLV,
95   DLEP_CDRR_TLV,
96   DLEP_CDRT_TLV,
97   DLEP_LATENCY_TLV,
98   DLEP_RESOURCES_TLV,
99   DLEP_RLQR_TLV,
100   DLEP_RLQT_TLV,
101 };
102 static const uint16_t _dst_mandatory[] = {
103   DLEP_MAC_ADDRESS_TLV,
104 };
105
106 /* supported signals of this extension */
107 static struct dlep_extension_signal _signals[] = {
108   {
109     .id = DLEP_SESSION_INITIALIZATION_ACK,
110     .supported_tlvs = _session_initack_tlvs,
111     .supported_tlv_count = ARRAYSIZE(_session_initack_tlvs),
112     .mandatory_tlvs = _session_initack_mandatory,
113     .mandatory_tlv_count = ARRAYSIZE(_session_initack_mandatory),
114     .add_radio_tlvs = dlep_extension_radio_write_session_init_ack,
115     .process_router = dlep_extension_router_process_session_init_ack,
116   },
117   {
118     .id = DLEP_SESSION_UPDATE,
119     .supported_tlvs = _peer_update_tlvs,
120     .supported_tlv_count = ARRAYSIZE(_peer_update_tlvs),
121     .add_radio_tlvs = dlep_extension_radio_write_session_update,
122     .process_router = dlep_extension_router_process_session_update,
123   },
124   {
125     .id = DLEP_DESTINATION_UP,
126     .supported_tlvs = _dst_tlvs,
127     .supported_tlv_count = ARRAYSIZE(_dst_tlvs),
128     .mandatory_tlvs = _dst_mandatory,
129     .mandatory_tlv_count = ARRAYSIZE(_dst_mandatory),
130     .add_radio_tlvs = dlep_extension_radio_write_destination,
131     .process_router = dlep_extension_router_process_destination,
132   },
133   {
134     .id = DLEP_DESTINATION_UPDATE,
135     .supported_tlvs = _dst_tlvs,
136     .supported_tlv_count = ARRAYSIZE(_dst_tlvs),
137     .mandatory_tlvs = _dst_mandatory,
138     .mandatory_tlv_count = ARRAYSIZE(_dst_mandatory),
139     .add_radio_tlvs = dlep_extension_radio_write_destination,
140     .process_router = dlep_extension_router_process_destination,
141   },
142 };
143
144 /* supported TLVs of this extension */
145 static struct dlep_extension_tlv _tlvs[] = {
146   { DLEP_MAC_ADDRESS_TLV, 6, 8 },
147   { DLEP_MDRR_TLV, 8, 8 },
148   { DLEP_MDRT_TLV, 8, 8 },
149   { DLEP_CDRR_TLV, 8, 8 },
150   { DLEP_CDRT_TLV, 8, 8 },
151   { DLEP_LATENCY_TLV, 8, 8 },
152   { DLEP_RESOURCES_TLV, 1, 1 },
153   { DLEP_RLQR_TLV, 1, 1 },
154   { DLEP_RLQT_TLV, 1, 1 },
155 };
156
157 static struct dlep_neighbor_mapping _neigh_mappings[] = {
158   {
159     .dlep = DLEP_MDRR_TLV,
160     .layer2 = OONF_LAYER2_NEIGH_RX_MAX_BITRATE,
161     .length = 8,
162
163     .mandatory = true,
164     .default_value.integer = 0,
165
166     .from_tlv = dlep_reader_map_identity,
167     .to_tlv = dlep_writer_map_identity,
168   },
169   {
170     .dlep = DLEP_MDRT_TLV,
171     .layer2 = OONF_LAYER2_NEIGH_TX_MAX_BITRATE,
172     .length = 8,
173
174     .mandatory = true,
175     .default_value.integer = 0,
176
177     .from_tlv = dlep_reader_map_identity,
178     .to_tlv = dlep_writer_map_identity,
179   },
180   {
181     .dlep = DLEP_CDRR_TLV,
182     .layer2 = OONF_LAYER2_NEIGH_RX_BITRATE,
183     .length = 8,
184
185     .mandatory = true,
186     .default_value.integer = 0,
187
188     .from_tlv = dlep_reader_map_identity,
189     .to_tlv = dlep_writer_map_identity,
190   },
191   {
192     .dlep = DLEP_CDRT_TLV,
193     .layer2 = OONF_LAYER2_NEIGH_TX_BITRATE,
194     .length = 8,
195
196     .mandatory = true,
197     .default_value.integer = 0,
198
199     .from_tlv = dlep_reader_map_identity,
200     .to_tlv = dlep_writer_map_identity,
201   },
202   {
203     .dlep = DLEP_LATENCY_TLV,
204     .layer2 = OONF_LAYER2_NEIGH_LATENCY,
205     .length = 8,
206
207     .mandatory = true,
208     .default_value.integer = 1,
209
210     .from_tlv = dlep_reader_map_identity,
211     .to_tlv = dlep_writer_map_identity,
212   },
213   {
214     .dlep = DLEP_RESOURCES_TLV,
215     .layer2 = OONF_LAYER2_NEIGH_RESOURCES,
216     .length = 1,
217     .from_tlv = dlep_reader_map_identity,
218     .to_tlv = dlep_writer_map_identity,
219   },
220   {
221     .dlep = DLEP_RLQR_TLV,
222     .layer2 = OONF_LAYER2_NEIGH_RX_RLQ,
223     .length = 1,
224     .from_tlv = dlep_reader_map_identity,
225     .to_tlv = dlep_writer_map_identity,
226   },
227   {
228     .dlep = DLEP_RLQT_TLV,
229     .layer2 = OONF_LAYER2_NEIGH_TX_RLQ,
230     .length = 1,
231     .from_tlv = dlep_reader_map_identity,
232     .to_tlv = dlep_writer_map_identity,
233   },
234 };
235
236 /* DLEP base extension, radio side */
237 static struct dlep_extension _base_metric = {
238   .id = DLEP_EXTENSION_BASE_METRIC,
239   .name = "base metric",
240
241   .signals = _signals,
242   .signal_count = ARRAYSIZE(_signals),
243   .tlvs = _tlvs,
244   .tlv_count = ARRAYSIZE(_tlvs),
245   .neigh_mapping = _neigh_mappings,
246   .neigh_mapping_count = ARRAYSIZE(_neigh_mappings),
247 };
248
249 /**
250  * Initialize the base metric DLEP extension
251  * @return this extension
252  */
253 struct dlep_extension *
254 dlep_base_metric_init(void) {
255   dlep_extension_add(&_base_metric);
256   return &_base_metric;
257 }