Add callbacks for IP bound and release events
authorMarcel Holtmann <marcel@holtmann.org>
Wed, 12 Aug 2009 06:23:50 +0000 (23:23 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Wed, 12 Aug 2009 06:23:50 +0000 (23:23 -0700)
include/ipconfig.h
src/device.c
src/ipconfig.c

index 83a8172..76d0b28 100644 (file)
@@ -64,6 +64,8 @@ struct connman_ipconfig_ops {
        void (*down) (struct connman_ipconfig *ipconfig);
        void (*lower_up) (struct connman_ipconfig *ipconfig);
        void (*lower_down) (struct connman_ipconfig *ipconfig);
+       void (*ip_bound) (struct connman_ipconfig *ipconfig);
+       void (*ip_release) (struct connman_ipconfig *ipconfig);
 };
 
 struct connman_ipconfig *connman_ipconfig_create(int index);
index 17720e5..1f0e20a 100644 (file)
@@ -1036,7 +1036,17 @@ static void device_lower_up(struct connman_ipconfig *ipconfig)
 
 static void device_lower_down(struct connman_ipconfig *ipconfig)
 {
-        connman_info("%s lower down", connman_ipconfig_get_ifname(ipconfig));
+       connman_info("%s lower down", connman_ipconfig_get_ifname(ipconfig));
+}
+
+static void device_ip_bound(struct connman_ipconfig *ipconfig)
+{
+       connman_info("%s ip bound", connman_ipconfig_get_ifname(ipconfig));
+}
+
+static void device_ip_release(struct connman_ipconfig *ipconfig)
+{
+       connman_info("%s ip release", connman_ipconfig_get_ifname(ipconfig));
 }
 
 static const struct connman_ipconfig_ops device_ops = {
@@ -1044,6 +1054,8 @@ static const struct connman_ipconfig_ops device_ops = {
        .down           = device_down,
        .lower_up       = device_lower_up,
        .lower_down     = device_lower_down,
+       .ip_bound       = device_ip_bound,
+       .ip_release     = device_ip_release,
 };
 
 /**
index faed54d..b02f20c 100644 (file)
@@ -256,6 +256,8 @@ static void __connman_ipconfig_lower_down(struct connman_ipdevice *ipdevice)
                return;
 
        ipdevice->driver->release(ipdevice->config);
+
+       connman_inet_clear_address(ipdevice->index);
 }
 
 void __connman_ipconfig_newlink(int index, unsigned short type,
@@ -317,6 +319,8 @@ update:
                        lower_down = TRUE;
        }
 
+       connman_inet_clear_address(index);
+
        ipdevice->flags = flags;
 
        str = g_string_new(NULL);
@@ -401,6 +405,7 @@ void __connman_ipconfig_newaddr(int index, const char *label,
 {
        struct connman_ipdevice *ipdevice;
        struct connman_ipaddress *ipaddress;
+       GList *list;
 
        DBG("index %d", index);
 
@@ -420,6 +425,23 @@ void __connman_ipconfig_newaddr(int index, const char *label,
 
        connman_info("%s {add} address %s/%u label %s", ipdevice->ifname,
                                                address, prefixlen, label);
+
+       if ((ipdevice->flags & (IFF_RUNNING | IFF_LOWER_UP)) != (IFF_RUNNING | IFF_LOWER_UP))
+               return;
+
+       if (g_slist_length(ipdevice->address_list) > 1)
+               return;
+
+       for (list = g_list_first(ipconfig_list); list;
+                                               list = g_list_next(list)) {
+               struct connman_ipconfig *ipconfig = list->data;
+
+               if (index != ipconfig->index)
+                       continue;
+
+               if (ipconfig->ops && ipconfig->ops->ip_bound)
+                       ipconfig->ops->ip_bound(ipconfig);
+       }
 }
 
 void __connman_ipconfig_deladdr(int index, const char *label,
@@ -427,6 +449,7 @@ void __connman_ipconfig_deladdr(int index, const char *label,
 {
        struct connman_ipdevice *ipdevice;
        struct connman_ipaddress *ipaddress;
+       GList *list;
 
        DBG("index %d", index);
 
@@ -445,6 +468,23 @@ void __connman_ipconfig_deladdr(int index, const char *label,
 
        connman_info("%s {del} address %s/%u label %s", ipdevice->ifname,
                                                address, prefixlen, label);
+
+       if ((ipdevice->flags & (IFF_RUNNING | IFF_LOWER_UP)) != (IFF_RUNNING | IFF_LOWER_UP))
+               return;
+
+       if (g_slist_length(ipdevice->address_list) > 0)
+               return;
+
+       for (list = g_list_first(ipconfig_list); list;
+                                               list = g_list_next(list)) {
+               struct connman_ipconfig *ipconfig = list->data;
+
+               if (index != ipconfig->index)
+                       continue;
+
+               if (ipconfig->ops && ipconfig->ops->ip_release)
+                       ipconfig->ops->ip_release(ipconfig);
+       }
 }
 
 void __connman_ipconfig_newroute(int index, unsigned char scope,
@@ -697,6 +737,8 @@ void connman_ipconfig_bind(struct connman_ipconfig *ipconfig,
                                        struct connman_ipaddress *ipaddress)
 {
        connman_ipaddress_copy(ipconfig->address, ipaddress);
+
+       connman_inet_set_address(ipconfig->index, ipconfig->address);
 }
 
 const char *__connman_ipconfig_method2string(enum connman_ipconfig_method method)