[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.