2 * Network Configuration Module
4 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
27 #include <sys/ioctl.h>
28 #include <sys/types.h>
29 #include <netinet/in.h>
31 #include <linux/if_bridge.h>
32 #include <linux/sockios.h>
34 extern unsigned int if_nametoindex(const char *__ifname);
37 #include "wmesh-log.h"
38 #include "wmesh-util.h"
39 #include "wmesh-service.h"
40 #include "wmesh-bridge.h"
42 #define ERROR_MESSAGE_LENGTH 256
44 int wmesh_bridge_create(const char* bridge_name)
46 int ret = WMESHD_ERROR_NONE;
49 char bridge[IFNAMSIZ];
50 char str_error[ERROR_MESSAGE_LENGTH];
51 #if !defined(SIOCBRADDBR)
52 unsigned long arg[3] = { BRCTL_ADD_BRIDGE, (unsigned long)bridge };
55 if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
56 WMESH_LOGE("Invalid parameter [%p]", bridge_name);
57 return WMESHD_ERROR_INVALID_PARAMETER;
60 br_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
62 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
63 WMESH_LOGD("Failed to open socket [%s(%d)]", str_error, errno);
65 return WMESHD_ERROR_IO_ERROR;
68 snprintf(bridge, IFNAMSIZ, "%s", bridge_name);
70 val = ioctl(br_fd, SIOCBRADDBR, bridge_name);
72 val = ioctl(br_fd, SIOCSIFBR, arg);
75 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
76 WMESH_LOGD("Failed to create bridge [%s(%d)]", str_error, errno);
78 ret = WMESHD_ERROR_IO_ERROR;
86 int wmesh_bridge_remove(const char* bridge_name)
88 int ret = WMESHD_ERROR_NONE;
91 char bridge[IFNAMSIZ];
92 char str_error[ERROR_MESSAGE_LENGTH];
93 #if !defined(SIOCBRDELBR)
94 unsigned long arg[3] = { BRCTL_DEL_BRIDGE, (unsigned long)bridge };
97 if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
98 WMESH_LOGE("Invalid parameter [%p]", bridge_name);
99 return WMESHD_ERROR_INVALID_PARAMETER;
102 br_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
104 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
105 WMESH_LOGD("Failed to open socket [%s(%d)]", str_error, errno);
107 return WMESHD_ERROR_IO_ERROR;
110 snprintf(bridge, IFNAMSIZ, "%s", bridge_name);
112 val = ioctl(br_fd, SIOCBRDELBR, bridge_name);
114 val = ioctl(br_fd, SIOCSIFBR, arg);
117 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
118 WMESH_LOGD("Failed to remove bridge [%s(%d)]", str_error, errno);
120 ret = WMESHD_ERROR_IO_ERROR;
128 int wmesh_bridge_add_interface(const char* bridge_name, const char* interface)
130 int ret = WMESHD_ERROR_NONE;
135 int if_index = if_nametoindex(interface);
137 char str_error[ERROR_MESSAGE_LENGTH];
138 #if !defined(SIOCBRADDIF)
139 unsigned long args[4] = { BRCTL_ADD_IF, if_index, 0, 0 };
142 if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
143 WMESH_LOGE("Invalid parameter [%p]", bridge_name);
144 return WMESHD_ERROR_INVALID_PARAMETER;
147 if (NULL == interface || strlen(interface) > IFNAMSIZ) {
148 WMESH_LOGE("Invalid parameter [%p]", interface);
149 return WMESHD_ERROR_INVALID_PARAMETER;
152 br_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
154 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
155 WMESH_LOGD("Failed to open socket [%s(%d)]", str_error, errno);
157 return WMESHD_ERROR_IO_ERROR;
160 snprintf(ifr.ifr_name, IFNAMSIZ, "%s", bridge_name);
162 ifr.ifr_ifindex = if_index;
163 val = ioctl(br_fd, SIOCBRADDIF, &ifr);
165 ifr.ifr_data = (char *)args;
166 val = ioctl(br_fd, SIOCDEVPRIVATE, &ifr);
169 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
170 WMESH_LOGD("Failed to add interface [%s] into bridge [%s(%d)]",
171 interface, str_error, errno);
173 ret = WMESHD_ERROR_IO_ERROR;
181 int wmesh_bridge_del_interface(const char* bridge_name, const char* interface)
183 int ret = WMESHD_ERROR_NONE;
188 int if_index = if_nametoindex(interface);
190 char str_error[ERROR_MESSAGE_LENGTH];
191 #if !defined(SIOCBRDELIF)
192 unsigned long args[4] = { BRCTL_DEL_IF, if_index, 0, 0 };
195 if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
196 WMESH_LOGE("Invalid parameter [%p]", bridge_name);
197 return WMESHD_ERROR_INVALID_PARAMETER;
200 if (NULL == interface || strlen(interface) > IFNAMSIZ) {
201 WMESH_LOGE("Invalid parameter [%p]", interface);
202 return WMESHD_ERROR_INVALID_PARAMETER;
205 br_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
207 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
208 WMESH_LOGD("Failed to open socket [%s(%d)]", str_error, errno);
210 return WMESHD_ERROR_IO_ERROR;
213 snprintf(ifr.ifr_name, IFNAMSIZ, "%s", bridge_name);
215 ifr.ifr_ifindex = if_index;
216 val = ioctl(br_fd, SIOCBRDELIF, &ifr);
218 ifr.ifr_data = (char *)args;
219 val = ioctl(br_fd, SIOCDEVPRIVATE, &ifr);
222 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
223 WMESH_LOGD("Failed to delete interface [%s] from bridge [%s(%d)]",
224 interface, str_error, errno);
226 ret = WMESHD_ERROR_IO_ERROR;
234 int wmesh_bridge_set_stp(const char* bridge_name, bool state)
236 int ret = WMESHD_ERROR_NONE;
239 char str_error[ERROR_MESSAGE_LENGTH];
240 int stp_state = (state) ? 1 : 0;
242 unsigned long arg[4] = {
243 BRCTL_SET_BRIDGE_STP_STATE,
246 if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
247 WMESH_LOGE("Invalid parameter [%p]", bridge_name);
248 return WMESHD_ERROR_INVALID_PARAMETER;
251 br_fd = socket(AF_LOCAL, SOCK_STREAM, 0);
253 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
254 WMESH_LOGD("Failed to open socket [%s(%d)]", str_error, errno);
256 return WMESHD_ERROR_IO_ERROR;
259 strncpy(ifr.ifr_name, bridge_name, IFNAMSIZ);
260 ifr.ifr_data = (char *)arg;
262 val = ioctl(br_fd, SIOCDEVPRIVATE, &ifr);
264 strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
265 WMESH_LOGE("Failed to set bridge[%s] stp state", bridge_name);
266 WMESH_LOGE(" %s(%d)", str_error, errno);
268 ret = WMESHD_ERROR_IO_ERROR;