From: Lei Xia Date: Thu, 18 Nov 2010 17:30:48 +0000 (-0600) Subject: add raw packet interface X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=13d8e5d4035b90bf1ab8b1da115c7d6310c76526;p=palacios.git add raw packet interface --- diff --git a/palacios/include/palacios/vmm_host_events.h b/palacios/include/palacios/vmm_host_events.h index b762501..c811373 100644 --- a/palacios/include/palacios/vmm_host_events.h +++ b/palacios/include/palacios/vmm_host_events.h @@ -43,6 +43,11 @@ struct v3_console_event { unsigned int cmd; }; +struct v3_packet_event { + unsigned char * pkt; + unsigned int size; +}; + #ifdef __V3VEE__ #include @@ -53,7 +58,8 @@ typedef enum { HOST_KEYBOARD_EVT, 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 { @@ -62,6 +68,7 @@ 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); }; @@ -79,6 +86,7 @@ struct v3_host_events { struct list_head timer_events; struct list_head serial_events; struct list_head console_events; + struct list_head packet_events; }; @@ -101,7 +109,7 @@ int v3_deliver_mouse_event(struct v3_vm_info * vm, struct v3_mouse_event * evt); 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 diff --git a/palacios/include/palacios/vmm_packet.h b/palacios/include/palacios/vmm_packet.h new file mode 100644 index 0000000..78585c1 --- /dev/null +++ b/palacios/include/palacios/vmm_packet.h @@ -0,0 +1,49 @@ +/* + * 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 + * Copyright (c) 2010, The V3VEE Project + * All rights reserved. + * + * Author: Lei Xia + * + * 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 + +#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 diff --git a/palacios/src/palacios/vmm_host_events.c b/palacios/src/palacios/vmm_host_events.c index bbacce5..2f52e30 100644 --- a/palacios/src/palacios/vmm_host_events.c +++ b/palacios/src/palacios/vmm_host_events.c @@ -30,6 +30,7 @@ int v3_init_host_events(struct v3_vm_info * vm) { 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; } @@ -68,6 +69,9 @@ int v3_hook_host_event(struct v3_vm_info * vm, 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; @@ -198,3 +202,30 @@ int v3_deliver_console_event(struct v3_vm_info * vm, 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; +} + + +