/* * Helper function to obtain bridge config from dbus object */ static ni_bridge_t * __ni_objectmodel_bridge_handle(const ni_dbus_object_t *object, ni_bool_t write_access, DBusError *error) { ni_netdev_t *dev = ni_objectmodel_unwrap_netif(object, error); ni_bridge_t *bridge; if (!(dev = ni_objectmodel_unwrap_netif(object, error))) return NULL; if (!write_access) return dev->bridge; if (!(bridge = ni_netdev_get_bridge(dev))) { dbus_set_error(error, DBUS_ERROR_FAILED, "Error getting bridge handle for interface"); return NULL; } return bridge; }
static ni_netdev_t * __ni_objectmodel_bridge_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); ni_netdev_t *new_ifp = NULL; const ni_bridge_t *bridge; int rv; bridge = ni_netdev_get_bridge(cfg_ifp); if (ifname == NULL && !(ifname = ni_netdev_make_name(nc, "br", 0))) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create bridging interface - too many interfaces"); goto out; } ni_string_dup(&cfg_ifp->name, ifname); if ((rv = ni_system_bridge_create(nc, cfg_ifp->name, bridge, &new_ifp)) < 0) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create bridging interface: %s", ni_strerror(rv)); new_ifp = NULL; goto out; } if (new_ifp->link.type != NI_IFTYPE_BRIDGE) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create bridging interface: new interface is of type %s", ni_linktype_type_to_name(new_ifp->link.type)); new_ifp = NULL; } out: if (cfg_ifp) ni_netdev_put(cfg_ifp); return new_ifp; }
static ni_bool_t __ni_compat_generate_bridge(xml_node_t *ifnode, const ni_compat_netdev_t *compat) { ni_bridge_t *bridge; xml_node_t *child; xml_node_t *ports; unsigned int i; char *tmp = NULL; bridge = ni_netdev_get_bridge(compat->dev); child = xml_node_create(ifnode, "bridge"); xml_node_new_element("stp", child, bridge->stp ? "true" : "false"); if (bridge->priority != NI_BRIDGE_VALUE_NOT_SET && ni_string_printf(&tmp, "%u", bridge->priority)) { xml_node_new_element("priority", child, tmp); ni_string_free(&tmp); } if (bridge->forward_delay != NI_BRIDGE_VALUE_NOT_SET && ni_string_printf(&tmp, "%.2f", bridge->forward_delay)) { xml_node_new_element("forward-delay", child, tmp); ni_string_free(&tmp); } if (bridge->ageing_time != NI_BRIDGE_VALUE_NOT_SET && ni_string_printf(&tmp, "%.2f", bridge->ageing_time)) { xml_node_new_element("aging-time", child, tmp); ni_string_free(&tmp); } if (bridge->hello_time != NI_BRIDGE_VALUE_NOT_SET && ni_string_printf(&tmp, "%.2f", bridge->hello_time)) { xml_node_new_element("hello-time", child, tmp); ni_string_free(&tmp); } if (bridge->max_age != NI_BRIDGE_VALUE_NOT_SET && ni_string_printf(&tmp, "%.2f", bridge->max_age)) { xml_node_new_element("max-age", child, tmp); ni_string_free(&tmp); } ports = xml_node_new("ports", child); for (i = 0; i < bridge->ports.count; ++i) { const ni_bridge_port_t *port = bridge->ports.data[i]; xml_node_t *portnode = xml_node_new("port", ports); xml_node_new_element("device", portnode, port->ifname); if (port->priority != NI_BRIDGE_VALUE_NOT_SET && ni_string_printf(&tmp, "%u", port->priority)) { xml_node_new_element("priority", portnode, tmp); ni_string_free(&tmp); } if (port->path_cost != NI_BRIDGE_VALUE_NOT_SET && ni_string_printf(&tmp, "%u", port->path_cost)) { xml_node_new_element("path-cost", portnode, tmp); ni_string_free(&tmp); } } return TRUE; }