From 885ac067b4332bea808de50885d0ccd6386b8636 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 11 Aug 2009 23:23:50 -0700 Subject: [PATCH] Add callbacks for IP bound and release events --- include/ipconfig.h | 2 ++ src/device.c | 14 +++++++++++++- src/ipconfig.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/include/ipconfig.h b/include/ipconfig.h index 83a8172..76d0b28 100644 --- a/include/ipconfig.h +++ b/include/ipconfig.h @@ -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); diff --git a/src/device.c b/src/device.c index 17720e5..1f0e20a 100644 --- a/src/device.c +++ b/src/device.c @@ -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, }; /** diff --git a/src/ipconfig.c b/src/ipconfig.c index faed54d..b02f20c 100644 --- a/src/ipconfig.c +++ b/src/ipconfig.c @@ -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) -- 2.7.4