summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2020-11-26 17:54:33 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2020-11-26 17:54:33 +0100
commite2ed707c877c5931446626b34475d1073382d80e (patch)
tree529d5ef443452df2597483fe771b3dd39392bee5
parentb0c018830e7884e7457b8ea44553946ff680eb89 (diff)
parentc4beaac67b2927141a69ce38c5988d6b56812415 (diff)
downloadNetworkManager-e2ed707c877c5931446626b34475d1073382d80e.tar.gz
ovs: merge branch 'bg/rh1899745'
https://bugzilla.redhat.com/show_bug.cgi?id=1899745 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/691
-rw-r--r--src/devices/ovs/nm-ovsdb.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/src/devices/ovs/nm-ovsdb.c b/src/devices/ovs/nm-ovsdb.c
index 61875bdcd0..08bf573880 100644
--- a/src/devices/ovs/nm-ovsdb.c
+++ b/src/devices/ovs/nm-ovsdb.c
@@ -992,7 +992,7 @@ _add_interface(NMOvsdb * self,
nm_auto_decref_json json_t *interfaces = NULL;
nm_auto_decref_json json_t *new_interfaces = NULL;
gboolean has_interface = FALSE;
- gboolean interface_is_internal;
+ gboolean interface_is_local;
gs_free char * bridge_cloned_mac = NULL;
gs_free char * interface_cloned_mac = NULL;
GError * error = NULL;
@@ -1006,10 +1006,10 @@ _add_interface(NMOvsdb * self,
new_ports = json_array();
new_interfaces = json_array();
- bridge_name = nm_connection_get_interface_name(bridge);
- port_name = nm_connection_get_interface_name(port);
- interface_name = nm_connection_get_interface_name(interface);
- interface_is_internal = nm_streq0(bridge_name, interface_name);
+ bridge_name = nm_connection_get_interface_name(bridge);
+ port_name = nm_connection_get_interface_name(port);
+ interface_name = nm_connection_get_interface_name(interface);
+ interface_is_local = nm_streq0(bridge_name, interface_name);
/* Determine cloned MAC addresses */
if (!nm_device_hw_addr_get_cloned(bridge_device,
@@ -1018,7 +1018,7 @@ _add_interface(NMOvsdb * self,
&bridge_cloned_mac,
NULL,
&error)) {
- _LOGW("Cannot determine cloned mac for OVS %s '%s': %s",
+ _LOGW("Cannot determine cloned MAC for OVS %s '%s': %s",
"bridge",
bridge_name,
error->message);
@@ -1031,18 +1031,34 @@ _add_interface(NMOvsdb * self,
&interface_cloned_mac,
NULL,
&error)) {
- _LOGW("Cannot determine cloned mac for OVS %s '%s': %s",
+ _LOGW("Cannot determine cloned MAC for OVS %s '%s': %s",
"interface",
interface_name,
error->message);
g_clear_error(&error);
}
- if (interface_is_internal && !bridge_cloned_mac && interface_cloned_mac) {
- _LOGT("'%s' is a local ovs-interface, the MAC will be set on ovs-bridge '%s'",
- interface_name,
- bridge_name);
- bridge_cloned_mac = g_steal_pointer(&interface_cloned_mac);
+ /* For local interfaces, ovs complains if it finds a
+ * MAC address in the Interface table because it only takes
+ * the MAC from the Bridge table.
+ * Set any cloned MAC present in a local interface connection
+ * into the Bridge table, unless conflicting with the bridge MAC. */
+ if (interface_is_local && interface_cloned_mac) {
+ if (bridge_cloned_mac && !nm_streq(interface_cloned_mac, bridge_cloned_mac)) {
+ _LOGW("Cloned MAC '%s' of local ovs-interface '%s' conflicts with MAC '%s' of bridge "
+ "'%s'",
+ interface_cloned_mac,
+ interface_name,
+ bridge_cloned_mac,
+ bridge_name);
+ nm_clear_g_free(&interface_cloned_mac);
+ } else {
+ nm_clear_g_free(&bridge_cloned_mac);
+ bridge_cloned_mac = g_steal_pointer(&interface_cloned_mac);
+ _LOGT("'%s' is a local ovs-interface, the MAC will be set on ovs-bridge '%s'",
+ interface_name,
+ bridge_name);
+ }
}
g_hash_table_iter_init(&iter, priv->bridges);
@@ -1108,7 +1124,7 @@ _add_interface(NMOvsdb * self,
g_return_if_fail(ovs_bridge);
_expect_bridge_ports(params, ovs_bridge->name, ports);
_set_bridge_ports(params, bridge_name, new_ports);
- if (bridge_cloned_mac && interface_is_internal)
+ if (bridge_cloned_mac && interface_is_local)
_set_bridge_mac(params, bridge_name, bridge_cloned_mac);
}