* @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
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) \
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);
*/
/**
- * @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
*/
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
/**
* @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()
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);
+
+/**
* @}
*/
* @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
* @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
(*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)
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);
}
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 */
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,
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)
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);
{
CHECK_FEATURE_SUPPORTED(VPN_SERVICE_FEATURE);
+ int result = VPNSVC_ERROR_NONE;
+ int dbus_result;
vpnsvc_tun_s *tun_s = NULL;
/* parameter check */
}
tun_s->mtu = mtu;
- return VPNSVC_ERROR_NONE;
+
+ return result;
}
EXPORT_API int vpnsvc_set_blocking(vpnsvc_h handle, bool blocking)
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;
+}
#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)
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
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;
}
}
+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);
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,
};
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");
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);