1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 ******************************************************************/
26 #include "cainterface.h"
27 #include "caremotehandler.h"
28 #include "camessagehandler.h"
29 #include "caprotocolmessage.h"
30 #include "canetworkconfigurator.h"
31 #include "cainterfacecontroller.h"
34 #include "caadapternetdtls.h"
37 CAGlobals_t caglobals = { 0 };
39 #define TAG "CA_CONN_MGR"
41 static bool g_isInitialized = false;
44 // CAAdapterNetDTLS will register the callback.
45 // Taking callback all the way through adapters not the right approach, hence calling here.
46 extern void CADTLSSetCredentialsCallback(CAGetDTLSCredentialsHandler credCallback);
49 CAResult_t CAInitialize()
51 OIC_LOG(DEBUG, TAG, "CAInitialize");
55 CAResult_t res = CAInitializeMessageHandler();
56 if (res != CA_STATUS_OK)
58 OIC_LOG(ERROR, TAG, "CAInitialize has failed");
61 g_isInitialized = true;
68 OIC_LOG(DEBUG, TAG, "CATerminate");
72 CATerminateMessageHandler();
73 CATerminateNetworkType();
75 g_isInitialized = false;
79 CAResult_t CAStartListeningServer()
81 OIC_LOG(DEBUG, TAG, "CAStartListeningServer");
85 return CA_STATUS_NOT_INITIALIZED;
88 return CAStartListeningServerAdapters();
91 CAResult_t CAStartDiscoveryServer()
93 OIC_LOG(DEBUG, TAG, "CAStartDiscoveryServer");
97 return CA_STATUS_NOT_INITIALIZED;
100 return CAStartDiscoveryServerAdapters();
103 void CARegisterHandler(CARequestCallback ReqHandler, CAResponseCallback RespHandler,
104 CAErrorCallback ErrorHandler)
106 OIC_LOG(DEBUG, TAG, "CARegisterHandler");
110 OIC_LOG(DEBUG, TAG, "CA is not initialized");
114 CASetInterfaceCallbacks(ReqHandler, RespHandler, ErrorHandler);
118 CAResult_t CARegisterDTLSCredentialsHandler(CAGetDTLSCredentialsHandler GetDTLSCredentialsHandler)
120 OIC_LOG(DEBUG, TAG, "CARegisterDTLSCredentialsHandler");
124 return CA_STATUS_NOT_INITIALIZED;
127 CADTLSSetCredentialsCallback(GetDTLSCredentialsHandler);
130 #endif //__WITH_DTLS__
132 CAResult_t CACreateEndpoint(CATransportFlags_t flags,
133 CATransportAdapter_t adapter,
136 CAEndpoint_t **object)
140 OIC_LOG(ERROR, TAG, "Invalid Parameter");
141 return CA_STATUS_INVALID_PARAM;
144 CAEndpoint_t *endpoint = CACreateEndpointObject(flags, adapter, addr, port);
147 return CA_STATUS_FAILED;
153 void CADestroyEndpoint(CAEndpoint_t *rep)
155 OIC_LOG(DEBUG, TAG, "CADestroyEndpoint");
160 CAResult_t CAGenerateToken(CAToken_t *token, uint8_t tokenLength)
162 OIC_LOG(DEBUG, TAG, "CAGenerateToken");
164 return CAGenerateTokenInternal(token, tokenLength);
167 void CADestroyToken(CAToken_t token)
169 OIC_LOG(DEBUG, TAG, "CADestroyToken");
171 CADestroyTokenInternal(token);
173 OIC_LOG(DEBUG, TAG, "OUT");
176 CAResult_t CAGetNetworkInformation(CAEndpoint_t **info, uint32_t *size)
178 OIC_LOG(DEBUG, TAG, "CAGetNetworkInformation");
182 return CA_STATUS_NOT_INITIALIZED;
185 return CAGetNetworkInformationInternal(info, size);
188 CAResult_t CASendRequest(const CAEndpoint_t *object,const CARequestInfo_t *requestInfo)
190 OIC_LOG(DEBUG, TAG, "CASendGetRequest");
194 return CA_STATUS_NOT_INITIALIZED;
197 return CADetachRequestMessage(object, requestInfo);
200 CAResult_t CASendNotification(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
202 OIC_LOG(DEBUG, TAG, "CASendNotification");
206 return CA_STATUS_NOT_INITIALIZED;
209 return CADetachResponseMessage(object, responseInfo);
212 CAResult_t CASendResponse(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
214 OIC_LOG(DEBUG, TAG, "CASendResponse");
218 return CA_STATUS_NOT_INITIALIZED;
221 return CADetachResponseMessage(object, responseInfo);
224 CAResult_t CASelectNetwork(CATransportAdapter_t interestedNetwork)
226 OIC_LOG_V(DEBUG, TAG, "Selected network : %d", interestedNetwork);
230 return CA_STATUS_NOT_INITIALIZED;
233 CAResult_t res = CA_STATUS_OK;
235 if (interestedNetwork & CA_ADAPTER_IP)
237 res = CAAddNetworkType(CA_ADAPTER_IP);
238 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_IP_ADAPTER) function returns error : %d", res);
240 else if (interestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
242 res = CAAddNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
243 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_RFCOMM_ADAPTER) function returns error : %d", res);
245 else if (interestedNetwork & CA_ADAPTER_GATT_BTLE)
247 res = CAAddNetworkType(CA_ADAPTER_GATT_BTLE);
248 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_GATT_ADAPTER) function returns error : %d", res);
252 else if (interestedNetwork & CA_ADAPTER_REMOTE_ACCESS)
254 res = CAAddNetworkType(CA_ADAPTER_REMOTE_ACCESS);
255 OIC_LOG_V(ERROR, TAG, "CAAddNetworkType(CA_ADAPTER_REMOTE_ACCESS) function returns error : %d",
261 res = CA_NOT_SUPPORTED;
266 CAResult_t CAUnSelectNetwork(CATransportAdapter_t nonInterestedNetwork)
268 OIC_LOG_V(DEBUG, TAG, "unselected network : %d", nonInterestedNetwork);
272 return CA_STATUS_NOT_INITIALIZED;
275 CAResult_t res = CA_STATUS_OK;
277 if (nonInterestedNetwork & CA_ADAPTER_IP)
279 res = CARemoveNetworkType(CA_ADAPTER_IP);
280 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_IP_ADAPTER) function returns error : %d", res);
282 else if (nonInterestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
284 res = CARemoveNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
285 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_RFCOMM_ADAPTER) function returns error : %d", res);
287 else if (nonInterestedNetwork & CA_ADAPTER_GATT_BTLE)
289 res = CARemoveNetworkType(CA_ADAPTER_GATT_BTLE);
290 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_GATT_ADAPTER) function returns error : %d", res);
293 else if (nonInterestedNetwork & CA_ADAPTER_REMOTE_ACCESS)
295 res = CARemoveNetworkType(CA_ADAPTER_REMOTE_ACCESS);
296 OIC_LOG_V(ERROR, TAG, "CARemoveNetworkType(CA_ADAPTER_REMOTE_ACCESS) function returns error : %d",
302 res = CA_STATUS_FAILED;
307 CAResult_t CAHandleRequestResponse()
309 if (!g_isInitialized)
311 OIC_LOG(ERROR, TAG, "not initialized");
312 return CA_STATUS_NOT_INITIALIZED;
315 CAHandleRequestResponseCallbacks();
322 CAResult_t CASelectCipherSuite(const uint16_t cipher)
324 OIC_LOG_V(DEBUG, TAG, "CASelectCipherSuite");
326 return CADtlsSelectCipherSuite(cipher);
329 CAResult_t CAEnableAnonECDHCipherSuite(const bool enable)
331 OIC_LOG_V(DEBUG, TAG, "CAEnableAnonECDHCipherSuite");
333 return CADtlsEnableAnonECDHCipherSuite(enable);
336 CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
337 const uint8_t* label, const size_t labelLen,
338 const uint8_t* rsrcServerDeviceID, const size_t rsrcServerDeviceIDLen,
339 const uint8_t* provServerDeviceID, const size_t provServerDeviceIDLen,
340 uint8_t* ownerPSK, const size_t ownerPSKSize)
342 OIC_LOG_V(DEBUG, TAG, "IN : CAGenerateOwnerPSK");
344 CAResult_t res = CA_STATUS_OK;
346 //newOwnerLabel and prevOwnerLabe can be NULL
347 if (!endpoint || !label || 0 == labelLen || !ownerPSK || 0 == ownerPSKSize)
349 return CA_STATUS_INVALID_PARAM;
352 res = CADtlsGenerateOwnerPSK(endpoint, label, labelLen,
353 rsrcServerDeviceID, rsrcServerDeviceIDLen,
354 provServerDeviceID, provServerDeviceIDLen,
355 ownerPSK, ownerPSKSize);
356 if (CA_STATUS_OK != res)
358 OIC_LOG_V(ERROR, TAG, "Failed to CAGenerateOwnerPSK : %d", res);
361 OIC_LOG_V(DEBUG, TAG, "OUT : CAGenerateOwnerPSK");
366 CAResult_t CAInitiateHandshake(const CAEndpoint_t *endpoint)
368 OIC_LOG_V(DEBUG, TAG, "IN : CAInitiateHandshake");
369 CAResult_t res = CA_STATUS_OK;
373 return CA_STATUS_INVALID_PARAM;
376 res = CADtlsInitiateHandshake(endpoint);
377 if (CA_STATUS_OK != res)
379 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsInitiateHandshake : %d", res);
382 OIC_LOG_V(DEBUG, TAG, "OUT : CAInitiateHandshake");
387 CAResult_t CACloseDtlsSession(const CAEndpoint_t *endpoint)
389 OIC_LOG_V(DEBUG, TAG, "IN : CACloseDtlsSession");
390 CAResult_t res = CA_STATUS_OK;
394 return CA_STATUS_INVALID_PARAM;
397 res = CADtlsClose(endpoint);
398 if (CA_STATUS_OK != res)
400 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsClose : %d", res);
403 OIC_LOG_V(DEBUG, TAG, "OUT : CACloseDtlsSession");
408 #endif /* __WITH_DTLS__ */