Implementation of connectivity abstraction feature Release v0.3
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / wifi_adapter / arduino / cawifiadapter.c
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 #include "cawifiadapter_singlethread.h"
22
23 #include <stdio.h>
24 #include <stdint.h>
25 #include "caadapterutils.h"
26 #include "logger.h"
27
28 #include "cawifiadapterutils.h"
29
30 /**
31  * @def WIFI_ETHERNET_ADAPTER_TAG
32  * @brief Logging tag for module name
33  */
34 #define WIFI_ADAPTER_TAG "WIFIADAP"
35
36 /**
37  * @def CA_PORT
38  * @brief Port to listen for incoming data
39  */
40 #define CA_PORT   5383
41
42 #define CA_MCAST_PORT   5683
43
44 /**
45  * @def CA_MULTICAST_IP
46  * @brief Multicast IP Address
47  */
48 #define CA_MULTICAST_IP "224.0.1.187"
49
50 /**
51  * @var gNetworkCallback
52  * @brief Network callback
53  */
54 static CANetworkChangeCallback gNetworkCallback = NULL;
55
56 /**
57  * @var gIsMulticastServerStarted
58  * @brief Flag to check if multicast server is started
59  */
60 static bool gIsMulticastServerStarted = false;
61
62 CAResult_t CAWIFIRegisterNetworkNotifications(CANetworkChangeCallback netCallback)
63 {
64     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
65
66     gNetworkCallback = netCallback;
67
68     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
69     return CA_STATUS_OK;
70 }
71
72 CAResult_t CAInitializeWifi(CARegisterConnectivityCallback registerCallback,
73                             CANetworkPacketReceivedCallback networkPacketCallback, CANetworkChangeCallback netCallback)
74 {
75     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
76     VERIFY_NON_NULL(registerCallback, WIFI_ADAPTER_TAG, "registerCallback");
77     VERIFY_NON_NULL(networkPacketCallback, WIFI_ADAPTER_TAG, "networkPacketCallback");
78     VERIFY_NON_NULL(netCallback, WIFI_ADAPTER_TAG, "netCallback");
79
80     CAConnectivityHandler_t wifiHandler;
81     wifiHandler.startAdapter = CAStartWIFI;
82     wifiHandler.startListenServer = CAStartWIFIListeningServer;
83     wifiHandler.startDiscoverServer = CAStartWIFIDiscoveryServer;
84     wifiHandler.sendData = CASendWIFIUnicastData;
85     wifiHandler.sendDataToAll = CASendWIFIMulticastData;
86     wifiHandler.GetnetInfo = CAGetWIFIInterfaceInformation;
87     wifiHandler.readData = CAReadWIFIData;
88     wifiHandler.stopAdapter = CAStopWIFI;
89     wifiHandler.terminate = CATerminateWIfI;
90     registerCallback(wifiHandler, CA_WIFI);
91
92     CASetWIFINetworkPacketCallback(networkPacketCallback);
93     CAWIFIRegisterNetworkNotifications(netCallback);
94
95     OIC_LOG(INFO, WIFI_ADAPTER_TAG, "IntializeWifi is Success");
96
97     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
98     return CA_STATUS_OK;
99 }
100
101 CAResult_t CAStartWIFI()
102 {
103     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
104     int16_t unicastPort = CA_PORT;
105     CAResult_t ret = CA_STATUS_OK;
106
107     /*Address is hardcoded as we are using Single Interface*/
108     ret = CAStartUnicastServer("0.0.0.0", &unicastPort);
109
110     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
111     return ret;
112 }
113
114 CAResult_t CAStartWIFIListeningServer()
115 {
116     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
117
118     CAResult_t ret = CA_STATUS_OK;
119     int16_t multicastPort = CA_MCAST_PORT;
120
121     if (gIsMulticastServerStarted == true)
122     {
123         OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Server is already Started");
124         return CA_SERVER_STARTED_ALREADY;
125     }
126
127     ret = CAStartMulticastServer(CA_MULTICAST_IP, "0.0.0.0", &multicastPort);
128     if (ret == CA_STATUS_OK)
129     {
130         OIC_LOG(INFO, WIFI_ADAPTER_TAG, "Multicast Server is Started Successfully");
131         gIsMulticastServerStarted = true;
132     }
133
134     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
135     return ret;
136 }
137
138 CAResult_t CAStartWIFIDiscoveryServer()
139 {
140     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
141
142     CAResult_t ret = CA_STATUS_OK;
143     int16_t multicastPort = CA_MCAST_PORT;
144
145     if (gIsMulticastServerStarted == true)
146     {
147         OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Server is already Started");
148         return CA_SERVER_STARTED_ALREADY;
149     }
150
151     ret = CAStartMulticastServer(CA_MULTICAST_IP, "0.0.0.0", &multicastPort);
152     if (ret == CA_STATUS_OK)
153     {
154         OIC_LOG(INFO, WIFI_ADAPTER_TAG, "Multicast Server is Started Successfully");
155         gIsMulticastServerStarted = true;
156     }
157
158     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
159     return ret;
160 }
161
162 uint32_t CASendWIFIUnicastData(const CARemoteEndpoint_t *remoteEndpoint, void *data,
163                                uint32_t dataLen)
164 {
165     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
166
167     uint32_t dataSize = 0;
168
169     VERIFY_NON_NULL_RET(remoteEndpoint, WIFI_ADAPTER_TAG, "remoteEndpoint",
170                         dataSize);
171     VERIFY_NON_NULL_RET(data, WIFI_ADAPTER_TAG, "data", dataSize);
172
173     if (dataLen == 0)
174     {
175         OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "DataLen is 0");
176         return dataSize;
177
178     }
179
180     dataSize = CAWIFISendData(remoteEndpoint->addressInfo.IP.ipAddress,
181                               remoteEndpoint->addressInfo.IP.port, data, dataLen, 0);
182
183     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
184     return dataSize;
185 }
186
187 uint32_t CASendWIFIMulticastData(void *data, uint32_t dataLength)
188 {
189     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
190     VERIFY_NON_NULL_RET(data, WIFI_ADAPTER_TAG, "data", 0);
191
192     uint32_t dataSize = 0;
193     if (dataLength == 0)
194     {
195         OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "DataLen is 0");
196         return 0;
197
198     }
199     dataSize = CAWIFISendData(CA_MULTICAST_IP, CA_MCAST_PORT, data, dataLength, 1);
200
201     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
202     return dataSize;
203 }
204
205 CAResult_t CAStartWIFINotifyRecvServers()
206 {
207     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
208
209     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
210     return CA_STATUS_OK;
211 }
212
213 uint32_t CASendWIFINotification(const CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
214 {
215     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
216
217     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
218     return CA_STATUS_OK;
219 }
220
221 CAResult_t CAGetWIFIInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
222 {
223     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
224
225     VERIFY_NON_NULL(info, WIFI_ADAPTER_TAG, "info");
226     char localIpAddress[CA_IPADDR_SIZE];
227     int32_t localIpAddressLen = sizeof(localIpAddress);
228
229     CAArduinoGetInterfaceAddress(localIpAddress, localIpAddressLen);
230     /**
231      * Create local endpoint using util function
232      */
233     (*info) = CAAdapterCreateLocalEndpoint(CA_WIFI, localIpAddress, "WiFi");
234     if (NULL == (*info))
235     {
236         OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Out of memory");
237         return CA_MEMORY_ALLOC_FAILED;
238     }
239
240     (*size) = 1;
241
242     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
243     return CA_STATUS_OK;
244 }
245
246 CAResult_t CAReadWIFIData()
247 {
248     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
249     CAArduoinoCheckServerData();
250     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
251     return CA_STATUS_OK;
252 }
253
254 CAResult_t CAStopWIFI()
255 {
256     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
257     CAResult_t result = CA_STATUS_FAILED;
258     result = CAStopUnicastServer();
259     if (result != CA_STATUS_OK)
260     {
261         OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Error");
262         return result;
263     }
264
265     result = CAStopMulticastServer();
266     if (result != CA_STATUS_OK)
267     {
268         OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Error");
269         return result;
270     }
271     else
272     {
273         gIsMulticastServerStarted = false;
274     }
275     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
276     return CA_STATUS_OK;
277 }
278
279 void CATerminateWIfI()
280 {
281     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "IN");
282
283     CASetWIFINetworkPacketCallback(NULL);
284     CAResult_t result = CAWIFIRegisterNetworkNotifications(NULL);
285     if (result != CA_STATUS_OK)
286     {
287         OIC_LOG(ERROR, WIFI_ADAPTER_TAG, "Error");
288     }
289
290     OIC_LOG(INFO, WIFI_ADAPTER_TAG, "TerminateWifi Success");
291
292     OIC_LOG(DEBUG, WIFI_ADAPTER_TAG, "OUT");
293     return;
294 }