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;
+}
+
+
+