Ian Campbell
2011-Oct-05 09:45 UTC
[Xen-devel] [PATCH 0 of 2] libxl: a couple of MAC address patches
These two patches should have been part of my "libxl: rationalise libxl_device_* APIs" series but I missed them out. I will include them in future repostings but for now here they are. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-05 09:45 UTC
[Xen-devel] [PATCH 1 of 2] libxl: add and use parse_mac helper function
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1317807819 -3600
# Node ID b85fcaaf73a9cfb5e5f448015c56630aa8daba3d
# Parent 6a40e32738e7026769c2932fa53b8aefd34e6a77
libxl: add and use parse_mac helper function
rather than open coding a bunch it a bunch of times.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r 6a40e32738e7 -r b85fcaaf73a9 tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c Wed Oct 05 10:43:10 2011 +0100
+++ b/tools/libxl/libxl_internal.c Wed Oct 05 10:43:39 2011 +0100
@@ -277,6 +277,23 @@ int libxl__file_reference_unmap(libxl_fi
return ERROR_FAIL;
}
+_hidden int libxl__parse_mac(const char *s, libxl_mac mac)
+{
+ const char *tok;
+ char *endptr;
+ int i;
+
+ for (i = 0, tok = s; *tok && (i < 6); ++i, tok += 3) {
+ mac[i] = strtol(tok, &endptr, 16);
+ if (endptr != (tok + 2) || (*endptr != ''\0''
&& *endptr != '':'') )
+ return ERROR_INVAL;
+ }
+ if ( i != 6 )
+ return ERROR_INVAL;
+
+ return 0;
+}
+
int libxl__fd_set_cloexec(int fd)
{
int flags = 0;
diff -r 6a40e32738e7 -r b85fcaaf73a9 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Wed Oct 05 10:43:10 2011 +0100
+++ b/tools/libxl/libxl_internal.h Wed Oct 05 10:43:39 2011 +0100
@@ -426,6 +426,8 @@ _hidden int libxl__fd_set_cloexec(int fd
_hidden int libxl__e820_alloc(libxl__gc *gc, uint32_t domid,
libxl_domain_config *d_config);
+_hidden int libxl__parse_mac(const char *s, libxl_mac mac);
+
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
diff -r 6a40e32738e7 -r b85fcaaf73a9 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c Wed Oct 05 10:43:10 2011 +0100
+++ b/tools/libxl/libxl_utils.c Wed Oct 05 10:43:39 2011 +0100
@@ -452,22 +452,19 @@ int libxl_mac_to_device_nic(libxl_ctx *c
const char *mac, libxl_device_nic *nic)
{
libxl_nicinfo *nics;
- unsigned int nb, i;
+ unsigned int nb, rc, i;
int found;
- uint8_t mac_n[6];
+ libxl_mac mac_n;
uint8_t *a, *b;
- const char *tok;
- char *endptr;
+
+ rc = libxl__parse_mac(mac, mac_n);
+ if (rc)
+ return rc;
nics = libxl_list_nics(ctx, domid, &nb);
if (!nics)
return ERROR_FAIL;
- for (i = 0, tok = mac; *tok && (i < 6); ++i, tok += 3) {
- mac_n[i] = strtol(tok, &endptr, 16);
- if (endptr != (tok + 2))
- return ERROR_INVAL;
- }
memset(nic, 0, sizeof (libxl_device_nic));
found = 0;
for (i = 0; i < nb; ++i) {
@@ -494,9 +491,8 @@ int libxl_devid_to_device_nic(libxl_ctx
const char *devid, libxl_device_nic *nic)
{
libxl__gc gc = LIBXL_INIT_GC(ctx);
- char *tok, *val;
+ char *val;
char *dompath, *nic_path_fe, *nic_path_be;
- unsigned int i;
int rc = ERROR_FAIL;
memset(nic, 0, sizeof (libxl_device_nic));
@@ -515,10 +511,10 @@ int libxl_devid_to_device_nic(libxl_ctx
nic->devid = strtoul(devid, NULL, 10);
val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc,
"%s/mac", nic_path_fe));
- for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
- ++i, tok = strtok(NULL, ":")) {
- nic->mac[i] = strtoul(tok, NULL, 16);
- }
+ rc = libxl__parse_mac(val, nic->mac);
+ if (rc)
+ goto out;
+
nic->script = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc,
"%s/script", nic_path_be), NULL);
rc = 0;
out:
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Campbell
2011-Oct-05 09:45 UTC
[Xen-devel] [PATCH 2 of 2] libxl: fix libxl_mac_to_device_nic
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1317807819 -3600
# Node ID 88486538d739b5fb0aab51526e77315a696c6092
# Parent b85fcaaf73a9cfb5e5f448015c56630aa8daba3d
libxl: fix libxl_mac_to_device_nic
I think I broke this back in 22041:4c9ef5ec9146, using i as both the inner and
outer loop iterator.
I''ve added libxl__compare_macs which helps keep things clean.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r b85fcaaf73a9 -r 88486538d739 tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c Wed Oct 05 10:43:39 2011 +0100
+++ b/tools/libxl/libxl_internal.c Wed Oct 05 10:43:39 2011 +0100
@@ -294,6 +294,18 @@ _hidden int libxl__parse_mac(const char
return 0;
}
+_hidden int libxl__compare_macs(libxl_mac *a, libxl_mac *b)
+{
+ int i;
+
+ for (i = 0; i<6; i++) {
+ if ((*a)[i] != (*b)[i])
+ return (*a)[i] - (*b)[i];
+ }
+
+ return 0;
+}
+
int libxl__fd_set_cloexec(int fd)
{
int flags = 0;
diff -r b85fcaaf73a9 -r 88486538d739 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Wed Oct 05 10:43:39 2011 +0100
+++ b/tools/libxl/libxl_internal.h Wed Oct 05 10:43:39 2011 +0100
@@ -426,7 +426,10 @@ _hidden int libxl__fd_set_cloexec(int fd
_hidden int libxl__e820_alloc(libxl__gc *gc, uint32_t domid,
libxl_domain_config *d_config);
+/* parse the string @s as a sequence of 6 colon separated bytes in to @mac */
_hidden int libxl__parse_mac(const char *s, libxl_mac mac);
+/* compare mac address @a and @b. 0 if the same, -ve if a<b and +ve if
a>b */
+_hidden int libxl__compare_macs(libxl_mac *a, libxl_mac *b);
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
diff -r b85fcaaf73a9 -r 88486538d739 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c Wed Oct 05 10:43:39 2011 +0100
+++ b/tools/libxl/libxl_utils.c Wed Oct 05 10:43:39 2011 +0100
@@ -453,9 +453,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c
{
libxl_nicinfo *nics;
unsigned int nb, rc, i;
- int found;
libxl_mac mac_n;
- uint8_t *a, *b;
rc = libxl__parse_mac(mac, mac_n);
if (rc)
@@ -466,17 +464,15 @@ int libxl_mac_to_device_nic(libxl_ctx *c
return ERROR_FAIL;
memset(nic, 0, sizeof (libxl_device_nic));
- found = 0;
+
+ rc = ERROR_INVAL;
for (i = 0; i < nb; ++i) {
- for (i = 0, a = nics[i].mac, b = mac_n;
- (b < mac_n + 6) && (*a == *b); ++a, ++b)
- ;
- if ((b >= mac_n + 6) && (*a == *b)) {
+ if (!libxl__compare_macs(&mac_n, &nics[i].mac)) {
nic->backend_domid = nics[i].backend_id;
nic->devid = nics[i].devid;
memcpy(nic->mac, nics[i].mac, sizeof (nic->mac));
nic->script = strdup(nics[i].script);
- found = 1;
+ rc = 0;
break;
}
}
@@ -484,7 +480,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c
for (i=0; i<nb; i++)
libxl_nicinfo_destroy(&nics[i]);
free(nics);
- return found;
+ return rc;
}
int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Jackson
2011-Oct-06 17:50 UTC
Re: [Xen-devel] [PATCH 1 of 2] libxl: add and use parse_mac helper function
Ian Campbell writes ("[Xen-devel] [PATCH 1 of 2] libxl: add and use
parse_mac helper function"):> libxl: add and use parse_mac helper function
Acked and applied both of these, thanks.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel