[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] This patch will cause xcsdump to display more verbose information about the
ChangeSet 1.1329, 2005/03/20 14:03:52+00:00, iap10@xxxxxxxxxxxxxxxxxxxx This patch will cause xcsdump to display more verbose information about the xcs traffic. This includes human-readable names of the message type and subtype and all of the parameters and their values. It's against today's xen-unstable and has been tested against a number of xen-unstable snapshots going back a few weeks (one line has to be removed to support older versions of xen-unstable). The message types displayed are configurable via a bitmask passed as a '-v' option in xcsdump. The code is very useful for figuring out what management tools (Xend, VM-Tools) are actually doing. I would not have been able to write vm-tools without it. Signed-off-by: Anthony Liguori <aliguori@xxxxxxxxxx> Signed-off-by: ian@xxxxxxxxxxxxx Makefile | 4 dump.c | 526 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ dump.h | 28 +++ xcsdump.c | 81 ++++++--- 4 files changed, 609 insertions(+), 30 deletions(-) diff -Nru a/tools/xcs/Makefile b/tools/xcs/Makefile --- a/tools/xcs/Makefile 2005-03-20 15:03:29 -05:00 +++ b/tools/xcs/Makefile 2005-03-20 15:03:29 -05:00 @@ -33,9 +33,9 @@ clean: $(RM) *.a *.so *.o *.rpm $(BIN) xcsdump -xcsdump: xcsdump.c +xcsdump: xcsdump.c dump.c $(CC) $(CFLAGS) -o xcsdump xcsdump.c -L$(XEN_LIBXC) -L$(XEN_LIBXUTIL) \ - ctrl_interface.c evtchn.c -lxc -lxutil + ctrl_interface.c evtchn.c dump.c -lxc -lxutil $(BIN): $(OBJS) $(CC) $(CFLAGS) $^ -o $@ -L$(XEN_LIBXC) -L$(XEN_LIBXUTIL) -lxc -lxutil diff -Nru a/tools/xcs/dump.c b/tools/xcs/dump.c --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/tools/xcs/dump.c 2005-03-20 15:03:29 -05:00 @@ -0,0 +1,526 @@ +/*\ + * Copyright (C) International Business Machines Corp., 2005 + * Author(s): Anthony Liguori <aliguori@xxxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; under version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +\*/ + +#include <stdio.h> +#include <stdarg.h> + +#include "dump.h" + +#define str(a) # a +#define error(a, ...) do { \ + _error("%s:%s():L%d: " a, __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__);\ + exit(1); \ +} while (0) +#define warn(a, ...) do { \ + _error("%s:%s():L%d: " a, __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__);\ +} while (0) +#define debug(a, ...) do { \ + _error(a, ## __VA_ARGS__);\ +} while (0) + +void _error(const char *fmt, ...); + +#define debug_begin(a, b) debug("CMSG_" a "_" b " {") +#define debug_end(a, b) debug("}") +#define debug_field(a, b, c) debug("\t." str(b) " = " c, a->b) +#define debug_field_mac(a, b) \ + debug("\t." str(b) " = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x", \ + a->b[0], a->b[1], a->b[2], a->b[3], a->b[4], a->b[5]) + +#define debug_dump(a, b, c) debug_hex("\t." str(b) " = ", a->b, a->c) + +#include <stdint.h> +#include <string.h> +#include <stdio.h> +#include <ctype.h> + +static int strcount(const char *str, char ch) +{ + int i; + int count = 0; + + for (i = 0; str[i]; i++) { + if (str[i] == ch) { + count++; + } + } + + return count; +} + +void debug_hex(const char *info, const uint8_t *data, size_t length) +{ + int indent = strlen(info) + (strcount(info, '\t') * 8 - 1); + int words_per_row = (2 * (80 - indent - 2) / 7) & ~1; + size_t i; + + for (i = 0; i < length; i += words_per_row) { + size_t ind; + + if (i == 0) { + fprintf(stderr, "%s", info); + } else { + int j; + for (j = 0; j < indent; j++) { + fprintf(stderr, " "); + } + } + + for (ind = 0; ind < words_per_row; ind++) { + if (ind % 2 == 0) { + fprintf(stderr, " "); + } + + if (i + ind < length) { + fprintf(stderr, "%.2X", data[i + ind]); + } else { + fprintf(stderr, " "); + } + } + + fprintf(stderr, " "); + + for (ind = 0; ind < words_per_row; ind++) { + if (i + ind < length) { + if (isprint(data[i + ind])) { + fprintf(stderr, "%c", data[i + ind]); + } else { + fprintf(stderr, "."); + } + } else { + fprintf(stderr, " "); + } + } + fprintf(stderr, "\n"); + } +} + +void dump_msg(const control_msg_t *msg, uint64_t flags) +{ + if ((flags & (1 << msg->type)) == 0) { + return; + } + + switch (msg->type) { + case CMSG_CONSOLE: + if (msg->subtype == CMSG_CONSOLE_DATA) { + debug_begin("CONSOLE", "DATA"); + debug_field(msg, length, "%u"); + debug_dump(msg, msg, length); + debug_end("CONSOLE", "DATA"); + } else { + debug_begin("CONSOLE", "UNKNOWN"); + debug_field(msg, subtype, "%u"); + debug_field(msg, length, "%u"); + debug_dump(msg, msg, length); + debug_end("CONSOLE", "UNKNOWN"); + } + break; + case CMSG_BLKIF_BE: + if (msg->subtype == CMSG_BLKIF_BE_CREATE) { + blkif_be_create_t *load; + load = (blkif_be_create_t *)msg->msg; + debug_begin("BLKIF_BE", "CREATE"); + debug_field(load, domid, "%u"); + debug_field(load, blkif_handle, "%u"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "CREATE"); + } else if (msg->subtype == CMSG_BLKIF_BE_DESTROY) { + blkif_be_destroy_t *load; + load = (blkif_be_destroy_t *)msg->msg; + debug_begin("BLKIF_BE", "DESTROY"); + debug_field(load, domid, "%u"); + debug_field(load, blkif_handle, "%u"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "DESTROY"); + } else if (msg->subtype == CMSG_BLKIF_BE_CONNECT) { + blkif_be_connect_t *load; + load = (blkif_be_connect_t *)msg->msg; + debug_begin("BLKIF_BE", "CONNECT"); + debug_field(load, domid, "%u"); + debug_field(load, blkif_handle, "%u"); + debug_field(load, shmem_frame, "%lu"); + debug_field(load, evtchn, "%u"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "CONNECT"); + } else if (msg->subtype == CMSG_BLKIF_BE_DISCONNECT) { + blkif_be_disconnect_t *load; + load = (blkif_be_disconnect_t *)msg->msg; + debug_begin("BLKIF_BE", "DISCONNECT"); + debug_field(load, domid, "%u"); + debug_field(load, blkif_handle, "%u"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "DISCONNECT"); + } else if (msg->subtype == CMSG_BLKIF_BE_VBD_CREATE) { + blkif_be_vbd_create_t *load; + load = (blkif_be_vbd_create_t *)msg->msg; + debug_begin("BLKIF_BE", "VBD_CREATE"); + debug_field(load, domid, "%u"); + debug_field(load, blkif_handle, "%u"); + debug_field(load, vdevice, "%u"); + debug_field(load, readonly, "%u"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "VBD_CREATE"); + } else if (msg->subtype == CMSG_BLKIF_BE_VBD_DESTROY) { + blkif_be_vbd_destroy_t *load; + load = (blkif_be_vbd_destroy_t *)msg->msg; + debug_begin("BLKIF_BE", "VBD_DESTROY"); + debug_field(load, domid, "%u"); + debug_field(load, blkif_handle, "%u"); + debug_field(load, vdevice, "%u"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "VBD_DESTROY"); + } else if (msg->subtype == CMSG_BLKIF_BE_VBD_GROW) { + blkif_be_vbd_grow_t *load; + load = (blkif_be_vbd_grow_t *)msg->msg; + debug_begin("BLKIF_BE", "VBD_GROW"); + debug_field(load, domid, "%u"); + debug_field(load, blkif_handle, "%u"); + debug_field(load, extent.sector_start, "%llu"); + debug_field(load, extent.sector_length, "%llu"); + debug_field(load, extent.device, "%u"); + debug_field(load, vdevice, "%u"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "VBD_GROW"); + } else if (msg->subtype == CMSG_BLKIF_BE_VBD_SHRINK) { + blkif_be_vbd_shrink_t *load; + load = (blkif_be_vbd_shrink_t *)msg->msg; + debug_begin("BLKIF_BE", "VBD_SHRINK"); + debug_field(load, domid, "%u"); + debug_field(load, blkif_handle, "%u"); + debug_field(load, vdevice, "%u"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "VBD_SHRINK"); + } else if (msg->subtype == CMSG_BLKIF_BE_DRIVER_STATUS) { + blkif_be_driver_status_t *load; + load = (blkif_be_driver_status_t *)msg->msg; + debug_begin("BLKIF_BE", "DRIVER_STATUS"); + debug_field(load, status, "%u"); + debug_end("BLKIF_BE", "DRIVER_STATUS"); + } else { + debug_begin("BLKIF_BE", "UNKNOWN"); + debug_field(msg, subtype, "%u"); + debug_field(msg, length, "%u"); + debug_dump(msg, msg, length); + debug_end("BLKIF_BE", "UNKNOWN"); + } + break; + case CMSG_BLKIF_FE: + if (msg->subtype == CMSG_BLKIF_FE_INTERFACE_STATUS) { + blkif_fe_interface_status_t *load; + load = (blkif_fe_interface_status_t *)msg->msg; + debug_begin("BLKIF_FE", "INTERFACE_STATUS"); + debug_field(load, handle, "%u"); + debug_field(load, status, "%u"); + debug_field(load, evtchn, "%u"); + debug_field(load, domid, "%u"); ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxxx https://lists.sourceforge.net/lists/listinfo/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |