Add Multipath TCP
[platform/core/connectivity/net-config.git] / src / mptcp.c
1 /*
2  * Network Configuration - VPN Service Module
3  *
4  * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <gio/gunixfdlist.h>
24
25 #include "mptcp.h"
26 #include "mptcp-internal.h"
27 #include "netdbus.h"
28 #include "log.h"
29
30 static Mptcp *mptcp_object = NULL;
31
32 Mptcp *get_mptcp_object(void)
33 {
34         return mptcp_object;
35 }
36
37 /*********************
38  * Handler Functions *
39  ********************/
40 gboolean handle_mptcp_supported(Mptcp *object, GDBusMethodInvocation *invocation)
41 {
42         DBG("handle_mptcp_supported");
43         gboolean value;
44
45         value = mptcp_supported();
46
47         mptcp_complete_mptcp_supported(object, invocation, value);
48         return TRUE;
49 }
50
51 gboolean handle_mptcp_set_enable(Mptcp *object, GDBusMethodInvocation *invocation, gint enable)
52 {
53         DBG("handle_mptcp_set_enable");
54
55         if (mptcp_set_enable(enable) == FALSE) {
56                 ERR("Fail to set mptcp_enabled[%d]", enable);
57                 return FALSE;
58         }
59
60         mptcp_complete_mptcp_set_enable(object, invocation);
61         return TRUE;
62 }
63
64 gboolean handle_mptcp_get_enabled(Mptcp *object, GDBusMethodInvocation *invocation)
65 {
66         DBG("handle_mptcp_get_enabled");
67         gint value;
68
69         value = mptcp_get_enabled();
70         if (value != 0 && value != 1 && value != 2) {
71                 ERR("Invalid value of mptcp_enabled[%d]", value);
72                 return FALSE;
73         }
74
75         mptcp_complete_mptcp_get_enabled(object, invocation, value);
76         return TRUE;
77 }
78
79 gboolean handle_mptcp_set_path_manager(Mptcp *object, GDBusMethodInvocation *invocation, const gchar *pm)
80 {
81         DBG("handle_mptcp_set_path_manager %s", pm);
82
83         if (mptcp_set_path_manager(pm) == FALSE) {
84                 ERR("Fail to set mptcp_path_manager[%d]", pm);
85                 return FALSE;
86         }
87
88         mptcp_complete_mptcp_set_path_manager(object, invocation);
89         return TRUE;
90 }
91
92 gboolean handle_mptcp_get_path_manager(Mptcp *object, GDBusMethodInvocation *invocation)
93 {
94         DBG("handle_mptcp_get_path_manager");
95         gchar* pm;
96
97         pm = mptcp_get_path_manager();
98         if (pm == NULL) {
99                 ERR("Fail to get mptcp_path_manager");
100                 return FALSE;
101         }
102
103         DBG("get path manager %s", pm);
104         mptcp_complete_mptcp_get_path_manager(object, invocation, pm);
105         g_free(pm);
106
107         return TRUE;
108 }
109
110 gboolean handle_mptcp_set_scheduler(Mptcp *object, GDBusMethodInvocation *invocation, const gchar *scheduler)
111 {
112         DBG("handle_mptcp_set_scheduler");
113
114         if (mptcp_mptcp_set_scheduler(scheduler) == FALSE) {
115                 ERR("Fail to set mptcp_scheduler[%s]", scheduler);
116                 return FALSE;
117         }
118
119         mptcp_complete_mptcp_set_scheduler(object, invocation);
120         return TRUE;
121 }
122
123 gboolean handle_mptcp_get_scheduler(Mptcp *object, GDBusMethodInvocation *invocation)
124 {
125         DBG("handle_mptcp_get_scheduler");
126         gchar* scheduler;
127
128         scheduler = mptcp_get_scheduler();
129         if (scheduler == NULL) {
130                 ERR("Fail to get mptcp_scheduler");
131                 return FALSE;
132         }
133
134         DBG("get scheduler %s", scheduler);
135         mptcp_complete_mptcp_get_scheduler(object, invocation, scheduler);
136         g_free(scheduler);
137
138         return TRUE;
139 }
140
141
142 /*****************************
143  * Initializations Functions *
144  ****************************/
145 void mptcp_object_create_and_init(void)
146 {
147         DBG("Create mptcp object.");
148         GDBusInterfaceSkeleton *interface_mptcp = NULL;
149         GDBusConnection *connection = NULL;
150         GDBusObjectManagerServer *server = netdbus_get_mptcp_manager();
151         if (server == NULL)
152                 return;
153
154         connection = netdbus_get_connection();
155         g_dbus_object_manager_server_set_connection(server, connection);
156
157         /* Interface */
158         mptcp_object = mptcp_skeleton_new();
159         interface_mptcp = G_DBUS_INTERFACE_SKELETON(mptcp_object);
160
161         /* VPN Service */
162         g_signal_connect(mptcp_object, "handle-mptcp-supported",
163                         G_CALLBACK(handle_mptcp_supported), NULL);
164         g_signal_connect(mptcp_object, "handle-mptcp-set-enable",
165                         G_CALLBACK(handle_mptcp_set_enable), NULL);
166         g_signal_connect(mptcp_object, "handle-mptcp-get-enabled",
167                         G_CALLBACK(handle_mptcp_get_enabled), NULL);
168         g_signal_connect(mptcp_object, "handle-mptcp-set-path-manager",
169                         G_CALLBACK(handle_mptcp_set_path_manager), NULL);
170         g_signal_connect(mptcp_object, "handle-mptcp-get-path-manager",
171                         G_CALLBACK(handle_mptcp_get_path_manager), NULL);
172         g_signal_connect(mptcp_object, "handle-mptcp-set-scheduler",
173                         G_CALLBACK(handle_mptcp_set_scheduler), NULL);
174         g_signal_connect(mptcp_object, "handle-mptcp-get-scheduler",
175                         G_CALLBACK(handle_mptcp_get_scheduler), NULL);
176
177         if (!g_dbus_interface_skeleton_export(interface_mptcp, connection,
178                         NETCONFIG_MPTCP_PATH, NULL)) {
179                 ERR("Export NETCONFIG_MPTCP_PATH for mptcp failed");
180         }
181
182         return;
183 }
184
185 void mptcp_object_deinit(void)
186 {
187         DBG("Deinit mptcp object.");
188
189         g_object_unref(mptcp_object);
190 }
191