Fix bridge error on RPI3 target
authorJiwan Kim <ji-wan.kim@samsung.com>
Tue, 23 May 2017 00:34:56 +0000 (09:34 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Mon, 17 Jul 2017 02:35:36 +0000 (11:35 +0900)
- Invalid parameter error (-22) occured with ioctl
- If 'SIOCBRADDBR' are defined, use it instead of 'SIOCSIFBR'

files/mesh.sh.in
src/mesh-bridge.c

index 7dcae69..f279050 100755 (executable)
@@ -4,9 +4,9 @@ MESH_INTERFACE='mesh0'
 BRIDGE_INTERFACE='br0'
 ETHER_INTERFACE='wlan0'
 HOSTAP_CONFIG='/etc/mesh/hostapd.conf'
-MESH_CHANNEL='9'
+MESH_CHANNEL='161'
 
-MESH_ID='mesh-area'
+MESH_ID='meshnet'
 WLAN_INTERFACE=$3
 ROLE=$1
 
index 38e8d59..908a495 100644 (file)
@@ -48,7 +48,9 @@ int mesh_bridge_create(const char* bridge_name)
        int br_fd = 0;
        char bridge[IFNAMSIZ];
        char str_error[ERROR_MESSAGE_LENGTH];
+#if !defined(SIOCBRADDBR)
        unsigned long arg[3] = { BRCTL_ADD_BRIDGE, (unsigned long)bridge };
+#endif
 
        if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
                MESH_LOGE("Invalid parameter [%p]", bridge_name);
@@ -64,7 +66,11 @@ int mesh_bridge_create(const char* bridge_name)
        }
 
        strncpy(bridge, bridge_name, IFNAMSIZ);
+#ifdef SIOCBRADDBR
+       val = ioctl(br_fd, SIOCBRADDBR, bridge_name);
+#else
        val = ioctl(br_fd, SIOCSIFBR, arg);
+#endif
        if (val < 0) {
                strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
                MESH_LOGD("Failed to create bridge [%s(%d)]", str_error, errno);
@@ -84,7 +90,9 @@ int mesh_bridge_remove(const char* bridge_name)
        int br_fd = 0;
        char bridge[IFNAMSIZ];
        char str_error[ERROR_MESSAGE_LENGTH];
+#if !defined(SIOCBRDELBR)
        unsigned long arg[3] = { BRCTL_DEL_BRIDGE, (unsigned long)bridge };
+#endif
 
        if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
                MESH_LOGE("Invalid parameter [%p]", bridge_name);
@@ -100,7 +108,11 @@ int mesh_bridge_remove(const char* bridge_name)
        }
 
        strncpy(bridge, bridge_name, IFNAMSIZ);
+#ifdef SIOCBRDELBR
+       val = ioctl(br_fd, SIOCBRDELBR, bridge_name);
+#else
        val = ioctl(br_fd, SIOCSIFBR, arg);
+#endif
        if (val < 0) {
                strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
                MESH_LOGD("Failed to remove bridge [%s(%d)]", str_error, errno);
@@ -123,7 +135,9 @@ int mesh_bridge_add_interface(const char* bridge_name, const char* interface)
        int if_index = if_nametoindex(interface);
 
        char str_error[ERROR_MESSAGE_LENGTH];
+#if !defined(SIOCBRADDIF)
        unsigned long args[4] = { BRCTL_ADD_IF, if_index, 0, 0 };
+#endif
 
        if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
                MESH_LOGE("Invalid parameter [%p]", bridge_name);
@@ -144,8 +158,13 @@ int mesh_bridge_add_interface(const char* bridge_name, const char* interface)
        }
 
        strncpy(ifr.ifr_name, bridge_name, IFNAMSIZ);
+#ifdef SIOCBRADDIF
+       ifr.ifr_ifindex = if_index;
+       val = ioctl(br_fd, SIOCBRADDIF, &ifr);
+#else
        ifr.ifr_data = (char *)args;
        val = ioctl(br_fd, SIOCDEVPRIVATE, &ifr);
+#endif
        if (val < 0) {
                strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
                MESH_LOGD("Failed to add interface [%s] into bridge [%s(%d)]",
@@ -169,7 +188,9 @@ int mesh_bridge_del_interface(const char* bridge_name, const char* interface)
        int if_index = if_nametoindex(interface);
 
        char str_error[ERROR_MESSAGE_LENGTH];
+#if !defined(SIOCBRDELIF)
        unsigned long args[4] = { BRCTL_DEL_IF, if_index, 0, 0 };
+#endif
 
        if (NULL == bridge_name || strlen(bridge_name) > IFNAMSIZ) {
                MESH_LOGE("Invalid parameter [%p]", bridge_name);
@@ -190,8 +211,13 @@ int mesh_bridge_del_interface(const char* bridge_name, const char* interface)
        }
 
        strncpy(ifr.ifr_name, bridge_name, IFNAMSIZ);
+#ifdef SIOCBRDELIF
+       ifr.ifr_ifindex = if_index;
+       val = ioctl(br_fd, SIOCBRDELIF, &ifr);
+#else
        ifr.ifr_data = (char *)args;
        val = ioctl(br_fd, SIOCDEVPRIVATE, &ifr);
+#endif
        if (val < 0) {
                strerror_r(errno, str_error, ERROR_MESSAGE_LENGTH);
                MESH_LOGD("Failed to delete interface [%s] from bridge [%s(%d)]",