Add APIs 81/85381/12
authorSeonah Moon <seonah1.moon@samsung.com>
Thu, 25 Aug 2016 00:58:16 +0000 (09:58 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Fri, 23 Sep 2016 07:57:18 +0000 (16:57 +0900)
- Set local/remote IP address
- Add/Remove dns server

Change-Id: I654a1c5a3507932c4ffc1acb638ff6f9d4c8b713
Signed-off-by: Seonah Moon <seonah1.moon@samsung.com>
doc/vpn_doc.h
include/capi_vpn_service_private.h
include/vpn_service.h
include/vpn_service_internal.h
src/capi_vpn_service.c
test/vpn_service_test.c

index 4c8073b..1693579 100755 (executable)
  * @section CAPI_NETWORK_VPN_SERVICE_MODULE_OVERVEW Overview
  * The VPN Service functions for managing VPN.
  * There can be only one VPN connection running at the same time. The existing interface is deactivated when a new one is created.
+ * 
  * Using the VPN Service, you can implement features that allow the users of your application to:
  *     - Initialize / Deinitialize the VPN device
  *     - Routing management
  *     - DNS management
  *     - Firewall management
+ *
+ * To enable or disable VPN interface, you should launch VPN popup by using app-control.
+ *
  * @section CAPI_NETWORK_VPN_SERVICE_MODULE_FEATURE Related Features
  * This API is related with the following features:\n
  * - http://tizen.org/feature/network.vpn\n
index 1157fef..4cb8542 100755 (executable)
 extern "C" {
 #endif /* __cplusplus */
 
+
 #define NETCONFIG_SERVICE_NAME                 "net.netconfig"
 #define NETCONFIG_VPNSVC_PATH                  "/net/netconfig/vpnsvc"
 #define NETCONFIG_VPNSVC_INTERFACE_NAME        "net.netconfig.vpnsvc"
 #define NETCONFIG_NETWORK_PATH                 "/net/netconfig/network"
 #define NETCONFIG_NETWORK_INTERFACE            "net.netconfig.network"
 
+#define VPNSVC_IP4_STRING_LEN 16
+#define VPNSVC_VPN_IFACE_NAME_LEN 16
+#define VPNSVC_SESSION_STRING_LEN 32
+
 #define _MAX_FILE_PATH_LEN 512
 #define _USER_SETTING_DEFAULT_MTU 1500
 #define _USER_SETTING_DEFAULT_SESSION "VPN_Session"
-
+#define _USER_SETTING_DEFAULT_ROUTE_PREFIX 32
 #define VPN_SERVICE_FEATURE    "http://tizen.org/feature/network.vpn"
 
 #define CHECK_FEATURE_SUPPORTED(feature_name) \
@@ -67,9 +72,12 @@ typedef struct _vpnsvc_tun_s {
        GDBusConnection *connection;            /**< D-Bus Connection */
        int fd;                                 /**< tun socket fd */
        int index;                              /**< tun index (if.iface_index) */
-       char name[VPNSVC_VPN_IFACE_NAME_LEN];      /**< tun name (if.iface_name) */
-       char session[VPNSVC_SESSION_STRING_LEN];/**< session name (user setting) */
+       char name[VPNSVC_VPN_IFACE_NAME_LEN];   /**< tun name (if.iface_name) */
+       char session[VPNSVC_SESSION_STRING_LEN];        /**< session name (user setting) */
+       char local_ip[VPNSVC_IP4_STRING_LEN];   /**< local IP address */
+       char remote_ip[VPNSVC_IP4_STRING_LEN];  /**< remote IP address */
        unsigned int mtu;                       /**< mtu (user setting) */
+       char *dns_suffix;                                               /**< dns suffix (optional) */
 } vpnsvc_tun_s;
 
 int _vpnsvc_check_feature_supported(const char *feature_name);
index 3c9e279..f111d2c 100755 (executable)
@@ -33,24 +33,6 @@ extern "C" {
  */
 
 /**
-  * @brief IPv4 address string length (includes end null character).
-  * @since_tizen 3.0
-  */
-#define VPNSVC_IP4_STRING_LEN 16
-
-/**
-  * @brief VPN interface name length.
-  * @since_tizen 3.0
-  */
-#define VPNSVC_VPN_IFACE_NAME_LEN 16
-
-/**
-  * @brief Session name string length (includes end null character).
-  * @since_tizen 3.0
-  */
-#define VPNSVC_SESSION_STRING_LEN 32
-
-/**
   * @brief   Enumeration for VPN service error types.
   * @details Indicate formats of error type field
   */
@@ -221,6 +203,24 @@ int vpnsvc_block_networks(vpnsvc_h handle,
 int vpnsvc_unblock_networks(vpnsvc_h handle);
 
 /**
+ * @brief Updates settings (Local IP / Remote IP / MTU).
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/vpnservice \n
+ *            %http://tizen.org/privilege/internet
+ * @param[in] handle The VPN interface handle
+ * @return 0 on success. Otherwise, a negative error value.
+ * @retval #VPNSVC_ERROR_NONE                  Success
+ * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
+ * @retval #VPNSVC_ERROR_IPC_FAILED            Cannot connect to service daemon
+ * @retval #VPNSVC_ERROR_PERMISSION_DENIED     Permission Denied
+ * @retval #VPNSVC_ERROR_NOT_SUPPORTED         Not Supported
+ * @pre The VPN interface should be initialized already.
+ * @see vpnsvc_init()
+ */
+int vpnsvc_update_settings(vpnsvc_h handle);
+
+/**
  * @brief Gets the fd of the VPN interface.
  * @since_tizen 3.0
  * @param[in] handle The VPN interface handle
@@ -264,11 +264,13 @@ int vpnsvc_get_iface_name(vpnsvc_h handle, char** iface_name);
 /**
  * @brief Sets the MTU of the VPN interface.
  * @since_tizen 3.0
+ * @remarks vpnsvc_update_settings() should be invoked after setting MTU.
  * @param[in] handle The VPN interface handle
  * @param[in] mtu    The MTU (Maximum Transmission Unit) value to be set for VPN interface. Default MTU size is 1500.
  * @return 0 on success. Otherwise, a negative error value.
  * @retval #VPNSVC_ERROR_NONE                  Success
  * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
+ * @retval #VPNSVC_ERROR_IO_ERROR              I/O Error (e.g. socket I/O error)
  * @retval #VPNSVC_ERROR_NOT_SUPPORTED         Not Supported
  * @pre Before calling this function, VPN interface should be initialized already.
  * @see vpnsvc_init()
@@ -320,6 +322,117 @@ int vpnsvc_set_session(vpnsvc_h handle, const char* session);
 int vpnsvc_get_session(vpnsvc_h handle, char** session);
 
 /**
+ * @brief Sets the VPN client IP address.
+ * @since_tizen 3.0
+ * @remarks The local address should be set before enabling VPN interface. \n
+ *                     vpnsvc_update_settings() should be invoked after setting local IP address.
+ * @param[in] handle           The VPN interface handle
+ * @param[in] local_ip         The local (VPN client) IP address (IPv4 only)
+
+ * @return 0 on success. Otherwise, a negative error value.
+ * @retval #VPNSVC_ERROR_NONE                  Success
+ * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
+ * @retval #VPNSVC_ERROR_IO_ERROR              I/O Error (e.g. socket I/O error)
+ * @retval #VPNSVC_ERROR_NOT_SUPPORTED         Not Supported
+ * @pre The VPN interface should be initialized already.
+ * @see vpnsvc_init()
+ */
+int vpnsvc_set_local_ip_address(vpnsvc_h handle, const char *local_ip);
+
+/**
+ * @brief Sets the VPN server IP address.
+ * @since_tizen 3.0
+ * @remarks The remote address should be set before enabling VPN interface. \n
+ *                     vpnsvc_update_settings() should be invoked after setting remote IP address.
+ * @param[in] handle           The VPN interface handle
+ * @param[in] remote_ip                The remote (VPN server) IP address (IPv4 only)
+ * @return 0 on success. Otherwise, a negative error value.
+ * @retval #VPNSVC_ERROR_NONE                  Success
+ * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
+ * @retval #VPNSVC_ERROR_IO_ERROR              I/O Error (e.g. socket I/O error)
+ * @retval #VPNSVC_ERROR_NOT_SUPPORTED         Not Supported
+ * @pre The VPN interface should be initialized already.
+ * @see vpnsvc_init()
+ */
+int vpnsvc_set_remote_ip_address(vpnsvc_h handle, const char *remote_ip);
+
+/**
+ * @brief Adds the route address.
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/vpnservice \n
+ *            %http://tizen.org/privilege/internet
+ * @remarks The route address should be set after enabling VPN interface.
+ * @param[in] handle           The VPN interface handle
+ * @param[in] route_address    Destination address of the routes (IPv4 only)
+ * @param[in] prefix           The prefix of routes, netmask length (also called a prefix, e.g. 8, 16, 24, 32)
+ * @return 0 on success. Otherwise, a negative error value.
+ * @retval #VPNSVC_ERROR_NONE                  Success
+ * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
+ * @retval #VPNSVC_ERROR_IO_ERROR              I/O Error (e.g. socket I/O error)
+ * @retval #VPNSVC_ERROR_NOT_SUPPORTED         Not Supported
+ * @pre The VPN interface should be initialized already.
+ * @see vpnsvc_init()
+ */
+int vpnsvc_add_route(vpnsvc_h handle, const char *route_address, int prefix);
+
+/**
+ * @brief Removes the route address.
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/vpnservice \n
+ *            %http://tizen.org/privilege/internet
+ * @param[in] handle                   The VPN interface handle
+ * @param[in] route_address            Destination address of the routes (IPv4 only)
+ * @param[in] prefix           The prefix of routes, netmask length (also called a prefix, e.g. 8, 16, 24, 32)
+ * @return 0 on success. Otherwise, a negative error value.
+ * @retval #VPNSVC_ERROR_NONE                  Success
+ * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
+ * @retval #VPNSVC_ERROR_IO_ERROR              I/O Error (e.g. socket I/O error)
+ * @retval #VPNSVC_ERROR_NOT_SUPPORTED         Not Supported
+ * @pre The VPN interface should be initialized already.
+ * @see vpnsvc_init()
+ */
+int vpnsvc_remove_route(vpnsvc_h handle, const char *route_address, int prefix);
+
+/**
+ * @brief Adds the DNS server name.
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/vpnservice \n
+ *            %http://tizen.org/privilege/internet
+ * @remarks The dns address should be set after enabling VPN interface.
+ * @param[in] handle           The VPN interface handle
+ * @param[in] dns_server       The DNS server address (IPv4 only)
+ * @return 0 on success. Otherwise, a negative error value.
+ * @retval #VPNSVC_ERROR_NONE                  Success
+ * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
+ * @retval #VPNSVC_ERROR_IO_ERROR              I/O Error (e.g. socket I/O error)
+ * @retval #VPNSVC_ERROR_NOT_SUPPORTED         Not Supported
+ * @pre The VPN interface should be initialized already.
+ * @see vpnsvc_init()
+ */
+int vpnsvc_add_dns_server(vpnsvc_h handle, const char *dns_server);
+
+/**
+ * @brief Removes the DNS server name.
+ * @since_tizen 3.0
+ * @privlevel public
+ * @privilege %http://tizen.org/privilege/vpnservice \n
+ *            %http://tizen.org/privilege/internet
+ * @param[in] handle           The VPN interface handle
+ * @param[in] dns_server       The DNS server address (IPv4 only)
+ * @return 0 on success. Otherwise, a negative error value.
+ * @retval #VPNSVC_ERROR_NONE                  Success
+ * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
+ * @retval #VPNSVC_ERROR_IO_ERROR              I/O Error (e.g. socket I/O error)
+ * @retval #VPNSVC_ERROR_NOT_SUPPORTED         Not Supported
+ * @pre The VPN interface should be initialized already.
+ * @see vpnsvc_init()
+ */
+int vpnsvc_remove_dns_server(vpnsvc_h handle, const char *dns_server);
+
+/**
 * @}
 */
 
index bf69850..24fc6bc 100755 (executable)
@@ -37,16 +37,7 @@ extern "C" {
  * @brief Sets-up VPN interface and brings it up. Installs specified routes/DNS servers/DNS suffix.
  * @since_tizen 3.0
  * @privlevel platform
- * @privilege %http://tizen.org/privilege/vpnservice.admin
  * @param[in] handle                           The VPN interface handle
- * @param[in] local_ip                         The local(vpn client) IP address
- * @param[in] remote_ip                                The remote(vpn server) IP address
- * @param[in] routes_dest_addr         Destination address of the routes
- * @param[in] routes_prefix         The prefix of routes, netmask length (also called a prefix, e.g. 8, 16, 24, 32)
- * @param[in] num_routes                       The number of routes, Unlimitation
- * @param[in] dns_servers                      The list of DNS server names - Optional
- * @param[in] num_dns_servers          The number of DNS server names - Optionl, Unlimitation
- * @param[in] dns_suffix               The DNS suffix - Optional (e.g. tizen.org)
  * @return 0 on success. otherwise, a negative error value.
  * @retval #VPNSVC_ERROR_NONE                  Success
  * @retval #VPNSVC_ERROR_INVALID_PARAMETER     Invalid parameter
@@ -58,17 +49,13 @@ extern "C" {
  * @see vpnsvc_init()
  * @see vpnsvc_down()
  */
-int vpnsvc_up(vpnsvc_h handle, const char* local_ip, const char* remote_ip,
-                               char *routes_dest_addr[], int routes_prefix[], size_t num_routes,
-                               const char** dns_servers, size_t num_dns_servers,
-                               const char* dns_suffix);
+int vpnsvc_up(vpnsvc_h handle);
 
 /**
  * @internal
  * @brief Brings the VPN interface down and restores original DNS servers/domains.
  * @since_tizen 3.0
  * @privlevel platform
- * @privilege %http://tizen.org/privilege/vpnservice.admin
  * @param[in] handle The VPN interface handle
  * @return 0 on success. otherwise, a negative error value.
  * @retval #VPNSVC_ERROR_NONE                  Success
index b76677f..96e76ae 100755 (executable)
@@ -104,6 +104,7 @@ static void _vpnsvc_init_vpnsvc_tun_s(vpnsvc_tun_s **s)
        (*s)->mtu = _USER_SETTING_DEFAULT_MTU;
        strncpy((*s)->session, _USER_SETTING_DEFAULT_SESSION, VPNSVC_SESSION_STRING_LEN);
        (*s)->session[VPNSVC_SESSION_STRING_LEN-1] = '\0';
+       (*s)->dns_suffix = NULL;
 }
 
 static void _vpnsvc_deinit_vpnsvc_tun_s(vpnsvc_tun_s *s)
@@ -118,6 +119,11 @@ static void _vpnsvc_deinit_vpnsvc_tun_s(vpnsvc_tun_s *s)
        memset(s->name, 0, VPNSVC_VPN_IFACE_NAME_LEN);
        memset(s->session, 0, VPNSVC_SESSION_STRING_LEN);
 
+       if (s->dns_suffix) {
+               g_free(s->dns_suffix);
+               s->dns_suffix = NULL;
+       }
+
        if (s)
                g_free(s);
 }
@@ -451,19 +457,12 @@ EXPORT_API int vpnsvc_protect(vpnsvc_h handle, int socket_fd, const char* iface_
        return result;
 }
 
-EXPORT_API int vpnsvc_up(vpnsvc_h handle, const char* local_ip, const char* remote_ip,
-                               char* routes_dest_add[], int routes_prefix[], size_t num_routes,
-                               const char** dns_servers, size_t num_dns_servers,
-                               const char* dns_suffix)
+EXPORT_API int vpnsvc_up(vpnsvc_h handle)
 {
        CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
 
        int result = VPNSVC_ERROR_NONE;
        int dbus_result;
-       GVariantBuilder route_builder, dns_builder;
-       size_t i = 0;
-       GVariant *route_param = NULL;
-       GVariant *dns_param = NULL;
        vpnsvc_tun_s *tun_s = NULL;
 
        /* parameter check */
@@ -483,40 +482,14 @@ EXPORT_API int vpnsvc_up(vpnsvc_h handle, const char* local_ip, const char* remo
                return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
        }
 
-       if (local_ip == NULL || remote_ip == NULL) {
+       if (tun_s->local_ip == NULL || tun_s->remote_ip == NULL) {
                LOGE("local and remote ip are invalid"); //LCOV_EXCL_LINE
                return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
        }
 
        LOGD("iface_index %d", tun_s->index);
-       LOGD("local_ip : %s, remote_ip : %s", local_ip, remote_ip);
-
-       /* make a route parameter */
-       g_variant_builder_init(&route_builder, G_VARIANT_TYPE("a{si}"));
-       for (i = 0 ; i < num_routes ; i++) {
-               if (strlen(routes_dest_add[i]) <= 0) {
-                       LOGE("invalid dest[%d]", i); //LCOV_EXCL_LINE
-                       return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
-               }
-               g_variant_builder_add(&route_builder, "{si}", routes_dest_add[i], routes_prefix[i]);
-               LOGD("dest[%d] : %s", i, routes_dest_add[i]);
-               LOGD("prefix[i] : %d", i,  routes_prefix[i]);
-       }
-       route_param = g_variant_builder_end(&route_builder);
-
-       /* make a dns parameter */
-       g_variant_builder_init(&dns_builder, G_VARIANT_TYPE("as"));
-       for (i = 0 ; i < num_dns_servers ; i++) {
-               if (strlen(dns_servers[i]) <= 0) {
-                       LOGE("invalid dns_servers[%d]", i); //LCOV_EXCL_LINE
-                       return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
-               }
-               LOGD("dns_servers[%d] : %s", i, dns_servers[i]);
-               g_variant_builder_add(&dns_builder, "s", dns_servers[i]);
-       }
-       dns_param = g_variant_builder_end(&dns_builder);
-
-       LOGD("dns_suffix : %s", dns_suffix);
+       LOGD("local_ip : %s, remote_ip : %s", tun_s->local_ip, tun_s->remote_ip);
+       LOGD("dns_suffix : %s", tun_s->dns_suffix);
 
        op = _vpnsvc_invoke_dbus_method(tun_s->connection,
                                                                NETCONFIG_SERVICE_NAME,
@@ -534,9 +507,7 @@ EXPORT_API int vpnsvc_up(vpnsvc_h handle, const char* local_ip, const char* remo
                                                                NETCONFIG_VPNSVC_PATH,
                                                                NETCONFIG_VPNSVC_INTERFACE_NAME,
                                                                "vpn_up",
-                                                               g_variant_new("(issvuvusu)", tun_s->index, local_ip, \
-                                                               remote_ip, route_param, num_routes, dns_param, num_dns_servers, \
-                                                               dns_suffix, tun_s->mtu),
+                                                               g_variant_new("(i)", tun_s->index),
                                                                &dbus_result);
 
        if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
@@ -831,6 +802,95 @@ EXPORT_API int vpnsvc_unblock_networks(vpnsvc_h handle)
        return result;
 }
 
+EXPORT_API int vpnsvc_update_settings(vpnsvc_h handle)
+{
+       CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
+
+       int result = VPNSVC_ERROR_NONE;
+       int dbus_result;
+       vpnsvc_tun_s *tun_s = NULL;
+
+       /* parameter check */
+       if (handle == NULL) {
+               LOGE("handle is a NULL"); //LCOV_EXCL_LINE
+               return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+       tun_s = (vpnsvc_tun_s*)handle;
+
+       op = _vpnsvc_invoke_dbus_method(tun_s->connection,
+                                                       NETCONFIG_SERVICE_NAME,
+                                                       NETCONFIG_NETWORK_PATH,
+                                                       NETCONFIG_NETWORK_INTERFACE,
+                                                       "CheckInternetPrivilege",
+                                                       NULL,
+                                                       &dbus_result);
+
+       if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
+               return VPNSVC_ERROR_PERMISSION_DENIED;
+
+       op = _vpnsvc_invoke_dbus_method(tun_s->connection,
+                       NETCONFIG_SERVICE_NAME,
+                       NETCONFIG_VPNSVC_PATH,
+                       NETCONFIG_VPNSVC_INTERFACE_NAME,
+                       "vpn_set_local_ip_address",
+                       g_variant_new("(is)", tun_s->index, tun_s->local_ip),
+                       &dbus_result);
+       if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
+               return VPNSVC_ERROR_PERMISSION_DENIED;
+
+       if (op == NULL) {
+               return VPNSVC_ERROR_IPC_FAILED; //LCOV_EXCL_LINE
+       } else {
+               g_variant_get(op, "(i)", &result);
+               if (result != VPNSVC_ERROR_NONE)
+                       LOGE("vpn_set_local_ip_address() failed"); //LCOV_EXCL_LINE
+               else
+                       LOGD("vpn_set_local_ip_address() succeed");
+       }
+
+       op = _vpnsvc_invoke_dbus_method(tun_s->connection,
+                                                               NETCONFIG_SERVICE_NAME,
+                                                               NETCONFIG_VPNSVC_PATH,
+                                                               NETCONFIG_VPNSVC_INTERFACE_NAME,
+                                                               "vpn_set_remote_ip_address",
+                                                               g_variant_new("(is)", tun_s->index, tun_s->remote_ip),
+                                                               &dbus_result);
+       if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
+               return VPNSVC_ERROR_PERMISSION_DENIED;
+
+       if (op == NULL) {
+               return VPNSVC_ERROR_IPC_FAILED; //LCOV_EXCL_LINE
+       } else {
+               g_variant_get(op, "(i)", &result);
+               if (result != VPNSVC_ERROR_NONE)
+                       LOGE("vpn_set_remote_ip_address() failed"); //LCOV_EXCL_LINE
+               else
+                       LOGD("vpn_set_remote_ip-address() succeed");
+       }
+
+       op = _vpnsvc_invoke_dbus_method(tun_s->connection,
+                                                               NETCONFIG_SERVICE_NAME,
+                                                               NETCONFIG_VPNSVC_PATH,
+                                                               NETCONFIG_VPNSVC_INTERFACE_NAME,
+                                                               "vpn_set_mtu",
+                                                               g_variant_new("(iu)", tun_s->index, tun_s->mtu),
+                                                               &dbus_result);
+       if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
+               return VPNSVC_ERROR_PERMISSION_DENIED;
+
+       if (op == NULL) {
+               return VPNSVC_ERROR_IPC_FAILED; //LCOV_EXCL_LINE
+       } else {
+               g_variant_get(op, "(i)", &result);
+               if (result != VPNSVC_ERROR_NONE)
+                       LOGE("vpn_set_mtu() failed"); //LCOV_EXCL_LINE
+               else
+                       LOGD("vpn_set_mtu() succeed");
+       }
+
+       return result;
+}
+
 EXPORT_API int vpnsvc_get_iface_fd(vpnsvc_h handle, int* iface_fd)
 {
        CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
@@ -912,6 +972,8 @@ EXPORT_API int vpnsvc_set_mtu(vpnsvc_h handle, int mtu)
 {
        CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
 
+       int result = VPNSVC_ERROR_NONE;
+       int dbus_result;
        vpnsvc_tun_s *tun_s = NULL;
 
        /* parameter check */
@@ -927,7 +989,8 @@ EXPORT_API int vpnsvc_set_mtu(vpnsvc_h handle, int mtu)
        }
 
        tun_s->mtu = mtu;
-       return VPNSVC_ERROR_NONE;
+
+       return result;
 }
 
 EXPORT_API int vpnsvc_set_blocking(vpnsvc_h handle, bool blocking)
@@ -1016,3 +1079,222 @@ EXPORT_API int vpnsvc_get_session(vpnsvc_h handle, char** session)
 
        return VPNSVC_ERROR_NONE;
 }
+
+EXPORT_API int vpnsvc_set_local_ip_address(vpnsvc_h handle, const char *local_ip)
+{
+       CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
+
+       int result = VPNSVC_ERROR_NONE;
+       vpnsvc_tun_s *tun_s = NULL;
+
+       /* parameter check */
+       if (handle == NULL) {
+               LOGE("handle is a NULL");
+               return VPNSVC_ERROR_INVALID_PARAMETER;
+       }
+       tun_s = (vpnsvc_tun_s*)handle;
+
+       if (local_ip == NULL) {
+               LOGE("Local IP address is NULL"); //LCOV_EXCL_LINE
+               return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       strncpy(tun_s->local_ip, local_ip, VPNSVC_IP4_STRING_LEN);
+       
+       return VPNSVC_ERROR_NONE;
+}
+
+EXPORT_API int vpnsvc_set_remote_ip_address(vpnsvc_h handle, const char *remote_ip)
+{
+       CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
+
+       int result = VPNSVC_ERROR_NONE;
+       vpnsvc_tun_s *tun_s = NULL;
+
+       /* parameter check */
+       if (handle == NULL) {
+               LOGE("handle is a NULL");
+               return VPNSVC_ERROR_INVALID_PARAMETER;
+       }
+       tun_s = (vpnsvc_tun_s*)handle;
+
+       if (remote_ip == NULL) {
+               LOGE("Remote IP address is NULL"); //LCOV_EXCL_LINE
+               return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       strncpy(tun_s->remote_ip, remote_ip, VPNSVC_IP4_STRING_LEN);
+
+       return VPNSVC_ERROR_NONE;
+}
+
+EXPORT_API int vpnsvc_add_route(vpnsvc_h handle, const char *route_address, int prefix)
+{
+       CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
+
+       int result = VPNSVC_ERROR_NONE;
+       int dbus_result;
+       vpnsvc_tun_s *tun_s = NULL;
+
+       /* parameter check */
+       if (handle == NULL) {
+               LOGE("handle is a NULL");
+               return VPNSVC_ERROR_INVALID_PARAMETER;
+       }
+       tun_s = (vpnsvc_tun_s*)handle;
+
+       if (route_address == NULL) {
+               LOGE("remove_address is NULL"); //LCOV_EXCL_LINE
+               return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       op = _vpnsvc_invoke_dbus_method(tun_s->connection,
+                                                               NETCONFIG_SERVICE_NAME,
+                                                               NETCONFIG_VPNSVC_PATH,
+                                                               NETCONFIG_VPNSVC_INTERFACE_NAME,
+                                                               "vpn_add_route",
+                                                               g_variant_new("(ssi)", tun_s->name, route_address, prefix),
+                                                               &dbus_result);
+       if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
+               return VPNSVC_ERROR_PERMISSION_DENIED;
+
+       if (op == NULL) {
+               return VPNSVC_ERROR_IPC_FAILED; //LCOV_EXCL_LINE
+       } else {
+               g_variant_get(op, "(i)", &result);
+               if (result != VPNSVC_ERROR_NONE)
+                       LOGE("vpn_add_route() failed"); //LCOV_EXCL_LINE
+               else
+                       LOGD("vpn_add_route() succeed");
+       }
+
+       return result;
+}
+
+EXPORT_API int vpnsvc_remove_route(vpnsvc_h handle, const char *route_address, int prefix)
+{
+       CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
+
+       int result = VPNSVC_ERROR_NONE;
+       int dbus_result;
+       vpnsvc_tun_s *tun_s = NULL;
+
+       /* parameter check */
+       if (handle == NULL) {
+               LOGE("handle is a NULL");
+               return VPNSVC_ERROR_INVALID_PARAMETER;
+       }
+       tun_s = (vpnsvc_tun_s*)handle;
+
+       if (route_address == NULL) {
+               LOGE("route_address is NULL"); //LCOV_EXCL_LINE
+               return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       op = _vpnsvc_invoke_dbus_method(tun_s->connection,
+                                                               NETCONFIG_SERVICE_NAME,
+                                                               NETCONFIG_VPNSVC_PATH,
+                                                               NETCONFIG_VPNSVC_INTERFACE_NAME,
+                                                               "vpn_remove_route",
+                                                               g_variant_new("(ssi)", tun_s->name, route_address, prefix),
+                                                               &dbus_result);
+       if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
+               return VPNSVC_ERROR_PERMISSION_DENIED;
+
+       if (op == NULL) {
+               return VPNSVC_ERROR_IPC_FAILED; //LCOV_EXCL_LINE
+       } else {
+               g_variant_get(op, "(i)", &result);
+               if (result != VPNSVC_ERROR_NONE)
+                       LOGE("vpn_remove_route() failed"); //LCOV_EXCL_LINE
+               else
+                       LOGD("vpn_remove_route() succeed");
+       }
+
+       return result;
+}
+
+EXPORT_API int vpnsvc_add_dns_server(vpnsvc_h handle, const char *dns_server)
+{
+       CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
+
+       int result = VPNSVC_ERROR_NONE;
+       int dbus_result;
+       vpnsvc_tun_s *tun_s = NULL;
+
+       /* parameter check */
+       if (handle == NULL) {
+               LOGE("handle is a NULL");
+               return VPNSVC_ERROR_INVALID_PARAMETER;
+       }
+       tun_s = (vpnsvc_tun_s*)handle;
+
+       if (dns_server == NULL) {
+               LOGE("dns_server is NULL"); //LCOV_EXCL_LINE
+               return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+
+       op = _vpnsvc_invoke_dbus_method(tun_s->connection,
+                                                               NETCONFIG_SERVICE_NAME,
+                                                               NETCONFIG_VPNSVC_PATH,
+                                                               NETCONFIG_VPNSVC_INTERFACE_NAME,
+                                                               "vpn_add_dns_server",
+                                                               g_variant_new("(ss)", tun_s->name, dns_server),
+                                                               &dbus_result);
+       if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
+               return VPNSVC_ERROR_PERMISSION_DENIED;
+
+       if (op == NULL) {
+               return VPNSVC_ERROR_IPC_FAILED; //LCOV_EXCL_LINE
+       } else {
+               g_variant_get(op, "(i)", &result);
+               if (result != VPNSVC_ERROR_NONE)
+                       LOGE("vpn_add_dns_server() failed"); //LCOV_EXCL_LINE
+               else
+                       LOGD("vpn_add_dns_server() succeed");
+       }
+
+       return result;
+}
+
+EXPORT_API int vpnsvc_remove_dns_server(vpnsvc_h handle, const char *dns_server)
+{
+       CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
+
+       int result = VPNSVC_ERROR_NONE;
+       int dbus_result;
+       vpnsvc_tun_s *tun_s = NULL;
+
+       /* parameter check */
+       if (handle == NULL) {
+               LOGE("handle is a NULL");
+               return VPNSVC_ERROR_INVALID_PARAMETER;
+       }
+       tun_s = (vpnsvc_tun_s*)handle;
+
+       if (dns_server == NULL) {
+               LOGE("dns_server is NULL"); //LCOV_EXCL_LINE
+               return VPNSVC_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
+       }
+       op = _vpnsvc_invoke_dbus_method(tun_s->connection,
+                                                               NETCONFIG_SERVICE_NAME,
+                                                               NETCONFIG_VPNSVC_PATH,
+                                                               NETCONFIG_VPNSVC_INTERFACE_NAME,
+                                                               "vpn_remove_dns_server",
+                                                               g_variant_new("(ss)", tun_s->name, dns_server),
+                                                               &dbus_result);
+       if (dbus_result == VPNSVC_ERROR_PERMISSION_DENIED)
+               return VPNSVC_ERROR_PERMISSION_DENIED;
+
+       if (op == NULL) {
+               return VPNSVC_ERROR_IPC_FAILED; //LCOV_EXCL_LINE
+       } else {
+               g_variant_get(op, "(i)", &result);
+               if (result != VPNSVC_ERROR_NONE)
+                       LOGE("vpn_remove_dns_server() failed"); //LCOV_EXCL_LINE
+               else
+                       LOGD("vpn_remove_dns_server() succeed");
+       }
+
+       return result;
+}
index b293817..010791d 100755 (executable)
 
 #include <stdio.h>
 #include <stdio_ext.h>
+#include <string.h>
 #include <stdlib.h>
+#include <sys/socket.h>
+#include <unistd.h>
 
-#include "capi_vpn_service_private.h"
+#include "vpn_service.h"
+#include "vpn_service_internal.h"
 
 #ifdef LOG_TAG
 #undef LOG_TAG
                perror("fgets() failed!!!");\
        } while (0);
 
+#define VPNSVC_IP4_STRING_LEN 16
+#define VPNSVC_VPN_IFACE_NAME_LEN 16
+#define VPNSVC_SESSION_STRING_LEN 32
+
 vpnsvc_h handle = NULL;
 
 static const char *test_print_error(vpnsvc_error_e error)
@@ -150,49 +158,13 @@ int test_vpnsvc_protect()
 int test_vpnsvc_up()
 {
        int rv;
-       char local[VPNSVC_IP4_STRING_LEN] = {'\0',};
-       char remote[VPNSVC_IP4_STRING_LEN] = {'\0',};
-       char *routes[2];
-       int prefix[2];
-       int nr_routes = 2;
-       const char *dns_server[2];
-       int nr_dns = 2;
-       char dns_suffix[100] = "tizen.org";
 
        if (!handle) {
                printf("invalid handle\n");
                return -1;
        }
 
-       strncpy(local, "192.168.0.82", VPNSVC_IP4_STRING_LEN);
-       strncpy(remote, "192.168.0.1", VPNSVC_IP4_STRING_LEN);
-
-       routes[0] = malloc(sizeof(char) * VPNSVC_IP4_STRING_LEN);
-       routes[1] = malloc(sizeof(char) * VPNSVC_IP4_STRING_LEN);
-
-       memset(routes[0], 0, sizeof(char) * VPNSVC_IP4_STRING_LEN);
-       memset(routes[1], 0, sizeof(char) * VPNSVC_IP4_STRING_LEN);
-
-       strncpy(routes[0], "192.168.0.10", VPNSVC_IP4_STRING_LEN);
-       prefix[0] = 32;
-
-       strncpy(routes[1], "192.168.0.11", VPNSVC_IP4_STRING_LEN);
-       prefix[1] = 32;
-
-       char *dns1 = "1.1.1.1";
-       char *dns2 = "2.2.2.2";
-
-       dns_server[0] = dns1;
-       dns_server[1] = dns2;
-
-       rv = vpnsvc_up(handle, local, remote, routes, prefix, nr_routes, dns_server, nr_dns, dns_suffix);
-
-       free(routes[0]);
-       free(routes[1]);
-
-       routes[0] = NULL;
-       routes[1] = NULL;
-
+       rv = vpnsvc_up(handle);
        if (rv != VPNSVC_ERROR_NONE)
                printf("vpnsvc up fail [%s]\n", test_print_error(rv));
        else
@@ -306,8 +278,11 @@ int test_vpnsvc_unblock_networks()
 int test_vpnsvc_set_mtu()
 {
        int rv;
+       int mtu = 0;
 
-       rv = vpnsvc_set_mtu(handle, 9000);
+       printf("Input MTU: ");
+       rv = scanf("%d", &mtu);
+       rv = vpnsvc_set_mtu(handle, mtu);
        if (rv != VPNSVC_ERROR_NONE) {
                printf("vpnsvc set mtu fail [%s]\n", test_print_error(rv));
                return -1;
@@ -355,6 +330,114 @@ int test_vpnsvc_set_session()
        }
 }
 
+int    test_vpnsvc_set_local_ip_address()
+{
+       int rv;
+       char local_ip[VPNSVC_IP4_STRING_LEN];
+
+       printf("Input local IP address: ");
+       rv = scanf("%s", local_ip);
+
+       rv = vpnsvc_set_local_ip_address(handle, local_ip);
+       if (rv != VPNSVC_ERROR_NONE) {
+               printf("vpnsvc set local IP address fail [%s]\n", test_print_error(rv));
+               return -1;
+       }
+
+       return 1;
+}
+
+int    test_vpnsvc_set_remote_ip_address()
+{
+       int rv;
+       char remote_ip[VPNSVC_IP4_STRING_LEN];
+
+       printf("Input remote IP address: ");
+       rv = scanf("%s", remote_ip);
+
+       rv = vpnsvc_set_remote_ip_address(handle, remote_ip);
+       if (rv != VPNSVC_ERROR_NONE) {
+               printf("vpnsvc set remote IP address fail [%s]\n", test_print_error(rv));
+               return -1;
+       }
+
+       return 1;
+}
+
+int test_vpnsvc_add_route()
+{
+       int rv;
+       int prefix;
+       char addr[VPNSVC_IP4_STRING_LEN];
+
+       printf("Input route address: ");
+       rv = scanf("%s", addr);
+       printf("Input prefix: ");
+       rv = scanf("%d", &prefix);
+
+       rv = vpnsvc_add_route(handle, addr, prefix);
+       if (rv != VPNSVC_ERROR_NONE) {
+               printf("vpnsvc add route address fail [%s]\n", test_print_error(rv));
+               return -1;
+       }
+
+       return 1;
+}
+
+int test_vpnsvc_remove_route()
+{
+       int rv;
+       int prefix;
+       char addr[VPNSVC_IP4_STRING_LEN];
+
+       printf("Input route address: ");
+       rv = scanf("%s", addr);
+       printf("Input prefix: ");
+       rv = scanf("%d", &prefix);
+
+       rv = vpnsvc_remove_route(handle, addr, prefix);
+       if (rv != VPNSVC_ERROR_NONE) {
+               printf("vpnsvc remove route address fail [%s]\n", test_print_error(rv));
+               return -1;
+       }
+
+       return 1;
+}
+
+int test_vpnsvc_add_dns_server()
+{
+       int rv;
+       char addr[VPNSVC_IP4_STRING_LEN];
+
+       printf("Input dns server: ");
+       rv = scanf("%s", addr);
+
+       rv = vpnsvc_add_dns_server(handle, addr);
+       if (rv != VPNSVC_ERROR_NONE) {
+               printf("vpnsvc add dns server fail [%s]\n", test_print_error(rv));
+               return -1;
+       }
+
+       return 1;
+}
+
+int test_vpnsvc_remove_dns_server()
+{
+       int rv;
+       char addr[VPNSVC_IP4_STRING_LEN];
+
+       printf("Input dns server address: ");
+       rv = scanf("%s", addr);
+
+       rv = vpnsvc_remove_dns_server(handle, addr);
+       if (rv != VPNSVC_ERROR_NONE) {
+               printf("vpnsvc remove dns server fail [%s]\n", test_print_error(rv));
+               return -1;
+       }
+
+       return 1;
+}
+
 int test_exit()
 {
        exit(0);
@@ -374,6 +457,12 @@ int (*test_function_table[])(void) = {
        test_vpnsvc_set_mtu,
        test_vpnsvc_set_blocking,
        test_vpnsvc_set_session,
+       test_vpnsvc_set_local_ip_address,
+       test_vpnsvc_set_remote_ip_address,
+       test_vpnsvc_add_route,
+       test_vpnsvc_remove_route,
+       test_vpnsvc_add_dns_server,
+       test_vpnsvc_remove_dns_server,
        test_exit,
 };
 
@@ -387,7 +476,7 @@ int main()
                printf("1  : vpnsvc_init\n");
                printf("2  : vpnsvc_deinit\n");
                printf("3  : vpnsvc_protect\n");
-               printf("4  : vpnsvc_up\n");
+               printf("4  : vpnsvc_up(1->13->14)\n");
                printf("5  : vpnsvc_down\n");
                printf("6  : vpnsvc_read\n");
                printf("7  : vpnsvc_write\n");
@@ -396,6 +485,12 @@ int main()
                printf("10 : vpnsvc_set_mtu\n");
                printf("11 : vpnsvc_set_blocking\n");
                printf("12 : vpnsvc_set_session\n");
+               printf("13 : vpnsvc_set_local_ip_address\n");
+               printf("14 : vpnsvc_set_remote_ip_address\n");
+               printf("15 : vpnsvc_add_route\n");
+               printf("16 : vpnsvc_remove_route\n");
+               printf("17 : vpnsvc_add_dns_server\n");
+               printf("18 : vpnsvc_remove_dns_server\n");
                printf("q  : quit\n");
 
                TEST_CONSOLE_INPUT(input, 3);