/* * InfinibandChild.Factory.newDevice: * Create a new infiniband child interface */ static ni_netdev_t * __ni_objectmodel_ib_newchild(ni_netdev_t *cfg, const char *ifname, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); ni_netdev_t *dev = NULL; const ni_infiniband_t *ib; const char *err; int rv; ib = ni_netdev_get_infiniband(cfg); if ((err = ni_infiniband_validate(NI_IFTYPE_INFINIBAND_CHILD, ib, &cfg->link.lowerdev)) != NULL) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "%s", err); return NULL; } if (ni_string_empty(ifname)) { if (ni_string_empty(cfg->name) && !ni_string_printf(&cfg->name, "%s.%04x", cfg->link.lowerdev.name, ib->pkey)) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create infiniband child: " "name argument missed, failed to construct"); return NULL; } ifname = NULL; } else if (!ni_string_eq(cfg->name, ifname)) { ni_string_dup(&cfg->name, ifname); } if (ni_string_eq(cfg->name, cfg->link.lowerdev.name)) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "Cannot to create infiniband child: " "child name %s equal with parent device name", cfg->name); return NULL; } if ((rv = ni_system_infiniband_child_create(nc, cfg, &dev)) < 0) { if (rv != -NI_ERROR_DEVICE_EXISTS || !dev || (ifname && dev && !ni_string_eq(ifname, dev->name))) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create infiniband child interface: %s", ni_strerror(rv)); return NULL; } } if (dev && dev->link.type != NI_IFTYPE_INFINIBAND_CHILD) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create infiniband child interface %s: it exists with type %s", cfg->name, ni_linktype_type_to_name(dev->link.type)); return NULL; } return dev; }
static ni_infiniband_t * __ni_objectmodel_infiniband_handle(const ni_dbus_object_t *object, ni_bool_t write_access, DBusError *error) { ni_netdev_t *dev; ni_infiniband_t *ib; if (!(dev = ni_objectmodel_unwrap_netif(object, error))) return NULL; if (!write_access) return dev->infiniband; if (!(ib = ni_netdev_get_infiniband(dev))) { dbus_set_error(error, DBUS_ERROR_FAILED, "Error getting infiniband handle for interface"); return NULL; } return ib; }
static ni_bool_t __ni_compat_generate_infiniband(xml_node_t *ifnode, const ni_compat_netdev_t *compat) { ni_infiniband_t *ib = ni_netdev_get_infiniband(compat->dev); xml_node_t *child; const char *value; char *pkey = NULL; switch (compat->dev->link.type) { case NI_IFTYPE_INFINIBAND: value = "infiniband"; break; case NI_IFTYPE_INFINIBAND_CHILD: value = "infiniband-child"; break; default: return FALSE; } if (!(child = xml_node_new(value, ifnode))) return FALSE; if ((value = ni_infiniband_get_mode_name(ib->mode))) xml_node_new_element("mode", child, value); if ((value = ni_infiniband_get_umcast_name(ib->umcast))) xml_node_new_element("multicast", child, value); if (ib->parent.name) { if (!ni_string_printf(&pkey, "0x%04x", ib->pkey)) return FALSE; xml_node_new_element("parent", child, ib->parent.name); xml_node_new_element("pkey", child, pkey); ni_string_free(&pkey); } return TRUE; }