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"
38 #include "catcpadapter.h"
41 CAGlobals_t caglobals = { 0 };
43 #define TAG "CA_CONN_MGR"
45 static bool g_isInitialized = false;
48 // CAAdapterNetDTLS will register the callback.
49 // Taking callback all the way through adapters not the right approach, hence calling here.
50 extern void CADTLSSetCredentialsCallback(CAGetDTLSCredentialsHandler credCallback);
53 CAResult_t CAInitialize()
55 OIC_LOG(DEBUG, TAG, "CAInitialize");
59 CAResult_t res = CAInitializeMessageHandler();
60 if (res != CA_STATUS_OK)
62 OIC_LOG(ERROR, TAG, "CAInitialize has failed");
65 g_isInitialized = true;
72 OIC_LOG(DEBUG, TAG, "CATerminate");
76 CATerminateMessageHandler();
77 CATerminateNetworkType();
79 g_isInitialized = false;
83 CAResult_t CAStartListeningServer()
85 OIC_LOG(DEBUG, TAG, "CAStartListeningServer");
89 return CA_STATUS_NOT_INITIALIZED;
92 return CAStartListeningServerAdapters();
95 CAResult_t CAStopListeningServer()
97 OIC_LOG(DEBUG, TAG, "CAStopListeningServer");
101 return CA_STATUS_NOT_INITIALIZED;
104 return CAStopListeningServerAdapters();
107 CAResult_t CAStartDiscoveryServer()
109 OIC_LOG(DEBUG, TAG, "CAStartDiscoveryServer");
113 return CA_STATUS_NOT_INITIALIZED;
116 return CAStartDiscoveryServerAdapters();
119 void CARegisterHandler(CARequestCallback ReqHandler, CAResponseCallback RespHandler,
120 CAErrorCallback ErrorHandler)
122 OIC_LOG(DEBUG, TAG, "CARegisterHandler");
126 OIC_LOG(DEBUG, TAG, "CA is not initialized");
130 CASetInterfaceCallbacks(ReqHandler, RespHandler, ErrorHandler);
134 CAResult_t CARegisterDTLSCredentialsHandler(CAGetDTLSCredentialsHandler GetDTLSCredentialsHandler)
136 OIC_LOG(DEBUG, TAG, "CARegisterDTLSCredentialsHandler");
140 return CA_STATUS_NOT_INITIALIZED;
143 CADTLSSetCredentialsCallback(GetDTLSCredentialsHandler);
146 #endif //__WITH_DTLS__
148 CAResult_t CACreateEndpoint(CATransportFlags_t flags,
149 CATransportAdapter_t adapter,
152 CAEndpoint_t **object)
156 OIC_LOG(ERROR, TAG, "Invalid Parameter");
157 return CA_STATUS_INVALID_PARAM;
160 CAEndpoint_t *endpoint = CACreateEndpointObject(flags, adapter, addr, port);
163 return CA_STATUS_FAILED;
169 void CADestroyEndpoint(CAEndpoint_t *rep)
171 OIC_LOG(DEBUG, TAG, "CADestroyEndpoint");
176 CAResult_t CAGenerateToken(CAToken_t *token, uint8_t tokenLength)
178 OIC_LOG(DEBUG, TAG, "CAGenerateToken");
180 return CAGenerateTokenInternal(token, tokenLength);
183 void CADestroyToken(CAToken_t token)
185 OIC_LOG(DEBUG, TAG, "CADestroyToken");
187 CADestroyTokenInternal(token);
189 OIC_LOG(DEBUG, TAG, "OUT");
192 CAResult_t CAGetNetworkInformation(CAEndpoint_t **info, uint32_t *size)
194 OIC_LOG(DEBUG, TAG, "CAGetNetworkInformation");
198 return CA_STATUS_NOT_INITIALIZED;
201 return CAGetNetworkInformationInternal(info, size);
204 CAResult_t CASendRequest(const CAEndpoint_t *object,const CARequestInfo_t *requestInfo)
206 OIC_LOG(DEBUG, TAG, "CASendGetRequest");
210 return CA_STATUS_NOT_INITIALIZED;
213 return CADetachRequestMessage(object, requestInfo);
216 CAResult_t CASendNotification(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
218 OIC_LOG(DEBUG, TAG, "CASendNotification");
222 return CA_STATUS_NOT_INITIALIZED;
225 return CADetachResponseMessage(object, responseInfo);
228 CAResult_t CASendResponse(const CAEndpoint_t *object, const CAResponseInfo_t *responseInfo)
230 OIC_LOG(DEBUG, TAG, "CASendResponse");
234 return CA_STATUS_NOT_INITIALIZED;
237 return CADetachResponseMessage(object, responseInfo);
240 CAResult_t CASelectNetwork(CATransportAdapter_t interestedNetwork)
242 OIC_LOG_V(DEBUG, TAG, "Selected network : %d", interestedNetwork);
246 return CA_STATUS_NOT_INITIALIZED;
249 CAResult_t res = CA_STATUS_OK;
251 if (interestedNetwork & CA_ADAPTER_IP)
253 res = CAAddNetworkType(CA_ADAPTER_IP);
254 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_IP_ADAPTER) function returns result: %d", res);
256 else if (interestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
258 res = CAAddNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
259 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_RFCOMM_ADAPTER) function returns result : %d", res);
261 else if (interestedNetwork & CA_ADAPTER_GATT_BTLE)
263 res = CAAddNetworkType(CA_ADAPTER_GATT_BTLE);
264 OIC_LOG_V(DEBUG, TAG, "CAAddNetworkType(CA_GATT_ADAPTER) function returns result : %d", res);
268 else if (interestedNetwork & CA_ADAPTER_REMOTE_ACCESS)
270 res = CAAddNetworkType(CA_ADAPTER_REMOTE_ACCESS);
271 OIC_LOG_V(DEBUG, TAG,
272 "CAAddNetworkType(CA_ADAPTER_REMOTE_ACCESS) function returns result : %d", res);
277 else if (interestedNetwork & CA_ADAPTER_TCP)
279 res = CAAddNetworkType(CA_ADAPTER_TCP);
280 OIC_LOG_V(DEBUG, TAG,
281 "CAAddNetworkType(CA_ADAPTER_TCP) function returns result : %d", res);
287 res = CA_NOT_SUPPORTED;
292 CAResult_t CAUnSelectNetwork(CATransportAdapter_t nonInterestedNetwork)
294 OIC_LOG_V(DEBUG, TAG, "unselected network : %d", nonInterestedNetwork);
298 return CA_STATUS_NOT_INITIALIZED;
301 CAResult_t res = CA_STATUS_OK;
303 if (nonInterestedNetwork & CA_ADAPTER_IP)
305 res = CARemoveNetworkType(CA_ADAPTER_IP);
306 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_IP_ADAPTER) function returns result : %d", res);
308 else if (nonInterestedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
310 res = CARemoveNetworkType(CA_ADAPTER_RFCOMM_BTEDR);
311 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_RFCOMM_ADAPTER) function returns result : %d", res);
313 else if (nonInterestedNetwork & CA_ADAPTER_GATT_BTLE)
315 res = CARemoveNetworkType(CA_ADAPTER_GATT_BTLE);
316 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_GATT_ADAPTER) function returns result : %d", res);
319 else if (nonInterestedNetwork & CA_ADAPTER_REMOTE_ACCESS)
321 res = CARemoveNetworkType(CA_ADAPTER_REMOTE_ACCESS);
322 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_ADAPTER_REMOTE_ACCESS) function returns result : %d",
329 else if (nonInterestedNetwork & CA_ADAPTER_TCP)
331 res = CARemoveNetworkType(CA_ADAPTER_TCP);
332 OIC_LOG_V(DEBUG, TAG, "CARemoveNetworkType(CA_ADAPTER_TCP) function returns result : %d",
339 res = CA_STATUS_FAILED;
344 CAResult_t CAHandleRequestResponse()
346 if (!g_isInitialized)
348 OIC_LOG(ERROR, TAG, "not initialized");
349 return CA_STATUS_NOT_INITIALIZED;
352 CAHandleRequestResponseCallbacks();
359 CAResult_t CASelectCipherSuite(const uint16_t cipher)
361 OIC_LOG_V(DEBUG, TAG, "CASelectCipherSuite");
363 return CADtlsSelectCipherSuite(cipher);
366 CAResult_t CAEnableAnonECDHCipherSuite(const bool enable)
368 OIC_LOG_V(DEBUG, TAG, "CAEnableAnonECDHCipherSuite");
370 return CADtlsEnableAnonECDHCipherSuite(enable);
373 CAResult_t CAGenerateOwnerPSK(const CAEndpoint_t* endpoint,
374 const uint8_t* label, const size_t labelLen,
375 const uint8_t* rsrcServerDeviceID, const size_t rsrcServerDeviceIDLen,
376 const uint8_t* provServerDeviceID, const size_t provServerDeviceIDLen,
377 uint8_t* ownerPSK, const size_t ownerPSKSize)
379 OIC_LOG_V(DEBUG, TAG, "IN : CAGenerateOwnerPSK");
381 CAResult_t res = CA_STATUS_OK;
383 //newOwnerLabel and prevOwnerLabe can be NULL
384 if (!endpoint || !label || 0 == labelLen || !ownerPSK || 0 == ownerPSKSize)
386 return CA_STATUS_INVALID_PARAM;
389 res = CADtlsGenerateOwnerPSK(endpoint, label, labelLen,
390 rsrcServerDeviceID, rsrcServerDeviceIDLen,
391 provServerDeviceID, provServerDeviceIDLen,
392 ownerPSK, ownerPSKSize);
393 if (CA_STATUS_OK != res)
395 OIC_LOG_V(ERROR, TAG, "Failed to CAGenerateOwnerPSK : %d", res);
398 OIC_LOG_V(DEBUG, TAG, "OUT : CAGenerateOwnerPSK");
403 CAResult_t CAInitiateHandshake(const CAEndpoint_t *endpoint)
405 OIC_LOG_V(DEBUG, TAG, "IN : CAInitiateHandshake");
406 CAResult_t res = CA_STATUS_OK;
410 return CA_STATUS_INVALID_PARAM;
413 res = CADtlsInitiateHandshake(endpoint);
414 if (CA_STATUS_OK != res)
416 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsInitiateHandshake : %d", res);
419 OIC_LOG_V(DEBUG, TAG, "OUT : CAInitiateHandshake");
424 CAResult_t CACloseDtlsSession(const CAEndpoint_t *endpoint)
426 OIC_LOG_V(DEBUG, TAG, "IN : CACloseDtlsSession");
427 CAResult_t res = CA_STATUS_OK;
431 return CA_STATUS_INVALID_PARAM;
434 res = CADtlsClose(endpoint);
435 if (CA_STATUS_OK != res)
437 OIC_LOG_V(ERROR, TAG, "Failed to CADtlsClose : %d", res);
440 OIC_LOG_V(DEBUG, TAG, "OUT : CACloseDtlsSession");
445 #endif /* __WITH_DTLS__ */