mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
bitkeeper revision 1.936 (40c09331NirwCvM2egwMlUy301iNmg)
Merge scramble.cl.cam.ac.uk:/auto/groups/xeno/BK/xeno.bk into scramble.cl.cam.ac.uk:/local/scratch/kaf24/xeno
This commit is contained in:
commit
6d7d5203ba
8 files changed
+503
-206
No files matched your search
@@ -91,6 +91,7 @@ vbd_list = []; cmdline_ip = ''; cmdline_root=''; cmdline_extra=''
|
||||
pci_device_list = []; console_port = -1
|
||||
auto_console = False
|
||||
dontstart = False
|
||||
flags = 0
|
||||
|
||||
##### Determine location of defaults file
|
||||
#####
|
||||
|
||||
+36
-22
@@ -43,19 +43,29 @@ def backend_rx_rsp(port, msg):
|
||||
rsp = { 'success': True }
|
||||
xend.main.send_management_response(rsp, xend.blkif.pendaddr)
|
||||
elif subtype == CMSG_BLKIF_BE_CONNECT:
|
||||
(dom,hnd,evtchn,frame,st) = struct.unpack("IIILI", msg.get_payload())
|
||||
pl = msg.get_payload()
|
||||
(dom, hnd, frame, evtchn, st) = (pl['domid'], pl['blkif_handle'],
|
||||
pl['shmem_frame'], pl['evtchn'],
|
||||
pl['status'])
|
||||
blkif = interface.list[xend.main.port_from_dom(dom).local_port]
|
||||
msg = xend.utils.message(CMSG_BLKIF_FE, \
|
||||
CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0)
|
||||
msg.append_payload(struct.pack("III",0,2,blkif.evtchn['port2']))
|
||||
msg = xend.utils.message(CMSG_BLKIF_FE,
|
||||
CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0,
|
||||
{ 'handle' : 0, 'status' : 2,
|
||||
'evtchn' : blkif.evtchn['port2'] })
|
||||
blkif.ctrlif_tx_req(xend.main.port_list[blkif.key], msg)
|
||||
elif subtype == CMSG_BLKIF_BE_VBD_CREATE:
|
||||
(dom,hnd,vdev,ro,st) = struct.unpack("IIHII", msg.get_payload())
|
||||
pl = msg.get_payload()
|
||||
(dom, hnd, vdev, ro, st) = (pl['domid'], pl['blkif_handle'],
|
||||
pl['vdevice'], pl['readonly'],
|
||||
pl['status'])
|
||||
blkif = interface.list[xend.main.port_from_dom(dom).local_port]
|
||||
(pdev, start_sect, nr_sect, readonly) = blkif.devices[vdev]
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW, 0)
|
||||
msg.append_payload(struct.pack("IIHHHQQI",dom,0,vdev,0, \
|
||||
pdev,start_sect,nr_sect,0))
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_GROW, 0,
|
||||
{ 'domid' : dom, 'blkif_handle' : 0,
|
||||
'vdevice' : vdev,
|
||||
'extent.sector_start' : start_sect,
|
||||
'extent.sector.length' : nr_sect,
|
||||
'extent.device' : pdev })
|
||||
backend_tx_req(msg)
|
||||
elif subtype == CMSG_BLKIF_BE_VBD_GROW:
|
||||
rsp = { 'success': True }
|
||||
@@ -83,8 +93,8 @@ class interface:
|
||||
self.devices = {}
|
||||
self.pendmsg = None
|
||||
interface.list[key] = self
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0)
|
||||
msg.append_payload(struct.pack("III",dom,0,0))
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_CREATE, 0,
|
||||
{ 'domid' : dom, 'blkif_handle' : 0 })
|
||||
xend.blkif.pendaddr = xend.main.mgmt_req_addr
|
||||
backend_tx_req(msg)
|
||||
|
||||
@@ -93,8 +103,9 @@ class interface:
|
||||
if self.devices.has_key(vdev):
|
||||
return False
|
||||
self.devices[vdev] = (pdev, start_sect, nr_sect, readonly)
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE, 0)
|
||||
msg.append_payload(struct.pack("IIHII",self.dom,0,vdev,readonly,0))
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_VBD_CREATE, 0,
|
||||
{ 'domid' : self.dom, 'blkif_handle' : 0,
|
||||
'vdevice' : vdev, 'readonly' : readonly })
|
||||
xend.blkif.pendaddr = xend.main.mgmt_req_addr
|
||||
backend_tx_req(msg)
|
||||
return True
|
||||
@@ -103,8 +114,8 @@ class interface:
|
||||
# Completely destroy this interface.
|
||||
def destroy(self):
|
||||
del interface.list[self.key]
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY, 0)
|
||||
msg.append_payload(struct.pack("III",self.dom,0,0))
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DESTROY, 0,
|
||||
{ 'domid' : self.dom, 'blkif_handle' : 0 })
|
||||
backend_tx_req(msg)
|
||||
|
||||
|
||||
@@ -128,16 +139,19 @@ class interface:
|
||||
port.write_response(msg)
|
||||
subtype = (msg.get_header())['subtype']
|
||||
if subtype == CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED:
|
||||
msg = xend.utils.message(CMSG_BLKIF_FE, \
|
||||
CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED, 0)
|
||||
msg.append_payload(struct.pack("III",0,1,0))
|
||||
msg = xend.utils.message(CMSG_BLKIF_FE,
|
||||
CMSG_BLKIF_FE_INTERFACE_STATUS_CHANGED,
|
||||
0,
|
||||
{ 'handle' : 0, 'status' : 1 })
|
||||
self.ctrlif_tx_req(port, msg)
|
||||
elif subtype == CMSG_BLKIF_FE_INTERFACE_CONNECT:
|
||||
(hnd,frame) = struct.unpack("IL", msg.get_payload())
|
||||
pl = msg.get_payload()
|
||||
(hnd, frame) = (pl['handle'], pl['shmem_frame'])
|
||||
xc = Xc.new()
|
||||
self.evtchn = xc.evtchn_bind_interdomain(dom1=0,dom2=self.dom)
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE, \
|
||||
CMSG_BLKIF_BE_CONNECT, 0)
|
||||
msg.append_payload(struct.pack("IIILI",self.dom,0, \
|
||||
self.evtchn['port1'],frame,0))
|
||||
msg = xend.utils.message(CMSG_BLKIF_BE,
|
||||
CMSG_BLKIF_BE_CONNECT, 0,
|
||||
{ 'domid' : self.dom, 'blkif_handle' : 0,
|
||||
'shmem_frame' : frame,
|
||||
'evtchn' : self.evtchn['port1'] })
|
||||
backend_tx_req(msg)
|
||||
+125
-123
@@ -22,8 +22,10 @@
|
||||
|
||||
typedef struct {
|
||||
BASIC_START_INFO;
|
||||
unsigned int domain_controller_evtchn;
|
||||
} extended_start_info_t;
|
||||
u16 domain_controller_evtchn; /* 320 */
|
||||
} PACKED extended_start_info_t; /* 322 bytes */
|
||||
#define SIF_BLK_BE_DOMAIN (1<<4) /* Is this a block backend domain? */
|
||||
#define SIF_NET_BE_DOMAIN (1<<5) /* Is this a net backend domain? */
|
||||
|
||||
|
||||
/*
|
||||
@@ -31,23 +33,23 @@ typedef struct {
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
u8 type; /* echoed in response */
|
||||
u8 subtype; /* echoed in response */
|
||||
u8 id; /* echoed in response */
|
||||
u8 length; /* number of bytes in 'msg' */
|
||||
unsigned char msg[60]; /* type-specific message data */
|
||||
} control_msg_t;
|
||||
u8 type; /* 0: echoed in response */
|
||||
u8 subtype; /* 1: echoed in response */
|
||||
u8 id; /* 2: echoed in response */
|
||||
u8 length; /* 3: number of bytes in 'msg' */
|
||||
u8 msg[60]; /* 4: type-specific message data */
|
||||
} PACKED control_msg_t; /* 64 bytes */
|
||||
|
||||
#define CONTROL_RING_SIZE 8
|
||||
typedef unsigned int CONTROL_RING_IDX;
|
||||
typedef u32 CONTROL_RING_IDX;
|
||||
#define MASK_CONTROL_IDX(_i) ((_i)&(CONTROL_RING_SIZE-1))
|
||||
|
||||
typedef struct {
|
||||
control_msg_t tx_ring[CONTROL_RING_SIZE]; /* guest-OS -> controller */
|
||||
control_msg_t rx_ring[CONTROL_RING_SIZE]; /* controller -> guest-OS */
|
||||
CONTROL_RING_IDX tx_req_prod, tx_resp_prod;
|
||||
CONTROL_RING_IDX rx_req_prod, rx_resp_prod;
|
||||
} control_if_t;
|
||||
control_msg_t tx_ring[CONTROL_RING_SIZE]; /* 0: guest -> controller */
|
||||
control_msg_t rx_ring[CONTROL_RING_SIZE]; /* 512: controller -> guest */
|
||||
CONTROL_RING_IDX tx_req_prod, tx_resp_prod; /* 1024, 1028 */
|
||||
CONTROL_RING_IDX rx_req_prod, rx_resp_prod; /* 1032, 1036 */
|
||||
} PACKED control_if_t; /* 1040 bytes */
|
||||
|
||||
/*
|
||||
* Top-level command types.
|
||||
@@ -97,10 +99,10 @@ typedef struct {
|
||||
#define BLKIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */
|
||||
#define BLKIF_INTERFACE_STATUS_CONNECTED 2 /* Exists and is connected. */
|
||||
typedef struct {
|
||||
unsigned int handle;
|
||||
unsigned int status;
|
||||
unsigned int evtchn; /* status == BLKIF_INTERFACE_STATUS_CONNECTED */
|
||||
} blkif_fe_interface_status_changed_t;
|
||||
u32 handle; /* 0 */
|
||||
u32 status; /* 4 */
|
||||
u16 evtchn; /* 8: (only if status == BLKIF_INTERFACE_STATUS_CONNECTED). */
|
||||
} PACKED blkif_fe_interface_status_changed_t; /* 10 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED:
|
||||
@@ -115,14 +117,14 @@ typedef struct {
|
||||
#define BLKIF_DRIVER_STATUS_UP 1
|
||||
typedef struct {
|
||||
/* IN */
|
||||
unsigned int status; /* BLKIF_DRIVER_STATUS_??? */
|
||||
u32 status; /* 0: BLKIF_DRIVER_STATUS_??? */
|
||||
/* OUT */
|
||||
/*
|
||||
* Tells driver how many interfaces it should expect to immediately
|
||||
* receive notifications about.
|
||||
*/
|
||||
unsigned int nr_interfaces;
|
||||
} blkif_fe_driver_status_changed_t;
|
||||
u32 nr_interfaces; /* 4 */
|
||||
} PACKED blkif_fe_driver_status_changed_t; /* 8 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_BLKIF_FE_INTERFACE_CONNECT:
|
||||
@@ -130,9 +132,11 @@ typedef struct {
|
||||
* STATUS_CONNECTED message.
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned int handle;
|
||||
unsigned long shmem_frame;
|
||||
} blkif_fe_interface_connect_t;
|
||||
u32 handle; /* 0 */
|
||||
u32 __pad;
|
||||
memory_t shmem_frame; /* 8 */
|
||||
MEMORY_PADDING;
|
||||
} PACKED blkif_fe_interface_connect_t; /* 16 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_BLKIF_FE_INTERFACE_DISCONNECT:
|
||||
@@ -140,8 +144,8 @@ typedef struct {
|
||||
* STATUS_DISCONNECTED message.
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned int handle;
|
||||
} blkif_fe_interface_disconnect_t;
|
||||
u32 handle; /* 0 */
|
||||
} PACKED blkif_fe_interface_disconnect_t; /* 4 bytes */
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@@ -166,10 +170,11 @@ typedef struct {
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
blkif_pdev_t device;
|
||||
blkif_sector_t sector_start;
|
||||
blkif_sector_t sector_length;
|
||||
} blkif_extent_t;
|
||||
blkif_sector_t sector_start; /* 0 */
|
||||
blkif_sector_t sector_length; /* 8 */
|
||||
blkif_pdev_t device; /* 16 */
|
||||
u16 __pad; /* 18 */
|
||||
} PACKED blkif_extent_t; /* 20 bytes */
|
||||
|
||||
/* Non-specific 'okay' return. */
|
||||
#define BLKIF_BE_STATUS_OKAY 0
|
||||
@@ -206,11 +211,11 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Domain attached to new interface. */
|
||||
unsigned int blkif_handle; /* Domain-specific interface handle. */
|
||||
domid_t domid; /* 0: Domain attached to new interface. */
|
||||
u32 blkif_handle; /* 4: Domain-specific interface handle. */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} blkif_be_create_t;
|
||||
u32 status; /* 8 */
|
||||
} PACKED blkif_be_create_t; /* 12 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_BLKIF_BE_DESTROY:
|
||||
@@ -220,11 +225,11 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Identify interface to be destroyed. */
|
||||
unsigned int blkif_handle; /* ...ditto... */
|
||||
domid_t domid; /* 0: Identify interface to be destroyed. */
|
||||
u32 blkif_handle; /* 4: ...ditto... */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} blkif_be_destroy_t;
|
||||
u32 status; /* 8 */
|
||||
} PACKED blkif_be_destroy_t; /* 12 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_BLKIF_BE_CONNECT:
|
||||
@@ -234,13 +239,14 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Domain attached to new interface. */
|
||||
unsigned int blkif_handle; /* Domain-specific interface handle. */
|
||||
unsigned int evtchn; /* Event channel for notifications. */
|
||||
unsigned long shmem_frame; /* Page cont. shared comms window. */
|
||||
domid_t domid; /* 0: Domain attached to new interface. */
|
||||
u32 blkif_handle; /* 4: Domain-specific interface handle. */
|
||||
memory_t shmem_frame; /* 8: Page cont. shared comms window. */
|
||||
MEMORY_PADDING;
|
||||
u32 evtchn; /* 16: Event channel for notifications. */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} blkif_be_connect_t;
|
||||
u32 status; /* 20 */
|
||||
} PACKED blkif_be_connect_t; /* 24 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_BLKIF_BE_DISCONNECT:
|
||||
@@ -250,70 +256,66 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Domain attached to new interface. */
|
||||
unsigned int blkif_handle; /* Domain-specific interface handle. */
|
||||
domid_t domid; /* 0: Domain attached to new interface. */
|
||||
u32 blkif_handle; /* 4: Domain-specific interface handle. */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} blkif_be_disconnect_t;
|
||||
u32 status; /* 8 */
|
||||
} PACKED blkif_be_disconnect_t; /* 12 bytes */
|
||||
|
||||
/* CMSG_BLKIF_BE_VBD_CREATE */
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Identify blkdev interface. */
|
||||
unsigned int blkif_handle; /* ...ditto... */
|
||||
blkif_vdev_t vdevice; /* Interface-specific id for this VBD. */
|
||||
int readonly; /* Non-zero -> VBD isn't writeable. */
|
||||
domid_t domid; /* 0: Identify blkdev interface. */
|
||||
u32 blkif_handle; /* 4: ...ditto... */
|
||||
blkif_vdev_t vdevice; /* 8: Interface-specific id for this VBD. */
|
||||
u16 readonly; /* 10: Non-zero -> VBD isn't writeable. */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} blkif_be_vbd_create_t;
|
||||
u32 status; /* 12 */
|
||||
} PACKED blkif_be_vbd_create_t; /* 16 bytes */
|
||||
|
||||
/* CMSG_BLKIF_BE_VBD_DESTROY */
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Identify blkdev interface. */
|
||||
unsigned int blkif_handle; /* ...ditto... */
|
||||
blkif_vdev_t vdevice; /* Interface-specific id of the VBD. */
|
||||
domid_t domid; /* 0: Identify blkdev interface. */
|
||||
u32 blkif_handle; /* 4: ...ditto... */
|
||||
blkif_vdev_t vdevice; /* 8: Interface-specific id of the VBD. */
|
||||
u16 __pad; /* 10 */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} blkif_be_vbd_destroy_t;
|
||||
u32 status; /* 12 */
|
||||
} PACKED blkif_be_vbd_destroy_t; /* 16 bytes */
|
||||
|
||||
/* CMSG_BLKIF_BE_VBD_GROW */
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Identify blkdev interface. */
|
||||
unsigned int blkif_handle; /* ...ditto... */
|
||||
blkif_vdev_t vdevice; /* Interface-specific id of the VBD. */
|
||||
blkif_extent_t extent; /* Physical extent to append to VBD. */
|
||||
domid_t domid; /* 0: Identify blkdev interface. */
|
||||
u32 blkif_handle; /* 4: ...ditto... */
|
||||
blkif_extent_t extent; /* 8: Physical extent to append to VBD. */
|
||||
blkif_vdev_t vdevice; /* 28: Interface-specific id of the VBD. */
|
||||
u16 __pad; /* 30 */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} blkif_be_vbd_grow_t;
|
||||
u32 status; /* 32 */
|
||||
} PACKED blkif_be_vbd_grow_t; /* 36 bytes */
|
||||
|
||||
/* CMSG_BLKIF_BE_VBD_SHRINK */
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Identify blkdev interface. */
|
||||
unsigned int blkif_handle; /* ...ditto... */
|
||||
blkif_vdev_t vdevice; /* Interface-specific id of the VBD. */
|
||||
domid_t domid; /* 0: Identify blkdev interface. */
|
||||
u32 blkif_handle; /* 4: ...ditto... */
|
||||
blkif_vdev_t vdevice; /* 8: Interface-specific id of the VBD. */
|
||||
u16 __pad; /* 10 */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} blkif_be_vbd_shrink_t;
|
||||
u32 status; /* 12 */
|
||||
} PACKED blkif_be_vbd_shrink_t; /* 16 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_BLKIF_BE_DRIVER_STATUS_CHANGED:
|
||||
* Notify the domain controller that the back-end driver is DOWN or UP.
|
||||
* If the driver goes DOWN while interfaces are still UP, the domain
|
||||
* If the driver goes DOWN while interfaces are still UP, the controller
|
||||
* will automatically send DOWN notifications.
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
unsigned int status; /* BLKIF_DRIVER_STATUS_??? */
|
||||
/* OUT */
|
||||
/*
|
||||
* Tells driver how many interfaces it should expect to immediately
|
||||
* receive notifications about.
|
||||
*/
|
||||
unsigned int nr_interfaces;
|
||||
} blkif_be_driver_status_changed_t;
|
||||
u32 status; /* 0: BLKIF_DRIVER_STATUS_??? */
|
||||
} PACKED blkif_be_driver_status_changed_t; /* 4 bytes */
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@@ -339,11 +341,11 @@ typedef struct {
|
||||
#define NETIF_INTERFACE_STATUS_DISCONNECTED 1 /* Exists but is disconnected. */
|
||||
#define NETIF_INTERFACE_STATUS_CONNECTED 2 /* Exists and is connected. */
|
||||
typedef struct {
|
||||
unsigned int handle;
|
||||
unsigned int status;
|
||||
unsigned int evtchn; /* status == NETIF_INTERFACE_STATUS_CONNECTED */
|
||||
u8 mac[6]; /* status == NETIF_INTERFACE_STATUS_CONNECTED */
|
||||
} netif_fe_interface_status_changed_t;
|
||||
u32 handle; /* 0 */
|
||||
u32 status; /* 4 */
|
||||
u16 evtchn; /* 8: status == NETIF_INTERFACE_STATUS_CONNECTED */
|
||||
u8 mac[6]; /* 10: status == NETIF_INTERFACE_STATUS_CONNECTED */
|
||||
} PACKED netif_fe_interface_status_changed_t; /* 16 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_NETIF_FE_DRIVER_STATUS_CHANGED:
|
||||
@@ -358,14 +360,14 @@ typedef struct {
|
||||
#define NETIF_DRIVER_STATUS_UP 1
|
||||
typedef struct {
|
||||
/* IN */
|
||||
unsigned int status; /* NETIF_DRIVER_STATUS_??? */
|
||||
u32 status; /* 0: NETIF_DRIVER_STATUS_??? */
|
||||
/* OUT */
|
||||
/*
|
||||
* Tells driver how many interfaces it should expect to immediately
|
||||
* receive notifications about.
|
||||
*/
|
||||
unsigned int nr_interfaces;
|
||||
} netif_fe_driver_status_changed_t;
|
||||
u32 nr_interfaces; /* 4 */
|
||||
} PACKED netif_fe_driver_status_changed_t; /* 8 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_NETIF_FE_INTERFACE_CONNECT:
|
||||
@@ -373,10 +375,13 @@ typedef struct {
|
||||
* STATUS_CONNECTED message.
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned int handle;
|
||||
unsigned long tx_shmem_frame;
|
||||
unsigned long rx_shmem_frame;
|
||||
} netif_fe_interface_connect_t;
|
||||
u32 handle; /* 0 */
|
||||
u32 __pad; /* 4 */
|
||||
memory_t tx_shmem_frame; /* 8 */
|
||||
MEMORY_PADDING;
|
||||
memory_t rx_shmem_frame; /* 16 */
|
||||
MEMORY_PADDING;
|
||||
} PACKED netif_fe_interface_connect_t; /* 24 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_NETIF_FE_INTERFACE_DISCONNECT:
|
||||
@@ -384,8 +389,8 @@ typedef struct {
|
||||
* STATUS_DISCONNECTED message.
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned int handle;
|
||||
} netif_fe_interface_disconnect_t;
|
||||
u32 handle; /* 0 */
|
||||
} PACKED netif_fe_interface_disconnect_t; /* 4 bytes */
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@@ -434,12 +439,13 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Domain attached to new interface. */
|
||||
unsigned int netif_handle; /* Domain-specific interface handle. */
|
||||
u8 mac[6];
|
||||
domid_t domid; /* 0: Domain attached to new interface. */
|
||||
u32 netif_handle; /* 4: Domain-specific interface handle. */
|
||||
u8 mac[6]; /* 8 */
|
||||
u16 __pad; /* 14 */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} netif_be_create_t;
|
||||
u32 status; /* 16 */
|
||||
} PACKED netif_be_create_t; /* 20 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_NETIF_BE_DESTROY:
|
||||
@@ -449,11 +455,11 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Identify interface to be destroyed. */
|
||||
unsigned int netif_handle; /* ...ditto... */
|
||||
domid_t domid; /* 0: Identify interface to be destroyed. */
|
||||
u32 netif_handle; /* 4: ...ditto... */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} netif_be_destroy_t;
|
||||
u32 status; /* 8 */
|
||||
} PACKED netif_be_destroy_t; /* 12 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_NETIF_BE_CONNECT:
|
||||
@@ -463,14 +469,17 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Domain attached to new interface. */
|
||||
unsigned int netif_handle; /* Domain-specific interface handle. */
|
||||
unsigned int evtchn; /* Event channel for notifications. */
|
||||
unsigned long tx_shmem_frame; /* Page cont. tx shared comms window. */
|
||||
unsigned long rx_shmem_frame; /* Page cont. rx shared comms window. */
|
||||
domid_t domid; /* 0: Domain attached to new interface. */
|
||||
u32 netif_handle; /* 4: Domain-specific interface handle. */
|
||||
memory_t tx_shmem_frame; /* 8: Page cont. tx shared comms window. */
|
||||
MEMORY_PADDING;
|
||||
memory_t rx_shmem_frame; /* 16: Page cont. rx shared comms window. */
|
||||
MEMORY_PADDING;
|
||||
u16 evtchn; /* 24: Event channel for notifications. */
|
||||
u16 __pad; /* 26 */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} netif_be_connect_t;
|
||||
u32 status; /* 28 */
|
||||
} PACKED netif_be_connect_t; /* 32 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_NETIF_BE_DISCONNECT:
|
||||
@@ -480,11 +489,11 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
domid_t domid; /* Domain attached to new interface. */
|
||||
unsigned int netif_handle; /* Domain-specific interface handle. */
|
||||
domid_t domid; /* 0: Domain attached to new interface. */
|
||||
u32 netif_handle; /* 4: Domain-specific interface handle. */
|
||||
/* OUT */
|
||||
unsigned int status;
|
||||
} netif_be_disconnect_t;
|
||||
u32 status; /* 8 */
|
||||
} PACKED netif_be_disconnect_t; /* 12 bytes */
|
||||
|
||||
/*
|
||||
* CMSG_NETIF_BE_DRIVER_STATUS_CHANGED:
|
||||
@@ -493,14 +502,7 @@ typedef struct {
|
||||
* will automatically send DOWN notifications.
|
||||
*/
|
||||
typedef struct {
|
||||
/* IN */
|
||||
unsigned int status; /* NETIF_DRIVER_STATUS_??? */
|
||||
/* OUT */
|
||||
/*
|
||||
* Tells driver how many interfaces it should expect to immediately
|
||||
* receive notifications about.
|
||||
*/
|
||||
unsigned int nr_interfaces;
|
||||
} netif_be_driver_status_changed_t;
|
||||
u32 status; /* 0: NETIF_DRIVER_STATUS_??? */
|
||||
} PACKED netif_be_driver_status_changed_t; /* 4 bytes */
|
||||
|
||||
#endif /* __DOMAIN_CONTROLLER_H__ */
|
||||
@@ -75,6 +75,8 @@ def daemon_loop():
|
||||
notifier.bind(dom0_port.local_port)
|
||||
port_list[dom0_port.local_port] = dom0_port
|
||||
|
||||
xend.netif.be_port = dom0_port
|
||||
|
||||
##
|
||||
## MAIN LOOP
|
||||
##
|
||||
|
||||
@@ -158,6 +158,7 @@ def new_network_interface(dom, handle=-1):
|
||||
## for the network will only be accepted from this domain.
|
||||
##
|
||||
def set_network_backend(dom):
|
||||
if xend.netif.be_port: xend.netif.recovery = True
|
||||
if xend.netif.be_port.remote_dom != 0:
|
||||
xend.netif.recovery = True
|
||||
xend.netif.be_port = xend.main.port_from_dom(dom)
|
||||
return { 'success' : True }
|
||||
+46
-45
@@ -25,12 +25,10 @@ NETIF_DRIVER_STATUS_UP = 1
|
||||
pendmsg = None
|
||||
pendaddr = None
|
||||
|
||||
recovery = False # Is a recovery in progress? (if so, we'll need to notify guests)
|
||||
recovery = False # Is a recovery in progress?
|
||||
be_port = None # Port object for backend domain
|
||||
|
||||
def backend_tx_req(msg):
|
||||
if not xend.netif.be_port:
|
||||
print "BUG: attempt to transmit request to non-existant netif driver"
|
||||
if xend.netif.be_port.space_to_write_request():
|
||||
xend.netif.be_port.write_request(msg)
|
||||
xend.netif.be_port.notify()
|
||||
@@ -42,7 +40,8 @@ def backend_rx_req(port, msg):
|
||||
subtype = (msg.get_header())['subtype']
|
||||
print "Received netif-be request, subtype %d" % subtype
|
||||
if subtype == CMSG_NETIF_BE_DRIVER_STATUS_CHANGED:
|
||||
(status, dummy) = struct.unpack("II", msg.get_payload())
|
||||
pl = msg.get_payload()
|
||||
status = pl['status']
|
||||
if status == NETIF_DRIVER_STATUS_UP:
|
||||
if xend.netif.recovery:
|
||||
print "New netif backend now UP, notifying guests:"
|
||||
@@ -50,17 +49,13 @@ def backend_rx_req(port, msg):
|
||||
netif = interface.list[netif_key]
|
||||
netif.create()
|
||||
print " Notifying %d" % netif.dom
|
||||
msg = xend.utils.message(CMSG_NETIF_FE, \
|
||||
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0)
|
||||
msg.append_payload(struct.pack("IIIBBBBBBBB", \
|
||||
0,1,0,0,0,0,0,0,0,0,0))
|
||||
netif.ctrlif_tx_req(xend.main.port_from_dom(netif.dom), msg)
|
||||
msg = xend.utils.message(
|
||||
CMSG_NETIF_FE,
|
||||
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0,
|
||||
{ 'handle' : 0, 'status' : 1 })
|
||||
netif.ctrlif_tx_req(xend.main.port_from_dom(netif.dom),msg)
|
||||
print "Done notifying guests"
|
||||
recovery = False
|
||||
else: # No recovery in progress.
|
||||
if xend.netif.be_port: # This should never be true! (remove later)
|
||||
print "BUG: unexpected netif backend UP message from %d" \
|
||||
% port.remote_dom
|
||||
else:
|
||||
print "Unexpected net backend driver status: %d" % status
|
||||
|
||||
@@ -71,17 +66,21 @@ def backend_rx_rsp(port, msg):
|
||||
rsp = { 'success': True }
|
||||
xend.main.send_management_response(rsp, xend.netif.pendaddr)
|
||||
elif subtype == CMSG_NETIF_BE_CONNECT:
|
||||
(dom,hnd,evtchn,tx_frame,rx_frame,st) = \
|
||||
struct.unpack("IIILLI", msg.get_payload())
|
||||
pl = msg.get_payload()
|
||||
(dom, hnd, evtchn, tx_frame, rx_frame, st) = (
|
||||
pl['domid'], pl['netif_handle'], pl['evtchn'],
|
||||
pl['tx_shmem_frame'], pl['rx_shmem_frame'], pl['status'])
|
||||
netif = interface.list[xend.main.port_from_dom(dom).local_port]
|
||||
msg = xend.utils.message(CMSG_NETIF_FE, \
|
||||
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0)
|
||||
msg.append_payload(struct.pack("IIIBBBBBBBB",0,2, \
|
||||
netif.evtchn['port2'], \
|
||||
netif.mac[0],netif.mac[1], \
|
||||
netif.mac[2],netif.mac[3], \
|
||||
netif.mac[4],netif.mac[5], \
|
||||
0,0))
|
||||
msg = xend.utils.message(CMSG_NETIF_FE,
|
||||
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0,
|
||||
{ 'handle' : 0, 'status' : 2,
|
||||
'evtchn' : netif.evtchn['port2'],
|
||||
'mac[0]' : netif.mac[0],
|
||||
'mac[1]' : netif.mac[1],
|
||||
'mac[2]' : netif.mac[2],
|
||||
'mac[3]' : netif.mac[3],
|
||||
'mac[4]' : netif.mac[4],
|
||||
'mac[5]' : netif.mac[5] })
|
||||
netif.ctrlif_tx_req(xend.main.port_list[netif.key], msg)
|
||||
|
||||
def backend_do_work(port):
|
||||
@@ -125,12 +124,14 @@ class interface:
|
||||
def create(self):
|
||||
"""Notify the current network back end to create the virtual interface
|
||||
represented by this object."""
|
||||
msg = xend.utils.message(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE, 0)
|
||||
msg.append_payload(struct.pack("IIBBBBBBBBI",self.dom,0, \
|
||||
self.mac[0],self.mac[1], \
|
||||
self.mac[2],self.mac[3], \
|
||||
self.mac[4],self.mac[5], \
|
||||
0,0,0))
|
||||
msg = xend.utils.message(CMSG_NETIF_BE, CMSG_NETIF_BE_CREATE, 0,
|
||||
{ 'domid' : self.dom, 'netif_handle' : 0,
|
||||
'mac[0]' : self.mac[0],
|
||||
'mac[1]' : self.mac[1],
|
||||
'mac[2]' : self.mac[2],
|
||||
'mac[3]' : self.mac[3],
|
||||
'mac[4]' : self.mac[4],
|
||||
'mac[5]' : self.mac[5] })
|
||||
xend.netif.pendaddr = xend.main.mgmt_req_addr
|
||||
backend_tx_req(msg)
|
||||
|
||||
@@ -138,8 +139,8 @@ class interface:
|
||||
# Completely destroy this interface.
|
||||
def destroy(self):
|
||||
del interface.list[self.key]
|
||||
msg = xend.utils.message(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY, 0)
|
||||
msg.append_payload(struct.pack("III",self.dom,0,0))
|
||||
msg = xend.utils.message(CMSG_NETIF_BE, CMSG_NETIF_BE_DESTROY, 0,
|
||||
{ 'domid' : self.dom, 'netif_handle' : 0 })
|
||||
backend_tx_req(msg)
|
||||
|
||||
|
||||
@@ -164,23 +165,23 @@ class interface:
|
||||
subtype = (msg.get_header())['subtype']
|
||||
if subtype == CMSG_NETIF_FE_DRIVER_STATUS_CHANGED:
|
||||
print "netif driver up message from %d" % port.remote_dom
|
||||
msg = xend.utils.message(CMSG_NETIF_FE, \
|
||||
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0)
|
||||
msg.append_payload(struct.pack("IIIBBBBBBBB",0,1,0,self.mac[0], \
|
||||
self.mac[1],self.mac[2], \
|
||||
self.mac[3],self.mac[4], \
|
||||
self.mac[5],0,0))
|
||||
msg = xend.utils.message(CMSG_NETIF_FE,
|
||||
CMSG_NETIF_FE_INTERFACE_STATUS_CHANGED, 0,
|
||||
{ 'handle' : 0, 'status' : 1 })
|
||||
self.ctrlif_tx_req(port, msg)
|
||||
elif subtype == CMSG_NETIF_FE_INTERFACE_CONNECT:
|
||||
print "netif connect request from %d" % port.remote_dom
|
||||
(hnd,tx_frame,rx_frame) = struct.unpack("ILL", msg.get_payload())
|
||||
pl = msg.get_payload()
|
||||
(hnd, tx_frame, rx_frame) = (pl['handle'], pl['tx_shmem_frame'],
|
||||
pl['rx_shmem_frame'])
|
||||
xc = Xc.new()
|
||||
self.evtchn = xc.evtchn_bind_interdomain( \
|
||||
dom1=xend.netif.be_port.remote_dom, \
|
||||
self.evtchn = xc.evtchn_bind_interdomain(
|
||||
dom1=xend.netif.be_port.remote_dom,
|
||||
dom2=self.dom)
|
||||
msg = xend.utils.message(CMSG_NETIF_BE, \
|
||||
CMSG_NETIF_BE_CONNECT, 0)
|
||||
msg.append_payload(struct.pack("IIILLI",self.dom,0, \
|
||||
self.evtchn['port1'],tx_frame, \
|
||||
rx_frame,0))
|
||||
msg = xend.utils.message(CMSG_NETIF_BE,
|
||||
CMSG_NETIF_BE_CONNECT, 0,
|
||||
{ 'domid' : self.dom, 'netif_handle' : 0,
|
||||
'tx_shmem_frame' : tx_frame,
|
||||
'rx_shmem_frame' : rx_frame,
|
||||
'evtchn' : self.evtchn['port1'] })
|
||||
backend_tx_req(msg)
|
||||
+271
-1
@@ -235,6 +235,23 @@ static PyTypeObject xu_notifier_type = {
|
||||
* *********************** MESSAGE ***********************
|
||||
*/
|
||||
|
||||
#define TYPE(_x,_y) (((_x)<<8)|(_y))
|
||||
#define P2C(_struct, _field, _pytype, _ctype1, _ctype2) \
|
||||
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); \
|
||||
xum->msg.length = sizeof(_struct); \
|
||||
} while ( 0 )
|
||||
#define C2P(_struct, _field, _pytype, _ctype1, _ctype2) \
|
||||
do { \
|
||||
PyObject *obj = Py ## _pytype ## _From ## _ctype1 \
|
||||
(((_struct *)&xum->msg.msg[0])->_field); \
|
||||
PyDict_SetItemString(dict, #_field, obj); \
|
||||
} while ( 0 )
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD;
|
||||
control_msg_t msg;
|
||||
@@ -262,13 +279,157 @@ static PyObject *xu_message_append_payload(PyObject *self, PyObject *args)
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
static PyObject *xu_message_set_response_fields(PyObject *self, PyObject *args)
|
||||
{
|
||||
xu_message_object *xum = (xu_message_object *)self;
|
||||
PyObject *payload;
|
||||
|
||||
if ( !PyArg_ParseTuple(args, "O", &payload) )
|
||||
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);
|
||||
break;
|
||||
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS_CHANGED):
|
||||
P2C(netif_fe_driver_status_changed_t, nr_interfaces, Int, Long, u32);
|
||||
break;
|
||||
}
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
static PyObject *xu_message_get_payload(PyObject *self, PyObject *args)
|
||||
{
|
||||
xu_message_object *xum = (xu_message_object *)self;
|
||||
PyObject *dict;
|
||||
|
||||
if ( !PyArg_ParseTuple(args, "") )
|
||||
return NULL;
|
||||
|
||||
dict = PyDict_New();
|
||||
|
||||
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);
|
||||
return dict;
|
||||
case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_DRIVER_STATUS_CHANGED):
|
||||
C2P(blkif_fe_driver_status_changed_t, status, Int, Long, u32);
|
||||
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);
|
||||
return dict;
|
||||
case TYPE(CMSG_BLKIF_FE, CMSG_BLKIF_FE_INTERFACE_DISCONNECT):
|
||||
C2P(blkif_fe_interface_disconnect_t, handle, Int, Long, u32);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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, extent.sector_start,
|
||||
Long, UnsignedLongLong, blkif_sector_t);
|
||||
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);
|
||||
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);
|
||||
return dict;
|
||||
case TYPE(CMSG_BLKIF_BE, CMSG_BLKIF_BE_DRIVER_STATUS_CHANGED):
|
||||
C2P(blkif_be_driver_status_changed_t, status, Int, Long, u32);
|
||||
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);
|
||||
return dict;
|
||||
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_DRIVER_STATUS_CHANGED):
|
||||
C2P(netif_fe_driver_status_changed_t, status, Int, Long, u32);
|
||||
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);
|
||||
return dict;
|
||||
case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_DISCONNECT):
|
||||
C2P(netif_fe_interface_disconnect_t, handle, Int, Long, u32);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
return dict;
|
||||
case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DRIVER_STATUS_CHANGED):
|
||||
C2P(netif_be_driver_status_changed_t, status, Int, Long, u32);
|
||||
return dict;
|
||||
}
|
||||
|
||||
PyObject_Del(dict); /* didn't use it after all */
|
||||
|
||||
return PyString_FromStringAndSize(xum->msg.msg, xum->msg.length);
|
||||
}
|
||||
|
||||
@@ -315,6 +476,11 @@ static PyMethodDef xu_message_methods[] = {
|
||||
METH_VARARGS,
|
||||
"Append @str to the message payload.\n" },
|
||||
|
||||
{ "set_response_fields",
|
||||
(PyCFunction)xu_message_set_response_fields,
|
||||
METH_VARARGS,
|
||||
"Fill in the response fields in a message that was passed to us.\n" },
|
||||
|
||||
{ "get_payload",
|
||||
(PyCFunction)xu_message_get_payload,
|
||||
METH_VARARGS,
|
||||
@@ -339,8 +505,9 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args)
|
||||
{
|
||||
xu_message_object *xum;
|
||||
int type, subtype, id;
|
||||
PyObject *payload = NULL;
|
||||
|
||||
if ( !PyArg_ParseTuple(args, "iii", &type, &subtype, &id) )
|
||||
if ( !PyArg_ParseTuple(args, "iii|O", &type, &subtype, &id, &payload) )
|
||||
return NULL;
|
||||
|
||||
xum = PyObject_New(xu_message_object, &xu_message_type);
|
||||
@@ -350,7 +517,110 @@ static PyObject *xu_message_new(PyObject *self, PyObject *args)
|
||||
xum->msg.id = id;
|
||||
xum->msg.length = 0;
|
||||
|
||||
if ( payload == NULL )
|
||||
return (PyObject *)xum;
|
||||
|
||||
if ( !PyDict_Check(payload) )
|
||||
{
|
||||
PyErr_SetString(PyExc_TypeError, "payload is not a dictionary");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
||||
return (PyObject *)xum;
|
||||
|
||||
fail:
|
||||
PyObject_Del((PyObject *)xum);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static PyObject *xu_message_getattr(PyObject *obj, char *name)
|
||||
|
||||
@@ -381,26 +381,32 @@ typedef struct shared_info_st
|
||||
#define MAX_CMDLINE 256
|
||||
#define BASIC_START_INFO \
|
||||
/* THE FOLLOWING ARE FILLED IN BOTH ON INITIAL BOOT AND ON RESUME. */ \
|
||||
unsigned long nr_pages; /* total pages allocated to this domain. */ \
|
||||
unsigned long shared_info; /* MACHINE address of shared info struct.*/ \
|
||||
unsigned long flags; /* SIF_xxx flags. */ \
|
||||
memory_t nr_pages; /* 0: Total pages allocated to this domain. */ \
|
||||
_MEMORY_PADDING(A); \
|
||||
memory_t shared_info; /* 8: MACHINE address of shared info struct.*/ \
|
||||
_MEMORY_PADDING(B); \
|
||||
u32 flags; /* 16: SIF_xxx flags. */ \
|
||||
u32 __pad; \
|
||||
/* THE FOLLOWING ARE ONLY FILLED IN ON INITIAL BOOT (NOT RESUME). */ \
|
||||
unsigned long pt_base; /* VIRTUAL address of page directory. */ \
|
||||
unsigned long nr_pt_frames; /* Number of bootstrap p.t. frames. */ \
|
||||
unsigned long mfn_list; /* VIRTUAL address of page-frame list. */ \
|
||||
unsigned long mod_start; /* VIRTUAL address of pre-loaded module. */ \
|
||||
unsigned long mod_len; /* Size (bytes) of pre-loaded module. */ \
|
||||
unsigned char cmd_line[MAX_CMDLINE]
|
||||
memory_t pt_base; /* 24: VIRTUAL address of page directory. */ \
|
||||
_MEMORY_PADDING(C); \
|
||||
memory_t nr_pt_frames; /* 32: Number of bootstrap p.t. frames. */ \
|
||||
_MEMORY_PADDING(D); \
|
||||
memory_t mfn_list; /* 40: VIRTUAL address of page-frame list. */ \
|
||||
_MEMORY_PADDING(E); \
|
||||
memory_t mod_start; /* 48: VIRTUAL address of pre-loaded module. */ \
|
||||
_MEMORY_PADDING(F); \
|
||||
memory_t mod_len; /* 56: Size (bytes) of pre-loaded module. */ \
|
||||
_MEMORY_PADDING(G); \
|
||||
u8 cmd_line[MAX_CMDLINE] /* 64 */
|
||||
|
||||
typedef struct {
|
||||
BASIC_START_INFO;
|
||||
} start_info_t;
|
||||
} PACKED start_info_t; /* 320 bytes */
|
||||
|
||||
/* These flags are passed in the 'flags' field of start_info_t. */
|
||||
#define SIF_PRIVILEGED 1 /* Is the domain privileged? */
|
||||
#define SIF_INITDOMAIN 2 /* Is this the initial control domain? */
|
||||
#define SIF_BLK_BE_DOMAIN 4 /* Is this a block backend domain? */
|
||||
#define SIF_NET_BE_DOMAIN 8 /* Is this a net backend domain? */
|
||||
#define SIF_PRIVILEGED (1<<0) /* Is the domain privileged? */
|
||||
#define SIF_INITDOMAIN (1<<1) /* Is this the initial control domain? */
|
||||
|
||||
/* For use in guest OSes. */
|
||||
extern shared_info_t *HYPERVISOR_shared_info;
|
||||
|
||||