static dbus_bool_t ni_objectmodel_dummy_change(ni_dbus_object_t *object, const ni_dbus_method_t *method, unsigned int argc, const ni_dbus_variant_t *argv, ni_dbus_message_t *reply, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); ni_netdev_t *dev, *cfg; /* we've already checked that argv matches our signature */ ni_assert(argc == 1); if (!(dev = ni_objectmodel_unwrap_netif(object, error)) || !(cfg = __ni_objectmodel_dummy_device_arg(&argv[0]))) { ni_dbus_error_invalid_args(error, object->path, method->name); return FALSE; } cfg->link.ifindex = dev->link.ifindex; if (ni_string_empty(cfg->name)) ni_string_dup(&cfg->name, dev->name); if (ni_netdev_device_is_up(dev)) { ni_debug_objectmodel("Skipping dummy changeDevice call on %s: " "device is up", dev->name); return TRUE; } if (ni_system_dummy_change(nc, dev, cfg) < 0) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to change dummy properties on interface %s", dev->name); return FALSE; } if (cfg->link.hwaddr.type == ARPHRD_VOID) cfg->link.hwaddr.type = ARPHRD_ETHER; if (!ni_link_address_is_invalid(&cfg->link.hwaddr) && ni_system_hwaddr_change(nc, dev, &cfg->link.hwaddr) < 0) { ni_error("Unable to change hwaddr on dummy interface %s", dev->name); /* fail? */ } return TRUE; }
/* * Change a macvlan/macvtap interface */ static dbus_bool_t __ni_objectmodel_macvlan_change(ni_netdev_t *cfg, ni_netdev_t *dev, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); const char *err; ni_macvlan_t *macvlan; const char *dev_iftype = NULL; macvlan = ni_netdev_get_macvlan(cfg); if ((err = ni_macvlan_validate(macvlan))) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "%s", err); return FALSE; } if ((cfg->link.lowerdev.index && (cfg->link.lowerdev.index != dev->link.lowerdev.index)) || (cfg->link.lowerdev.name && !ni_string_eq(cfg->link.lowerdev.name, dev->link.lowerdev.name))) { const char *cfg_iftype = ni_linktype_type_to_name(cfg->link.type); if (cfg->link.lowerdev.name) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "Cannot change %s lower device to %s", cfg_iftype, cfg->link.lowerdev.name); } else { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "Cannot change %s lower device to %u", cfg_iftype, cfg->link.lowerdev.index); } return FALSE; } cfg->link.lowerdev.index = dev->link.lowerdev.index; ni_string_dup(&cfg->link.lowerdev.name, dev->link.lowerdev.name); cfg->link.ifindex = dev->link.ifindex; if (ni_string_empty(cfg->name)) ni_string_dup(&cfg->name, dev->name); dev_iftype = ni_linktype_type_to_name(dev->link.type); if (!macvlan->mode) { macvlan->mode = dev->macvlan->mode; } else if ((macvlan->mode == NI_MACVLAN_MODE_PASSTHRU) != (dev->macvlan->mode == NI_MACVLAN_MODE_PASSTHRU)) { /* Passthrough mode can't be set or cleared dynamically */ dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "Cannot change %s mode to %s", dev_iftype, ni_macvlan_mode_to_name(macvlan->mode)); return FALSE; } if (ni_netdev_device_is_up(dev)) { ni_debug_objectmodel("Skipping %s changeDevice call on %s: " "device is up", dev_iftype, dev->name); return TRUE; } if (ni_system_macvlan_change(nc, dev, cfg) < 0) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to change %s properties on interface %s", dev_iftype, dev->name); return FALSE; } if (cfg->link.hwaddr.type == ARPHRD_VOID) cfg->link.hwaddr.type = ARPHRD_ETHER; if (!ni_link_address_is_invalid(&cfg->link.hwaddr) && ni_system_hwaddr_change(nc, dev, &cfg->link.hwaddr) < 0) { ni_error("Unable to change hwaddr on %s interface %s", dev_iftype, dev->name); /* fail? */ } return TRUE; }
static dbus_bool_t ni_objectmodel_tuntap_change(ni_dbus_object_t *object, const ni_dbus_method_t *method, unsigned int argc, const ni_dbus_variant_t *argv, ni_dbus_message_t *reply, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); ni_netdev_t *dev, *cfg; ni_tuntap_t *tuntap; const char *err; const char *iftype_name; /* we've already checked that argv matches our signature */ ni_assert(argc == 1); if (!(dev = ni_objectmodel_unwrap_netif(object, error)) || !(cfg = __ni_objectmodel_tuntap_device_arg(&argv[0], dev->link.type)) || !(ni_netdev_get_tuntap(dev))) { ni_dbus_error_invalid_args(error, object->path, method->name); return FALSE; } /* changeDevice method is only needed in case of TAP devices */ if (dev->link.type != NI_IFTYPE_TAP) return TRUE; iftype_name = ni_linktype_type_to_name(dev->link.type); tuntap = ni_netdev_get_tuntap(cfg); if ((err = ni_tuntap_validate(tuntap))) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "%s", err); return FALSE; } cfg->link.ifindex = dev->link.ifindex; if (ni_string_empty(cfg->name)) ni_string_dup(&cfg->name, dev->name); if (ni_netdev_device_is_up(dev)) { ni_debug_objectmodel("Skipping %s changeDevice call on %s: " "device is up", iftype_name, dev->name); return TRUE; } if (ni_system_tap_change(nc, dev, cfg) < 0) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to change %s properties on interface %s", iftype_name, dev->name); return FALSE; } if (cfg->link.hwaddr.type == ARPHRD_VOID) cfg->link.hwaddr.type = ARPHRD_ETHER; if (ni_system_hwaddr_change(nc, dev, &cfg->link.hwaddr) < 0) { ni_error("Unable to change hwaddr on %s interface %s", iftype_name, dev->name); /* fail? */ } return TRUE; }