Drop arduino support: SINGLE_THREAD
[iotivity.git] / resource / csdk / routing / include / routingtablemanager.h
1 /* ****************************************************************
2  *
3  * Copyright 2015 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************/
20
21 /**
22  * @file
23  * This file contains the APIs for routing table manager.
24  */
25 #ifndef ROUTING_TABLE_MANAGER_H_
26 #define ROUTING_TABLE_MANAGER_H_
27
28 #include <unistd.h>
29 #include <time.h>
30 #include <sys/time.h>
31
32 #if defined(__ANDROID__)
33 #include <linux/time.h>
34 #endif
35 #include "ulinklist.h"
36 #include "uarraylist.h"
37 #include "octypes.h"
38
39
40 #ifdef __cplusplus
41 extern "C"
42 {
43 #endif
44
45 /**
46  * Maximum hop/destination address length.
47  */
48 #define MAX_DEST_ADDR_LEN 40
49
50 /**
51  * Maximum number of observers for the gateway resource.
52  */
53 #define MAX_NUM_OBSERVERS 10
54
55 /**
56  * Maximum time after which gateway should send a notification for its existence.
57  * Every 30s gateway will send its existence notification.
58  */
59 #define GATEWAY_ALIVE_TIMEOUT 30
60
61 /**
62  * The routing table entries are validated for every 40 seconds for its existence.
63  */
64 #define ROUTINGTABLE_REFRESH_TIMEOUT 40
65
66 /**
67  * The routing table entries are removed if entries are invalid every 45 seconds.
68  */
69 #define ROUTINGTABLE_VALIDATION_TIMEOUT 45
70
71 /**
72  * Destination Interface Address entries.
73  */
74 typedef struct
75 {
76     uint32_t observerId;                    /**< Observer Id. */
77     CAEndpoint_t destIntfAddr;              /**< Destination Interface Address. */
78     uint32_t timeElapsed;                   /**< Time elapsed. */
79     bool isValid;                           /**< Valid check for Gateway. */
80 } RTMDestIntfInfo_t;
81
82 /**
83  * Endpoint Address entries.
84  */
85 typedef struct
86 {
87     uint16_t endpointId;                    /**< Endpoint Id. */
88     CAEndpoint_t destIntfAddr;              /**< Destination Interface Address. */
89 } RTMEndpointEntry_t;
90
91 /**
92  * Gateway Address entries.
93  */
94 typedef struct gatewayAddress
95 {
96     uint32_t gatewayId;                     /**< Gateway Id. */
97     u_arraylist_t *destIntfAddr;            /**< Destination Interface Addresses. */
98 } RTMGatewayId_t;
99
100 /**
101  * Routing table entries at Gateway.
102  */
103 typedef struct
104 {
105     RTMGatewayId_t *destination;            /**< destination Address. */
106     RTMGatewayId_t *nextHop;                /**< Next Hop Information. */
107     uint32_t routeCost;                     /**< routeCost. */
108     uint16_t mcastMessageSeqNum;            /**< sequence number for last mcast packet. */
109     uint32_t seqNum;                        /**< sequence number for notification. */
110 } RTMGatewayEntry_t;
111
112 /**
113  * Initialize the Routing Table Manager.
114  * @param[in,out] gatewayTable      Gateway Routing Table.
115  * @param[in,out] endpointTable     Endpoint Routing Table.
116  * @return  ::OC_STACK_OK or Appropriate error code.
117  */
118 OCStackResult RTMInitialize(u_linklist_t **gatewayTable, u_linklist_t **endpointTable);
119
120 /**
121  * Terminates the Routing Table Manager.
122  * @param[in,out] gatewayTable      Gateway Routing Table.
123  * @param[in,out] endpointTable     Endpoint Routing Table.
124  * @return  ::OC_STACK_OK or Appropriate error code.
125  */
126 OCStackResult RTMTerminate(u_linklist_t **gatewayTable, u_linklist_t **endpointTable);
127
128 /**
129  * Frees the gateway table memory with nodes containing structure RTMGatewayEntry_t.
130  * @param[in,out] gatewayTable      Gateway Routing Table.
131  * @return  ::OC_STACK_OK or Appropriate error code.
132  */
133 OCStackResult RTMFreeGatewayRouteTable(u_linklist_t **gatewayTable);
134
135 /**
136  * Frees the gateway ID list memory with nodes containing structute RTMGatewayId_t.
137  * @param[in,out] gatewayIdTable      Gateway ID list.
138  * @return  ::OC_STACK_OK or Appropriate error code.
139  */
140 OCStackResult RTMFreeGatewayIdList(u_linklist_t **gatewayIdTable);
141
142 /**
143  * Frees the endpoint table memory with nodes containing structute RTMEndpointEntry_t.
144  * @param[in,out] endpointTable     Endpoint Routing Table.
145  * @return  ::OC_STACK_OK or Appropriate error code.
146  */
147 OCStackResult RTMFreeEndpointRouteTable(u_linklist_t **endpointTable);
148
149 /**
150  * Adds the entry to the routing table if the entry for Gateway id is
151  * not preset in Routing table, Updates the Old entry if Entry for
152  * Gateway Id is already present in Routing table i.e routeCost and NextHop
153  * will be updated for efficient hop result.
154  *
155  * @param[in]       gatewayId           Gateway Id.
156  * @param[in]       nextHop             Next Hop address.
157  * @param[in]       routeCost           Shortest Path to Destination - Hopcount.
158  * @param[in]       destInterfaces      Destination Interface Information.
159  * @param[in,out]   gatewayTable        Gateway Routing Table.
160  * @return  ::OC_STACK_OK or Appropriate error code.
161  */
162 OCStackResult RTMAddGatewayEntry(uint32_t gatewayId, uint32_t nextHop, uint32_t routeCost,
163                                  const RTMDestIntfInfo_t *destInterfaces, u_linklist_t **gatewayTable);
164
165 /**
166  * Adds the endpoint entry to the routing table.
167  * @param[in,out]   endpointId          Endpoint Id.
168  * @param[in]       destAddr            Destination Address.
169  * @param[in,out]   endpointTable       Endpoint Routing Table.
170  * @return  ::OC_STACK_OK or Appropriate error code.
171  */
172 OCStackResult RTMAddEndpointEntry(uint16_t *endpointId, const CAEndpoint_t *destAddr,
173                                   u_linklist_t **endpointTable);
174
175 /**
176  * Removes the gateway entry from the routing table and also removes
177  * corresponding entries having nexthop as removed gateway.
178  * @param[in]        gatewayId              Gateway id of node need to be removed.
179  * @param[in,out]    removedGatewayNodes    Linklist containing removed gateway nodes
180  *                                          list need to be freed by caller.
181  * @param[in,out]    gatewayTable           Gateway Routing Table.
182  * @return  ::OC_STACK_OK or Appropriate error code.
183  */
184 OCStackResult RTMRemoveGatewayEntry(uint32_t gatewayId, u_linklist_t **removedGatewayNodes,
185                                     u_linklist_t **gatewayTable);
186
187 /**
188  * Removes the endpoint entry from the routing table.
189  * @param[in]       endpointId        Endpoint id of node need to be removed.
190  * @param[in,out]   endpointTable     Endpoint Routing Table.
191  * @return  ::OC_STACK_OK or Appropriate error code.
192  */
193 OCStackResult RTMRemoveEndpointEntry(uint16_t endpointId, u_linklist_t **endpointTable);
194
195 /**
196  * Removes the gateway entry from the routing table which has gateway id and nexthop as given.
197  * @param[in]        gatewayId              Gateway Id.
198  * @param[in]        nextHop                Next Hop address.
199  * @param[in]        destInfAdr             Destination Address of Next Hop to update time.
200  * @param[in,out]    existEntry             Entry which has different Next Hop.
201  * @param[in,out]    gatewayTable           Gateway Routing Table.
202  * @return  ::OC_STACK_OK or Appropriate error code.
203  */
204 OCStackResult RTMRemoveGatewayDestEntry(uint32_t gatewayId, uint32_t nextHop,
205                                         const RTMDestIntfInfo_t *destInfAdr,
206                                         RTMGatewayEntry_t **existEntry, u_linklist_t **gatewayTable);
207 /**
208  * Removes the gateway nodes.
209  * @param[in,out]    gatewayTable           Gateway Routing Table.
210  * @return  ::OC_STACK_OK or Appropriate error code.
211  */
212 OCStackResult RTMRemoveGateways(u_linklist_t **gatewayTable);
213
214 /**
215  * Removes the endpoint nodes.
216  * @param[in,out]   endpointTable           Endpoint Routing Table.
217  * @return  ::OC_STACK_OK or Appropriate error code.
218  */
219 OCStackResult RTMRemoveEndpoints(u_linklist_t **endpointTable);
220
221 /**
222  * Gets the neighbor nodes i.e nodes with routecost 1.
223  * @param[in,out]   neighbourNodes        link list containing neighbor nodes.
224                                           this list will be pointer to GatewayIds
225                                           and must be freed by caller.
226  * @param[in]       gatewayTable           Gateway Routing Table.
227  */
228 void RTMGetNeighbours(u_linklist_t **neighbourNodes, const u_linklist_t *gatewayTable);
229
230 /**
231  * Gets next hop from the routing table.
232  * @param[in]        gatewayId              Gateway Id.
233  * @param[in]        gatewayTable           Gateway Routing Table.
234  * @return  Next Hop address - returns NULL if it is End Device.
235  */
236 RTMGatewayId_t *RTMGetNextHop(uint32_t gatewayId, const u_linklist_t *gatewayTable);
237
238 /**
239  * Gets endpoint entry
240  * @param[in]       endpointId        Endpoint id of node need to be removed.
241  * @param[in]       endpointTable     Endpoint Routing Table.
242  * @return  Endpoint Destination inteface address.
243  */
244 CAEndpoint_t *RTMGetEndpointEntry(uint16_t endpointId, const u_linklist_t *endpointTable);
245
246 /**
247  * Updates destination interface address of an entry with provided gateway id
248  * as destination.
249  * @param[in]        gatewayId               Gateway Id of Hop need to be updated.
250  * @param[in]        destInterfaces          Destination Interface Information.
251  * @param[in]        addAdr                  Add/Remove destination address.
252  * @param[in,out]    gatewayTable            Gateway Routing Table.
253  * @return  ::OC_STACK_OK or Appropriate error code.
254  */
255 OCStackResult RTMUpdateDestinationIntfAdr(uint32_t gatewayId, RTMDestIntfInfo_t destInterfaces,
256                                           bool addAdr, u_linklist_t **gatewayTable);
257
258 /**
259  * Updates Multicast sequence number for gatewayID
260  * @param[in]       gatewayId           Gateway Id of Hop need to be updated.
261  * @param[in]       seqNum              Sequence number for last cast packet from gateway.
262  * @param[in,out]   gatewayTable        Gateway Routing Table.
263  * @return  ::OC_STACK_OK or Appropriate error code.
264  */
265 OCStackResult RTMUpdateMcastSeqNumber(uint32_t gatewayId, uint16_t seqNum,
266                                       u_linklist_t **gatewayTable);
267
268 /**
269  * Prints the routing table
270  * @param[in]    gatewayTable           Gateway Routing Table.
271  * @param[in]    endpointTable          Endpoint Routing Table.
272  */
273 void RTMPrintTable(const u_linklist_t *gatewayTable, const u_linklist_t *endpointTable);
274
275 /**
276  * Frees the GatewayId
277  * @param[in]        gateway                Gateway Structure pointer.
278  * @param[in,out]    gatewayTable           Gateway Routing Table.
279  */
280 void RTMFreeGateway(RTMGatewayId_t *gateway, u_linklist_t **gatewayTable);
281
282 /**
283  * Gets the list of observer IDs.
284  * @param[in,out]    obsList                List of Observation IDs.
285  * @param[in,out]    obsListLen             Length if Observation ID list.
286  * @param[in]        gatewayTable           Gateway Routing Table.
287  */
288 void RTMGetObserverList(OCObservationId **obsList, uint32_t *obsListLen,
289                         const u_linklist_t *gatewayTable);
290
291 /**
292  * Adds a observer address and obsID to the list.
293  * @param[in]        obsID                  Observation ID.
294  * @param[in]        devAddr                Address of Gateway.
295  * @param[in,out]    gatewayTable           Gateway Routing Table.
296  * @return  ::OC_STACK_OK or Appropriate error code.
297  */
298 OCStackResult RTMAddObserver(uint32_t obsID, CAEndpoint_t devAddr, u_linklist_t **gatewayTable);
299
300 /**
301  * Check if a particular observer address is already registerd and returns
302  * its obsID if present.
303  * @param[in]        devAddr                Address of Gateway.
304  * @param[in,out]    obsID                  Observation ID.
305  * @param[in]        gatewayTable           Gateway Routing Table.
306  * @return  true or false.
307  */
308 bool RTMIsObserverPresent(CAEndpoint_t devAddr, OCObservationId *obsID,
309                           const u_linklist_t *gatewayTable);
310
311 /**
312  * Gets Current Time in Micro Seconds.
313  * @return  Current Time.
314  */
315 uint64_t RTMGetCurrentTime();
316
317 /**
318  * Update Gateway Address Validity.
319  * @param[in,out]    invalidTable      Removed entries Table.
320  * @param[in,out]    gatewayTable      Gateway Routing Table.
321  * @return  ::OC_STACK_OK or Appropriate error code.
322  */
323 OCStackResult RTMUpdateDestAddrValidity(u_linklist_t **invalidTable, u_linklist_t **gatewayTable);
324
325 /**
326  * Removes invalid gateways.
327  * @param[in,out]    invalidTable      Removed entries Table.
328  * @param[in,out]    gatewayTable      Gateway Routing Table.
329  * @return  ::OC_STACK_OK or Appropriate error code.
330  */
331 OCStackResult RTMRemoveInvalidGateways(u_linklist_t **invalidTable, u_linklist_t **gatewayTable);
332
333 /**
334  * Update Sequence number of Gateway Entry.
335  * @param[in]       gatewayId           Gateway Id.
336  * @param[in]       seqNum              Sequence Number of Entry.
337  * @param[in]       destAdr             Destination Interface Information.
338  * @param[out]      gatewayTable        Gateway Routing Table.
339  * @param[in]       forceUpdate         To Update parameters forcefully.
340  * @return  ::OC_STACK_OK or Appropriate error code.
341  */
342 OCStackResult RTMUpdateEntryParameters(uint32_t gatewayId, uint32_t seqNum,
343                                        const RTMDestIntfInfo_t *destAdr, u_linklist_t **gatewayTable,
344                                        bool forceUpdate);
345
346 #ifdef __cplusplus
347 } /* extern "C" */
348 #endif
349
350 #endif /* ROUTING_TABLE_MANAGER_H_ */
351