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

Reply via email to