unsigned int cmd;
};
+struct v3_packet_event {
+ unsigned char * pkt;
+ unsigned int size;
+};
+
#ifdef __V3VEE__
#include <palacios/vmm_list.h>
HOST_MOUSE_EVT,
HOST_TIMER_EVT,
HOST_CONSOLE_EVT,
- HOST_SERIAL_EVT } v3_host_evt_type_t;
+ HOST_SERIAL_EVT,
+ HOST_PACKET_EVT} v3_host_evt_type_t;
union v3_host_event_handler {
int (*timer_handler)(struct v3_vm_info * vm, struct v3_timer_event * evt, void * priv_data);
int (*serial_handler)(struct v3_vm_info * vm, struct v3_serial_event * evt, void * priv_data);
int (*console_handler)(struct v3_vm_info * vm, struct v3_console_event * evt, void * priv_data);
+ int (*packet_handler)(struct v3_vm_info * vm, struct v3_packet_event * evt, void * priv_data);
};
struct list_head timer_events;
struct list_head serial_events;
struct list_head console_events;
+ struct list_head packet_events;
};
int v3_deliver_timer_event(struct v3_vm_info * vm, struct v3_timer_event * evt);
int v3_deliver_serial_event(struct v3_vm_info * vm, struct v3_serial_event * evt);
int v3_deliver_console_event(struct v3_vm_info * vm, struct v3_console_event * evt);
-
+int v3_deliver_packet_event(struct v3_vm_info * vm, struct v3_packet_event * evt);
#endif
--- /dev/null
+/*
+ * This file is part of the Palacios Virtual Machine Monitor developed
+ * by the V3VEE Project with funding from the United States National
+ * Science Foundation and the Department of Energy.
+ *
+ * The V3VEE Project is a joint project between Northwestern University
+ * and the University of New Mexico. You can find out more at
+ * http://www.v3vee.org
+ *
+ * Copyright (c) 2010, Lei Xia <lxia@northwestern.edu>
+ * Copyright (c) 2010, The V3VEE Project <http://www.v3vee.org>
+ * All rights reserved.
+ *
+ * Author: Lei Xia <lxia@northwestern.edu>
+ *
+ * This is free software. You are permitted to use,
+ * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
+ */
+
+
+#ifndef __VMM_PACKET_H__
+#define __VMM_PACKET_H__
+
+#include <palacios/vmm.h>
+
+#ifdef __V3VEE__
+
+#define V3_send_Raw(pkt, size, data) ({ \
+ extern struct v3_packet_hooks * packet_hooks; \
+ int ret; \
+ if ((packet_hooks) && (packet_hooks)->send) { \
+ ret = (packet_hooks)->send(pkt,size,data); \
+ } \
+ ret; \
+ })
+
+#endif
+
+
+struct v3_packet_hooks {
+
+ int (*send)(const char * pkt, const int size, void * private_data);
+
+};
+
+
+extern void V3_Init_Packet(struct v3_packet_hooks * hooks);
+
+#endif
INIT_LIST_HEAD(&(host_evts->timer_events));
INIT_LIST_HEAD(&(host_evts->serial_events));
INIT_LIST_HEAD(&(host_evts->console_events));
+ INIT_LIST_HEAD(&(host_evts->packet_events));
return 0;
}
case HOST_CONSOLE_EVT:
list_add(&(hook->link), &(host_evts->console_events));
break;
+ case HOST_PACKET_EVT:
+ list_add(&(hook->link), &(host_evts->packet_events));
+ break;
}
return 0;
return 0;
}
+
+int v3_deliver_packet_event(struct v3_vm_info * vm,
+ struct v3_packet_event * evt) {
+ struct v3_host_events * host_evts = NULL;
+ struct v3_host_event_hook * hook = NULL;
+
+ if (vm == NULL) {
+ vm = v3_get_foreground_vm();
+ }
+
+ host_evts = &(vm->host_event_hooks);
+
+ if (vm->run_state != VM_RUNNING) {
+ return -1;
+ }
+
+ list_for_each_entry(hook, &(host_evts->packet_events), link) {
+ if (hook->cb.packet_handler(vm, evt, hook->private_data) == -1) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
+