Lines Matching +full:protocol +full:- +full:node

17  *  Contributions after 2012-01-13 are licensed under the terms of the
29 #include "hw/qdev-properties.h"
30 #include "qemu/main-loop.h"
32 #include "hw/xen/xen-legacy-backend.h"
39 /* ------------------------------------------------------------- */
48 int xenstore_write_be_str(struct XenLegacyDevice *xendev, const char *node, in xenstore_write_be_str() argument
51 return xenstore_write_str(xendev->be, node, val); in xenstore_write_be_str()
54 int xenstore_write_be_int(struct XenLegacyDevice *xendev, const char *node, in xenstore_write_be_int() argument
57 return xenstore_write_int(xendev->be, node, ival); in xenstore_write_be_int()
60 int xenstore_write_be_int64(struct XenLegacyDevice *xendev, const char *node, in xenstore_write_be_int64() argument
63 return xenstore_write_int64(xendev->be, node, ival); in xenstore_write_be_int64()
66 char *xenstore_read_be_str(struct XenLegacyDevice *xendev, const char *node) in xenstore_read_be_str() argument
68 return xenstore_read_str(xendev->be, node); in xenstore_read_be_str()
71 int xenstore_read_be_int(struct XenLegacyDevice *xendev, const char *node, in xenstore_read_be_int() argument
74 return xenstore_read_int(xendev->be, node, ival); in xenstore_read_be_int()
77 char *xenstore_read_fe_str(struct XenLegacyDevice *xendev, const char *node) in xenstore_read_fe_str() argument
79 return xenstore_read_str(xendev->fe, node); in xenstore_read_fe_str()
82 int xenstore_read_fe_int(struct XenLegacyDevice *xendev, const char *node, in xenstore_read_fe_int() argument
85 return xenstore_read_int(xendev->fe, node, ival); in xenstore_read_fe_int()
88 int xenstore_read_fe_uint64(struct XenLegacyDevice *xendev, const char *node, in xenstore_read_fe_uint64() argument
91 return xenstore_read_uint64(xendev->fe, node, uval); in xenstore_read_fe_uint64()
94 /* ------------------------------------------------------------- */
104 xen_pv_printf(xendev, 1, "backend state: %s -> %s\n", in xen_be_set_state()
105 xenbus_strstate(xendev->be_state), xenbus_strstate(state)); in xen_be_set_state()
106 xendev->be_state = state; in xen_be_set_state()
113 assert(xendev->ops->flags & DEVOPS_FLAG_NEED_GNTDEV); in xen_be_set_max_grant_refs()
115 if (qemu_xen_gnttab_set_max_grants(xendev->gnttabdev, nr_refs)) { in xen_be_set_max_grant_refs()
126 assert(xendev->ops->flags & DEVOPS_FLAG_NEED_GNTDEV); in xen_be_map_grant_refs()
128 ptr = qemu_xen_gnttab_map_refs(xendev->gnttabdev, nr_refs, xen_domid, refs, in xen_be_map_grant_refs()
142 assert(xendev->ops->flags & DEVOPS_FLAG_NEED_GNTDEV); in xen_be_unmap_grant_refs()
144 if (qemu_xen_gnttab_unmap(xendev->gnttabdev, ptr, refs, nr_refs)) { in xen_be_unmap_grant_refs()
165 xendev = g_malloc0(ops->size); in xen_be_get_xendev()
166 object_initialize(&xendev->qdev, ops->size, TYPE_XENBACKEND); in xen_be_get_xendev()
167 OBJECT(xendev)->free = g_free; in xen_be_get_xendev()
168 qdev_set_id(DEVICE(xendev), g_strdup_printf("xen-%s-%d", type, dev), in xen_be_get_xendev()
173 xendev->type = type; in xen_be_get_xendev()
174 xendev->dom = dom; in xen_be_get_xendev()
175 xendev->dev = dev; in xen_be_get_xendev()
176 xendev->ops = ops; in xen_be_get_xendev()
178 snprintf(xendev->be, sizeof(xendev->be), "backend/%s/%d/%d", in xen_be_get_xendev()
179 xendev->type, xendev->dom, xendev->dev); in xen_be_get_xendev()
180 snprintf(xendev->name, sizeof(xendev->name), "%s-%d", in xen_be_get_xendev()
181 xendev->type, xendev->dev); in xen_be_get_xendev()
183 xendev->debug = debug; in xen_be_get_xendev()
184 xendev->local_port = -1; in xen_be_get_xendev()
186 xendev->evtchndev = qemu_xen_evtchn_open(); in xen_be_get_xendev()
187 if (xendev->evtchndev == NULL) { in xen_be_get_xendev()
192 qemu_set_cloexec(qemu_xen_evtchn_fd(xendev->evtchndev)); in xen_be_get_xendev()
196 if (xendev->ops->alloc) { in xen_be_get_xendev()
197 xendev->ops->alloc(xendev); in xen_be_get_xendev()
206 * Node specifies the changed field. node = NULL means
210 const char *node) in xen_be_backend_changed() argument
212 if (node == NULL || strcmp(node, "online") == 0) { in xen_be_backend_changed()
213 if (xenstore_read_be_int(xendev, "online", &xendev->online) == -1) { in xen_be_backend_changed()
214 xendev->online = 0; in xen_be_backend_changed()
218 if (node) { in xen_be_backend_changed()
219 xen_pv_printf(xendev, 2, "backend update: %s\n", node); in xen_be_backend_changed()
220 if (xendev->ops->backend_changed) { in xen_be_backend_changed()
221 xendev->ops->backend_changed(xendev, node); in xen_be_backend_changed()
227 const char *node) in xen_be_frontend_changed() argument
231 if (node == NULL || strcmp(node, "state") == 0) { in xen_be_frontend_changed()
232 if (xenstore_read_fe_int(xendev, "state", &fe_state) == -1) { in xen_be_frontend_changed()
235 if (xendev->fe_state != fe_state) { in xen_be_frontend_changed()
236 xen_pv_printf(xendev, 1, "frontend state: %s -> %s\n", in xen_be_frontend_changed()
237 xenbus_strstate(xendev->fe_state), in xen_be_frontend_changed()
240 xendev->fe_state = fe_state; in xen_be_frontend_changed()
242 if (node == NULL || strcmp(node, "protocol") == 0) { in xen_be_frontend_changed()
243 g_free(xendev->protocol); in xen_be_frontend_changed()
244 xendev->protocol = xenstore_read_fe_str(xendev, "protocol"); in xen_be_frontend_changed()
245 if (xendev->protocol) { in xen_be_frontend_changed()
246 xen_pv_printf(xendev, 1, "frontend protocol: %s\n", in xen_be_frontend_changed()
247 xendev->protocol); in xen_be_frontend_changed()
251 if (node) { in xen_be_frontend_changed()
252 xen_pv_printf(xendev, 2, "frontend update: %s\n", node); in xen_be_frontend_changed()
253 if (xendev->ops->frontend_changed) { in xen_be_frontend_changed()
254 xendev->ops->frontend_changed(xendev, node); in xen_be_frontend_changed()
262 const char *node; in xenstore_update_fe() local
265 len = strlen(xendev->fe); in xenstore_update_fe()
266 if (strncmp(xendev->fe, watch, len) != 0) { in xenstore_update_fe()
272 node = watch + len + 1; in xenstore_update_fe()
274 xen_be_frontend_changed(xendev, node); in xenstore_update_fe()
278 /* ------------------------------------------------------------- */
285 * Also sets initial state (-> Initializing) when done. Which
286 * only affects the xendev->be_state variable as xenbus should
293 if (xenstore_read_be_int(xendev, "state", &be_state) == -1) { in xen_be_try_setup()
295 return -1; in xen_be_try_setup()
301 return -1; in xen_be_try_setup()
304 xendev->fe = xenstore_read_be_str(xendev, "frontend"); in xen_be_try_setup()
305 if (xendev->fe == NULL) { in xen_be_try_setup()
307 return -1; in xen_be_try_setup()
311 xendev->watch = qemu_xen_xs_watch(xenstore, xendev->fe, xenstore_update_fe, in xen_be_try_setup()
313 if (!xendev->watch) { in xen_be_try_setup()
315 xendev->fe); in xen_be_try_setup()
316 return -1; in xen_be_try_setup()
327 * without synchronizing with the frontend. Fakes hotplug-status. No
337 if (!xendev->online) { in xen_be_try_init()
339 return -1; in xen_be_try_init()
342 if (xendev->ops->init) { in xen_be_try_init()
343 rc = xendev->ops->init(xendev); in xen_be_try_init()
350 xenstore_write_be_str(xendev, "hotplug-status", "connected"); in xen_be_try_init()
366 if (xendev->fe_state != XenbusStateInitialised && in xen_be_try_initialise()
367 xendev->fe_state != XenbusStateConnected) { in xen_be_try_initialise()
368 if (xendev->ops->flags & DEVOPS_FLAG_IGNORE_STATE) { in xen_be_try_initialise()
372 return -1; in xen_be_try_initialise()
376 if (xendev->ops->flags & DEVOPS_FLAG_NEED_GNTDEV) { in xen_be_try_initialise()
377 xendev->gnttabdev = qemu_xen_gnttab_open(); in xen_be_try_initialise()
378 if (xendev->gnttabdev == NULL) { in xen_be_try_initialise()
380 return -1; in xen_be_try_initialise()
383 xendev->gnttabdev = NULL; in xen_be_try_initialise()
386 if (xendev->ops->initialise) { in xen_be_try_initialise()
387 rc = xendev->ops->initialise(xendev); in xen_be_try_initialise()
405 if (!xendev->ops->connected) { in xen_be_try_connected()
409 if (xendev->fe_state != XenbusStateConnected) { in xen_be_try_connected()
410 if (xendev->ops->flags & DEVOPS_FLAG_IGNORE_STATE) { in xen_be_try_connected()
418 xendev->ops->connected(xendev); in xen_be_try_connected()
429 if (xendev->be_state != XenbusStateClosing && in xen_be_disconnect()
430 xendev->be_state != XenbusStateClosed && in xen_be_disconnect()
431 xendev->ops->disconnect) { in xen_be_disconnect()
432 xendev->ops->disconnect(xendev); in xen_be_disconnect()
434 if (xendev->gnttabdev) { in xen_be_disconnect()
435 qemu_xen_gnttab_close(xendev->gnttabdev); in xen_be_disconnect()
436 xendev->gnttabdev = NULL; in xen_be_disconnect()
438 if (xendev->be_state != state) { in xen_be_disconnect()
448 if (xendev->fe_state != XenbusStateInitialising) { in xen_be_try_reset()
449 return -1; in xen_be_try_reset()
452 xen_pv_printf(xendev, 1, "device reset (for re-connect)\n"); in xen_be_try_reset()
465 if (xendev->fe_state == XenbusStateClosing || in xen_be_check_state()
466 xendev->fe_state == XenbusStateClosed) { in xen_be_check_state()
467 xen_be_disconnect(xendev, xendev->fe_state); in xen_be_check_state()
473 switch (xendev->be_state) { in xen_be_check_state()
484 /* xendev->be_state doesn't change */ in xen_be_check_state()
486 rc = -1; in xen_be_check_state()
492 rc = -1; in xen_be_check_state()
500 /* ------------------------------------------------------------- */
515 len = snprintf(path, sizeof(path), "backend/%s/%d", be->type, be->dom); in xenstore_update_be()
522 dev = -1; in xenstore_update_be()
525 if (dev == -1) { in xenstore_update_be()
529 xendev = xen_be_get_xendev(be->type, be->dom, dev, be->ops); in xenstore_update_be()
531 bepath = qemu_xen_xs_read(xenstore, 0, xendev->be, &len); in xenstore_update_be()
551 be->type = type; in xenstore_scan()
552 be->dom = dom; in xenstore_scan()
553 be->ops = ops; in xenstore_scan()
558 return -1; in xenstore_scan()
577 /* -------------------------------------------------------------------- */
603 xen_sysbus = qbus_new(TYPE_XENSYSBUS, xen_sysdev, "xen-sysbus"); in xen_be_init()
613 snprintf(path, sizeof(path), "device-model/%u/backends/%s", xen_domid, in xen_be_register()
622 if (xendev->local_port != -1) { in xen_be_bind_evtchn()
625 xendev->local_port = qemu_xen_evtchn_bind_interdomain in xen_be_bind_evtchn()
626 (xendev->evtchndev, xendev->dom, xendev->remote_port); in xen_be_bind_evtchn()
627 if (xendev->local_port == -1) { in xen_be_bind_evtchn()
629 return -1; in xen_be_bind_evtchn()
631 xen_pv_printf(xendev, 2, "bind evtchn port %d\n", xendev->local_port); in xen_be_bind_evtchn()
632 qemu_set_fd_handler(qemu_xen_evtchn_fd(xendev->evtchndev), in xen_be_bind_evtchn()
647 set_bit(DEVICE_CATEGORY_MISC, dc->categories); in xendev_class_init()
648 /* xen-backend devices can be plugged/unplugged dynamically */ in xendev_class_init()
649 dc->user_creatable = true; in xendev_class_init()
650 dc->bus_type = TYPE_XENSYSBUS; in xendev_class_init()
664 hc->unplug = qdev_simple_device_unplug_cb; in xen_sysbus_class_init()