diff options
author | Seonah Moon <seonah1.moon@samsung.com> | 2018-01-23 14:50:50 +0900 |
---|---|---|
committer | Seonah Moon <seonah1.moon@samsung.com> | 2018-01-23 14:50:55 +0900 |
commit | 30602f521a85820a9f6b7ac04876400e00c68b15 (patch) | |
tree | f035a4fcc014a034f3b492886d1e8395f327fd25 /vpn/plugins/vpn.c | |
parent | a079cfe6f815f8c69055de834d1ccbdf1fd94ba7 (diff) | |
parent | 9362752a471a5c892d679548fbf2828d5fc5684b (diff) | |
download | connman-30602f521a85820a9f6b7ac04876400e00c68b15.tar.gz connman-30602f521a85820a9f6b7ac04876400e00c68b15.tar.bz2 connman-30602f521a85820a9f6b7ac04876400e00c68b15.zip |
Updated connman to version 1.35
Change-Id: I13526fbf80296a79be15548fc226a308941ac9ec
Signed-off-by: Taesub Kim <taesub.kim@samsung.com>
Diffstat (limited to 'vpn/plugins/vpn.c')
-rwxr-xr-x | vpn/plugins/vpn.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/vpn/plugins/vpn.c b/vpn/plugins/vpn.c index e65dacac..f6e24c4c 100755 --- a/vpn/plugins/vpn.c +++ b/vpn/plugins/vpn.c @@ -56,6 +56,7 @@ struct vpn_data { unsigned int watch; enum vpn_state state; struct connman_task *task; + int tun_flags; }; struct vpn_driver_data { @@ -89,7 +90,7 @@ static int stop_vpn(struct vpn_provider *provider) return 0; memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_flags = IFF_TUN | IFF_NO_PI; + ifr.ifr_flags = data->tun_flags | IFF_NO_PI; sprintf(ifr.ifr_name, "%s", data->if_name); fd = open("/dev/net/tun", O_RDWR | O_CLOEXEC); @@ -195,6 +196,34 @@ int vpn_set_ifname(struct vpn_provider *provider, const char *ifname) return 0; } +static int vpn_set_state(struct vpn_provider *provider, + enum vpn_provider_state state) +{ + struct vpn_data *data = vpn_provider_get_data(provider); + if (!data) + return -EINVAL; + + switch (state) { + case VPN_PROVIDER_STATE_UNKNOWN: + return -EINVAL; + case VPN_PROVIDER_STATE_IDLE: + data->state = VPN_STATE_IDLE; + break; + case VPN_PROVIDER_STATE_CONNECT: + case VPN_PROVIDER_STATE_READY: + data->state = VPN_STATE_CONNECT; + break; + case VPN_PROVIDER_STATE_DISCONNECT: + data->state = VPN_STATE_DISCONNECT; + break; + case VPN_PROVIDER_STATE_FAILURE: + data->state = VPN_STATE_FAILURE; + break; + } + + return 0; +} + static void vpn_newlink(unsigned flags, unsigned change, void *user_data) { struct vpn_provider *provider = user_data; @@ -357,7 +386,7 @@ static void vpn_event(struct vpn_provider *provider, int state) } #endif -static int vpn_create_tun(struct vpn_provider *provider) +static int vpn_create_tun(struct vpn_provider *provider, int flags) { struct vpn_data *data = vpn_provider_get_data(provider); struct ifreq ifr; @@ -377,7 +406,7 @@ static int vpn_create_tun(struct vpn_provider *provider) } memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_flags = IFF_TUN | IFF_NO_PI; + ifr.ifr_flags = flags | IFF_NO_PI; for (i = 0; i < 256; i++) { sprintf(ifr.ifr_name, "vpn%d", i); @@ -393,6 +422,7 @@ static int vpn_create_tun(struct vpn_provider *provider) goto exist_err; } + data->tun_flags = flags; data->if_name = (char *)g_strdup(ifr.ifr_name); if (!data->if_name) { connman_error("Failed to allocate memory"); @@ -434,7 +464,7 @@ static int vpn_connect(struct vpn_provider *provider, struct vpn_data *data = vpn_provider_get_data(provider); struct vpn_driver_data *vpn_driver_data; const char *name; - int ret = 0; + int ret = 0, tun_flags = IFF_TUN; enum vpn_state state = VPN_STATE_UNKNOWN; if (data) @@ -482,7 +512,10 @@ static int vpn_connect(struct vpn_provider *provider, } if (vpn_driver_data->vpn_driver->flags != VPN_FLAG_NO_TUN) { - ret = vpn_create_tun(provider); + if (vpn_driver_data->vpn_driver->device_flags) { + tun_flags = vpn_driver_data->vpn_driver->device_flags(provider); + } + ret = vpn_create_tun(provider, tun_flags); if (ret < 0) goto exist_err; } @@ -628,6 +661,7 @@ int vpn_register(const char *name, struct vpn_driver *vpn_driver, data->provider_driver.probe = vpn_probe; data->provider_driver.remove = vpn_remove; data->provider_driver.save = vpn_save; + data->provider_driver.set_state = vpn_set_state; if (!driver_hash) driver_hash = g_hash_table_new_full(g_str_hash, |