Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 15 Jan 2011 10:12:16 +0000 (UTC)
From:      Janne Snabb <snabb@epipe.com>
To:        freebsd-xen@freebsd.org
Subject:   Re: xn0: Error 2 parsing device/vif/0/mac [PATCH]
Message-ID:  <alpine.BSF.2.00.1101151002450.20212@tiktik.epipe.com>
In-Reply-To: <alpine.BSF.2.00.1101150731240.20212@tiktik.epipe.com>
References:  <alpine.BSF.2.00.1101150731240.20212@tiktik.epipe.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 15 Jan 2011, Janne Snabb wrote:

> It appears that that the netfront driver fails to get the vif mac 
> address which leads to panic shortly afterwards.

The patch at the bottom of this message solves the problem for me.
After that the current 8.2RC2 system works fine on amd64 with XENHVM
kernel with Xen 4.0.1 (have not tested other versions).

If the "mac" node does not appear in the front-end vif directory
(does it ever appear there? in my experience no), we fetch a link
to the backend directory for the same vif and try to get the "mac"
node from there.

I am not sure if this is the proper way to fix this, but it works
for me.

I can send-pr this if desired.

Best Regards,
--
Janne Snabb / EPIPE Communications
snabb@epipe.com - http://epipe.com/

--- sys/dev/xen/netfront/netfront.c.orig	2010-12-21 17:09:25.000000000 +0000
+++ sys/dev/xen/netfront/netfront.c	2011-01-15 10:01:12.000000000 +0000
@@ -399,16 +399,30 @@
  */
 static int 
 xen_net_read_mac(device_t dev, uint8_t mac[])
 {
 	int error, i;
-	char *s, *e, *macstr;
+	char *s, *e, *macstr, *backend;
 
 	error = xs_read(XST_NIL, xenbus_get_node(dev), "mac", NULL,
 	    (void **) &macstr);
-	if (error)
-		return (error);
+
+	if (error) {
+		error = xs_read(XST_NIL, xenbus_get_node(dev), "backend", NULL,
+		    (void **) &backend);
+
+		if (error)
+			return (error);
+
+		error = xs_read(XST_NIL, backend, "mac", NULL,
+		    (void **) &macstr);
+
+		free(backend, M_XENBUS);
+
+		if (error)
+			return (error);
+	}
 
 	s = macstr;
 	for (i = 0; i < ETHER_ADDR_LEN; i++) {
 		mac[i] = strtoul(s, &e, 16);
 		if (s == e || (e[0] != ':' && e[0] != 0)) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?alpine.BSF.2.00.1101151002450.20212>