From bb4164c7e4319320c4c13998071409414d48b2ff Mon Sep 17 00:00:00 2001 From: Joao Martins Date: Thu, 11 Oct 2018 11:39:06 -0400 Subject: [PATCH] hw/xen/devconfig: refactor API for creating vbd/nic This allows a device to create devices and point out the backend id and type. Which consequently will allow orchestration via driver domains, via qemu or via hypervisor. Signed-off-by: Joao Martins --- hw/xen/xen_devconfig.c | 93 ++++++++++++++++++++--------- hw/xen/xen_pvdev.c | 10 +++- include/hw/xen/xen-legacy-backend.h | 13 ++++ 3 files changed, 87 insertions(+), 29 deletions(-) diff --git a/hw/xen/xen_devconfig.c b/hw/xen/xen_devconfig.c index 315dbc9c51..a33a943cc0 100644 --- a/hw/xen/xen_devconfig.c +++ b/hw/xen/xen_devconfig.c @@ -5,8 +5,8 @@ /* ------------------------------------------------------------- */ -static int xen_config_dev_dirs(const char *ftype, const char *btype, int vdev, - char *fe, char *be, int len) +static int xen_config_dev_dirs(const char *ftype, const char *btype, int be_id, + int vdev, char *fe, char *be, int len) { char *dom; @@ -14,23 +14,23 @@ static int xen_config_dev_dirs(const char *ftype, const char *btype, int vdev, snprintf(fe, len, "%s/device/%s/%d", dom, ftype, vdev); free(dom); - dom = xs_get_domain_path(xenstore, 0); + dom = xs_get_domain_path(xenstore, be_id); snprintf(be, len, "%s/backend/%s/%d/%d", dom, btype, xen_domid, vdev); free(dom); - xenstore_mkdir(fe, XS_PERM_READ | XS_PERM_WRITE); - xenstore_mkdir(be, XS_PERM_READ); + xenstore_mkdir_other(fe, be_id, XS_PERM_READ | XS_PERM_WRITE); + xenstore_mkdir_other(be, be_id, XS_PERM_READ); return 0; } -static int xen_config_dev_all(char *fe, char *be) +static int xen_config_dev_all(char *fe, char *be, int be_id) { /* frontend */ if (xen_protocol) xenstore_write_str(fe, "protocol", xen_protocol); xenstore_write_int(fe, "state", XenbusStateInitialising); - xenstore_write_int(fe, "backend-id", 0); + xenstore_write_int(fe, "backend-id", be_id); xenstore_write_str(fe, "backend", be); /* backend */ @@ -45,7 +45,7 @@ static int xen_config_dev_all(char *fe, char *be) /* ------------------------------------------------------------- */ -int xen_config_dev_blk(DriveInfo *disk) +static int __xen_config_dev_blk(DriveInfo *disk, XenBackendType *bk) { char fe[256], be[256], device_name[32]; int vdev = 202 * 256 + 16 * disk->unit; @@ -57,7 +57,7 @@ int xen_config_dev_blk(DriveInfo *disk) snprintf(device_name, sizeof(device_name), "xvd%c", 'a' + disk->unit); xen_pv_printf(NULL, 1, "config disk %d [%s]: %s\n", disk->unit, device_name, filename); - xen_config_dev_dirs("vbd", "qdisk", vdev, fe, be, sizeof(fe)); + xen_config_dev_dirs("vbd", bk->type, bk->domid, vdev, fe, be, sizeof(fe)); /* frontend */ xenstore_write_int(fe, "virtual-device", vdev); @@ -70,12 +70,46 @@ int xen_config_dev_blk(DriveInfo *disk) xenstore_write_str(be, "mode", mode); /* common stuff */ - return xen_config_dev_all(fe, be); + return xen_config_dev_all(fe, be, 0); } -int xen_config_dev_nic(NICInfo *nic) +int xen_config_dev_blk(DriveInfo *disk) +{ + char type[16] = "qdisk"; + XenBackendType be = { .type = type, .domid = 0 }; + + return __xen_config_dev_blk(disk, &be); +} + +int xen_config_dev_blk_by_conf(DriveInfo *disk, XenBackendType *be) +{ + return __xen_config_dev_blk(disk, be); +} + +static int __xen_config_dev_nic(char *mac, int dev_id, XenBackendType *bk) { char fe[256], be[256]; + + xen_pv_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", dev_id, mac); + xen_config_dev_dirs("vif", bk->type, bk->domid, dev_id, fe, be, sizeof(fe)); + + /* frontend */ + xenstore_write_int(fe, "handle", dev_id); + xenstore_write_str(fe, "mac", mac); + + /* backend */ + xenstore_write_str(be, "script", ""); + xenstore_write_int(be, "handle", dev_id); + xenstore_write_str(be, "mac", mac); + + /* common stuff */ + return xen_config_dev_all(fe, be, bk->domid); +} + +int xen_config_dev_nic(NICInfo *nic) +{ + char type[16] = "qnic"; + XenBackendType be = { .type = type, .domid = 0 }; char mac[20]; int vlan_id = -1; @@ -83,46 +117,51 @@ int xen_config_dev_nic(NICInfo *nic) snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x", nic->macaddr.a[0], nic->macaddr.a[1], nic->macaddr.a[2], nic->macaddr.a[3], nic->macaddr.a[4], nic->macaddr.a[5]); - xen_pv_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", vlan_id, mac); - xen_config_dev_dirs("vif", "qnic", vlan_id, fe, be, sizeof(fe)); - /* frontend */ - xenstore_write_int(fe, "handle", vlan_id); - xenstore_write_str(fe, "mac", mac); + return __xen_config_dev_nic(mac, vlan_id, &be); +} - /* backend */ - xenstore_write_int(be, "handle", vlan_id); - xenstore_write_str(be, "mac", mac); +int xen_config_dev_nic_by_conf(NetClientState *netdev, MACAddr macaddr, + XenBackendType *be) +{ + static int dev_id = -1; + char mac[20]; - /* common stuff */ - return xen_config_dev_all(fe, be); + dev_id++; + + snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x", + macaddr.a[0], macaddr.a[1], macaddr.a[2], + macaddr.a[3], macaddr.a[4], macaddr.a[5]); + xen_pv_printf(NULL, 1, "config nic %d: mac=\"%s\"\n", dev_id, mac); + + return __xen_config_dev_nic(mac, dev_id, be); } int xen_config_dev_vfb(int vdev, const char *type) { char fe[256], be[256]; - xen_config_dev_dirs("vfb", "vfb", vdev, fe, be, sizeof(fe)); + xen_config_dev_dirs("vfb", "vfb", 0, vdev, fe, be, sizeof(fe)); /* backend */ xenstore_write_str(be, "type", type); /* common stuff */ - return xen_config_dev_all(fe, be); + return xen_config_dev_all(fe, be, 0); } int xen_config_dev_vkbd(int vdev) { char fe[256], be[256]; - xen_config_dev_dirs("vkbd", "vkbd", vdev, fe, be, sizeof(fe)); - return xen_config_dev_all(fe, be); + xen_config_dev_dirs("vkbd", "vkbd", 0, vdev, fe, be, sizeof(fe)); + return xen_config_dev_all(fe, be, 0); } int xen_config_dev_console(int vdev) { char fe[256], be[256]; - xen_config_dev_dirs("console", "console", vdev, fe, be, sizeof(fe)); - return xen_config_dev_all(fe, be); + xen_config_dev_dirs("console", "console", 0, vdev, fe, be, sizeof(fe)); + return xen_config_dev_all(fe, be, 0); } diff --git a/hw/xen/xen_pvdev.c b/hw/xen/xen_pvdev.c index e9c2ca0159..47a05fae46 100644 --- a/hw/xen/xen_pvdev.c +++ b/hw/xen/xen_pvdev.c @@ -57,11 +57,12 @@ void xen_config_cleanup(void) } } -int xenstore_mkdir(char *path, int p) +int xenstore_mkdir_other(char *path, int domid, int p) { struct xs_permissions perms[2] = { { - .id = 0, /* set owner: dom0 */ + .id = domid, /* set owner: dom0 */ + .perms = XS_PERM_READ | XS_PERM_WRITE, }, { .id = xen_domid, .perms = p, @@ -81,6 +82,11 @@ int xenstore_mkdir(char *path, int p) return 0; } +int xenstore_mkdir(char *path, int p) +{ + return xenstore_mkdir_other(path, 0, p); +} + int xenstore_write_str(const char *base, const char *node, const char *val) { char abspath[XEN_BUFSIZE]; diff --git a/include/hw/xen/xen-legacy-backend.h b/include/hw/xen/xen-legacy-backend.h index 901edbc272..8117b98318 100644 --- a/include/hw/xen/xen-legacy-backend.h +++ b/include/hw/xen/xen-legacy-backend.h @@ -25,6 +25,7 @@ extern BusState *xen_sysbus; extern XenEvtchnHandler *xen_legacy_handler; int xenstore_mkdir(char *path, int p); +int xenstore_mkdir_other(char *path, int be_id, int p); int xenstore_write_be_str(struct XenLegacyDevice *xendev, const char *node, const char *val); int xenstore_write_be_int(struct XenLegacyDevice *xendev, const char *node, @@ -116,10 +117,22 @@ extern struct XenDevOps xen_netdev_ops; /* xen_nic.c */ extern struct XenDevOps xen_usb_ops; /* xen-usb.c */ #endif +typedef struct XenBackendType { + char *type; + uint16_t domid; +} XenBackendType; + +#define DEFINE_XEN_PROPERTIES(_state, _conf) \ + DEFINE_PROP_STRING("backendtype", _state, _conf.type), \ + DEFINE_PROP_UINT16("backend", _state, _conf.domid, 0) + /* configuration (aka xenbus setup) */ void xen_config_cleanup(void); int xen_config_dev_blk(DriveInfo *disk); +int xen_config_dev_blk_by_conf(DriveInfo *disk, XenBackendType *be); int xen_config_dev_nic(NICInfo *nic); +int xen_config_dev_nic_by_conf(NetClientState *netdev, MACAddr macaddr, + XenBackendType *be); int xen_config_dev_vfb(int vdev, const char *type); int xen_config_dev_vkbd(int vdev); int xen_config_dev_console(int vdev); -- 2.50.1