b3e3c7b05f6e3f2e6e4ebea99403dd06d3efbf3f
[oonf.git] / src-plugins / generic / dlep / ext_lid / lid.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 "common/autobuf.h"
47 #include "common/avl.h"
48 #include "common/common_types.h"
49 #include "subsystems/oonf_timer.h"
50
51 #include "dlep/dlep_extension.h"
52 #include "dlep/dlep_iana.h"
53 #include "dlep/dlep_reader.h"
54 #include "dlep/dlep_writer.h"
55
56 #include "dlep/ext_lid/lid.h"
57
58 static int _write_lid_only(struct dlep_extension *ext, struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh);
59 static void _cb_session_init(struct dlep_session *session);
60 static void _cb_session_deactivate(struct dlep_session *session);
61
62 /* UDP peer discovery */
63
64 /* destination up */
65 static const uint16_t _dst_up_tlvs[] = {
66   DLEP_LID_TLV,
67 };
68 static const uint16_t _dst_up_mandatory[] = {
69   DLEP_LID_TLV,
70 };
71
72 /* destination up ack */
73 static const uint16_t _dst_up_ack_tlvs[] = {
74   DLEP_LID_TLV,
75 };
76 static const uint16_t _dst_up_ack_mandatory[] = {
77   DLEP_LID_TLV,
78 };
79
80 /* destination down */
81 static const uint16_t _dst_down_tlvs[] = {
82   DLEP_LID_TLV,
83 };
84 static const uint16_t _dst_down_mandatory[] = {
85   DLEP_LID_TLV,
86 };
87
88 /* destination down ack */
89 static const uint16_t _dst_down_ack_tlvs[] = {
90   DLEP_LID_TLV,
91 };
92 static const uint16_t _dst_down_ack_mandatory[] = {
93   DLEP_LID_TLV,
94 };
95
96 /* destination update */
97 static const uint16_t _dst_update_tlvs[] = {
98   DLEP_LID_TLV,
99 };
100 static const uint16_t _dst_update_mandatory[] = {
101   DLEP_MAC_ADDRESS_TLV,
102 };
103
104 /* link characteristics request */
105 static const uint16_t _linkchar_req_tlvs[] = {
106   DLEP_LID_TLV,
107 };
108 static const uint16_t _linkchar_req_mandatory[] = {
109   DLEP_LID_TLV,
110 };
111
112 /* link characteristics ack */
113 static const uint16_t _linkchar_ack_tlvs[] = {
114   DLEP_LID_TLV,
115 };
116 static const uint16_t _linkchar_ack_mandatory[] = {
117   DLEP_LID_TLV,
118 };
119
120 /* supported signals of this extension, parsing the LID TLV is done by dlep_extension */
121 static struct dlep_extension_signal _signals[] = {
122   {
123     .id = DLEP_DESTINATION_UP,
124     .supported_tlvs = _dst_up_tlvs,
125     .supported_tlv_count = ARRAYSIZE(_dst_up_tlvs),
126     .mandatory_tlvs = _dst_up_mandatory,
127     .mandatory_tlv_count = ARRAYSIZE(_dst_up_mandatory),
128     .add_radio_tlvs = _write_lid_only,
129   },
130   {
131     .id = DLEP_DESTINATION_UP_ACK,
132     .supported_tlvs = _dst_up_ack_tlvs,
133     .supported_tlv_count = ARRAYSIZE(_dst_up_ack_tlvs),
134     .mandatory_tlvs = _dst_up_ack_mandatory,
135     .mandatory_tlv_count = ARRAYSIZE(_dst_up_ack_mandatory),
136     .add_router_tlvs = _write_lid_only,
137   },
138   {
139     .id = DLEP_DESTINATION_DOWN,
140     .supported_tlvs = _dst_down_tlvs,
141     .supported_tlv_count = ARRAYSIZE(_dst_down_tlvs),
142     .mandatory_tlvs = _dst_down_mandatory,
143     .mandatory_tlv_count = ARRAYSIZE(_dst_down_mandatory),
144     .add_radio_tlvs = _write_lid_only,
145   },
146   {
147     .id = DLEP_DESTINATION_DOWN_ACK,
148     .supported_tlvs = _dst_down_ack_tlvs,
149     .supported_tlv_count = ARRAYSIZE(_dst_down_ack_tlvs),
150     .mandatory_tlvs = _dst_down_ack_mandatory,
151     .mandatory_tlv_count = ARRAYSIZE(_dst_down_ack_mandatory),
152     .add_router_tlvs = _write_lid_only,
153   },
154   {
155     .id = DLEP_DESTINATION_UPDATE,
156     .supported_tlvs = _dst_update_tlvs,
157     .supported_tlv_count = ARRAYSIZE(_dst_update_tlvs),
158     .mandatory_tlvs = _dst_update_mandatory,
159     .mandatory_tlv_count = ARRAYSIZE(_dst_update_mandatory),
160     .add_radio_tlvs = _write_lid_only,
161   },
162   {
163     .id = DLEP_LINK_CHARACTERISTICS_REQUEST,
164     .supported_tlvs = _linkchar_req_tlvs,
165     .supported_tlv_count = ARRAYSIZE(_linkchar_req_tlvs),
166     .mandatory_tlvs = _linkchar_req_mandatory,
167     .mandatory_tlv_count = ARRAYSIZE(_linkchar_req_mandatory),
168     .add_router_tlvs = _write_lid_only,
169   },
170   {
171     .id = DLEP_LINK_CHARACTERISTICS_ACK,
172     .supported_tlvs = _linkchar_ack_tlvs,
173     .supported_tlv_count = ARRAYSIZE(_linkchar_ack_tlvs),
174     .mandatory_tlvs = _linkchar_ack_mandatory,
175     .mandatory_tlv_count = ARRAYSIZE(_linkchar_ack_mandatory),
176     .add_radio_tlvs = _write_lid_only,
177   },
178 };
179
180 /* supported TLVs of this extension */
181 static struct dlep_extension_tlv _tlvs[] = {
182   { DLEP_LID_TLV, 1, OONF_LAYER2_MAX_LINK_ID },
183 };
184
185 /* DLEP base extension, radio side */
186 static struct dlep_extension _lid = {
187   .id = DLEP_EXTENSION_LINK_ID,
188   .name = "linkid",
189
190   .signals = _signals,
191   .signal_count = ARRAYSIZE(_signals),
192   .tlvs = _tlvs,
193   .tlv_count = ARRAYSIZE(_tlvs),
194
195   .cb_session_init_radio = _cb_session_init,
196   .cb_session_init_router = _cb_session_init,
197   .cb_session_deactivate_radio = _cb_session_deactivate,
198   .cb_session_deactivate_router = _cb_session_deactivate,
199 };
200
201 /**
202  * Get link-id DLEP extension
203  * @return this extension
204  */
205 struct dlep_extension *
206 dlep_lid_init(void) {
207   dlep_extension_add(&_lid);
208   return &_lid;
209 }
210
211 /**
212  * Write the link-id TLV into the DLEP message
213  * @param ext (this) dlep extension
214  * @param session dlep session
215  * @param neigh layer2 neighbor key to write into TLV
216  * @return -1 if an error happened, 0 otherwise
217  */
218 static int
219 _write_lid_only(
220   struct dlep_extension *ext __attribute__((unused)), struct dlep_session *session, const struct oonf_layer2_neigh_key *neigh) {
221   if (dlep_writer_add_lid_tlv(&session->writer, neigh)) {
222     return -1;
223   }
224   return 0;
225 }
226
227 static void
228 _cb_session_init(struct dlep_session *session) {
229   session->allow_lids = true;
230 }
231
232 static void
233 _cb_session_deactivate(struct dlep_session *session) {
234   session->allow_lids = false;
235 }