bitkeeper revision 1.939 (40c58e4fzvuzE1QaJup7OdkdA6xDqg)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 8 Jun 2004 10:00:47 +0000 (10:00 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 8 Jun 2004 10:00:47 +0000 (10:00 +0000)
Xend fixes for ngio.

tools/xend/lib/blkif.py
tools/xend/lib/utils.c

index 9ea972caa51df165204eccc6cfb717b034d8a337..a35d1bcea159ad3b79bb9e57a62267e529c1351a 100644 (file)
@@ -64,7 +64,7 @@ def backend_rx_rsp(port, msg):
                                  { 'domid' : dom, 'blkif_handle' : 0,
                                    'vdevice' : vdev,
                                    'extent.sector_start' : start_sect,
-                                   'extent.sector.length' : nr_sect,
+                                   'extent.sector_length' : nr_sect,
                                    'extent.device' : pdev })
         backend_tx_req(msg)
     elif subtype == CMSG_BLKIF_BE_VBD_GROW:
index a01ba5254bea7f7ee0273d70621ba4506fc305b6..918e74cc96fbaf6e86bc794ad94c91040c6bd9c8 100644 (file)
@@ -236,18 +236,29 @@ static PyTypeObject xu_notifier_type = {
  */
 
 #define TYPE(_x,_y) (((_x)<<8)|(_y))
-#define P2C(_struct, _field, _pytype, _ctype1, _ctype2)                   \
+#define P2C(_struct, _field, _ctype)                                      \
     do {                                                                  \
         PyObject *obj;                                                    \
-        if ( ((obj = PyDict_GetItemString(payload, #_field)) != NULL) &&  \
-             Py ## _pytype ## _Check(obj) )                               \
-            ((_struct *)&xum->msg.msg[0])->_field =                       \
-                (_ctype2)Py ## _pytype ## _As ## _ctype1(obj);            \
+        if ( (obj = PyDict_GetItemString(payload, #_field)) != NULL )     \
+        {                                                                 \
+            if ( PyInt_Check(obj) )                                       \
+            {                                                             \
+                ((_struct *)&xum->msg.msg[0])->_field =                   \
+                  (_ctype)PyInt_AsLong(obj);                              \
+                dict_items_parsed++;                                      \
+            }                                                             \
+            else if ( PyLong_Check(obj) )                                 \
+            {                                                             \
+                ((_struct *)&xum->msg.msg[0])->_field =                   \
+                  (_ctype)PyLong_AsUnsignedLongLong(obj);                 \
+                dict_items_parsed++;                                      \
+            }                                                             \
+        }                                                                 \
         xum->msg.length = sizeof(_struct);                                \
     } while ( 0 )
-#define C2P(_struct, _field, _pytype, _ctype1, _ctype2)                   \
+#define C2P(_struct, _field, _pytype, _ctype)                             \
     do {                                                                  \
-        PyObject *obj = Py ## _pytype ## _From ## _ctype1                 \
+        PyObject *obj = Py ## _pytype ## _From ## _ctype                  \
                         (((_struct *)&xum->msg.msg[0])->_field);          \
         if ( dict == NULL ) dict = PyDict_New();                          \
         PyDict_SetItemString(dict, #_field, obj);                         \
@@ -284,20 +295,33 @@ static PyObject *xu_message_set_response_fields(PyObject *self, PyObject *args)
 {
     xu_message_object *xum = (xu_message_object *)self;
     PyObject *payload;
+    int dict_items_parsed = 0;
 
     if ( !PyArg_ParseTuple(args, "O", &payload) )
         return NULL;
 
+    if ( !PyDict_Check(payload) )
+    {
+        PyErr_SetString(PyExc_TypeError, "payload is not a dictionary");
+        return NULL;
+    }
+
     switch ( TYPE(xum->msg.type, xum->msg.subtype) )
     {
     case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED):
-        P2C(blkif_fe_driver_status_changed_t, nr_interfaces, Int, Long, u32);
+        P2C(blkif_fe_driver_status_changed_t, nr_interfaces, u32);
         break;
     case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS_CHANGED):
-        P2C(netif_fe_driver_status_changed_t, nr_interfaces, Int, Long, u32);
+        P2C(netif_fe_driver_status_changed_t, nr_interfaces, u32);
         break;
     }
 
+    if ( dict_items_parsed != PyDict_Size(payload) )
+    {
+        PyErr_SetString(PyExc_TypeError, "payload contains bad items");
+        return NULL;
+    }
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -313,117 +337,116 @@ static PyObject *xu_message_get_payload(PyObject *self, PyObject *args)
     switch ( TYPE(xum->msg.type, xum->msg.subtype) )
     {
     case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED):
-        C2P(blkif_fe_interface_status_changed_t, handle, Int, Long, u32);
-        C2P(blkif_fe_interface_status_changed_t, status, Int, Long, u32);
-        C2P(blkif_fe_interface_status_changed_t, evtchn, Int, Long, u16);
+        C2P(blkif_fe_interface_status_changed_t, handle, Int, Long);
+        C2P(blkif_fe_interface_status_changed_t, status, Int, Long);
+        C2P(blkif_fe_interface_status_changed_t, evtchn, Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED):
-        C2P(blkif_fe_driver_status_changed_t, status, Int, Long, u32);
+        C2P(blkif_fe_driver_status_changed_t, status, Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_CONNECT):
-        C2P(blkif_fe_interface_connect_t, handle,      Int, Long, u32);
-        C2P(blkif_fe_interface_connect_t, shmem_frame, Int, Long, memory_t);
+        C2P(blkif_fe_interface_connect_t, handle,      Int, Long);
+        C2P(blkif_fe_interface_connect_t, shmem_frame, Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_DISCONNECT):
-        C2P(blkif_fe_interface_disconnect_t, handle, Int, Long, u32);
+        C2P(blkif_fe_interface_disconnect_t, handle, Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE):
-        C2P(blkif_be_create_t, domid,        Int, Long, u32);
-        C2P(blkif_be_create_t, blkif_handle, Int, Long, u32);
-        C2P(blkif_be_create_t, status, Int, Long, u32);
+        C2P(blkif_be_create_t, domid,        Int, Long);
+        C2P(blkif_be_create_t, blkif_handle, Int, Long);
+        C2P(blkif_be_create_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY):
-        C2P(blkif_be_destroy_t, domid,        Int, Long, u32);
-        C2P(blkif_be_destroy_t, blkif_handle, Int, Long, u32);
-        C2P(blkif_be_destroy_t, status, Int, Long, u32);
+        C2P(blkif_be_destroy_t, domid,        Int, Long);
+        C2P(blkif_be_destroy_t, blkif_handle, Int, Long);
+        C2P(blkif_be_destroy_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CONNECT):
-        C2P(blkif_be_connect_t, domid,        Int, Long, u32);
-        C2P(blkif_be_connect_t, blkif_handle, Int, Long, u32);
-        C2P(blkif_be_connect_t, shmem_frame,  Int, Long, memory_t);
-        C2P(blkif_be_connect_t, evtchn,       Int, Long, u16);
-        C2P(blkif_be_connect_t, status, Int, Long, u32);
+        C2P(blkif_be_connect_t, domid,        Int, Long);
+        C2P(blkif_be_connect_t, blkif_handle, Int, Long);
+        C2P(blkif_be_connect_t, shmem_frame,  Int, Long);
+        C2P(blkif_be_connect_t, evtchn,       Int, Long);
+        C2P(blkif_be_connect_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DISCONNECT):
-        C2P(blkif_be_disconnect_t, domid,        Int, Long, u32);
-        C2P(blkif_be_disconnect_t, blkif_handle, Int, Long, u32);
-        C2P(blkif_be_disconnect_t, status, Int, Long, u32);
+        C2P(blkif_be_disconnect_t, domid,        Int, Long);
+        C2P(blkif_be_disconnect_t, blkif_handle, Int, Long);
+        C2P(blkif_be_disconnect_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE):
-        C2P(blkif_be_vbd_create_t, domid,        Int, Long, u32);
-        C2P(blkif_be_vbd_create_t, blkif_handle, Int, Long, u32);
-        C2P(blkif_be_vbd_create_t, vdevice,      Int, Long, blkif_vdev_t);
-        C2P(blkif_be_vbd_create_t, readonly,     Int, Long, u16);
-        C2P(blkif_be_vbd_create_t, status, Int, Long, u32);
+        C2P(blkif_be_vbd_create_t, domid,        Int, Long);
+        C2P(blkif_be_vbd_create_t, blkif_handle, Int, Long);
+        C2P(blkif_be_vbd_create_t, vdevice,      Int, Long);
+        C2P(blkif_be_vbd_create_t, readonly,     Int, Long);
+        C2P(blkif_be_vbd_create_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_DESTROY):
-        C2P(blkif_be_vbd_destroy_t, domid,        Int, Long, u32);
-        C2P(blkif_be_vbd_destroy_t, blkif_handle, Int, Long, u32);
-        C2P(blkif_be_vbd_destroy_t, vdevice,      Int, Long, blkif_vdev_t);
-        C2P(blkif_be_vbd_destroy_t, status, Int, Long, u32);
+        C2P(blkif_be_vbd_destroy_t, domid,        Int, Long);
+        C2P(blkif_be_vbd_destroy_t, blkif_handle, Int, Long);
+        C2P(blkif_be_vbd_destroy_t, vdevice,      Int, Long);
+        C2P(blkif_be_vbd_destroy_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW):
-        C2P(blkif_be_vbd_grow_t, domid,        Int, Long, u32);
-        C2P(blkif_be_vbd_grow_t, blkif_handle, Int, Long, u32);
-        C2P(blkif_be_vbd_grow_t, vdevice,      Int, Long, blkif_vdev_t);
+        C2P(blkif_be_vbd_grow_t, domid,         Int, Long);
+        C2P(blkif_be_vbd_grow_t, blkif_handle,  Int, Long);
+        C2P(blkif_be_vbd_grow_t, vdevice,       Int, Long);
         C2P(blkif_be_vbd_grow_t, extent.sector_start, 
-             Long, UnsignedLongLong, blkif_sector_t);
+             Long, UnsignedLongLong);
         C2P(blkif_be_vbd_grow_t, extent.sector_length, 
-             Long, UnsignedLongLong, blkif_sector_t);
-        C2P(blkif_be_vbd_grow_t, extent.device, 
-             Int, Long, blkif_pdev_t);
-        C2P(blkif_be_vbd_grow_t, status, Int, Long, u32);
+             Long, UnsignedLongLong);
+        C2P(blkif_be_vbd_grow_t, extent.device, Int, Long);
+        C2P(blkif_be_vbd_grow_t, status,        Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_SHRINK):
-        C2P(blkif_be_vbd_shrink_t, domid,        Int, Long, u32);
-        C2P(blkif_be_vbd_shrink_t, blkif_handle, Int, Long, u32);
-        C2P(blkif_be_vbd_shrink_t, vdevice,      Int, Long, blkif_vdev_t);
-        C2P(blkif_be_vbd_shrink_t, status, Int, Long, u32);
+        C2P(blkif_be_vbd_shrink_t, domid,        Int, Long);
+        C2P(blkif_be_vbd_shrink_t, blkif_handle, Int, Long);
+        C2P(blkif_be_vbd_shrink_t, vdevice,      Int, Long);
+        C2P(blkif_be_vbd_shrink_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DRIVER_STATUS_CHANGED):
-        C2P(blkif_be_driver_status_changed_t, status, Int, Long, u32);
+        C2P(blkif_be_driver_status_changed_t, status, Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED):
-        C2P(netif_fe_interface_status_changed_t, handle, Int, Long, u32);
-        C2P(netif_fe_interface_status_changed_t, status, Int, Long, u32);
-        C2P(netif_fe_interface_status_changed_t, evtchn, Int, Long, u16);
+        C2P(netif_fe_interface_status_changed_t, handle, Int, Long);
+        C2P(netif_fe_interface_status_changed_t, status, Int, Long);
+        C2P(netif_fe_interface_status_changed_t, evtchn, Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS_CHANGED):
-        C2P(netif_fe_driver_status_changed_t, status, Int, Long, u32);
+        C2P(netif_fe_driver_status_changed_t, status, Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_CONNECT):
-        C2P(netif_fe_interface_connect_t, handle,         Int, Long, u32);
-        C2P(netif_fe_interface_connect_t, tx_shmem_frame, Int, Long, memory_t);
-        C2P(netif_fe_interface_connect_t, rx_shmem_frame, Int, Long, memory_t);
+        C2P(netif_fe_interface_connect_t, handle,         Int, Long);
+        C2P(netif_fe_interface_connect_t, tx_shmem_frame, Int, Long);
+        C2P(netif_fe_interface_connect_t, rx_shmem_frame, Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_DISCONNECT):
-        C2P(netif_fe_interface_disconnect_t, handle, Int, Long, u32);
+        C2P(netif_fe_interface_disconnect_t, handle, Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE):
-        C2P(netif_be_create_t, domid,        Int, Long, u32);
-        C2P(netif_be_create_t, netif_handle, Int, Long, u32);
-        C2P(netif_be_create_t, status, Int, Long, u32);
+        C2P(netif_be_create_t, domid,        Int, Long);
+        C2P(netif_be_create_t, netif_handle, Int, Long);
+        C2P(netif_be_create_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY):
-        C2P(netif_be_destroy_t, domid,        Int, Long, u32);
-        C2P(netif_be_destroy_t, netif_handle, Int, Long, u32);
-        C2P(netif_be_destroy_t, status, Int, Long, u32);
+        C2P(netif_be_destroy_t, domid,        Int, Long);
+        C2P(netif_be_destroy_t, netif_handle, Int, Long);
+        C2P(netif_be_destroy_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CONNECT):
-        C2P(netif_be_connect_t, domid,          Int, Long, u32);
-        C2P(netif_be_connect_t, netif_handle,   Int, Long, u32);
-        C2P(netif_be_connect_t, tx_shmem_frame, Int, Long, memory_t);
-        C2P(netif_be_connect_t, rx_shmem_frame, Int, Long, memory_t);
-        C2P(netif_be_connect_t, evtchn,         Int, Long, u16);
-        C2P(netif_be_connect_t, status, Int, Long, u32);
+        C2P(netif_be_connect_t, domid,          Int, Long);
+        C2P(netif_be_connect_t, netif_handle,   Int, Long);
+        C2P(netif_be_connect_t, tx_shmem_frame, Int, Long);
+        C2P(netif_be_connect_t, rx_shmem_frame, Int, Long);
+        C2P(netif_be_connect_t, evtchn,         Int, Long);
+        C2P(netif_be_connect_t, status,         Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DISCONNECT):
-        C2P(netif_be_disconnect_t, domid,        Int, Long, u32);
-        C2P(netif_be_disconnect_t, netif_handle, Int, Long, u32);
-        C2P(netif_be_disconnect_t, status, Int, Long, u32);
+        C2P(netif_be_disconnect_t, domid,        Int, Long);
+        C2P(netif_be_disconnect_t, netif_handle, Int, Long);
+        C2P(netif_be_disconnect_t, status,       Int, Long);
         return dict;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS_CHANGED):
-        C2P(netif_be_driver_status_changed_t, status, Int, Long, u32);
+        C2P(netif_be_driver_status_changed_t, status, Int, Long);
         return dict;
     }
 
@@ -472,7 +495,7 @@ staticforward PyTypeObject xu_message_type;
 static PyObject *xu_message_new(PyObject *self, PyObject *args)
 {
     xu_message_object *xum;
-    int type, subtype, id;
+    int type, subtype, id, dict_items_parsed = 0;
     PyObject *payload = NULL;
 
     if ( !PyArg_ParseTuple(args, "iii|O", &type, &subtype, &id, &payload) )
@@ -498,93 +521,97 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args)
     switch ( TYPE(type, subtype) )
     {
     case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED):
-        P2C(blkif_fe_interface_status_changed_t, handle, Int, Long, u32);
-        P2C(blkif_fe_interface_status_changed_t, status, Int, Long, u32);
-        P2C(blkif_fe_interface_status_changed_t, evtchn, Int, Long, u16);
+        P2C(blkif_fe_interface_status_changed_t, handle, u32);
+        P2C(blkif_fe_interface_status_changed_t, status, u32);
+        P2C(blkif_fe_interface_status_changed_t, evtchn, u16);
         break;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE):
-        P2C(blkif_be_create_t, domid,        Int, Long, u32);
-        P2C(blkif_be_create_t, blkif_handle, Int, Long, u32);
+        P2C(blkif_be_create_t, domid,        u32);
+        P2C(blkif_be_create_t, blkif_handle, u32);
         break;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY):
-        P2C(blkif_be_destroy_t, domid,        Int, Long, u32);
-        P2C(blkif_be_destroy_t, blkif_handle, Int, Long, u32);
+        P2C(blkif_be_destroy_t, domid,        u32);
+        P2C(blkif_be_destroy_t, blkif_handle, u32);
         break;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CONNECT):
-        P2C(blkif_be_connect_t, domid,        Int, Long, u32);
-        P2C(blkif_be_connect_t, blkif_handle, Int, Long, u32);
-        P2C(blkif_be_connect_t, shmem_frame,  Int, Long, memory_t);
-        P2C(blkif_be_connect_t, evtchn,       Int, Long, u16);
+        P2C(blkif_be_connect_t, domid,        u32);
+        P2C(blkif_be_connect_t, blkif_handle, u32);
+        P2C(blkif_be_connect_t, shmem_frame,  memory_t);
+        P2C(blkif_be_connect_t, evtchn,       u16);
         break;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DISCONNECT):
-        P2C(blkif_be_disconnect_t, domid,        Int, Long, u32);
-        P2C(blkif_be_disconnect_t, blkif_handle, Int, Long, u32);
+        P2C(blkif_be_disconnect_t, domid,        u32);
+        P2C(blkif_be_disconnect_t, blkif_handle, u32);
         break;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE):
-        P2C(blkif_be_vbd_create_t, domid,        Int, Long, u32);
-        P2C(blkif_be_vbd_create_t, blkif_handle, Int, Long, u32);
-        P2C(blkif_be_vbd_create_t, vdevice,      Int, Long, blkif_vdev_t);
-        P2C(blkif_be_vbd_create_t, readonly,     Int, Long, u16);
+        P2C(blkif_be_vbd_create_t, domid,        u32);
+        P2C(blkif_be_vbd_create_t, blkif_handle, u32);
+        P2C(blkif_be_vbd_create_t, vdevice,      blkif_vdev_t);
+        P2C(blkif_be_vbd_create_t, readonly,     u16);
         break;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_DESTROY):
-        P2C(blkif_be_vbd_destroy_t, domid,        Int, Long, u32);
-        P2C(blkif_be_vbd_destroy_t, blkif_handle, Int, Long, u32);
-        P2C(blkif_be_vbd_destroy_t, vdevice,      Int, Long, blkif_vdev_t);
+        P2C(blkif_be_vbd_destroy_t, domid,        u32);
+        P2C(blkif_be_vbd_destroy_t, blkif_handle, u32);
+        P2C(blkif_be_vbd_destroy_t, vdevice,      blkif_vdev_t);
         break;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW):
-        P2C(blkif_be_vbd_grow_t, domid,        Int, Long, u32);
-        P2C(blkif_be_vbd_grow_t, blkif_handle, Int, Long, u32);
-        P2C(blkif_be_vbd_grow_t, vdevice,      Int, Long, blkif_vdev_t);
-        P2C(blkif_be_vbd_grow_t, extent.sector_start, 
-             Long, UnsignedLongLong, blkif_sector_t);
-        P2C(blkif_be_vbd_grow_t, extent.sector_length, 
-             Long, UnsignedLongLong, blkif_sector_t);
-        P2C(blkif_be_vbd_grow_t, extent.device, 
-             Int, Long, blkif_pdev_t);
+        P2C(blkif_be_vbd_grow_t, domid,                u32);
+        P2C(blkif_be_vbd_grow_t, blkif_handle,         u32);
+        P2C(blkif_be_vbd_grow_t, vdevice,              blkif_vdev_t);
+        P2C(blkif_be_vbd_grow_t, extent.sector_start,  blkif_sector_t);
+        P2C(blkif_be_vbd_grow_t, extent.sector_length, blkif_sector_t);
+        P2C(blkif_be_vbd_grow_t, extent.device,        blkif_pdev_t);
         break;
     case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_SHRINK):
-        P2C(blkif_be_vbd_shrink_t, domid,        Int, Long, u32);
-        P2C(blkif_be_vbd_shrink_t, blkif_handle, Int, Long, u32);
-        P2C(blkif_be_vbd_shrink_t, vdevice,      Int, Long, blkif_vdev_t);
+        P2C(blkif_be_vbd_shrink_t, domid,        u32);
+        P2C(blkif_be_vbd_shrink_t, blkif_handle, u32);
+        P2C(blkif_be_vbd_shrink_t, vdevice,      blkif_vdev_t);
         break;
     case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED):
-        P2C(netif_fe_interface_status_changed_t, handle, Int, Long, u32);
-        P2C(netif_fe_interface_status_changed_t, status, Int, Long, u32);
-        P2C(netif_fe_interface_status_changed_t, evtchn, Int, Long, u16);
-        P2C(netif_fe_interface_status_changed_t, mac[0], Int, Long, u8);
-        P2C(netif_fe_interface_status_changed_t, mac[1], Int, Long, u8);
-        P2C(netif_fe_interface_status_changed_t, mac[2], Int, Long, u8);
-        P2C(netif_fe_interface_status_changed_t, mac[3], Int, Long, u8);
-        P2C(netif_fe_interface_status_changed_t, mac[4], Int, Long, u8);
-        P2C(netif_fe_interface_status_changed_t, mac[5], Int, Long, u8);
+        P2C(netif_fe_interface_status_changed_t, handle, u32);
+        P2C(netif_fe_interface_status_changed_t, status, u32);
+        P2C(netif_fe_interface_status_changed_t, evtchn, u16);
+        P2C(netif_fe_interface_status_changed_t, mac[0], u8);
+        P2C(netif_fe_interface_status_changed_t, mac[1], u8);
+        P2C(netif_fe_interface_status_changed_t, mac[2], u8);
+        P2C(netif_fe_interface_status_changed_t, mac[3], u8);
+        P2C(netif_fe_interface_status_changed_t, mac[4], u8);
+        P2C(netif_fe_interface_status_changed_t, mac[5], u8);
         break;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE):
-        P2C(netif_be_create_t, domid,        Int, Long, u32);
-        P2C(netif_be_create_t, netif_handle, Int, Long, u32);
-        P2C(netif_be_create_t, mac[0],       Int, Long, u8);
-        P2C(netif_be_create_t, mac[1],       Int, Long, u8);
-        P2C(netif_be_create_t, mac[2],       Int, Long, u8);
-        P2C(netif_be_create_t, mac[3],       Int, Long, u8);
-        P2C(netif_be_create_t, mac[4],       Int, Long, u8);
-        P2C(netif_be_create_t, mac[5],       Int, Long, u8);
+        P2C(netif_be_create_t, domid,        u32);
+        P2C(netif_be_create_t, netif_handle, u32);
+        P2C(netif_be_create_t, mac[0],       u8);
+        P2C(netif_be_create_t, mac[1],       u8);
+        P2C(netif_be_create_t, mac[2],       u8);
+        P2C(netif_be_create_t, mac[3],       u8);
+        P2C(netif_be_create_t, mac[4],       u8);
+        P2C(netif_be_create_t, mac[5],       u8);
         break;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY):
-        P2C(netif_be_destroy_t, domid,        Int, Long, u32);
-        P2C(netif_be_destroy_t, netif_handle, Int, Long, u32);
+        P2C(netif_be_destroy_t, domid,        u32);
+        P2C(netif_be_destroy_t, netif_handle, u32);
         break;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_CONNECT):
-        P2C(netif_be_connect_t, domid,          Int, Long, u32);
-        P2C(netif_be_connect_t, netif_handle,   Int, Long, u32);
-        P2C(netif_be_connect_t, tx_shmem_frame, Int, Long, memory_t);
-        P2C(netif_be_connect_t, rx_shmem_frame, Int, Long, memory_t);
-        P2C(netif_be_connect_t, evtchn,         Int, Long, u16);
+        P2C(netif_be_connect_t, domid,          u32);
+        P2C(netif_be_connect_t, netif_handle,   u32);
+        P2C(netif_be_connect_t, tx_shmem_frame, memory_t);
+        P2C(netif_be_connect_t, rx_shmem_frame, memory_t);
+        P2C(netif_be_connect_t, evtchn,         u16);
         break;
     case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DISCONNECT):
-        P2C(netif_be_disconnect_t, domid,        Int, Long, u32);
-        P2C(netif_be_disconnect_t, netif_handle, Int, Long, u32);
+        P2C(netif_be_disconnect_t, domid,        u32);
+        P2C(netif_be_disconnect_t, netif_handle, u32);
         break;
     }
 
+    if ( dict_items_parsed != PyDict_Size(payload) )
+    {
+        PyErr_SetString(PyExc_TypeError, "payload contains bad items");
+        PyObject_Del((PyObject *)xum);
+        return NULL;
+    }
+
     return (PyObject *)xum;
 }