2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include "mesh_private.h"
21 #include "mesh_dbus.h"
27 EXPORT_API int mesh_network_new(mesh_network_h* network)
29 struct mesh_network_s *net;
31 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
33 if (network == NULL) {
34 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
35 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
38 net = calloc(1, sizeof(struct mesh_network_s));
40 LOGE("Out of memory"); //LCOV_EXCL_LINE
41 return MESH_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
43 *network = (mesh_network_h)net;
45 return MESH_ERROR_NONE;
48 EXPORT_API int mesh_network_clone(mesh_network_h* dst, mesh_network_h src)
50 struct mesh_network_s *net = NULL;
51 struct mesh_network_s *_src = src;
53 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
55 if (dst == NULL || src == NULL) {
56 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
57 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
60 net = calloc(1, sizeof(struct mesh_network_s));
62 LOGE("Out of memory"); //LCOV_EXCL_LINE
63 return MESH_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
65 memcpy(net->meshid, _src->meshid, MAX_MESHID_LEN);
66 memcpy(net->bssid, _src->bssid, MAX_BSSID_LEN);
67 net->channel = _src->channel;
68 net->rssi = _src->rssi;
69 net->data_rate = _src->data_rate;
70 net->security = _src->security;
72 *dst = (mesh_network_h)net;
74 return MESH_ERROR_NONE;
77 EXPORT_API int mesh_network_new_with(mesh_network_h* network, const char *meshid,
78 const char *bssid, int channel, int rssi, int data_rate)
80 struct mesh_network_s *net;
82 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
84 if (network == NULL) {
85 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
86 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
89 net = calloc(1, sizeof(struct mesh_network_s));
90 if (meshid) memcpy(net->meshid, meshid, MAX_MESHID_LEN);
91 if (bssid) memcpy(net->bssid, bssid, MAX_BSSID_LEN);
92 net->channel = channel;
94 net->data_rate = data_rate;
95 *network = (mesh_network_h)net;
97 return MESH_ERROR_NONE;
100 EXPORT_API void mesh_network_destroy(mesh_network_h network)
102 struct mesh_network_s *net = network;
103 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
106 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
107 return; //LCOV_EXCL_LINE
112 EXPORT_API int mesh_network_get_meshid(mesh_network_h network, char **meshid)
114 struct mesh_network_s *net = network;
116 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
118 if (network == NULL || meshid == NULL) {
119 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
120 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
123 *meshid = strdup(net->meshid);
125 return MESH_ERROR_NONE;
128 EXPORT_API int mesh_network_set_meshid(mesh_network_h network, const char *meshid)
130 struct mesh_network_s *net = (struct mesh_network_s *)network;
132 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
134 if (network == NULL || meshid == NULL ) {
135 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
136 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
139 memcpy(net->meshid, meshid, MAX_MESHID_LEN);
141 return MESH_ERROR_NONE;
144 EXPORT_API int mesh_network_get_bssid(mesh_network_h network, char **bssid)
146 struct mesh_network_s *net = (struct mesh_network_s *)network;
148 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
150 if (network == NULL || bssid == NULL) {
151 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
152 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
155 *bssid = strdup(net->bssid);
157 return MESH_ERROR_NONE;
160 EXPORT_API int mesh_network_set_bssid(mesh_network_h network, const char *bssid)
162 struct mesh_network_s *net = (struct mesh_network_s *)network;
164 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
166 if (network == NULL || bssid == NULL ) {
167 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
168 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
171 memcpy(net->bssid, bssid, MAX_BSSID_LEN);
173 return MESH_ERROR_NONE;
176 EXPORT_API int mesh_network_get_channel(mesh_network_h network, int *channel)
178 struct mesh_network_s *net = (struct mesh_network_s *)network;
180 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
182 if (network == NULL || channel == NULL ) {
183 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
184 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
187 *channel = net->channel;
189 return MESH_ERROR_NONE;
192 EXPORT_API int mesh_network_set_channel(mesh_network_h network, int channel)
194 struct mesh_network_s *net = (struct mesh_network_s *)network;
196 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
198 if (network == NULL) {
199 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
200 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
203 net->channel = channel;
205 return MESH_ERROR_NONE;
208 EXPORT_API int mesh_network_get_rssi(mesh_network_h network, int *rssi)
210 struct mesh_network_s *net = (struct mesh_network_s *)network;
212 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
214 if (network == NULL || rssi == NULL ) {
215 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
216 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
219 *rssi = net->channel;
221 return MESH_ERROR_NONE;
224 EXPORT_API int mesh_network_set_rssi(mesh_network_h network, int rssi)
226 struct mesh_network_s *net = (struct mesh_network_s *)network;
228 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
230 if (network == NULL) {
231 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
232 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
237 return MESH_ERROR_NONE;
240 EXPORT_API int mesh_network_get_data_rate(mesh_network_h network, int *data_rate)
242 struct mesh_network_s *net = (struct mesh_network_s *)network;
244 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
246 if (network == NULL || data_rate == NULL ) {
247 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
248 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
251 *data_rate = net->channel;
253 return MESH_ERROR_NONE;
256 EXPORT_API int mesh_network_set_data_rate(mesh_network_h network, int data_rate)
258 struct mesh_network_s *net = (struct mesh_network_s *)network;
260 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
262 if (network == NULL) {
263 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
264 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
267 net->data_rate = data_rate;
269 return MESH_ERROR_NONE;
272 EXPORT_API int mesh_peer_get_address(mesh_peer_h peer, char **address)
274 struct mesh_peer_s *peer_info = (struct mesh_peer_s *)peer;
276 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
279 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
280 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
283 *address = strdup(peer_info->address);
285 return MESH_ERROR_NONE;
288 EXPORT_API int mesh_initialize(mesh_h *mesh)
291 struct mesh_handle* handle;
293 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
296 LOGE("Invalid parameter"); //LCOV_EXCL_LINE
297 return MESH_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
302 if (rv != MESH_ERROR_NONE) {
303 LOGE("Failed to initialize mesh network");//LCOV_EXCL_LINE
304 return rv; //LCOV_EXCL_LINE
308 #if !GLIB_CHECK_VERSION(2, 35, 0)
312 handle = g_new0(struct mesh_handle, 1);
313 if (NULL == handle) {
314 LOGE("Failed to create handle");
315 return MESH_ERROR_OUT_OF_MEMORY;
319 rv = _mesh_dbus_start(*mesh);
320 if (rv != MESH_ERROR_NONE) {
321 LOGD("D-Bus init: (0x%X)", rv);
324 return MESH_ERROR_NONE;
327 EXPORT_API int mesh_deinitialize(mesh_h handle)
329 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
331 _mesh_dbus_stop(handle);
333 LOGI("Destroy handle: %p", handle);
335 return MESH_ERROR_NONE;
338 EXPORT_API int mesh_set_event_cb(mesh_h handle, mesh_event_cb event_handler)
341 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
343 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
345 rv = _mesh_set_event_cb(handle, event_handler);
349 EXPORT_API int mesh_enable(mesh_h handle)
352 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
354 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
356 rv = _mesh_enable(handle);
360 EXPORT_API int mesh_disable(mesh_h handle)
363 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
365 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
367 rv = _mesh_disable(handle);
371 EXPORT_API int mesh_scan(mesh_h handle)
374 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
376 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
378 rv = _mesh_scan(handle);
382 EXPORT_API int mesh_cancel_scan(mesh_h handle)
385 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
387 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
389 rv = _mesh_cancel_scan(handle);
393 EXPORT_API int mesh_specific_scan(mesh_h handle, const char* ssid, int channel)
396 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
398 RETV_IF(NULL == ssid, MESH_ERROR_INVALID_PARAMETER);
399 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
401 rv = _mesh_specific_scan(handle, ssid, channel);
405 EXPORT_API int mesh_foreach_found_mesh_network(mesh_h handle,
406 mesh_found_mesh_network_cb cb, void *user_data)
409 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
411 RETV_IF(NULL == cb, MESH_ERROR_INVALID_PARAMETER);
412 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
414 rv = _mesh_get_scan_result(handle);
415 if (MESH_ERROR_NONE != rv) {
419 rv = _mesh_foreach_found_mesh_network(handle, cb, user_data);
423 EXPORT_API int mesh_foreach_connected_peers(mesh_h handle,
424 mesh_connected_peer_cb cb, void *user_data)
427 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
429 RETV_IF(NULL == cb, MESH_ERROR_INVALID_PARAMETER);
430 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
432 rv = _mesh_find_peers(handle);
433 if (MESH_ERROR_NONE != rv) {
437 rv = _mesh_foreach_connected_peers(handle, cb, user_data);
441 EXPORT_API int mesh_enable_mesh(mesh_h handle)
444 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
446 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
448 rv = _mesh_enable_mesh(handle);
452 EXPORT_API int mesh_disable_mesh(mesh_h handle)
455 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
457 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
459 rv = _mesh_disable_mesh(handle);
463 EXPORT_API int mesh_is_joined(mesh_h handle, int* is_joined)
466 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
468 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
470 rv = _mesh_is_joined(handle, is_joined);
474 EXPORT_API int mesh_get_joined_network(mesh_h handle, mesh_network_h *network)
477 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
479 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
481 rv = _mesh_get_joined_mesh_network(handle, network);
485 EXPORT_API int mesh_set_gate(mesh_h handle, bool stp, bool gate_announce)
488 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
490 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
492 rv = _mesh_set_gate(handle, stp, gate_announce);
496 EXPORT_API int mesh_unset_gate(mesh_h handle)
499 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
501 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
503 rv = _mesh_unset_gate(handle);
507 EXPORT_API int mesh_set_softap(mesh_h handle, const char* ssid,
508 const char* key, int channel, bool visibility,
509 int max_stations, int security)
513 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
515 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
516 RETV_IF(NULL == ssid, MESH_ERROR_INVALID_PARAMETER);
517 RETV_IF(NULL == key, MESH_ERROR_INVALID_PARAMETER);
520 memcpy(buf, "n", strlen("n"));
522 memcpy(buf, "a", strlen("a"));
524 rv = _mesh_set_softap(handle, ssid, key, buf, channel,
525 visibility, max_stations, security);
529 EXPORT_API int mesh_enable_softap(mesh_h handle)
532 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
534 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
536 rv = _mesh_enable_softap(handle);
540 EXPORT_API int mesh_disable_softap(mesh_h handle)
543 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
545 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
547 rv = _mesh_disable_softap(handle);
551 EXPORT_API int mesh_create_mesh_network(mesh_h handle, mesh_network_h network)
554 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
556 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
557 RETV_IF(NULL == network, MESH_ERROR_INVALID_PARAMETER);
559 rv = _mesh_create_network(handle, network);
563 EXPORT_API int mesh_connect_mesh_network(mesh_h handle, mesh_network_h network)
566 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
568 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
569 RETV_IF(NULL == network, MESH_ERROR_INVALID_PARAMETER);
571 rv = _mesh_connect_network(handle, network);
575 EXPORT_API int mesh_disconnect_mesh_network(mesh_h handle, mesh_network_h network)
578 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
580 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
581 RETV_IF(NULL == network, MESH_ERROR_INVALID_PARAMETER);
583 rv = _mesh_disconnect_network(handle, network);
587 EXPORT_API int mesh_forget_mesh_network(mesh_h handle, mesh_network_h network)
590 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
592 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
593 RETV_IF(NULL == network, MESH_ERROR_INVALID_PARAMETER);
595 rv = _mesh_forget_network(handle, network);
599 EXPORT_API int mesh_get_stations_info(mesh_h handle, mesh_found_station_cb cb, void *user_data)
602 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
604 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
606 rv = _mesh_get_stations_info(handle, cb, user_data);
610 EXPORT_API int mesh_get_mpath_info(mesh_h handle, mesh_found_mpath_cb cb, void *user_data)
613 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
615 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
617 rv = _mesh_get_mpath_info(handle, cb, user_data);
621 EXPORT_API int mesh_set_interfaces(mesh_h handle,
622 const char *mesh, const char* gate, const char *softap)
625 CHECK_FEATURE_SUPPORTED(MESH_FEATURE);
627 RETV_IF(NULL == mesh, MESH_ERROR_INVALID_PARAMETER);
628 RETV_IF(NULL == handle, MESH_ERROR_INVALID_PARAMETER);
630 rv = _mesh_set_interfaces(handle, mesh, gate, softap);