summary refs log tree commit diff
path: root/src/core/devices/ovs
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/devices/ovs')
-rw-r--r--src/core/devices/ovs/nm-device-ovs-bridge.c18
-rw-r--r--src/core/devices/ovs/nm-device-ovs-port.c120
-rw-r--r--src/core/devices/ovs/nm-ovs-factory.c3
-rw-r--r--src/core/devices/ovs/nm-ovsdb.c11
4 files changed, 99 insertions, 53 deletions
diff --git a/src/core/devices/ovs/nm-device-ovs-bridge.c b/src/core/devices/ovs/nm-device-ovs-bridge.c
index ea77dd18..048afb02 100644
--- a/src/core/devices/ovs/nm-device-ovs-bridge.c
+++ b/src/core/devices/ovs/nm-device-ovs-bridge.c
@@ -78,20 +78,26 @@ act_stage3_ip_config(NMDevice *device, int addr_family)
     nm_device_devip_set_state(device, addr_family, NM_DEVICE_IP_STATE_READY, NULL);
 }
 
-static gboolean
-enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gboolean configure)
+static NMTernary
+attach_port(NMDevice                  *device,
+            NMDevice                  *port,
+            NMConnection              *connection,
+            gboolean                   configure,
+            GCancellable              *cancellable,
+            NMDeviceAttachPortCallback callback,
+            gpointer                   user_data)
 {
     if (!configure)
         return TRUE;
 
-    if (!NM_IS_DEVICE_OVS_PORT(slave))
+    if (!NM_IS_DEVICE_OVS_PORT(port))
         return FALSE;
 
     return TRUE;
 }
 
 static void
-release_slave(NMDevice *device, NMDevice *slave, gboolean configure)
+detach_port(NMDevice *device, NMDevice *port, gboolean configure)
 {}
 
 void
@@ -159,8 +165,8 @@ nm_device_ovs_bridge_class_init(NMDeviceOvsBridgeClass *klass)
     device_class->get_generic_capabilities            = get_generic_capabilities;
     device_class->act_stage3_ip_config                = act_stage3_ip_config;
     device_class->ready_for_ip_config                 = ready_for_ip_config;
-    device_class->enslave_slave                       = enslave_slave;
-    device_class->release_slave                       = release_slave;
+    device_class->attach_port                         = attach_port;
+    device_class->detach_port                         = detach_port;
     device_class->can_reapply_change_ovs_external_ids = TRUE;
     device_class->reapply_connection                  = nm_device_ovs_reapply_connection;
 }
diff --git a/src/core/devices/ovs/nm-device-ovs-port.c b/src/core/devices/ovs/nm-device-ovs-port.c
index 6ba52f40..5510e39f 100644
--- a/src/core/devices/ovs/nm-device-ovs-port.c
+++ b/src/core/devices/ovs/nm-device-ovs-port.c
@@ -72,20 +72,42 @@ act_stage3_ip_config(NMDevice *device, int addr_family)
     nm_device_devip_set_state(device, addr_family, NM_DEVICE_IP_STATE_READY, NULL);
 }
 
+typedef struct {
+    NMDevice                  *device;
+    NMDevice                  *port;
+    GCancellable              *cancellable;
+    NMDeviceAttachPortCallback callback;
+    gpointer                   callback_user_data;
+} AttachPortData;
+
 static void
 add_iface_cb(GError *error, gpointer user_data)
 {
-    NMDevice *slave = user_data;
-
-    if (error && !g_error_matches(error, NM_UTILS_ERROR, NM_UTILS_ERROR_CANCELLED_DISPOSING)) {
-        nm_log_warn(LOGD_DEVICE,
-                    "device %s could not be added to a ovs port: %s",
-                    nm_device_get_iface(slave),
-                    error->message);
-        nm_device_state_changed(slave, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_OVSDB_FAILED);
+    AttachPortData       *data = user_data;
+    NMDeviceOvsPort      *self;
+    gs_free_error GError *local = NULL;
+
+    if (g_cancellable_is_cancelled(data->cancellable)) {
+        local = nm_utils_error_new_cancelled(FALSE, NULL);
+        error = local;
+    } else if (error && !nm_utils_error_is_cancelled_or_disposing(error)) {
+        self = NM_DEVICE_OVS_PORT(data->device);
+        _LOGW(LOGD_DEVICE,
+              "device %s could not be added to a ovs port: %s",
+              nm_device_get_iface(data->port),
+              error->message);
+        nm_device_state_changed(data->port,
+                                NM_DEVICE_STATE_FAILED,
+                                NM_DEVICE_STATE_REASON_OVSDB_FAILED);
     }
 
-    g_object_unref(slave);
+    data->callback(data->device, error, data->callback_user_data);
+
+    g_object_unref(data->device);
+    g_object_unref(data->port);
+    nm_clear_g_cancellable(&data->cancellable);
+
+    nm_g_slice_free(data);
 }
 
 static gboolean
@@ -115,14 +137,21 @@ set_mtu_cb(GError *error, gpointer user_data)
     g_object_unref(self);
 }
 
-static gboolean
-enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gboolean configure)
+static NMTernary
+attach_port(NMDevice                  *device,
+            NMDevice                  *port,
+            NMConnection              *connection,
+            gboolean                   configure,
+            GCancellable              *cancellable,
+            NMDeviceAttachPortCallback callback,
+            gpointer                   user_data)
 {
     NMDeviceOvsPort    *self      = NM_DEVICE_OVS_PORT(device);
     NMActiveConnection *ac_port   = NULL;
     NMActiveConnection *ac_bridge = NULL;
     NMDevice           *bridge_device;
     NMSettingWired     *s_wired;
+    AttachPortData     *data;
 
     if (!configure)
         return TRUE;
@@ -131,42 +160,49 @@ enslave_slave(NMDevice *device, NMDevice *slave, NMConnection *connection, gbool
     ac_bridge = nm_active_connection_get_master(ac_port);
     if (!ac_bridge) {
         _LOGW(LOGD_DEVICE,
-              "can't enslave %s: bridge active-connection not found",
-              nm_device_get_iface(slave));
+              "can't attach %s: bridge active-connection not found",
+              nm_device_get_iface(port));
         return FALSE;
     }
 
     bridge_device = nm_active_connection_get_device(ac_bridge);
     if (!bridge_device) {
-        _LOGW(LOGD_DEVICE, "can't enslave %s: bridge device not found", nm_device_get_iface(slave));
+        _LOGW(LOGD_DEVICE, "can't attach %s: bridge device not found", nm_device_get_iface(port));
         return FALSE;
     }
 
+    data  = g_slice_new(AttachPortData);
+    *data = (AttachPortData){
+        .device             = g_object_ref(device),
+        .port               = g_object_ref(port),
+        .cancellable        = g_object_ref(cancellable),
+        .callback           = callback,
+        .callback_user_data = user_data,
+    };
+
     nm_ovsdb_add_interface(nm_ovsdb_get(),
                            nm_active_connection_get_applied_connection(ac_bridge),
                            nm_device_get_applied_connection(device),
-                           nm_device_get_applied_connection(slave),
+                           nm_device_get_applied_connection(port),
                            bridge_device,
-                           slave,
+                           port,
                            add_iface_cb,
-                           g_object_ref(slave));
+                           data);
 
     /* DPDK ports does not have a link after the devbind, so the MTU must be
      * set on ovsdb after adding the interface. */
-    if (NM_IS_DEVICE_OVS_INTERFACE(slave) && _ovs_interface_is_dpdk(slave)) {
-        s_wired = nm_device_get_applied_setting(slave, NM_TYPE_SETTING_WIRED);
-
-        if (!s_wired || !nm_setting_wired_get_mtu(s_wired))
-            return TRUE;
-
-        nm_ovsdb_set_interface_mtu(nm_ovsdb_get(),
-                                   nm_device_get_ip_iface(slave),
-                                   nm_setting_wired_get_mtu(s_wired),
-                                   set_mtu_cb,
-                                   g_object_ref(slave));
+    if (NM_IS_DEVICE_OVS_INTERFACE(port) && _ovs_interface_is_dpdk(port)) {
+        s_wired = nm_device_get_applied_setting(port, NM_TYPE_SETTING_WIRED);
+        if (s_wired && nm_setting_wired_get_mtu(s_wired)) {
+            nm_ovsdb_set_interface_mtu(nm_ovsdb_get(),
+                                       nm_device_get_ip_iface(port),
+                                       nm_setting_wired_get_mtu(s_wired),
+                                       set_mtu_cb,
+                                       g_object_ref(port));
+        }
     }
 
-    return TRUE;
+    return NM_TERNARY_DEFAULT;
 }
 
 static void
@@ -186,31 +222,31 @@ del_iface_cb(GError *error, gpointer user_data)
 }
 
 static void
-release_slave(NMDevice *device, NMDevice *slave, gboolean configure)
+detach_port(NMDevice *device, NMDevice *port, gboolean configure)
 {
-    NMDeviceOvsPort *self              = NM_DEVICE_OVS_PORT(device);
-    bool             slave_not_managed = !NM_IN_SET(nm_device_sys_iface_state_get(slave),
-                                        NM_DEVICE_SYS_IFACE_STATE_MANAGED,
-                                        NM_DEVICE_SYS_IFACE_STATE_ASSUME);
+    NMDeviceOvsPort *self             = NM_DEVICE_OVS_PORT(device);
+    bool             port_not_managed = !NM_IN_SET(nm_device_sys_iface_state_get(port),
+                                       NM_DEVICE_SYS_IFACE_STATE_MANAGED,
+                                       NM_DEVICE_SYS_IFACE_STATE_ASSUME);
 
-    _LOGI(LOGD_DEVICE, "releasing ovs interface %s", nm_device_get_ip_iface(slave));
+    _LOGI(LOGD_DEVICE, "detaching ovs interface %s", nm_device_get_ip_iface(port));
 
     /* Even if the an interface's device has gone away (e.g. externally
      * removed and thus we're called with configure=FALSE), we still need
      * to make sure its OVSDB entry is gone.
      */
-    if (configure || slave_not_managed) {
+    if (configure || port_not_managed) {
         nm_ovsdb_del_interface(nm_ovsdb_get(),
-                               nm_device_get_iface(slave),
+                               nm_device_get_iface(port),
                                del_iface_cb,
-                               g_object_ref(slave));
+                               g_object_ref(port));
     }
 
     if (configure) {
         /* Open VSwitch is going to delete this one. We must ignore what happens
          * next with the interface. */
-        if (NM_IS_DEVICE_OVS_INTERFACE(slave))
-            nm_device_update_from_platform_link(slave, NULL);
+        if (NM_IS_DEVICE_OVS_INTERFACE(port))
+            nm_device_update_from_platform_link(port, NULL);
     }
 }
 
@@ -245,8 +281,8 @@ nm_device_ovs_port_class_init(NMDeviceOvsPortClass *klass)
     device_class->get_generic_capabilities            = get_generic_capabilities;
     device_class->act_stage3_ip_config                = act_stage3_ip_config;
     device_class->ready_for_ip_config                 = ready_for_ip_config;
-    device_class->enslave_slave                       = enslave_slave;
-    device_class->release_slave                       = release_slave;
+    device_class->attach_port                         = attach_port;
+    device_class->detach_port                         = detach_port;
     device_class->can_reapply_change_ovs_external_ids = TRUE;
     device_class->reapply_connection                  = nm_device_ovs_reapply_connection;
 }
diff --git a/src/core/devices/ovs/nm-ovs-factory.c b/src/core/devices/ovs/nm-ovs-factory.c
index 5aaa5c01..ff2c7858 100644
--- a/src/core/devices/ovs/nm-ovs-factory.c
+++ b/src/core/devices/ovs/nm-ovs-factory.c
@@ -178,7 +178,8 @@ ovsdb_device_removed(NMOvsdb         *ovsdb,
     device_state = nm_device_get_state(device);
 
     if (device_type == NM_DEVICE_TYPE_OVS_INTERFACE && nm_device_get_act_request(device)
-        && device_state < NM_DEVICE_STATE_DEACTIVATING) {
+        && (device_state > NM_DEVICE_STATE_DISCONNECTED
+            && device_state < NM_DEVICE_STATE_DEACTIVATING)) {
         nm_device_state_changed(device,
                                 NM_DEVICE_STATE_DEACTIVATING,
                                 NM_DEVICE_STATE_REASON_REMOVED);
diff --git a/src/core/devices/ovs/nm-ovsdb.c b/src/core/devices/ovs/nm-ovsdb.c
index 44e16cb7..e7c96852 100644
--- a/src/core/devices/ovs/nm-ovsdb.c
+++ b/src/core/devices/ovs/nm-ovsdb.c
@@ -376,6 +376,9 @@ ovsdb_call_method(NMOvsdb                  *self,
     NMOvsdbPrivate  *priv = NM_OVSDB_GET_PRIVATE(self);
     OvsdbMethodCall *call;
 
+    /* FIXME(shutdown): this function should accept a cancellable to
+     * interrupt the operation. */
+
     /* Ensure we're not unsynchronized before we queue the method call. */
     ovsdb_try_connect(self);
 
@@ -1550,7 +1553,7 @@ _external_ids_to_string(const GArray *arr)
     if (!arr)
         return g_strdup("empty");
 
-    nm_str_buf_init(&strbuf, NM_UTILS_GET_NEXT_REALLOC_SIZE_104, FALSE);
+    strbuf = NM_STR_BUF_INIT(NM_UTILS_GET_NEXT_REALLOC_SIZE_104, FALSE);
     nm_str_buf_append(&strbuf, "[");
     for (i = 0; i < arr->len; i++) {
         const NMUtilsNamedValue *n = &g_array_index(arr, NMUtilsNamedValue, i);
@@ -1584,7 +1587,7 @@ ovsdb_got_update(NMOvsdb *self, json_t *msg)
     json_t         *items;
     json_t         *external_ids;
     json_error_t    json_error = {
-        0,
+           0,
     };
     void       *iter;
     const char *name;
@@ -1985,7 +1988,7 @@ ovsdb_got_msg(NMOvsdb *self, json_t *msg)
 {
     NMOvsdbPrivate *priv       = NM_OVSDB_GET_PRIVATE(self);
     json_error_t    json_error = {
-        0,
+           0,
     };
     json_t     *json_id = NULL;
     json_int_t  id      = (json_int_t) -1;
@@ -2127,7 +2130,7 @@ ovsdb_read_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
     gssize          size;
     json_t         *msg;
     json_error_t    json_error = {
-        0,
+           0,
     };
 
     size = g_input_stream_read_finish(stream, res, &error);