[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] g/c unused xcs.
# HG changeset patch # User cl349@xxxxxxxxxxxxxxxxxxxx # Node ID 38c5199155fc111f3209438b4474775a1736120f # Parent 4e4aac33809faf1344b897b517ae5cfc9f7883f7 g/c unused xcs. Signed-off-by: Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> diff -r 4e4aac33809f -r 38c5199155fc .hgignore --- a/.hgignore Wed Sep 7 18:37:55 2005 +++ b/.hgignore Wed Sep 7 19:01:05 2005 @@ -147,8 +147,6 @@ ^tools/vtpm_manager/manager/vtpm_managerd ^tools/web-shutdown\.tap$ ^tools/x2d2/minixend$ -^tools/xcs/xcs$ -^tools/xcs/xcsdump$ ^tools/xcutils/xc_restore$ ^tools/xcutils/xc_save$ ^tools/xenstat/xentop/xentop$ @@ -166,7 +164,6 @@ ^tools/xenstore/xs_test$ ^tools/xenstore/xs_watch_stress$ ^tools/xentrace/xentrace$ -^tools/xfrd/xfrd$ ^xen/BLOG$ ^xen/TAGS$ ^xen/arch/x86/asm-offsets\.s$ diff -r 4e4aac33809f -r 38c5199155fc tools/Makefile --- a/tools/Makefile Wed Sep 7 18:37:55 2005 +++ b/tools/Makefile Wed Sep 7 19:01:05 2005 @@ -7,7 +7,6 @@ SUBDIRS += misc SUBDIRS += examples SUBDIRS += xentrace -SUBDIRS += xcs SUBDIRS += xcutils SUBDIRS += firmware SUBDIRS += security diff -r 4e4aac33809f -r 38c5199155fc tools/Rules.mk --- a/tools/Rules.mk Wed Sep 7 18:37:55 2005 +++ b/tools/Rules.mk Wed Sep 7 19:01:05 2005 @@ -4,7 +4,6 @@ XEN_XC = $(XEN_ROOT)/tools/python/xen/lowlevel/xc XEN_LIBXC = $(XEN_ROOT)/tools/libxc -XEN_XCS = $(XEN_ROOT)/tools/xcs XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore XEN_LIBXENSTAT = $(XEN_ROOT)/tools/xenstat/libxenstat/src diff -r 4e4aac33809f -r 38c5199155fc tools/examples/init.d/xend --- a/tools/examples/init.d/xend Wed Sep 7 18:37:55 2005 +++ b/tools/examples/init.d/xend Wed Sep 7 19:01:05 2005 @@ -11,7 +11,7 @@ exit 0 fi -# Wait for Xend and xcs to be up +# Wait for Xend to be up function await_daemons_up { i=1 diff -r 4e4aac33809f -r 38c5199155fc tools/misc/xend --- a/tools/misc/xend Wed Sep 7 18:37:55 2005 +++ b/tools/misc/xend Wed Sep 7 19:01:05 2005 @@ -25,11 +25,6 @@ import signal import time import commands - -XCS_PATH = "/var/lib/xen/xcs_socket" -XCS_EXEC = "/usr/sbin/xcs" -XCS_PIDFILE = "/var/run/xcs.pid" -XCS_ARGS = (XCS_EXEC, "-p", XCS_PIDFILE) # add fallback path for non-native python path installs if needed sys.path.append('/usr/lib/python') @@ -70,52 +65,6 @@ hline() raise CheckError("invalid user") -def xcs_running(): - """ See if the control switch is running. - """ - s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - try: - s.connect( (XCS_PATH) ) - s.close() - except: - try: - os.remove(XCS_PIDFILE) - except: - pass - return 0 - return 1 - -def start_xcs(): - if (not xcs_running()): - if os.fork() == 0 : - if not os.path.isdir(os.path.dirname(XCS_PATH)): - os.makedirs(os.path.dirname(XCS_PATH)) - try: - os.execvp(XCS_EXEC, XCS_ARGS) - except: - hline() - msg("Tried to start xcs, but failed. Is it installed?") - hline() - raise CheckError("couldn't start xcs") - for n in range(10) : - if (xcs_running()): - break - time.sleep(0.1) - else : - hline() - msg("Failed to start the control interface switch.") - hline() - raise CheckError("xcs not running") - -def stop_xcs(): - try: - xcs_pidfile = open(XCS_PIDFILE) - xcs_pid = int(xcs_pidfile.read().strip()) - os.kill(xcs_pid, signal.SIGTERM) - xcs_pidfile.close() - except: - return - def start_xenstored(): XENSTORED_TRACE = os.getenv("XENSTORED_TRACE") cmd = "/usr/sbin/xenstored --pid-file=/var/run/xenstore.pid" @@ -141,19 +90,16 @@ pid, status = os.wait() return status >> 8 elif sys.argv[1] == 'start': - start_xcs() start_xenstored() start_consoled() return daemon.start() elif sys.argv[1] == 'trace_start': - start_xcs() start_xenstored() start_consoled() return daemon.start(trace=1) elif sys.argv[1] == 'stop': return daemon.stop() elif sys.argv[1] == 'restart': - start_xcs() start_xenstored() start_consoled() return daemon.stop() or daemon.start() diff -r 4e4aac33809f -r 38c5199155fc tools/xenstore/Makefile --- a/tools/xenstore/Makefile Wed Sep 7 18:37:55 2005 +++ b/tools/xenstore/Makefile Wed Sep 7 19:01:05 2005 @@ -15,7 +15,6 @@ BASECFLAGS+= -O3 $(PROFILE) #BASECFLAGS+= -I$(XEN_ROOT)/tools BASECFLAGS+= -I$(XEN_ROOT)/tools/libxc -BASECFLAGS+= -I$(XEN_ROOT)/tools/xcs BASECFLAGS+= -I$(XEN_ROOT)/xen/include/public BASECFLAGS+= -I. BASECFLAGS+= -I$(XEN_ROOT)/linux-2.6-xen-sparse/include/asm-xen/linux-public diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/Makefile --- a/tools/xcs/Makefile Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,48 +0,0 @@ -# Makefile for XCS -# Andrew Warfield, 2004 - -XEN_ROOT=../.. -include $(XEN_ROOT)/tools/Rules.mk - -XCS_INSTALL_DIR = /usr/sbin - -INSTALL = install -INSTALL_PROG = $(INSTALL) -m0755 -INSTALL_DIR = $(INSTALL) -d -m0755 - -CFLAGS += -Wall -Werror -g3 -D _XOPEN_SOURCE=600 - -CFLAGS += -I $(XEN_XC) -CFLAGS += -I $(XEN_LIBXC) - -SRCS := -SRCS += ctrl_interface.c -SRCS += bindings.c -SRCS += connection.c -SRCS += evtchn.c -SRCS += xcs.c - -HDRS = $(wildcard *.h) -OBJS = $(patsubst %.c,%.o,$(SRCS)) -BIN = xcs - -all: $(BIN) xcsdump - -clean: - $(RM) *.a *.so *.o *.rpm $(BIN) xcsdump - -xcsdump: xcsdump.c dump.c - $(CC) $(CFLAGS) -o xcsdump xcsdump.c -L$(XEN_LIBXC) \ - ctrl_interface.c evtchn.c dump.c -lxenctrl - -$(BIN): $(OBJS) - $(CC) $(CFLAGS) $^ -o $@ -L$(XEN_LIBXC) -lxenctrl - -$(OBJS): $(HDRS) - -install: xcs xcsdump - $(INSTALL_DIR) -p $(DESTDIR)/$(XCS_INSTALL_DIR) - $(INSTALL_DIR) -p $(DESTDIR)/usr/include - $(INSTALL_PROG) xcs $(DESTDIR)/$(XCS_INSTALL_DIR) - $(INSTALL_PROG) xcsdump $(DESTDIR)/$(XCS_INSTALL_DIR) - $(INSTALL_PROG) xcs_proto.h $(DESTDIR)/usr/include diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/bindings.c --- a/tools/xcs/bindings.c Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,179 +0,0 @@ -/* bindings.c - * - * Manage subscriptions for the control interface switch. - * - * (c) 2004, Andrew Warfield - * - */ - -/* Interfaces: - * - * xcs_bind (port, type, connection) - * - Register connection to receive messages of this type. - * xcs_unbind (port, type, connection) - * - Remove an existing registration. (Must be an exact match) - * xcs_lookup (port, type) - * - Return a list of connections matching a registration. - * - * - All connections have a connection.bindings list of current bindings. - * - (port, type) pairs may be wildcarded with -1. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <string.h> -#include "xcs.h" - - -typedef struct binding_ent_st { - connection_t *con; - struct binding_ent_st *next; -} binding_ent_t; - -#define BINDING_TABLE_SIZE 1024 - -static binding_ent_t *binding_table[BINDING_TABLE_SIZE]; - -#define PORT_WILD(_ent) ((_ent)->port == PORT_WILDCARD) -#define TYPE_WILD(_ent) ((_ent)->type == TYPE_WILDCARD) -#define FULLY_WILD(_ent) (PORT_WILD(_ent) && TYPE_WILD(_ent)) - -#define BINDING_HASH(_key) \ - ((((_key)->port * 11) ^ (_key)->type) % BINDING_TABLE_SIZE) - - -void init_bindings(void) -{ - memset(binding_table, 0, sizeof(binding_table)); -} - -static int table_add(binding_ent_t *table[], - connection_t *con, - binding_key_t *key) -{ - binding_ent_t **curs, *ent; - - curs = &table[BINDING_HASH(key)]; - - while (*curs != NULL) { - if ((*curs)->con == con) { - DPRINTF("Tried to add an ent that already existed.\n"); - goto done; - } - curs = &(*curs)->next; - } - - if (connection_add_binding(con, key) != 0) - { - DPRINTF("couldn't add binding on connection (%lu)\n", con->id); - goto fail; - } - ent = (binding_ent_t *)malloc(sizeof(binding_ent_t)); - if (ent == 0) { - DPRINTF("couldn't alloc binding ent!\n"); - goto fail; - } - ent->con = con; - ent->next = NULL; - *curs = ent; - -done: - return 0; - -fail: - return -1; -} - - -static inline int binding_has_colliding_hashes(connection_t *con, - binding_key_t *key) -{ - int hash, count = 0; - binding_key_ent_t *ent; - - ent = con->bindings; - hash = BINDING_HASH(key); - - while (ent != NULL) { - if (BINDING_HASH(&ent->key) == hash) count ++; - ent = ent->next; - } - - return (count > 1); -} -static int table_remove(binding_ent_t *table[], - connection_t *con, - binding_key_t *key) -{ - binding_ent_t **curs, *ent; - - if (!binding_has_colliding_hashes(con, key)) - { - - curs = &table[BINDING_HASH(key)]; - - while ((*curs != NULL) && ((*curs)->con != con)) - curs = &(*curs)->next; - - if (*curs != NULL) { - ent = *curs; - *curs = (*curs)->next; - free(ent); - } - } - - connection_remove_binding(con, key); - - return 0; -} - -int xcs_bind(connection_t *con, int port, u16 type) -{ - binding_key_t key; - - key.port = port; - key.type = type; - - return table_add(binding_table, con, &key); -} - -int xcs_unbind(connection_t *con, int port, u16 type) -{ - binding_key_t key; - - key.port = port; - key.type = type; - - return table_remove(binding_table, con, &key); -} - - -static void for_each_binding(binding_ent_t *list, binding_key_t *key, - void (*f)(connection_t *, void *), void *arg) -{ - while (list != NULL) - { - if (connection_has_binding(list->con, key)) - f(list->con, arg); - list = list->next; - } -} - -void xcs_lookup(int port, u16 type, void (*f)(connection_t *, void *), - void *arg) -{ - binding_key_t key; - - key.port = port; key.type = type; - for_each_binding(binding_table[BINDING_HASH(&key)], &key, f, arg); - - key.port = port; key.type = TYPE_WILDCARD; - for_each_binding(binding_table[BINDING_HASH(&key)], &key, f, arg); - - key.port = PORT_WILDCARD; key.type = type; - for_each_binding(binding_table[BINDING_HASH(&key)], &key, f, arg); - - key.port = PORT_WILDCARD; key.type = TYPE_WILDCARD; - for_each_binding(binding_table[BINDING_HASH(&key)], &key, f, arg); -} diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/connection.c --- a/tools/xcs/connection.c Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,157 +0,0 @@ -/* - * connection.c - * - * State associated with a client connection to xcs. - * - * Copyright (c) 2004, Andrew Warfield - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "xcs.h" - -connection_t *connection_list = NULL; - -#define CONNECTED(_c) (((_c)->ctrl_fd != -1) || ((_c)->data_fd != -1)) - -connection_t *get_con_by_session(unsigned long session_id) -{ - connection_t **c, *ent = NULL; - - c = &connection_list; - - DPRINTF("looking for id: %lu : %lu\n", session_id, (*c)->id); - - while (*c != NULL) - { - if ((*c)->id == session_id) - return (*c); - c = &(*c)->next; - } - - return ent; -} - -connection_t *connection_new() -{ - connection_t *con; - - con = (connection_t *)malloc(sizeof(connection_t)); - if (con == NULL) - { - DPRINTF("couldn't allocate a new connection\n"); - return NULL; - } - - con->bindings = NULL; - con->data_fd = -1; - con->ctrl_fd = -1; - - /* connections need a unique session id. - * - this approach probably gets fixed later, but for the moment - * is unique, and clearly identifies a connection. - */ - con->id = (unsigned long)con; - - /* add it to the connection list */ - con->next = connection_list; - connection_list = con; - - return (con); -} - -void connection_free(connection_t *con) -{ - /* first free all subscribed bindings: */ - - while (con->bindings != NULL) - xcs_unbind(con, con->bindings->key.port, con->bindings->key.type); - - /* now free the connection. */ - free(con); -} - -int connection_add_binding(connection_t *con, binding_key_t *key) -{ - binding_key_ent_t *key_ent; - - key_ent = (binding_key_ent_t *)malloc(sizeof(binding_key_ent_t)); - if (key_ent == NULL) - { - DPRINTF("couldn't alloc key in connection_add_binding\n"); - return -1; - } - - key_ent->key = *key; - key_ent->next = con->bindings; - con->bindings = key_ent; - - return 0; -} - -int connection_remove_binding(connection_t *con, binding_key_t *key) -{ - binding_key_ent_t *key_ent; - binding_key_ent_t **curs = &con->bindings; - - while ((*curs != NULL) && (!BINDING_KEYS_EQUAL(&(*curs)->key, key))) - curs = &(*curs)->next; - - if (*curs != NULL) { - key_ent = *curs; - *curs = (*curs)->next; - free(key_ent); - } - - return 0; -} - - -int connection_has_binding(connection_t *con, binding_key_t *key) -{ - binding_key_ent_t *ent; - int ret = 0; - - ent = con->bindings; - - while (ent != NULL) - { - if (BINDING_KEYS_EQUAL(key, &ent->key)) - { - ret = 1; - break; - } - ent = ent->next; - } - - return ret; -} - - -void gc_connection_list(void) -{ - connection_t **c, *ent = NULL; - struct timeval now, delta; - - c = &connection_list; - gettimeofday(&now, NULL); - - while ( *c != NULL ) - { - if ( !CONNECTED(*c) ) - { - timersub(&now, &(*c)->disconnect_time, &delta); - if ( delta.tv_sec >= XCS_SESSION_TIMEOUT ) - { - DPRINTF(" : Freeing connection %lu after %lds\n", - (*c)->id, delta.tv_sec); - ent = *c; - *c = (*c)->next; - connection_free(ent); - continue; - } - } - c = &(*c)->next; - } -} diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/ctrl_interface.c --- a/tools/xcs/ctrl_interface.c Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,258 +0,0 @@ -/* control_interface.c - * - * Interfaces to control message rings to VMs. - * - * Most of this is directly based on the original xu interface to python - * written by Keir Fraser. - * - * (c) 2004, Andrew Warfield - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/ioctl.h> -#include <sys/mman.h> -#include <errno.h> -#include "xcs.h" - -static int xc_handle = -1; - -/* Called at start-of-day when using the control channel interface. */ -int ctrl_chan_init(void) -{ - if ( (xc_handle = xc_interface_open()) == -1 ) - { - DPRINTF("Could not open Xen control interface"); - return -1; - } - - return 0; -} - -static control_if_t *map_control_interface(int fd, unsigned long pfn, - u32 dom) -{ - char *vaddr = xc_map_foreign_range( fd, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, pfn ); - if ( vaddr == NULL ) - return NULL; - return (control_if_t *)(vaddr + 2048); -} - -static void unmap_control_interface(int fd, control_if_t *c) -{ - char *vaddr = (char *)c - 2048; - (void)munmap(vaddr, PAGE_SIZE); -} - -int ctrl_chan_notify(control_channel_t *cc) -{ - return xc_evtchn_send(xc_handle, cc->local_port); -} - -int ctrl_chan_read_request(control_channel_t *cc, xcs_control_msg_t *dmsg) -{ - control_msg_t *smsg; - RING_IDX c = cc->tx_ring.req_cons; - - if ( !RING_HAS_UNCONSUMED_REQUESTS(&cc->tx_ring) ) - { - DPRINTF("no request to read\n"); - return -1; - } - - rmb(); /* make sure we see the data associated with the request */ - smsg = RING_GET_REQUEST(&cc->tx_ring, c); - memcpy(&dmsg->msg, smsg, sizeof(*smsg)); - if ( dmsg->msg.length > sizeof(dmsg->msg.msg) ) - dmsg->msg.length = sizeof(dmsg->msg.msg); - cc->tx_ring.req_cons++; - return 0; -} - -int ctrl_chan_write_request(control_channel_t *cc, - xcs_control_msg_t *smsg) -{ - control_msg_t *dmsg; - RING_IDX p = cc->rx_ring.req_prod_pvt; - - if ( RING_FULL(&cc->rx_ring) ) - { - DPRINTF("no space to write request"); - return -ENOSPC; - } - - dmsg = RING_GET_REQUEST(&cc->rx_ring, p); - memcpy(dmsg, &smsg->msg, sizeof(*dmsg)); - - wmb(); - cc->rx_ring.req_prod_pvt++; - RING_PUSH_REQUESTS(&cc->rx_ring); - - return 0; -} - -int ctrl_chan_read_response(control_channel_t *cc, xcs_control_msg_t *dmsg) -{ - control_msg_t *smsg; - RING_IDX c = cc->rx_ring.rsp_cons; - - if ( !RING_HAS_UNCONSUMED_RESPONSES(&cc->rx_ring) ) - { - DPRINTF("no response to read"); - return -1; - } - - rmb(); /* make sure we see the data associated with the request */ - smsg = RING_GET_RESPONSE(&cc->rx_ring, c); - memcpy(&dmsg->msg, smsg, sizeof(*smsg)); - if ( dmsg->msg.length > sizeof(dmsg->msg.msg) ) - dmsg->msg.length = sizeof(dmsg->msg.msg); - cc->rx_ring.rsp_cons++; - return 0; -} - -int ctrl_chan_write_response(control_channel_t *cc, - xcs_control_msg_t *smsg) -{ - control_msg_t *dmsg; - RING_IDX p = cc->tx_ring.rsp_prod_pvt; - - /* akw: if the ring is synchronous, you should never need this test! */ - /* (but it was in the original code... ) */ - if ( cc->tx_ring.req_cons == cc->tx_ring.rsp_prod_pvt ) - { - DPRINTF("no space to write response"); - return -ENOSPC; - } - - dmsg = RING_GET_RESPONSE(&cc->tx_ring, p); - memcpy(dmsg, &smsg->msg, sizeof(*dmsg)); - - wmb(); - cc->tx_ring.rsp_prod_pvt++; - RING_PUSH_RESPONSES(&cc->tx_ring); - - return 0; -} - -int ctrl_chan_request_to_read(control_channel_t *cc) -{ - return (RING_HAS_UNCONSUMED_REQUESTS(&cc->tx_ring)); -} - -int ctrl_chan_space_to_write_request(control_channel_t *cc) -{ - return (!(RING_FULL(&cc->rx_ring))); -} - -int ctrl_chan_response_to_read(control_channel_t *cc) -{ - return (RING_HAS_UNCONSUMED_RESPONSES(&cc->rx_ring)); -} - -int ctrl_chan_space_to_write_response(control_channel_t *cc) -{ - /* again, there is something fishy here. */ - return ( cc->tx_ring.req_cons != cc->tx_ring.rsp_prod_pvt ); -} - -int ctrl_chan_connect(control_channel_t *cc) -{ - xc_dominfo_t info; - - if ( cc->connected ) - { - return 0; - } - - if ( (xc_domain_getinfo(xc_handle, cc->remote_dom, 1, &info) != 1) || - (info.domid != cc->remote_dom) ) - { - DPRINTF("Failed to obtain domain status"); - return -1; - } - - cc->interface = - map_control_interface(xc_handle, info.shared_info_frame, - cc->remote_dom); - - if ( cc->interface == NULL ) - { - DPRINTF("Failed to map domain control interface"); - return -1; - } - - /* Synchronise ring indexes. */ - BACK_RING_ATTACH(&cc->tx_ring, &cc->interface->tx_ring, CONTROL_RING_MEM); - FRONT_RING_ATTACH(&cc->rx_ring, &cc->interface->rx_ring, CONTROL_RING_MEM); - - cc->connected = 1; - - return 0; -} - -void ctrl_chan_disconnect(control_channel_t *cc) -{ - if ( cc->connected ) - unmap_control_interface(xc_handle, cc->interface); - cc->connected = 0; -} - - -control_channel_t *ctrl_chan_new(u32 dom, int local_port, int remote_port) -{ - control_channel_t *cc; - - cc = (control_channel_t *)malloc(sizeof(control_channel_t)); - if ( cc == NULL ) return NULL; - - cc->connected = 0; - cc->remote_dom = dom; - - if ( dom == 0 ) - { - goto fail; - } - else if ( xc_evtchn_bind_interdomain(xc_handle, - DOMID_SELF, dom, - &local_port, &remote_port) != 0 ) - { - DPRINTF("Could not open channel to domain"); - goto fail; - } - - cc->local_port = local_port; - cc->remote_port = remote_port; - - if ( ctrl_chan_connect(cc) != 0 ) - goto fail; - - return cc; - - fail: - if ( dom != 0 ) - (void)xc_evtchn_close(xc_handle, DOMID_SELF, local_port); - - free(cc); - - return NULL; -} - -void ctrl_chan_free(control_channel_t *cc) -{ - ctrl_chan_disconnect(cc); - if ( cc->remote_dom != 0 ) - (void)xc_evtchn_close(xc_handle, DOMID_SELF, cc->local_port); - free(cc); -} - - -/* other libxc commands: */ - -int ctrl_chan_bind_virq(int virq, int *port) -{ - return xc_evtchn_bind_virq(xc_handle, virq, port); -} diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/dump.c --- a/tools/xcs/dump.c Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,506 +0,0 @@ -/*\ - * 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, pdevice, "%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_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"); - debug_end("BLKIF_FE", "INTERFACE_STATUS"); - } else if (msg->subtype == CMSG_BLKIF_FE_DRIVER_STATUS) { - blkif_fe_driver_status_t *load; - load = (blkif_fe_driver_status_t *)msg->msg; - debug_begin("BLKIF_FE", "DRIVER_STATUS"); - debug_field(load, status, "%u"); - debug_field(load, max_handle, "%u"); - debug_end("BLKIF_FE", "DRIVER_STATUS"); - } else if (msg->subtype == CMSG_BLKIF_FE_INTERFACE_CONNECT) { - blkif_fe_interface_connect_t *load; - load = (blkif_fe_interface_connect_t *)msg->msg; - debug_begin("BLKIF_FE", "INTERFACE_CONNECT"); - debug_field(load, handle, "%u"); - debug_field(load, shmem_frame, "%lu"); - debug_end("BLKIF_FE", "INTERFACE_CONNECT"); - } else if (msg->subtype == CMSG_BLKIF_FE_INTERFACE_DISCONNECT) { - blkif_fe_interface_disconnect_t *load; - load = (blkif_fe_interface_disconnect_t *)msg->msg; - debug_begin("BLKIF_FE", "INTERFACE_DISCONNECT"); - debug_field(load, handle, "%u"); - debug_end("BLKIF_FE", "INTERFACE_DISCONNECT"); - } else if (msg->subtype == CMSG_BLKIF_FE_INTERFACE_QUERY) { - blkif_fe_interface_query_t *load; - load = (blkif_fe_interface_query_t *)msg->msg; - debug_begin("BLKIF_FE", "INTERFACE_QUERY"); - debug_field(load, handle, "%u"); - debug_field(load, status, "%u"); - debug_field(load, evtchn, "%u"); - debug_field(load, domid, "%u"); - debug_end("BLKIF_FE", "INTERFACE_QUERY"); - } else { - debug_begin("BLKIF_FE", "UNKNOWN"); - debug_field(msg, subtype, "%u"); - debug_field(msg, length, "%u"); - debug_dump(msg, msg, length); - debug_end("BLKIF_FE", "UNKNOWN"); - } - break; - case CMSG_NETIF_BE: - if (msg->subtype == CMSG_NETIF_BE_CREATE) { - netif_be_create_t *load; - load = (netif_be_create_t *)msg->msg; - debug_begin("NETIF_BE", "CREATE"); - debug_field(load, domid, "%u"); - debug_field(load, netif_handle, "%u"); - debug_field_mac(load, mac); - debug_field_mac(load, be_mac); - debug_field(load, status, "%u"); - debug_end("NETIF_BE", "CREATE"); - } else if (msg->subtype == CMSG_NETIF_BE_DESTROY) { - netif_be_destroy_t *load; - load = (netif_be_destroy_t *)msg->msg; - debug_begin("NETIF_BE", "DESTROY"); - debug_field(load, domid, "%u"); - debug_field(load, netif_handle, "%u"); - debug_field(load, status, "%u"); - debug_end("NETIF_BE", "DESTROY"); - } else if (msg->subtype == CMSG_NETIF_BE_CONNECT) { - netif_be_connect_t *load; - load = (netif_be_connect_t *)msg->msg; - debug_begin("NETIF_BE", "CONNECT"); - debug_field(load, domid, "%u"); - debug_field(load, netif_handle, "%u"); - debug_field(load, tx_shmem_frame, "%lu"); - debug_field(load, rx_shmem_frame, "%lu"); - debug_field(load, evtchn, "%u"); - debug_field(load, status, "%u"); - debug_end("NETIF_BE", "CONNECT"); - } else if (msg->subtype == CMSG_NETIF_BE_DISCONNECT) { - netif_be_disconnect_t *load; - load = (netif_be_disconnect_t *)msg->msg; - debug_begin("NETIF_BE", "DISCONNECT"); - debug_field(load, domid, "%u"); - debug_field(load, netif_handle, "%u"); - debug_field(load, status, "%u"); - debug_end("NETIF_BE", "DISCONNECT"); - } else if (msg->subtype == CMSG_NETIF_BE_DRIVER_STATUS) { - netif_be_driver_status_t *load; - load = (netif_be_driver_status_t *)msg->msg; - debug_begin("NETIF_BE", "DRIVER_STATUS"); - debug_field(load, status, "%u"); - debug_end("NETIF_BE", "DRIVER_STATUS"); - } else { - debug_begin("NETIF_BE", "UNKNOWN"); - debug_field(msg, subtype, "%u"); - debug_field(msg, length, "%u"); - debug_dump(msg, msg, length); - debug_end("NETIF_BE", "UNKNOWN"); - } - break; - case CMSG_NETIF_FE: - if (msg->subtype == CMSG_NETIF_FE_INTERFACE_STATUS) { - netif_fe_interface_status_t *load; - load = (netif_fe_interface_status_t *)msg->msg; - debug_begin("NETIF_FE", "INTERFACE_STATUS"); - debug_field(load, handle, "%u"); - debug_field(load, status, "%u"); - debug_field(load, evtchn, "%u"); - debug_field_mac(load, mac); - debug_field(load, domid, "%u"); - debug_end("NETIF_FE", "INTERFACE_STATUS"); - } else if (msg->subtype == CMSG_NETIF_FE_DRIVER_STATUS) { - netif_fe_driver_status_t *load; - load = (netif_fe_driver_status_t *)msg->msg; - debug_begin("NETIF_FE", "DRIVER_STATUS"); - debug_field(load, status, "%u"); - debug_field(load, max_handle, "%u"); - debug_end("NETIF_FE", "DRIVER_STATUS"); - } else if (msg->subtype == CMSG_NETIF_FE_INTERFACE_CONNECT) { - netif_fe_interface_connect_t *load; - load = (netif_fe_interface_connect_t *)msg->msg; - debug_begin("NETIF_FE", "INTERFACE_CONNECT"); - debug_field(load, handle, "%u"); - debug_field(load, tx_shmem_frame, "%lu"); - debug_field(load, rx_shmem_frame, "%lu"); - debug_end("NETIF_FE", "INTERFACE_CONNECT"); - } else if (msg->subtype == CMSG_NETIF_FE_INTERFACE_DISCONNECT) { - netif_fe_interface_disconnect_t *load; - load = (netif_fe_interface_disconnect_t *)msg->msg; - debug_begin("NETIF_FE", "INTERFACE_DISCONNECT"); - debug_field(load, handle, "%u"); - debug_end("NETIF_FE", "INTERFACE_DISCONNECT"); - } else if (msg->subtype == CMSG_NETIF_FE_INTERFACE_QUERY) { - netif_fe_interface_query_t *load; - load = (netif_fe_interface_query_t *)msg->msg; - debug_begin("NETIF_FE", "INTERFACE_QUERY"); - debug_field(load, handle, "%u"); - debug_field(load, status, "%u"); - debug_field(load, evtchn, "%u"); - debug_field_mac(load, mac); - debug_field(load, domid, "%u"); - debug_end("NETIF_FE", "INTERFACE_QUERY"); - } else { - debug_begin("NETIF_FE", "UNKNOWN"); - debug_field(msg, subtype, "%u"); - debug_field(msg, length, "%u"); - debug_dump(msg, msg, length); - debug_end("NETIF_FE", "UNKNOWN"); - } - break; - case CMSG_SHUTDOWN: - if (msg->subtype == CMSG_SHUTDOWN_POWEROFF) { - debug_begin("SHUTDOWN", "POWEROFF"); - debug_end("SHUTDOWN", "POWEROFF"); - } else if (msg->subtype == CMSG_SHUTDOWN_REBOOT) { - debug_begin("SHUTDOWN", "REBOOT"); - debug_end("SHUTDOWN", "REBOOT"); - } else if (msg->subtype == CMSG_SHUTDOWN_SUSPEND) { - debug_begin("SHUTDOWN", "SUSPEND"); - debug_end("SHUTDOWN", "SUSPEND"); - } else if (msg->subtype == CMSG_SHUTDOWN_SYSRQ) { - debug_begin("SHUTDOWN", "SYSRQ"); - debug_end("SHUTDOWN", "SYSRQ"); - } else { - debug_begin("SHUTDOWN", "UNKNOWN"); - debug_field(msg, subtype, "%u"); - debug_field(msg, length, "%u"); - debug_dump(msg, msg, length); - debug_end("SHUTDOWN", "UNKNOWN"); - } - break; - case CMSG_MEM_REQUEST: - if (msg->subtype == CMSG_MEM_REQUEST_SET) { - mem_request_t *load; - load = (mem_request_t *)msg->msg; - debug_begin("MEM_REQUEST", "SET"); - debug_field(load, target, "%u"); - debug_field(load, status, "%u"); - debug_end("MEM_REQUEST", "SET"); - } else { - debug_begin("MEM_REQUEST", "UNKNOWN"); - debug_field(msg, subtype, "%u"); - debug_field(msg, length, "%u"); - debug_dump(msg, msg, length); - debug_end("MEM_REQUEST", "UNKNOWN"); - } - break; - case CMSG_USBIF_BE: - if (msg->subtype == CMSG_USBIF_BE_CREATE) { - usbif_be_create_t *load; - load = (usbif_be_create_t *)msg->msg; - debug_begin("USBIF_BE", "CREATE"); - debug_field(load, domid, "%u"); - debug_field(load, status, "%u"); - debug_end("USBIF_BE", "CREATE"); - } else if (msg->subtype == CMSG_USBIF_BE_DESTROY) { - usbif_be_destroy_t *load; - load = (usbif_be_destroy_t *)msg->msg; - debug_begin("USBIF_BE", "DESTROY"); - debug_field(load, domid, "%u"); - debug_field(load, status, "%u"); - debug_end("USBIF_BE", "DESTROY"); - } else if (msg->subtype == CMSG_USBIF_BE_CONNECT) { - usbif_be_connect_t *load; - load = (usbif_be_connect_t *)msg->msg; - debug_begin("USBIF_BE", "CONNECT"); - debug_field(load, domid, "%u"); - debug_field(load, shmem_frame, "%lu"); - debug_field(load, evtchn, "%u"); - debug_field(load, bandwidth, "%u"); - debug_field(load, status, "%u"); - debug_end("USBIF_BE", "CONNECT"); - } else if (msg->subtype == CMSG_USBIF_BE_DISCONNECT) { - usbif_be_disconnect_t *load; - load = (usbif_be_disconnect_t *)msg->msg; - debug_begin("USBIF_BE", "DISCONNECT"); - debug_field(load, domid, "%u"); - debug_field(load, status, "%u"); - debug_end("USBIF_BE", "DISCONNECT"); - } else if (msg->subtype == CMSG_USBIF_BE_CLAIM_PORT) { - usbif_be_claim_port_t *load; - load = (usbif_be_claim_port_t *)msg->msg; - debug_begin("USBIF_BE", "CLAIM_PORT"); - debug_field(load, domid, "%u"); - debug_field(load, usbif_port, "%u"); - debug_field(load, status, "%u"); - debug_field(load, path, "%s"); - debug_end("USBIF_BE", "CLAIM_PORT"); - } else if (msg->subtype == CMSG_USBIF_BE_RELEASE_PORT) { - usbif_be_release_port_t *load; - load = (usbif_be_release_port_t *)msg->msg; - debug_begin("USBIF_BE", "RELEASE_PORT"); - debug_field(load, path, "%s"); - debug_end("USBIF_BE", "RELEASE_PORT"); - } else if (msg->subtype == CMSG_USBIF_BE_DRIVER_STATUS_CHANGED) { - usbif_be_driver_status_changed_t *load; - load = (usbif_be_driver_status_changed_t *)msg->msg; - debug_begin("USBIF_BE", "DRIVER_STATUS_CHANGED"); - debug_field(load, status, "%u"); - debug_end("USBIF_BE", "DRIVER_STATUS_CHANGED"); - } else { - debug_begin("USBIF_BE", "UNKNOWN"); - debug_field(msg, subtype, "%u"); - debug_field(msg, length, "%u"); - debug_dump(msg, msg, length); - debug_end("USBIF_BE", "UNKNOWN"); - } - break; - case CMSG_USBIF_FE: - if (msg->subtype == CMSG_USBIF_FE_INTERFACE_STATUS_CHANGED) { - usbif_fe_interface_status_changed_t *load; - load = (usbif_fe_interface_status_changed_t *)msg->msg; - debug_begin("USBIF_FE", "INTERFACE_STATUS_CHANGED"); - debug_field(load, status, "%u"); - debug_field(load, evtchn, "%u"); - debug_field(load, domid, "%u"); - debug_field(load, bandwidth, "%u"); - debug_field(load, num_ports, "%u"); - debug_end("USBIF_FE", "INTERFACE_STATUS_CHANGED"); - } else if (msg->subtype == CMSG_USBIF_FE_DRIVER_STATUS_CHANGED) { - usbif_fe_driver_status_changed_t *load; - load = (usbif_fe_driver_status_changed_t *)msg->msg; - debug_begin("USBIF_FE", "DRIVER_STATUS_CHANGED"); - debug_field(load, status, "%u"); - debug_end("USBIF_FE", "DRIVER_STATUS_CHANGED"); - } else if (msg->subtype == CMSG_USBIF_FE_INTERFACE_CONNECT) { - usbif_fe_interface_connect_t *load; - load = (usbif_fe_interface_connect_t *)msg->msg; - debug_begin("USBIF_FE", "INTERFACE_CONNECT"); - debug_field(load, shmem_frame, "%lu"); - debug_end("USBIF_FE", "INTERFACE_CONNECT"); - } else if (msg->subtype == CMSG_USBIF_FE_INTERFACE_DISCONNECT) { - debug_begin("USBIF_FE", "INTERFACE_DISCONNECT"); - debug_end("USBIF_FE", "INTERFACE_DISCONNECT"); - } else { - debug_begin("USBIF_FE", "UNKNOWN"); - debug_field(msg, subtype, "%u"); - debug_field(msg, length, "%u"); - debug_dump(msg, msg, length); - debug_end("USBIF_FE", "UNKNOWN"); - } - break; - default: - debug_begin("UNKNOWN", "UNKNOWN"); - debug_field(msg, type, "%u"); - debug_field(msg, subtype, "%u"); - debug_field(msg, length, "%u"); - debug_dump(msg, msg, length); - debug_end("UNKNOWN", "UNKNOWN"); - break; - } -} - -void _error(const char *fmt, ...) -{ - va_list ap; - char buffer[4096]; - - va_start(ap, fmt); - vsnprintf(buffer, sizeof(buffer), fmt, ap); - va_end(ap); - - fprintf(stderr, "%s\n", buffer); -} - diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/dump.h --- a/tools/xcs/dump.h Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,28 +0,0 @@ -/*\ - * 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 -\*/ - -#ifndef XENCTLD_ERROR_H -#define XENCTLD_ERROR_H - -#include <stdint.h> -#include <xenctrl.h> -#include <xen/io/domain_controller.h> - -void dump_msg(const control_msg_t *msg, uint64_t flags); - -#endif diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/evtchn.c --- a/tools/xcs/evtchn.c Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,106 +0,0 @@ -/* evtchn.c - * - * Interfaces to event channel driver. - * - * Most of this is directly based on the original xu interface to python - * written by Keir Fraser. - * - * (c) 2004, Andrew Warfield - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <sys/ioctl.h> -#include <sys/stat.h> -#include <sys/sysmacros.h> /* XOPEN drops makedev, this gets it back. */ -#include <fcntl.h> -#include <unistd.h> -#include <errno.h> -#include "xcs.h" - -static int evtchn_fd = -1; - -/* NB. The following should be kept in sync with the kernel's evtchn driver. */ -#define EVTCHN_DEV_NAME "/dev/xen/evtchn" -#define EVTCHN_DEV_MAJOR 10 -#define EVTCHN_DEV_MINOR 201 -/* /dev/xen/evtchn ioctls: */ -/* EVTCHN_RESET: Clear and reinit the event buffer. Clear error condition. */ -#define EVTCHN_RESET _IO('E', 1) -/* EVTCHN_BIND: Bind to teh specified event-channel port. */ -#define EVTCHN_BIND _IO('E', 2) -/* EVTCHN_UNBIND: Unbind from the specified event-channel port. */ -#define EVTCHN_UNBIND _IO('E', 3) - -int evtchn_read() -{ - u16 v; - int bytes; - - while ( (bytes = read(evtchn_fd, &v, sizeof(v))) == -1 ) - { - if ( errno == EINTR ) - continue; - /* EAGAIN was cased to return 'None' in the python version... */ - return -errno; - } - - if ( bytes == sizeof(v) ) - return v; - - /* bad return */ - return -1; -} - -void evtchn_unmask(u16 idx) -{ - (void)write(evtchn_fd, &idx, sizeof(idx)); -} - -int evtchn_bind(int idx) -{ - if ( ioctl(evtchn_fd, EVTCHN_BIND, idx) != 0 ) - return -errno; - - return 0; -} - -int evtchn_unbind(int idx) -{ - if ( ioctl(evtchn_fd, EVTCHN_UNBIND, idx) != 0 ) - return -errno; - - return 0; -} - -int evtchn_open(void) -{ - struct stat st; - - /* Make sure any existing device file links to correct device. */ - if ( (lstat(EVTCHN_DEV_NAME, &st) != 0) || - !S_ISCHR(st.st_mode) || - (st.st_rdev != makedev(EVTCHN_DEV_MAJOR, EVTCHN_DEV_MINOR)) ) - (void)unlink(EVTCHN_DEV_NAME); - - reopen: - evtchn_fd = open(EVTCHN_DEV_NAME, O_NONBLOCK|O_RDWR); - if ( evtchn_fd == -1 ) - { - if ( (errno == ENOENT) && - ((mkdir("/dev/xen", 0755) == 0) || (errno == EEXIST)) && - (mknod(EVTCHN_DEV_NAME, S_IFCHR|0600, - makedev(EVTCHN_DEV_MAJOR,EVTCHN_DEV_MINOR)) == 0) ) - goto reopen; - return -errno; - } - return evtchn_fd; -} - -void evtchn_close() -{ - (void)close(evtchn_fd); - evtchn_fd = -1; -} - diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/xcs.c --- a/tools/xcs/xcs.c Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,973 +0,0 @@ -/* xcs.c - * - * xcs - Xen Control Switch - * - * Copyright (c) 2004, Andrew Warfield - */ - -/* - - Things we need to select on in xcs: - - 1. Events arriving on /dev/evtchn - - These will kick a function to read everything off the fd, and scan the - associated control message rings, resulting in notifications sent on - data channels to connected clients. - - 2. New TCP connections on XCS_PORT. - - These will either be control (intially) or associated data connections. - - Control connections will instantiate or rebind to an existing connnection - struct. The control channel is used to configure what events will be - received on an associated data channel. These two channels are split - out because the control channel is synchronous, all messages will return - a result from XCS. The data channel is effectively asynchronous, events - may arrive in the middle of a control message exchange. Additionally, - Having two TCP connections allows the client side to have a blocking - listen loop for data messages, while independently interacting on the - control channel at other places in the code. - - Data connections attach to an existing control struct, using a session - id that is passed during the control connect. There is currently a - one-to-one relationship between data and control channels, but there - could just as easily be many data channels, if there were a set of - clients with identical interests, or if you wanted to trace an existing - client's data traffic. - - 3. Messages arriving on open TCP connections. - There are three types of open connections: - - 3a. Messages arriving on open control channel file descriptors. - - [description of the control protocol here] - - 3b. Messages arriving on open data channel file descriptors. - - [description of the data protocol here] - - 3c. Messages arriving on (new) unbound connections. - - A connection must issue a XCS_CONNECT message to specify what - it is, after which the connection is moved into one of the above - two groups. - - Additionally, we need a periodic timer to do housekeeping. - - 4. Every XCS_GC_INTERVAL seconds, we need to clean up outstanding state. - Specifically, we garbage collect any sessions (connection_t structs) - that have been unconnected for a period of time (XCS_SESSION_TIMEOUT), - and close any connections that have been openned, but not connected - as a control or data connection (XCS_UFD_TIMEOUT). - -*/ - -#include <stdlib.h> -#include <stdio.h> -#include <unistd.h> -#include <sys/time.h> -#include <sys/types.h> -#include <string.h> -#include <signal.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <errno.h> -#include <malloc.h> -#include <fcntl.h> -#include <ctype.h> -#include "xcs.h" - -#undef fd_max -#define fd_max(x,y) ((x) > (y) ? (x) : (y)) - -/* ------[ Control channel interfaces ]------------------------------------*/ - -static control_channel_t *cc_list[NR_EVENT_CHANNELS]; -static int *dom_port_map = 0; -static int dom_port_map_size = 0; - -static void map_dom_to_port(u32 dom, int port) -{ - if (dom >= dom_port_map_size) { - dom_port_map = (int *)realloc(dom_port_map, - (dom + 256) * sizeof(dom_port_map[0])); - - if (dom_port_map == NULL) { - perror("realloc(dom_port_map)"); - exit(1); - } - - for (; dom_port_map_size < dom + 256; dom_port_map_size++) { - dom_port_map[dom_port_map_size] = -1; - } - } - - dom_port_map[dom] = port; -} - -static int dom_to_port(u32 dom) -{ - if (dom >= dom_port_map_size) return -1; - - return dom_port_map[dom]; -} - -static void init_interfaces(void) -{ - memset(cc_list, 0, sizeof cc_list); -} - -static control_channel_t *add_interface(u32 dom, int local_port, - int remote_port) -{ - control_channel_t *cc=NULL, *oldcc; - int ret; - - if ((dom_to_port(dom) >= 0) && (cc_list[dom_to_port(dom)] != NULL)) - { - return(cc_list[dom_to_port(dom)]); - } - - if (cc_list[local_port] == NULL) - { - cc = ctrl_chan_new(dom, local_port, remote_port); - } - - if (cc == NULL) - return NULL; - - DPRINTF("added a new interface: dom: %u (l:%d,r:%d): %p\n", - dom, local_port, remote_port, cc); - DPRINTF("added a new interface: dom: %u (l:%d,r:%d): %p\n", - dom, cc->local_port, cc->remote_port, cc); - - if ((ret = evtchn_bind(cc->local_port)) != 0) - { - DPRINTF("Got control interface, but couldn't bind evtchan!(%d)\n", ret); - ctrl_chan_free(cc); - return NULL; - } - - if ( cc_list[cc->local_port] != NULL ) - { - oldcc = cc_list[cc->local_port]; - - if ((oldcc->remote_dom != cc->remote_dom) || - (oldcc->remote_port != cc->remote_port)) - { - DPRINTF("CC conflict! (port: %d, old dom: %u, new dom: %u, " - "old ref_count: %d)\n", - cc->local_port, oldcc->remote_dom, cc->remote_dom, - oldcc->ref_count); - map_dom_to_port(oldcc->remote_dom, -1); - ctrl_chan_free(cc_list[cc->local_port]); - cc_list[cc->local_port] = NULL; - } - } - - cc_list[cc->local_port] = cc; - map_dom_to_port(cc->remote_dom, cc->local_port); - cc->type = CC_TYPE_INTERDOMAIN; - cc->ref_count = 0; - return cc; -} - -control_channel_t *add_virq(int virq) -{ - control_channel_t *cc; - int virq_port; - - if (ctrl_chan_bind_virq(virq, &virq_port) == -1) - return NULL; - - if ((cc_list[virq_port] != NULL) && - (cc_list[virq_port]->type != CC_TYPE_VIRQ)) - return NULL; - - if ((cc_list[virq_port] != NULL) && - (cc_list[virq_port]->type == CC_TYPE_VIRQ)) - return cc_list[virq_port]; - - cc = (control_channel_t *)malloc(sizeof(control_channel_t)); - if ( cc == NULL ) return NULL; - - memset(cc, 0, sizeof(control_channel_t)); - cc->type = CC_TYPE_VIRQ; - cc->local_port = virq_port; - cc->virq = virq; - cc->ref_count = 1; - - if (evtchn_bind(cc->local_port) != 0) - { - DPRINTF("Got control interface, but couldn't bind evtchan!\n"); - free(cc); - return NULL; - } - - cc_list[cc->local_port] = cc; - - return cc; -} - -void get_interface(control_channel_t *cc) -{ - if (cc != NULL) - cc->ref_count++; -} - -void put_interface(control_channel_t *cc) -{ - if (cc != NULL) - { - cc->ref_count--; - if (cc->ref_count <= 0) - { - DPRINTF("Freeing cc on port %d.\n", cc->local_port); - (void)evtchn_unbind(cc->local_port); - cc_list[cc->local_port] = NULL; - map_dom_to_port(cc->remote_dom, -1); - ctrl_chan_free(cc); - } - } -} - -/* ------[ Simple helpers ]------------------------------------------------*/ - -/* listen_socket() is straight from paul sheer's useful select_tut manpage. */ -static int listen_socket (char *listen_path) -{ - struct sockaddr_un a; - int s; - int yes; - - if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) - { - perror ("socket"); - return -1; - } - - yes = 1; - - memset (&a, 0, sizeof (a)); - a.sun_family = AF_UNIX; - strcpy(a.sun_path, listen_path); - - /* remove an old socket if it exists. */ - unlink(listen_path); - - if (bind(s, (struct sockaddr *) &a, sizeof (a)) < 0) - { - fprintf (stderr, "bind('%s'): %s\n", listen_path, strerror(errno)); - close (s); - return -1; - } - DPRINTF ("accepting connections on path %s\n", listen_path); - listen (s, 10); - return s; -} - -/* ------[ Message handlers ]----------------------------------------------*/ - -#define NO_CHANGE 0 -#define CONNECTED 1 -#define DISCONNECTED 2 -int handle_connect_msg( xcs_msg_t *msg, int fd ) -{ - xcs_connect_msg_t *cmsg = &msg->u.connect; - connection_t *con; - int ret = NO_CHANGE; - - switch (msg->type) - { - case XCS_CONNECT_CTRL: - { - if ( cmsg->session_id == 0 ) - { - con = connection_new(); - if ( con == NULL) - { - msg->result = XCS_RSLT_FAILED; - break; - } - msg->result = XCS_RSLT_OK; - cmsg->session_id = con->id; - con->ctrl_fd = fd; - ret = CONNECTED; - DPRINTF("New control connection\n"); - break; - } - - con = get_con_by_session(cmsg->session_id); - if ( con == NULL ) - { - msg->result = XCS_RSLT_BADSESSION; - break; - } - if ( con->ctrl_fd != -1 ) - { - msg->result = XCS_RSLT_CONINUSE; - break; - } - con->ctrl_fd = fd; - msg->result = XCS_RSLT_OK; - ret = CONNECTED; - DPRINTF("Rebound to control connection\n"); - break; - } - case XCS_CONNECT_DATA: - { - con = get_con_by_session(cmsg->session_id); - if ( con == NULL ) - { - msg->result = XCS_RSLT_BADSESSION; - break; - } - if ( con->data_fd != -1 ) - { - msg->result = XCS_RSLT_CONINUSE; - break; - } - con->data_fd = fd; - msg->result = XCS_RSLT_OK; - ret = CONNECTED; - DPRINTF("Attached data connection\n"); - break; - - } - case XCS_CONNECT_BYE: - { - close ( fd ); - ret = DISCONNECTED; - break; - } - } - - return ret; -} - -int handle_control_message( connection_t *con, xcs_msg_t *msg ) -{ - int ret; - int reply_needed = 1; - - DPRINTF("Got message, type %u.\n", msg->type); - - switch (msg->type) - { - case XCS_MSG_BIND: - { - xcs_bind_msg_t *bmsg = &msg->u.bind; - - if ( ! BIND_MSG_VALID(bmsg) ) - { - msg->result = XCS_RSLT_BADREQUEST; - break; - } - - ret = xcs_bind(con, bmsg->port, bmsg->type); - if (ret == 0) { - msg->result = XCS_RSLT_OK; - } else { - msg->result = XCS_RSLT_FAILED; - } - break; - } - case XCS_MSG_UNBIND: - { - xcs_bind_msg_t *bmsg = &msg->u.bind; - - if ( ! BIND_MSG_VALID(bmsg) ) - { - msg->result = XCS_RSLT_BADREQUEST; - break; - } - - ret = xcs_unbind(con, bmsg->port, bmsg->type); - if (ret == 0) { - msg->result = XCS_RSLT_OK; - } else { - msg->result = XCS_RSLT_FAILED; - } - break; - } - case XCS_VIRQ_BIND: - { - control_channel_t *cc; - xcs_virq_msg_t *vmsg = &msg->u.virq; - if ( ! VIRQ_MSG_VALID(vmsg) ) - { - msg->result = XCS_RSLT_BADREQUEST; - break; - } - - cc = add_virq(vmsg->virq); - if (cc == NULL) - { - msg->result = XCS_RSLT_FAILED; - break; - } - ret = xcs_bind(con, cc->local_port, TYPE_VIRQ); - if (ret == 0) { - vmsg->port = cc->local_port; - msg->result = XCS_RSLT_OK; - } else { - msg->result = XCS_RSLT_FAILED; - } - break; - } - - case XCS_CIF_NEW_CC: - { - control_channel_t *cc; - xcs_interface_msg_t *imsg = &msg->u.interface; - - if ( ! INTERFACE_MSG_VALID(imsg) ) - { - msg->result = XCS_RSLT_BADREQUEST; - break; - } - - cc = add_interface(imsg->dom, imsg->local_port, imsg->remote_port); - if (cc != NULL) { - get_interface(cc); - msg->result = XCS_RSLT_OK; - imsg->local_port = cc->local_port; - imsg->remote_port = cc->remote_port; - } else { - msg->result = XCS_RSLT_FAILED; - } - break; - } - - case XCS_CIF_FREE_CC: - { - control_channel_t *cc; - xcs_interface_msg_t *imsg = &msg->u.interface; - - if ( ! INTERFACE_MSG_VALID(imsg) ) - { - msg->result = XCS_RSLT_BADREQUEST; - break; - } - - cc = add_interface(imsg->dom, imsg->local_port, imsg->remote_port); - if (cc != NULL) { - put_interface(cc); - } - msg->result = XCS_RSLT_OK; - break; - } - } - return reply_needed; -} - -void handle_data_message( connection_t *con, xcs_msg_t *msg ) -{ - control_channel_t *cc; - xcs_control_msg_t *cmsg = &msg->u.control; - int port; - - switch (msg->type) - { - case XCS_REQUEST: - if ( cmsg->remote_dom > MAX_DOMS ) - break; - - port = dom_to_port(cmsg->remote_dom); - if (port == -1) break; - cc = cc_list[port]; - if ((cc != NULL) && ( cc->type == CC_TYPE_INTERDOMAIN )) - { - DPRINTF("DN:REQ: dom:%d port: %d type: %d\n", - cc->remote_dom, cc->local_port, - cmsg->msg.type); - ctrl_chan_write_request(cc, cmsg); - ctrl_chan_notify(cc); - } else { - DPRINTF("tried to send a REQ to a null cc\n."); - } - break; - - case XCS_RESPONSE: - if ( cmsg->remote_dom > MAX_DOMS ) - break; - - port = dom_to_port(cmsg->remote_dom); - if (port == -1) break; - cc = cc_list[port]; - if ((cc != NULL) && ( cc->type == CC_TYPE_INTERDOMAIN )) - { - DPRINTF("DN:RSP: dom:%d port: %d type: %d\n", - cc->remote_dom, cc->local_port, - cmsg->msg.type); - ctrl_chan_write_response(cc, cmsg); - ctrl_chan_notify(cc); - } - break; - - case XCS_VIRQ: - if ( !(PORT_VALID(cmsg->local_port)) ) - break; - - cc = cc_list[cmsg->local_port]; - - if ((cc != NULL) && ( cc->type == CC_TYPE_VIRQ )) - { - DPRINTF("DN:VIRQ: virq: %d port: %d\n", - cc->virq, cc->local_port); - ctrl_chan_notify(cc); - } - break; - } -} - -/* ------[ Control interface handler ]-------------------------------------*/ - -/* passed as a function pointer to the lookup. */ -void send_kmsg(connection_t *c, void *arg) -{ - xcs_msg_t *msg = (xcs_msg_t *)arg; - - DPRINTF(" -> CONNECTION %d\n", c->data_fd); - if (c->data_fd > 0) - { - send(c->data_fd, msg, sizeof(xcs_msg_t), 0); - } -} - -int handle_ctrl_if(void) -{ - control_channel_t *cc; - control_msg_t *msg; - xcs_msg_t kmsg; - int chan, ret; - - DPRINTF("Event thread kicked!\n"); -again: - while ((chan = evtchn_read()) > 0) - { - evtchn_unmask(chan); - cc = cc_list[chan]; - if (cc_list[chan] == NULL) { - DPRINTF("event from unknown channel (%d)\n", chan); - continue; - } - - if ( cc_list[chan]->type == CC_TYPE_VIRQ ) - { - DPRINTF("UP:VIRQ: virq:%d port: %d\n", - cc->virq, cc->local_port); - kmsg.type = XCS_VIRQ; - kmsg.u.control.local_port = cc->local_port; - xcs_lookup(cc->local_port, TYPE_VIRQ, send_kmsg, &kmsg); - continue; - } - - while (ctrl_chan_request_to_read(cc)) - { - msg = &kmsg.u.control.msg; - kmsg.type = XCS_REQUEST; - kmsg.u.control.remote_dom = cc->remote_dom; - kmsg.u.control.local_port = cc->local_port; - ret = ctrl_chan_read_request(cc, &kmsg.u.control); - DPRINTF("UP:REQ: dom:%d port: %d type: %d len: %d\n", - cc->remote_dom, cc->local_port, - msg->type, msg->length); - if (ret == 0) - xcs_lookup(cc->local_port, msg->type, send_kmsg, &kmsg); - } - - while (ctrl_chan_response_to_read(cc)) - { - msg = &kmsg.u.control.msg; - kmsg.type = XCS_RESPONSE; - kmsg.u.control.remote_dom = cc->remote_dom; - kmsg.u.control.local_port = cc->local_port; - ret = ctrl_chan_read_response(cc, &kmsg.u.control); - DPRINTF("UP:RSP: dom:%d port: %d type: %d len: %d\n", - cc->remote_dom, cc->local_port, - msg->type, msg->length); - if (ret == 0) - xcs_lookup(cc->local_port, msg->type, send_kmsg, &kmsg); - } - } - - if (chan == -EINTR) - goto again; - - return chan; -} - - -/* ------[ Main xcs code / big select loop ]-------------------------------*/ - - -typedef struct unbound_fd_st { - int fd; - struct timeval born; - struct unbound_fd_st *next; -} unbound_fd_t; - -/* This makes ufd point to the next entry in the list, so need to * - * break/continue if called while iterating. */ -void delete_ufd(unbound_fd_t **ufd) -{ - unbound_fd_t *del_ufd; - - del_ufd = *ufd; - *ufd = (*ufd)->next; - free( del_ufd ); -} - -void gc_ufd_list( unbound_fd_t **ufd ) -{ - struct timeval now, delta; - - gettimeofday(&now, NULL); - - while ( *ufd != NULL ) - { - timersub(&now, &(*ufd)->born, &delta); - if (delta.tv_sec > XCS_UFD_TIMEOUT) - { - DPRINTF("GC-UFD: closing fd: %d\n", (*ufd)->fd); - close((*ufd)->fd); - delete_ufd(ufd); - continue; - } - ufd = &(*ufd)->next; - } -} - -void daemonize_xcs(void) -{ - - /* detach from our controlling tty so that a shell does hang waiting for - stopped jobs. */ - - pid_t pid = fork(); - int fd; - - if (pid == -1) { - perror("fork()"); - } else if (pid) { - exit(0); - } - - fd = open("/var/log/xcs.log", O_WRONLY | O_APPEND | O_CREAT); - if ( fd == -1 ) { - fprintf(stderr, "xcs couldn't open logfile. Directing all output to " - "/dev/null instead.\n"); - fd = open("/dev/null", O_WRONLY); - } - - setsid(); - close(2); - close(1); - close(0); - dup(fd); - dup(fd); -} - - -static char *pidfilename = NULL; -void cleanup(int sig) -{ - /* throw away our pidfile if we created one. */ - if ( pidfilename != NULL ) - unlink(pidfilename); - exit(0); -} - -int main (int argc, char *argv[]) -{ - int listen_fd, evtchn_fd; - unbound_fd_t *unbound_fd_list = NULL, **ufd; - struct timeval timeout = { XCS_GC_INTERVAL, 0 }; - connection_t **con; - int c, daemonize; - FILE *pidfile; - struct stat s; - - daemonize = 1; - pidfile = NULL; - - signal(SIGHUP, cleanup); - signal(SIGTERM, cleanup); - signal(SIGINT, cleanup); - - /* Do a bunch of stuff before potentially daemonizing so we can - * print error messages sanely before redirecting output. */ - - /* Initialize xc and event connections. */ - if (ctrl_chan_init() != 0) - { - printf("Couldn't open conneciton to libxc.\n"); - exit(-1); - } - - if ((evtchn_fd = evtchn_open()) < 0) - { - printf("Couldn't open event channel driver interface.\n"); - exit(-1); - } - - /* Bind listen_fd to the client socket. */ - listen_fd = listen_socket(XCS_SUN_PATH); - - while ((c = getopt (argc, argv, "ip:")) != -1) - { - switch (c) - { - case 'i': /* interactive */ - daemonize = 0; - break; - case 'p': /* pid file */ - pidfilename = optarg; - break; - case '?': - if (isprint (optopt)) - fprintf (stderr, "Unknown option `-%c'.\n", optopt); - else - fprintf (stderr, - "Bad option character `\\x%x'.\n", optopt); - break; - } - } - - if ( pidfilename != NULL ) - { - if ( stat(pidfilename, &s) == 0 ) - { - fprintf(stderr, "Thre specified pid file (%s) already exists.\n" - "Is another instance of xcs running?\n", pidfilename); - exit(-1); - } - - pidfile = fopen(pidfilename, "w"); - if (pidfile == NULL) - { - fprintf(stderr, "Error openning pidfile (%s).\n", pidfilename); - exit(-1); - } - } - - if (daemonize == 1) - daemonize_xcs(); - - if (pidfile != NULL) - { - fprintf(pidfile, "%d", getpid()); - fclose(pidfile); - } - - - /* Initialize control interfaces, bindings. */ - init_interfaces(); - init_bindings(); - - - for (;;) - { - int n = 0, ret; - fd_set rd, wr, er; - FD_ZERO ( &rd ); - FD_ZERO ( &wr ); - FD_ZERO ( &er ); - - /* TCP listen fd: */ - FD_SET ( listen_fd, &rd ); - n = fd_max ( n, listen_fd ); - - /* Evtchn fd: */ - FD_SET ( evtchn_fd, &rd ); - n = fd_max ( n, evtchn_fd ); - - /* unbound connection fds: */ - ufd = &unbound_fd_list; - while ((*ufd) != NULL) - { - FD_SET ( (*ufd)->fd, &rd ); - n = fd_max ( n, (*ufd)->fd ); - ufd = &(*ufd)->next; - } - - /* control and data fds: */ - con = &connection_list; - while ((*con) != NULL) - { - if ((*con)->ctrl_fd > 0) - { - FD_SET ( (*con)->ctrl_fd, &rd ); - n = fd_max ( n, (*con)->ctrl_fd ); - } - if ((*con)->data_fd > 0) - { - FD_SET ( (*con)->data_fd, &rd ); - n = fd_max ( n, (*con)->data_fd ); - } - con = &(*con)->next; - } - - ret = select ( n + 1, &rd, &wr, &er, &timeout ); - - if ( (timeout.tv_sec == 0) && (timeout.tv_usec == 0) ) - { - gc_ufd_list(&unbound_fd_list); - gc_connection_list(); - timeout.tv_sec = XCS_GC_INTERVAL; - } - - if ( (ret == -1) && (errno == EINTR) ) - continue; - if ( ret < 0 ) - { - perror ("select()"); - exit(-1); - } - - /* CASE 1: Events arriving on /dev/evtchn. */ - - if ( FD_ISSET (evtchn_fd, &rd )) - handle_ctrl_if(); - - /* CASE 2: New connection on the listen port. */ - if ( FD_ISSET ( listen_fd, &rd )) - { - struct sockaddr_un remote_addr; - int size; - memset (&remote_addr, 0, sizeof (remote_addr)); - size = sizeof remote_addr; - ret = accept(listen_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&size); - if ( ret < 0 ) - { - perror("accept()"); - } else { - unbound_fd_t *new_ufd; - - new_ufd = (unbound_fd_t *)malloc(sizeof(*new_ufd)); - - if (new_ufd != NULL) - { - gettimeofday(&new_ufd->born, NULL); - new_ufd->fd = ret; - new_ufd->next = unbound_fd_list; - unbound_fd_list = new_ufd; - } else { - perror("malloc unbound connection"); - close(ret); - } - } - } - - /* CASE 3a: Handle messages on control connections. */ - - con = &connection_list; - while ( *con != NULL ) - { - if ( ((*con)->ctrl_fd > 0) && (FD_ISSET((*con)->ctrl_fd, &rd)) ) - { - xcs_msg_t msg; - memset (&msg, 0, sizeof(msg)); - ret = read( (*con)->ctrl_fd, &msg, sizeof(msg) ); - - if ( ret < 0 ) - { - perror("reading ctrl fd."); - } else if ( ret == 0 ) - { - DPRINTF("Control connection dropped.\n"); - close ( (*con)->ctrl_fd ); - (*con)->ctrl_fd = -1; - gettimeofday(&(*con)->disconnect_time, NULL); - } else - { - if ( ret != sizeof(msg) ) - { - DPRINTF("Unexpected frame size!\n"); - continue; - } - - ret = handle_control_message( *con, &msg ); - - if ( ret == 1 ) - send( (*con)->ctrl_fd, &msg, sizeof(msg), 0 ); - } - } - con = &(*con)->next; - } - - /* CASE 3b: Handle messages on data connections. */ - - con = &connection_list; - while ( *con != NULL ) - { - if ( ((*con)->data_fd > 0) && (FD_ISSET((*con)->data_fd, &rd)) ) - { - xcs_msg_t msg; - memset (&msg, 0, sizeof(msg)); - ret = read( (*con)->data_fd, &msg, sizeof(msg) ); - - if ( ret < 0 ) - { - perror("reading data fd."); - } else if ( ret == 0 ) - { - DPRINTF("Data connection dropped.\n"); - close ( (*con)->data_fd ); - (*con)->data_fd = -1; - gettimeofday(&(*con)->disconnect_time, NULL); - } else - { - if ( ret != sizeof(msg) ) - { - DPRINTF("Unexpected frame size!\n"); - continue; - } - - handle_data_message( *con, &msg ); - } - } - con = &(*con)->next; - } - - /* CASE 3c: Handle messages arriving on unbound connections. */ - ufd = &unbound_fd_list; - while ((*ufd) != NULL) - { - if ( FD_ISSET( (*ufd)->fd, &rd ) ) - { - xcs_msg_t msg; - memset (&msg, 0, sizeof(msg)); - ret = read( (*ufd)->fd, &msg, sizeof(msg) ); - - if ( ret == 0 ) - { - close ( (*ufd)->fd ); - delete_ufd(ufd); - continue; /* we just advanced ufd */ - } else { - if ( ret != sizeof(msg) ) - { - DPRINTF("Unexpected frame size!\n"); - continue; - } - - ret = handle_connect_msg( &msg, (*ufd)->fd ); - - if ( (ret == CONNECTED) || (ret == NO_CHANGE) ) - send( (*ufd)->fd, &msg, sizeof(msg), 0 ); - - if ( (ret = CONNECTED) || (ret = DISCONNECTED) ) - { - delete_ufd( ufd ); - continue; - } - } - } - ufd = &(*ufd)->next; - } - } -} - diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/xcs.h --- a/tools/xcs/xcs.h Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,148 +0,0 @@ -/* xcs.h - * - * public interfaces for the control interface switch (xcs). - * - * (c) 2004, Andrew Warfield - * - */ - - -#ifndef __XCS_H__ -#define __XCS_H__ - -#include <pthread.h> -#include <xenctrl.h> -#include <xen/xen.h> -#include <xen/io/domain_controller.h> -#include <xen/linux/privcmd.h> -#include <sys/time.h> -#include "xcs_proto.h" - -/* ------[ Debug macros ]--------------------------------------------------*/ - -#if 0 -#define DPRINTF(_f, _a...) printf ( _f , ## _a ) -#else -#define DPRINTF(_f, _a...) ((void)0) -#endif - -/* ------[ XCS-specific defines and types ]--------------------------------*/ - -#define MAX_DOMS 1024 -#define XCS_SESSION_TIMEOUT 10 /* (secs) disconnected session gc timeout */ -#define XCS_UFD_TIMEOUT 5 /* how long can connections be unbound? */ -#define XCS_GC_INTERVAL 5 /* How often to run gc handlers. */ - - -/* ------[ Other required defines ]----------------------------------------*/ - -/* Size of a machine page frame. */ -#define PAGE_SIZE XC_PAGE_SIZE - -#ifndef timersub /* XOPEN and __BSD don't cooperate well... */ -#define timersub(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ - if ((result)->tv_usec < 0) { \ - --(result)->tv_sec; \ - (result)->tv_usec += 1000000; \ - } \ - } while (0) -#endif /*timersub*/ - -/* ------[ Bindings Interface ]--------------------------------------------*/ - -/*forward declare connection_t */ -typedef struct connection_st connection_t; - -typedef struct { - int port; - u16 type; -} binding_key_t; - -typedef struct binding_key_ent_st { - binding_key_t key; - struct binding_key_ent_st *next; -} binding_key_ent_t; - -#define BINDING_KEYS_EQUAL(_k1, _k2) \ - (((_k1)->port == (_k2)->port) && ((_k1)->type == (_k2)->type)) - -int xcs_bind(connection_t *con, int port, u16 type); -int xcs_unbind(connection_t *con, int port, u16 type); -void xcs_lookup(int port, u16 type, void (*f)(connection_t *, void *), - void *arg); -void init_bindings(void); - -/* ------[ Connection Interface ]------------------------------------------*/ - -struct connection_st { - unsigned long id; /* Unique session id */ - int ctrl_fd; /* TCP descriptors */ - int data_fd; /* */ - binding_key_ent_t *bindings; /* List of bindings */ - connection_t *next; /* Linked list of connections */ - struct timeval disconnect_time; /* " " */ -}; /* previously typedefed as connection_t */ - - -extern connection_t *connection_list; - -connection_t *get_con_by_session(unsigned long session_id); -connection_t *connection_new(); -void connection_free(connection_t *con); -int connection_add_binding(connection_t *con, binding_key_t *key); -int connection_remove_binding(connection_t *con, binding_key_t *key); -int connection_has_binding(connection_t *con, binding_key_t *key); -void gc_connection_list(void); - -/* ------[ Control Channel Interfaces ]------------------------------------*/ - -typedef struct { - int connected; - int ref_count; - int type; - u32 remote_dom; - int local_port; - int remote_port; - control_if_t *interface; - ctrl_back_ring_t tx_ring; - ctrl_front_ring_t rx_ring; - int virq; -} control_channel_t; - -/* cc types that we care about */ -#define CC_TYPE_INTERDOMAIN 0 -#define CC_TYPE_VIRQ 1 - -control_channel_t - *ctrl_chan_new(u32 dom, int local_port, int remote_port); -void ctrl_chan_free(control_channel_t *cc); -int ctrl_chan_init(void); -int ctrl_chan_notify(control_channel_t *cc); -int ctrl_chan_read_request(control_channel_t *cc, xcs_control_msg_t *); -int ctrl_chan_write_request(control_channel_t *cc, - xcs_control_msg_t *smsg); -int ctrl_chan_read_response(control_channel_t *cc, xcs_control_msg_t *); -int ctrl_chan_write_response(control_channel_t *cc, - xcs_control_msg_t *smsg); -int ctrl_chan_request_to_read(control_channel_t *cc); -int ctrl_chan_space_to_write_request(control_channel_t *cc); -int ctrl_chan_response_to_read(control_channel_t *cc); -int ctrl_chan_space_to_write_response(control_channel_t *cc); -int ctrl_chan_connect(control_channel_t *cc); -void ctrl_chan_disconnect(control_channel_t *cc); -int ctrl_chan_bind_virq(int virq, int *port); - -/* ------[ Event notification interfaces ]---------------------------------*/ - - -int evtchn_open(void); -void evtchn_close(); -int evtchn_bind(int idx); -int evtchn_unbind(int idx); -void evtchn_unmask(u16 idx); -int evtchn_read(); - -#endif /* __XCS_H__ */ diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/xcs_proto.h --- a/tools/xcs/xcs_proto.h Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,101 +0,0 @@ -/* xcs_proto.h - * - * protocol interfaces for the control interface switch (xcs). - * - * (c) 2004, Andrew Warfield - * - */ - -#ifndef __XCS_PROTO_H__ -#define __XCS_PROTO_H__ - -#define XCS_SUN_PATH "/var/lib/xen/xcs_socket" - -/* xcs message types: */ -#define XCS_CONNECT_CTRL 0 /* This is a control connection. */ -#define XCS_CONNECT_DATA 1 /* This is a data connection. */ -#define XCS_CONNECT_BYE 2 /* Terminate a session. */ -#define XCS_MSG_BIND 3 /* Register for a message type. */ -#define XCS_MSG_UNBIND 4 /* Unregister for a message type. */ -#define XCS_VIRQ_BIND 5 /* Register for a virq. */ -#define XCS_MSG_WRITELOCK 6 /* Writelock a (dom,type) pair. */ -#define XCS_CIF_NEW_CC 7 /* Create a new control channel. */ -#define XCS_CIF_FREE_CC 8 /* Create a new control channel. */ -#define XCS_REQUEST 9 /* This is a request message. */ -#define XCS_RESPONSE 10 /* this is a response Message. */ -#define XCS_VIRQ 11 /* this is a virq notification. */ - -/* xcs result values: */ -#define XCS_RSLT_OK 0 -#define XCS_RSLT_FAILED 1 /* something bad happened. */ -#define XCS_RSLT_ARECONNECTED 2 /* attempt to over connect. */ -#define XCS_RSLT_BADSESSION 3 /* request for unknown session id. */ -#define XCS_RSLT_NOSESSION 4 /* tried to do something before NEW. */ -#define XCS_RSLT_CONINUSE 5 /* Requested connection is taken. */ -#define XCS_RSLT_BADREQUEST 6 /* Request message didn't validate. */ - -/* Binding wildcards */ -#define PORT_WILDCARD 0xefffffff -#define TYPE_WILDCARD 0xffff -#define TYPE_VIRQ 0xfffe - -typedef struct { - unsigned long session_id; -} xcs_connect_msg_t; - -typedef struct { - int port; - u16 type; -} xcs_bind_msg_t; - -typedef struct { - int port; - u16 virq; -} xcs_virq_msg_t; - -typedef struct { - u32 dom; - int local_port; - int remote_port; -} xcs_interface_msg_t; - -typedef struct { - u32 remote_dom; - int local_port; - control_msg_t msg; -} xcs_control_msg_t; - -typedef struct { - u32 type; - u32 result; - union { - xcs_connect_msg_t connect; /* These are xcs ctrl message types */ - xcs_bind_msg_t bind; - xcs_virq_msg_t virq; - xcs_interface_msg_t interface; - - xcs_control_msg_t control; /* These are xcs data message types */ - } u; -} xcs_msg_t; - -/* message validation macros. */ -#define PORT_VALID(_p) \ - ( (((_p) >= 0) && ((_p) < NR_EVENT_CHANNELS)) \ - || ((_p) == PORT_WILDCARD) ) - -#define TYPE_VALID(_t) \ - ( ((_t) < 256) \ - || ((_t) == TYPE_VIRQ) \ - || ((_t) == TYPE_WILDCARD) ) - -#define BIND_MSG_VALID(_b) \ - ( PORT_VALID((_b)->port) && TYPE_VALID((_b)->type) ) - -/* Port is overwritten, and we don't currently validate the requested virq. */ -#define VIRQ_MSG_VALID(_v) ( 1 ) - -/* Interfaces may return with ports of -1, but may not be requested as such */ -#define INTERFACE_MSG_VALID(_i) \ - ( PORT_VALID((_i)->local_port) && PORT_VALID((_i)->remote_port) ) - -#endif /* __XCS_PROTO_H__ */ diff -r 4e4aac33809f -r 38c5199155fc tools/xcs/xcsdump.c --- a/tools/xcs/xcsdump.c Wed Sep 7 18:37:55 2005 +++ /dev/null Wed Sep 7 19:01:05 2005 @@ -1,206 +0,0 @@ -/* xcsdump.c - * - * little tool to sniff control messages. - * - * Copyright (c) 2004, Andrew Warfield - * - * Modifications by Anthony Liguori <aliguori@xxxxxxxxxx> are: - * Copyright (C) 2005, International Business Machines, Corp. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <ctype.h> -#include <xenctrl.h> -#include <xen/xen.h> -#include <xen/io/domain_controller.h> -#include <getopt.h> -#include "xcs_proto.h" -#include "xcs.h" - -#include "dump.h" - -static int xcs_ctrl_fd = -1; /* connection to the xcs server. */ -static int xcs_data_fd = -1; /* connection to the xcs server. */ - -int sock_connect(char *path) -{ - struct sockaddr_un addr; - int ret, len, fd; - - fd = socket(AF_UNIX, SOCK_STREAM, 0); - if (fd < 0) - { - printf("error creating xcs socket!\n"); - return -1; - } - - addr.sun_family = AF_UNIX; - strcpy(addr.sun_path, path); - len = sizeof(addr.sun_family) + strlen(addr.sun_path) + 1; - - ret = connect(fd, (struct sockaddr *)&addr, len); - if (ret < 0) - { - printf("error connecting to xcs!\n"); - return -1; - } - - return fd; -} - -void sock_disconnect(int *fd) -{ - close(*fd); - *fd = -1; -} - -void xcs_read(int fd, xcs_msg_t *msg) -{ - int ret; - - ret = read(fd, msg, sizeof(xcs_msg_t)); - if (ret != sizeof(xcs_msg_t)) { - printf("read error\n"); - exit(-1); - } -} - -void xcs_send(int fd, xcs_msg_t *msg) -{ - int ret; - - ret = send(fd, msg, sizeof(xcs_msg_t), 0); - if (ret != sizeof(xcs_msg_t) ) - { - printf("send error\n"); - exit(-1); - } -} - - -int main(int argc, char* argv[]) -{ - int ret; - xcs_msg_t msg; - control_msg_t *cmsg; - int verbose = 0; - int ch; - - while ((ch = getopt(argc, argv, "hv:")) != -1) - { - switch (ch) - { - case 'v': - verbose = atoi(optarg); - break; - case 'h': - printf("Usage: %s [-v FLAGS]\n" -"Displays XCS control message traffic.\n" -"\n" -"FLAGS is a bitmask where each bit (numbering starts from LSB) represents\n" -"whether to display a particular message type.\n" -"\n" -"For example, -v 1022 will display all messages except for console messages.\n" - , argv[0]); - exit(0); - break; - } - } - - ret = sock_connect(XCS_SUN_PATH); - if (ret < 0) - { - printf("connect failed!\n"); - exit(-1); - } - xcs_ctrl_fd = ret; - - memset(&msg, 0, sizeof(msg)); - msg.type = XCS_CONNECT_CTRL; - xcs_send(xcs_ctrl_fd, &msg); - xcs_read(xcs_ctrl_fd, &msg); - if (msg.result != XCS_RSLT_OK) - { - printf("Error connecting control channel\n"); - exit(-1); - } - - ret = sock_connect(XCS_SUN_PATH); - if (ret < 0) - { - printf("connect failed!\n"); - exit(-1); - } - xcs_data_fd = ret; - - msg.type = XCS_CONNECT_DATA; - /* session id is set from before... */ - xcs_send(xcs_data_fd, &msg); - xcs_read(xcs_data_fd, &msg); - if (msg.result != XCS_RSLT_OK) - { - printf("Error connecting data channel\n"); - exit(-1); - } - - msg.type = XCS_MSG_BIND; - msg.u.bind.port = PORT_WILDCARD; - msg.u.bind.type = TYPE_WILDCARD; - xcs_send(xcs_ctrl_fd, &msg); - xcs_read(xcs_ctrl_fd, &msg); - if (msg.result != XCS_RSLT_OK) - { - printf("Error binding.\n"); - exit(-1); - } - - - while (1) - { - xcs_read(xcs_data_fd, &msg); - cmsg = &msg.u.control.msg; - - switch (msg.type) - { - case XCS_REQUEST: - if (!verbose || verbose & (1 << msg.u.control.msg.type)) - { - printf("[REQUEST ] : (dom:%u port:%d) (type:(%d,%d) len %d)\n", - msg.u.control.remote_dom, - msg.u.control.local_port, - msg.u.control.msg.type, - msg.u.control.msg.subtype, - msg.u.control.msg.length); - - dump_msg(cmsg, verbose); - } - break; - case XCS_RESPONSE: - if (!verbose || verbose & (1 << msg.u.control.msg.type)) - { - printf("[RESPONSE] : (dom:%u port:%d) (type:(%d,%d) len %d)\n", - msg.u.control.remote_dom, - msg.u.control.local_port, - msg.u.control.msg.type, - msg.u.control.msg.subtype, - msg.u.control.msg.length); - - dump_msg(cmsg, verbose); - } - break; - case XCS_VIRQ: - printf("[VIRQ ] : %d\n", msg.u.control.local_port); - break; - default: - printf("[UNKNOWN ] : %d\n", msg.type); - } - } - - return(0); -} _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |