File add-hwaddr-to-ovs-bridge.patch of Package wicked
--- a/src/ovs.c
+++ b/src/ovs.c
@@ -28,2 +28,6 @@
#include <stdlib.h>
+
+#include <net/if_arp.h>
+#include <execinfo.h>
+#include <stdio.h>
@@ -38,2 +42,26 @@
+ #define BT_BUF_SIZE 100
+
+ void
+ _backtrace(void)
+ {
+ int j, nptrs;
+ void *buffer[BT_BUF_SIZE];
+ char **strings;
+
+ nptrs = backtrace(buffer, BT_BUF_SIZE);
+ ni_info("backtrace() returned %d addresses\n", nptrs);
+
+ strings = backtrace_symbols(buffer, nptrs);
+ if (strings == NULL) {
+ perror("backtrace_symbols");
+ exit(EXIT_FAILURE);
+ }
+
+ for (j = 0; j < nptrs; j++)
+ ni_info("%s\n", strings[j]);
+
+ free(strings);
+ }
+
ni_ovs_bridge_t *
@@ -479,2 +507,5 @@
ni_process_free(pi);
+
+ if(!ni_ovs_vsctl_bridge_set_hwaddr(ovs_vsctl, cfg))
+ goto failure;
@@ -485,2 +516,74 @@
}
+
+#define _HWADDR_SIZE 17
+int ni_ovs_vsctl_bridge_read_hwaddr(const ni_netdev_t *cfg)
+{
+ FILE *f;
+ char *lladdr;
+ char *filename;
+ asprintf(&filename, "/run/%s-hwaddr", cfg->name);
+
+ if ((f = fopen(filename, "r")) == NULL) {
+ ni_warn("ifcfg-%s: cannot open file %s for reading", cfg->name, filename);
+ return NI_PROCESS_FAILURE;
+ }
+ if ((lladdr = malloc((_HWADDR_SIZE + 1) * sizeof(char))) == NULL) {
+ ni_warn("ifcfg-%s: cannot allocate memory for buffer", cfg->name);
+ return NI_PROCESS_FAILURE;
+ }
+ if (fread(lladdr, sizeof(char), _HWADDR_SIZE, f) < 1) {
+ ni_warn("ifcfg-%s: did not read any characters from %s", cfg->name, filename);
+ return NI_PROCESS_FAILURE;
+ }
+ lladdr[_HWADDR_SIZE] = '\0';
+ ni_info("ifcfg-%s: link address read: %s", cfg->name, lladdr);
+ if (ni_link_address_parse(&cfg->link.hwaddr, ARPHRD_ETHER, lladdr) < 0) {
+ ni_error("ifcfg-%s: Cannot parse LLADDR=\"%s\"",
+ cfg->name, lladdr);
+ return NI_PROCESS_FAILURE;
+ }
+ return 0;
+}
+
+int /* process run codes (for now) */
+ni_ovs_vsctl_bridge_set_hwaddr(const char *ovs_vsctl, const ni_netdev_t *cfg)
+{
+ ni_shellcmd_t *cmd;
+ ni_process_t *pi;
+ int rv = NI_PROCESS_FAILURE;
+ if (ni_ovs_vsctl_bridge_read_hwaddr(cfg) != 0) {
+ ni_warn("ifcfg-%s: cannot read link address from the given file", cfg->name);
+ return NI_PROCESS_FAILURE;
+ }
+ ni_info("ifcfg-%s: hwaddr.type: %u, hwaddr.len: %u, hwaddr.data: %.*s", cfg->name, cfg->link.hwaddr.type, cfg->link.hwaddr.len, NI_MAXHWADDRLEN, ni_link_address_print(&cfg->link.hwaddr));
+ if (!ni_link_address_is_invalid(&cfg->link.hwaddr) && (cfg->link.hwaddr.type == ARPHRD_ETHER)) {
+ if (!(cmd = ni_shellcmd_new(NULL)))
+ return rv;
+
+ if (!ni_shellcmd_add_arg(cmd, ovs_vsctl))
+ goto failure;
+
+ if (!ni_shellcmd_add_arg(cmd, "set"))
+ goto failure;
+
+ if (!ni_shellcmd_add_arg(cmd, "bridge"))
+ goto failure;
+
+ if (!ni_shellcmd_add_arg(cmd, cfg->name))
+ goto failure;
+
+ if (!ni_shellcmd_fmt_arg(cmd, "other-config:hwaddr=%s", ni_link_address_print(&cfg->link.hwaddr)))
+ goto failure;
+ ni_info("ifcfg-%s: execute command; %s", cfg->name, cmd->command);
+ if (!(pi = ni_process_new(cmd)))
+ goto failure;
+ rv = ni_process_run_and_wait(pi);
+ ni_process_free(pi);
+failure:
+ if (cmd)
+ ni_shellcmd_release(cmd);
+ return rv;
+ }
+ return 0;
+}
--- a/src/ovs.h
+++ b/src/ovs.h
@@ -30,2 +30,4 @@
extern int ni_ovs_vsctl_bridge_add(const ni_netdev_t *, ni_bool_t);
+extern int ni_ovs_vsctl_bridge_set_hwaddr(const char *, const ni_netdev_t *);
+extern int ni_ovs_vsctl_bridge_read_hwaddr(const ni_netdev_t *);
extern int ni_ovs_vsctl_bridge_del(const char *);
+++ a/client/suse/compat-suse.c
--- b/client/suse/compat-suse.c
@@ -2811,2 +2811,3 @@
unsigned int tag;
+ const char *lladdr = NULL;
@@ -2851,3 +2852,12 @@
return -1;
+
+ if ((lladdr = ni_sysconfig_get_value(sc, "LLADDR")) != NULL) {
+ if (ni_link_address_parse(&dev->link.hwaddr, ARPHRD_ETHER, lladdr) < 0) {
+ ni_error("ifcfg-%s: Cannot parse LLADDR=\"%s\"",
+ dev->name, lladdr);
+ return -1;
+ }
+ }
+ni_info("ifcfg-%s: lladdr: %s, hwaddr.type: %u, hwaddr.len: %u, hwaddr.data: %s (%.*s)", dev->name, lladdr, dev->link.hwaddr.type, dev->link.hwaddr.len, ni_link_address_print(&dev->link.hwaddr), NI_MAXHWADDRLEN, dev->link.hwaddr.data);
return 0;
--- a/client/compat.c
+++ b/client/compat.c
@@ -1082,2 +1082,7 @@
bnode = xml_node_create(ifnode, "ovs-bridge");
+
+ if (compat->dev->link.hwaddr.len) {
+ xml_node_new_element("address", bnode,
+ ni_link_address_print(&compat->dev->link.hwaddr));
+ }
--- a/schema/ovs-bridge.xml
+++ b/schema/ovs-bridge.xml
@@ -27,6 +27,7 @@
<tag type="uint16" />
</vlan>
<ports class="array" element-type="ovs-bridge:port-device" element-name="port" />
+ <address type="ethernet-address"/>
</define>
<define name="configuration" class="dict" extends="ovs-bridge:bridge-config"/>