This is used when restarting the VPN connection and IP address changes and we must remove the earlier IP address from network interface. --- vpn/vpn-provider.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ vpn/vpn-provider.h | 1 + 2 files changed, 46 insertions(+)
diff --git a/vpn/vpn-provider.c b/vpn/vpn-provider.c index ba1add3..5bc6093 100644 --- a/vpn/vpn-provider.c +++ b/vpn/vpn-provider.c @@ -84,6 +84,8 @@ struct vpn_provider { char *config_file; char *config_entry; bool immutable; + struct connman_ipaddress *prev_ipv4_addr; + struct connman_ipaddress *prev_ipv6_addr; }; static void append_properties(DBusMessageIter *iter, @@ -1000,6 +1002,8 @@ static void provider_destruct(struct vpn_provider *provider) g_strfreev(provider->host_ip); g_free(provider->config_file); g_free(provider->config_entry); + connman_ipaddress_free(provider->prev_ipv4_addr); + connman_ipaddress_free(provider->prev_ipv6_addr); g_free(provider); } @@ -2560,6 +2564,47 @@ void vpn_provider_change_address(struct vpn_provider *provider) } } +void vpn_provider_clear_address(struct vpn_provider *provider, int family) +{ + const char *address; + unsigned char len; + + DBG("provider %p family %d ipv4 %p ipv6 %p", provider, family, + provider->prev_ipv4_addr, provider->prev_ipv6_addr); + + switch (family) { + case AF_INET: + if (provider->prev_ipv4_addr) { + connman_ipaddress_get_ip(provider->prev_ipv4_addr, + &address, &len); + + DBG("ipv4 %s/%d", address, len); + + connman_inet_clear_address(provider->index, + provider->prev_ipv4_addr); + connman_ipaddress_free(provider->prev_ipv4_addr); + provider->prev_ipv4_addr = NULL; + } + break; + case AF_INET6: + if (provider->prev_ipv6_addr) { + connman_ipaddress_get_ip(provider->prev_ipv6_addr, + &address, &len); + + DBG("ipv6 %s/%d", address, len); + + connman_inet_clear_ipv6_address(provider->index, + address, len); + + connman_ipaddress_free(provider->prev_ipv6_addr); + provider->prev_ipv6_addr = NULL; + } + break; + default: + break; + } +} + static int agent_probe(struct connman_agent *agent) { DBG("agent %p", agent); diff --git a/vpn/vpn-provider.h b/vpn/vpn-provider.h index 4b73e8e..8105d7f 100644 --- a/vpn/vpn-provider.h +++ b/vpn/vpn-provider.h @@ -108,6 +108,7 @@ const char *vpn_provider_get_name(struct vpn_provider *provider); const char *vpn_provider_get_host(struct vpn_provider *provider); const char *vpn_provider_get_path(struct vpn_provider *provider); void vpn_provider_change_address(struct vpn_provider *provider); +void vpn_provider_clear_address(struct vpn_provider *provider, int family); typedef void (* vpn_provider_connect_cb_t) (struct vpn_provider *provider, void *user_data, int error); -- 1.8.3.1 _______________________________________________ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman