Skip to content

Commit

Permalink
Merge pull request #340 from mtomaschewski/event-order-4
Browse files Browse the repository at this point in the history
events: process complete device state change event transitions
  • Loading branch information
mtomaschewski committed Jul 23, 2014
2 parents acbfd63 + e262573 commit 7b20627
Show file tree
Hide file tree
Showing 13 changed files with 263 additions and 222 deletions.
3 changes: 3 additions & 0 deletions autoip4/main.c
Expand Up @@ -320,6 +320,9 @@ autoip4_device_create(ni_dbus_server_t *server, const ni_netdev_t *ifp)
ni_autoip_device_t *dev;
ni_bool_t rv = FALSE;

if ((dev = ni_autoip_device_by_index(ifp->link.ifindex)) != NULL)
return TRUE;

dev = ni_autoip_device_new(ifp->name, &ifp->link);
if (!dev) {
ni_error("Cannot allocate autoip4 device for '%s' and index %u",
Expand Down
3 changes: 3 additions & 0 deletions dhcp4/main.c
Expand Up @@ -416,6 +416,9 @@ dhcp4_device_create(ni_dbus_server_t *server, const ni_netdev_t *ifp)
ni_dhcp4_device_t *dev;
ni_bool_t rv = FALSE;

if ((dev = ni_dhcp4_device_by_index(ifp->link.ifindex)) != NULL)
return TRUE;

dev = ni_dhcp4_device_new(ifp->name, &ifp->link);
if (!dev) {
ni_error("Cannot allocate dhcp4 device for '%s' and index %u",
Expand Down
3 changes: 3 additions & 0 deletions dhcp6/main.c
Expand Up @@ -357,6 +357,9 @@ dhcp6_device_create(ni_dbus_server_t *server, const ni_netdev_t *ifp)
ni_dhcp6_device_t *dev;
ni_bool_t rv = FALSE;

if ((dev = ni_dhcp6_device_by_index(ifp->link.ifindex)) != NULL)
return TRUE;

dev = ni_dhcp6_device_new(ifp->name, &ifp->link);
if (!dev) {
ni_error("Cannot allocate dhcp6 device for '%s' and index %u",
Expand Down
3 changes: 2 additions & 1 deletion include/wicked/netinfo.h
Expand Up @@ -56,7 +56,8 @@ struct ni_netdev {
ni_netdev_t * next;
unsigned int seq;
unsigned int modified : 1,
deleted : 1;
deleted : 1,
created : 1;

char * name;
ni_linkinfo_t link;
Expand Down
5 changes: 2 additions & 3 deletions nanny/nanny.c
Expand Up @@ -699,12 +699,11 @@ ni_nanny_netif_state_change_signal_receive(ni_dbus_connection_t *conn, ni_dbus_m
if (event == NI_EVENT_DEVICE_CREATE)
return;

if (event == NI_EVENT_DEVICE_READY) {
w = ni_fsm_ifworker_by_object_path(mgr->fsm, object_path);
if (!w && event == NI_EVENT_DEVICE_READY) {
if ((w = ni_fsm_recv_new_netif_path(mgr->fsm, object_path)))
ni_nanny_register_device(mgr, w);
}

w = ni_fsm_ifworker_by_object_path(mgr->fsm, object_path);
if (!w) {
ni_warn("received signal \"%s\" from unknown object \"%s\"",
signal_name, object_path);
Expand Down
35 changes: 16 additions & 19 deletions server/main.c
Expand Up @@ -365,12 +365,19 @@ handle_interface_event(ni_netdev_t *dev, ni_event_t event)
if (dbus_server) {
ni_dbus_object_t *object;

if (event == NI_EVENT_DEVICE_CREATE) {
/* A new netif was discovered; create a dbus server object
* enacpsulating it. */
object = ni_objectmodel_get_netif_object(dbus_server, dev);
if (!object && event == NI_EVENT_DEVICE_CREATE) {
/* A new netif was discovered or we've created one;
* create a dbus server object enacpsulating it.
*
* When a factory creates a virtual device, it also
* creates the dbus object and while the netlink
* event about it device arrived, we already have it.
*
* When the system discovered new device, we'll get
* a netlink event and create the dbus object here.
*/
object = ni_objectmodel_register_netif(dbus_server, dev, NULL);
} else {
object = ni_objectmodel_get_netif_object(dbus_server, dev);
}
if (!object) {
/* usually a "bad event", e.g. when the underlying netdev
Expand All @@ -389,25 +396,15 @@ handle_interface_event(ni_netdev_t *dev, ni_event_t event)
case NI_EVENT_DEVICE_DELETE:
/* Delete dbus object first, so that GetManagedObjects doesn't
* return it any longer.
* Note; deletion of the object will be deferred until we return to
* the main loop.
* Note; deletion of the object will be deferred until we return
* to the main loop.
*/
ni_objectmodel_unregister_netif(dbus_server, dev);

/* Delete dbus object and emit event */
while ((event_uuid = ni_netdev_get_event_uuid(dev, event)) != NULL)
ni_objectmodel_send_netif_event(dbus_server, object, NI_EVENT_DEVICE_DOWN, event_uuid);

ni_objectmodel_send_netif_event(dbus_server, object, NI_EVENT_DEVICE_DOWN, NULL);
ni_objectmodel_send_netif_event(dbus_server, object, NI_EVENT_DEVICE_DELETE, NULL);
break;

case NI_EVENT_DEVICE_READY:
while ((event_uuid = ni_netdev_get_event_uuid(dev, event)) != NULL)
ni_objectmodel_send_netif_event(dbus_server, object, event, event_uuid);
ni_objectmodel_send_netif_event(dbus_server, object, event, NULL);
break;

case NI_EVENT_DEVICE_READY:
case NI_EVENT_DEVICE_DOWN:
case NI_EVENT_LINK_ASSOCIATED:
case NI_EVENT_LINK_ASSOCIATION_LOST:
case NI_EVENT_LINK_UP:
Expand Down
5 changes: 2 additions & 3 deletions src/dbus-objects/addrconf.c
Expand Up @@ -103,9 +103,8 @@ ni_objectmodel_addrconf_path_to_device(const char *path)
if (ni_parse_uint(path, &ifindex, 10) < 0)
return NULL;

nc = ni_global_state_handle(1);
if (nc == NULL) {
ni_error("%s: unable to refresh interfaces", __func__);
if (!(nc = ni_global_state_handle(0))) {
ni_error("%s: unable to get global handle", __func__);
return NULL;
}

Expand Down
12 changes: 2 additions & 10 deletions src/dbus-objects/interface.c
Expand Up @@ -190,16 +190,8 @@ static const ni_dbus_class_t ni_objectmodel_netif_list_class = {
dbus_bool_t
ni_objectmodel_netif_list_refresh(ni_dbus_object_t *object)
{
ni_netconfig_t *nc;

if (!(nc = ni_global_state_handle(1))) {
ni_error("failed to refresh network interfaces");
return FALSE;
}

/* Note, we do not have to deal with removal of interfaces
* that have been destroyed. We should be notified of these
* automatically via RTM_DELLINK */
/* We're notified about automatically via RTM_NEW/DELLINK */
(void)object;

return TRUE;
}
Expand Down

0 comments on commit 7b20627

Please sign in to comment.