Merge branch 'security-CKM' into 'master'
[platform/upstream/iotivity.git] / resource / csdk / connectivity / inc / caretransmission.h
1 /******************************************************************
2  *
3  * Copyright 2014 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 common function for retransmission messages.
24  */
25
26 #ifndef CA_RETRANSMISSION_H_
27 #define CA_RETRANSMISSION_H_
28
29 #include <stdint.h>
30
31 #include "cathreadpool.h"
32 #include "camutex.h"
33 #include "uarraylist.h"
34 #include "cacommon.h"
35
36 /** IP, EDR, LE. **/
37 #define DEFAULT_RETRANSMISSION_TYPE (CA_ADAPTER_IP | \
38                                      CA_ADAPTER_RFCOMM_BTEDR | \
39                                      CA_ADAPTER_GATT_BTLE)
40
41 /** default ACK time is 2 sec(CoAP). **/
42 #define DEFAULT_ACK_TIMEOUT_SEC     2
43
44 /** default max retransmission trying count is 4(CoAP). **/
45 #define DEFAULT_RETRANSMISSION_COUNT      4
46
47 /** check period is 1 sec. **/
48 #define RETRANSMISSION_CHECK_PERIOD_SEC     1
49
50 /** retransmission data send method type. **/
51 typedef CAResult_t (*CADataSendMethod_t)(const CAEndpoint_t *endpoint,
52                                          const void *pdu,
53                                          uint32_t size);
54
55 /** retransmission timeout callback type. **/
56 typedef void (*CATimeoutCallback_t)(const CAEndpoint_t *endpoint,
57                                     const void *pdu,
58                                     uint32_t size);
59
60 typedef struct
61 {
62     /** retransmission support transport type. **/
63     CATransportAdapter_t supportType;
64
65     /** retransmission trying count. **/
66     uint8_t tryingCount;
67
68 } CARetransmissionConfig_t;
69
70 typedef struct
71 {
72     /** Thread pool of the thread started. **/
73     ca_thread_pool_t threadPool;
74
75     /** mutex for synchronization. **/
76     ca_mutex threadMutex;
77
78     /** conditional mutex for synchronization. **/
79     ca_cond threadCond;
80
81     /** send method for retransmission data. **/
82     CADataSendMethod_t dataSendMethod;
83
84     /** callback function for retransmit timeout. **/
85     CATimeoutCallback_t timeoutCallback;
86
87     /** retransmission configure data. **/
88     CARetransmissionConfig_t config;
89
90     /** Variable to inform the thread to stop. **/
91     bool isStop;
92
93     /** array list on which the thread is operating. **/
94     u_arraylist_t *dataList;
95
96 } CARetransmission_t;
97
98 #ifdef __cplusplus
99 extern "C"
100 {
101 #endif
102
103 /**
104  * Initializes the retransmission context.
105  * @param[in]   context                      context for retransmission.
106  * @param[in]   handle                       thread pool handle.
107  * @param[in]   retransmissionSendMethod     function to be called for retransmission.
108  * @param[in]   timeoutCallback              callback for retransmit timeout.
109  * @param[in]   config                       configuration for retransmission.
110  *                                           if NULL is coming, it will set default values.
111  * @return  ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
112  */
113 CAResult_t CARetransmissionInitialize(CARetransmission_t *context,
114                                       ca_thread_pool_t handle,
115                                       CADataSendMethod_t retransmissionSendMethod,
116                                       CATimeoutCallback_t timeoutCallback,
117                                       CARetransmissionConfig_t* config);
118
119 /**
120  * Starting the retransmission context.
121  * @param[in]   context      context for retransmission.
122  * @return  ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
123  */
124 CAResult_t CARetransmissionStart(CARetransmission_t *context);
125
126 /**
127  * Pass the sent pdu data. if retransmission process need, internal thread will wake up and
128  * process the retransmission data.
129  * @param[in]   context      context for retransmission.
130  * @param[in]   endpoint     endpoint information.
131  * @param[in]   pdu          sent pdu binary data.
132  * @param[in]   size         sent pdu binary data size.
133  * @return  ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
134  */
135 CAResult_t CARetransmissionSentData(CARetransmission_t* context,
136                                     const CAEndpoint_t* endpoint,
137                                     const void* pdu, uint32_t size);
138
139 /**
140  * Pass the received pdu data. if received pdu is ACK data for the retransmission CON data,
141  * the specified CON data will remove on retransmission list.
142  * @param[in]   context              context for retransmission.
143  * @param[in]   endpoint             endpoint information.
144  * @param[in]   pdu                  received pdu binary data.
145  * @param[in]   size                 received pdu binary data size.
146  * @param[out]  retransmissionPdu    pdu data of the request for reset and ack.
147  * @return  ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
148  */
149 CAResult_t CARetransmissionReceivedData(CARetransmission_t *context,
150                                         const CAEndpoint_t *endpoint, const void *pdu,
151                                         uint32_t size, void **retransmissionPdu);
152
153 /**
154  * Stopping the retransmission context.
155  * @param[in]   context         context for retransmission.
156  * @return  ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
157  */
158 CAResult_t CARetransmissionStop(CARetransmission_t *context);
159
160 /**
161  * Terminating the retransmission context.
162  * @param[in]   context         context for retransmission.
163  * @return  ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
164  */
165 CAResult_t CARetransmissionDestroy(CARetransmission_t *context);
166
167 /**
168  * Invoke Retransmission according to TimedAction Response.
169  * @param[in]   threadValue     context for retransmission.
170  */
171 void CARetransmissionBaseRoutine(void *threadValue);
172
173 #ifdef __cplusplus
174 } /* extern "C" */
175 #endif
176
177 #endif  /* CA_RETRANSMISSION_H_ */