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 = {
.down = device_down,
.lower_up = device_lower_up,
.lower_down = device_lower_down,
+ .ip_bound = device_ip_bound,
+ .ip_release = device_ip_release,
};
/**
return;
ipdevice->driver->release(ipdevice->config);
+
+ connman_inet_clear_address(ipdevice->index);
}
void __connman_ipconfig_newlink(int index, unsigned short type,
lower_down = TRUE;
}
+ connman_inet_clear_address(index);
+
ipdevice->flags = flags;
str = g_string_new(NULL);
{
struct connman_ipdevice *ipdevice;
struct connman_ipaddress *ipaddress;
+ GList *list;
DBG("index %d", index);
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,
{
struct connman_ipdevice *ipdevice;
struct connman_ipaddress *ipaddress;
+ GList *list;
DBG("index %d", index);
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,
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)