Separate logic for mesh enable / set gate
authorJiwan Kim <ji-wan.kim@samsung.com>
Tue, 7 Mar 2017 09:10:44 +0000 (18:10 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Mon, 17 Jul 2017 02:35:36 +0000 (11:35 +0900)
files/mesh.sh.in
include/mesh-request.h
include/mesh.h
src/mesh-request.c
src/mesh-service-interface.c

index dd99329..7dcae69 100755 (executable)
@@ -38,6 +38,7 @@ start()
                        /bin/echo "Setting mesh gate..."
                        /bin/echo "  setting mesh interface.."
 
+## Enable mesh
                        # Add virtual interface
                        @SBIN_DIR@/iw dev $WLAN_INTERFACE set type managed
                        @SBIN_DIR@/ifconfig $WLAN_INTERFACE up
@@ -55,30 +56,32 @@ start()
                        @SBIN_DIR@/ifconfig $MESH_INTERFACE 0.0.0.0 up
                        @SBIN_DIR@/ifconfig $BRIDGE_INTERFACE up
 
+## Join mesh
                        # Join(create) specific mesh network
                        # NOTICE: [iw dev ## set channel] should be performed before join
                        @SBIN_DIR@/iw dev $MESH_INTERFACE set channel $MESH_CHANNEL
                        @SBIN_DIR@/iw dev $MESH_INTERFACE mesh join $MESH_ID
 
+## Set gate
                        # Add external network into bridge
                        @SBIN_DIR@/brctl addif $BRIDGE_INTERFACE $ETHER_INTERFACE
                        @SBIN_DIR@/ifconfig $ETHER_INTERFACE down
                        @SBIN_DIR@/ifconfig $ETHER_INTERFACE 0.0.0.0 up
 
-                       # Get MAC address from eth0
-                       ETH_MAC_ADDR=`@SBIN_DIR@/ifconfig $ETHER_INTERFACE | /usr/bin/sed -n '/ether/p' | /usr/bin/awk "{print \\$2}"`
-                       echo "========================"
-                       echo $ETH_MAC_ADDR
-                       @SBIN_DIR@/ifconfig $BRIDGE_INTERFACE hw ether $ETH_MAC_ADDR
-
-                       # Do scan
-                       @SBIN_DIR@/iw $MESH_INTERFACE scan > /dev/null
-
                        # Announce mesh gate
                        /bin/echo "  announce mesh gate.."
                        @SBIN_DIR@/iw $MESH_INTERFACE set mesh_param mesh_hwmp_rootmode=4
                        @SBIN_DIR@/iw $MESH_INTERFACE set mesh_param mesh_gate_announcements=1
 
+                       # Get MAC address from eth0
+                       #ETH_MAC_ADDR=`@SBIN_DIR@/ifconfig $ETHER_INTERFACE | /usr/bin/sed -n '/ether/p' | /usr/bin/awk "{print \\$2}"`
+                       #echo "========================"
+                       #echo $ETH_MAC_ADDR
+                       #@SBIN_DIR@/ifconfig $BRIDGE_INTERFACE hw ether $ETH_MAC_ADDR
+
+                       # Do scan
+                       @SBIN_DIR@/iw $MESH_INTERFACE scan > /dev/null
+
                        # Set IP into bridge interface
                        /bin/echo "  Get IP address with DHCP.."
                        #/usr/bin/dhcp -v -i $BRIDGE_INTERFACE
index 804daa7..af91ced 100644 (file)
 
 int mesh_request_dhcp(const char* interface);
 
-int mesh_request_enable_mesh_gate(const char* base_interface,
+int mesh_request_enable_mesh(const char* base_interface,
                const char* mesh_interface, const char* mesh_id, int mesh_channel);
-int mesh_request_disable_mesh_gate(const char* mesh_interface);
+int mesh_request_disable_mesh(const char* mesh_interface);
 
+int mesh_request_set_mesh_gate(const char* bridge_interface,
+               const char* mesh_interface, const char* external_interface);
+int mesh_request_unset_mesh_gate(const char* bridge_interface,
+               const char* mesh_interface, const char* external_interface);
+
+/* Bridge network */
 int mesh_request_create_bridge(const char* bridge_interface,
                const char* mesh_interface, const char* external_interface);
 int mesh_request_remove_bridge(const char* bridge_interface);
+int mesh_request_add_bridge_interface(const char* bridge_interface,
+               const char* interface);
+int mesh_request_remove_bridge_interface(const char* bridge_interface,
+               const char* interface);
 
 int mesh_request_scan(const char* mesh_interface);
 int mesh_request_specific_scan(const char* mesh_interface, const char* mesh_id,
index e38fb21..5ec3de9 100644 (file)
@@ -70,6 +70,7 @@ typedef struct _mesh_service {
        gboolean mesh_activated; /**< Stored if mesh network is activated */
        GList *saved_mesh_network; /**< Saved mesh network list */
        GList *scanned_mesh_network; /**< Scanned mesh network list */
+       mesh_network_info_s *joined_network; /**< Joined network info */
 } mesh_service;
 
  #endif /* __MESH_H__ */
index 71cf4c7..be0b74a 100644 (file)
@@ -126,7 +126,7 @@ int mesh_request_get_scan_result(const char* mesh_interface, GList **scan_list)
        return ret;
 }
 
-int mesh_request_disable_mesh_gate(const char* mesh_interface)
+int mesh_request_disable_mesh(const char* mesh_interface)
 {
        int ret = MESHD_ERROR_NONE;
 
@@ -141,7 +141,7 @@ int mesh_request_disable_mesh_gate(const char* mesh_interface)
        return MESHD_ERROR_NONE;
 }
 
-int mesh_request_enable_mesh_gate(const char* base_interface,
+int mesh_request_enable_mesh(const char* base_interface,
                const char* mesh_interface, const char* mesh_id, int mesh_channel)
 {
        int ret = MESHD_ERROR_NONE;
@@ -179,7 +179,7 @@ int mesh_request_enable_mesh_gate(const char* base_interface,
                return ret;
        }
 
-       /* Make wlan interface down */
+       /* Make base interface down */
        ret = mesh_interface_set(base_interface, NULL, MESH_INTERFACE_DOWN);
        if(MESHD_ERROR_NONE != ret) {
                MESH_LOGE("Failed to change base interface state");
@@ -193,6 +193,18 @@ int mesh_request_enable_mesh_gate(const char* base_interface,
                return ret;
        }
 
+       return MESHD_ERROR_NONE;
+}
+
+int mesh_request_set_mesh_gate(const char* bridge_interface,
+               const char* mesh_interface, const char* external_interface)
+{
+       int ret = MESHD_ERROR_NONE;
+
+/* TODO: Add external network into bridge */
+       NOTUSED(bridge_interface);
+       NOTUSED(external_interface);
+
        /* Set mesh parameters */
        ret = mesh_netlink_set_mesh_parameter(mesh_interface,
                        "mesh_hwmp_rootmode", 4);
@@ -209,6 +221,31 @@ int mesh_request_enable_mesh_gate(const char* base_interface,
        return MESHD_ERROR_NONE;
 }
 
+int mesh_request_unset_mesh_gate(const char* bridge_interface,
+               const char* mesh_interface, const char* external_interface)
+{
+       int ret = MESHD_ERROR_NONE;
+
+/* TODO: remove external network from bridge */
+       NOTUSED(bridge_interface);
+       NOTUSED(external_interface);
+
+       /* Set mesh parameters */
+       ret = mesh_netlink_set_mesh_parameter(mesh_interface,
+                       "mesh_hwmp_rootmode", 0);
+       if (MESHD_ERROR_NONE != ret) {
+               MESH_LOGE("Failed to set [mesh_hwmp_rootmode] : 4");
+       }
+
+       ret = mesh_netlink_set_mesh_parameter(mesh_interface,
+                       "mesh_gate_announcements", 0);
+       if (MESHD_ERROR_NONE != ret) {
+               MESH_LOGE("Failed to set [mesh_gate_announcements] : 1");
+       }
+
+       return MESHD_ERROR_NONE;
+}
+
 int mesh_request_remove_bridge(const char* bridge_interface)
 {
        int ret = MESHD_ERROR_NONE;
index f1c9ce0..43671de 100644 (file)
@@ -168,32 +168,6 @@ static gboolean _meshd_dbus_handle_enable(NetMesh *object,
                goto FINISH;
        }
 
-       ret = mesh_request_enable_mesh_gate(info->base_interface,
-                       info->mesh_interface, info->mesh_id, info->mesh_channel);
-       if (MESHD_ERROR_NONE != ret) {
-               MESH_LOGE("Failed to mesh_request_enable_mesh_gate [%d]", ret);
-               goto FINISH;
-       }
-
-       ret = mesh_request_create_bridge(info->bridge_interface,
-                       info->mesh_interface, info->external_interface);
-       if (MESHD_ERROR_NONE != ret) {
-               MESH_LOGE("Failed to mesh_request_create_bridge [%d]", ret);
-               goto FINISH;
-       }
-#if 0
-       ret = mesh_request_specific_scan(info->mesh_interface,
-                       info->mesh_id, info->mesh_channel);
-       if (MESHD_ERROR_NONE != ret) {
-               MESH_LOGE("Failed to mesh_request_specific_scan [%d]", ret);
-       }
-
-       ret = mesh_dhcp_request(info->bridge_interface);
-       if (MESHD_ERROR_NONE != ret) {
-               MESH_LOGE("Failed to mesh_dhcp_request [%d]", ret);
-       }
-#endif
-
 FINISH:
        net_mesh_emit_mesh_enabled(object, ret);
 
@@ -216,10 +190,9 @@ static gboolean _meshd_dbus_handle_disable(NetMesh *object,
                goto FINISH;
        }
 
-       ret = mesh_request_disable_mesh_gate(info->mesh_interface);
+       ret = mesh_request_disable_mesh(info->mesh_interface);
        if (MESHD_ERROR_NONE != ret) {
                MESH_LOGE("Failed to mesh_request_disable_mesh_gate");
-               goto FINISH;
        }
 
        ret = mesh_request_remove_bridge(info->bridge_interface);
@@ -388,25 +361,55 @@ static gboolean _meshd_dbus_handle_get_found_mesh_networks(NetMesh *object,
 }
 
 static gboolean _meshd_dbus_handle_enable_mesh(NetMesh *object,
-               GDBusMethodInvocation *invocation)
+               GDBusMethodInvocation *invocation,
+               gpointer user_data)
 {
        int ret = MESHD_ERROR_NONE;
-
-       MESH_LOGD("Not implemented yet !");
+       mesh_service *service = (mesh_service *)user_data;
+       mesh_interface_s *info = service->interface_info;
 
        /* TODO: Create or join mesh network and create bridge */
+       ret = mesh_request_enable_mesh(info->base_interface,
+                       info->mesh_interface, info->mesh_id, info->mesh_channel);
+       if (MESHD_ERROR_NONE != ret) {
+               MESH_LOGE("Failed to mesh_request_enable_mesh_gate [%d]", ret);
+               goto FINISH;
+       }
+
+       ret = mesh_request_create_bridge(info->bridge_interface,
+                       info->mesh_interface, info->external_interface);
+       if (MESHD_ERROR_NONE != ret) {
+               MESH_LOGE("Failed to mesh_request_create_bridge [%d]", ret);
+               goto FINISH;
+       }
 
+#if 0
+       ret = mesh_request_specific_scan(info->mesh_interface,
+                       info->mesh_id, info->mesh_channel);
+       if (MESHD_ERROR_NONE != ret) {
+               MESH_LOGE("Failed to mesh_request_specific_scan [%d]", ret);
+       }
+
+       ret = mesh_dhcp_request(info->bridge_interface);
+       if (MESHD_ERROR_NONE != ret) {
+               MESH_LOGE("Failed to mesh_dhcp_request [%d]", ret);
+       }
+#endif
+
+FINISH:
        net_mesh_complete_enable_mesh(object, invocation, ret);
 
        return TRUE;
 }
 
 static gboolean _meshd_dbus_handle_disable_mesh(NetMesh *object,
-               GDBusMethodInvocation *invocation)
+               GDBusMethodInvocation *invocation,
+               gpointer user_data)
 {
        int ret = MESHD_ERROR_NONE;
 
        MESH_LOGD("Not implemented yet !");
+       NOTUSED(user_data);
 
        /* TODO: Destroy bridge and return from mesh to infra mode */