Ejemplo n.º 1
0
static dbus_bool_t
ni_objectmodel_gre_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_gre_t *gre;
	const char *err;

	/* we've already checked that argv matches our signature */
	ni_assert(argc == 1);

	if (!(dev = ni_objectmodel_unwrap_netif(object, error)) ||
		!(cfg = __ni_objectmodel_gre_device_arg(&argv[0])) ||
		!(ni_netdev_get_gre(dev))) {
		ni_dbus_error_invalid_args(error, object->path, method->name);
		return FALSE;
	}

	gre = ni_netdev_get_gre(cfg);
	if ((err = ni_gre_validate(gre))) {
		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 gre changeDevice call on %s: "
				"device is up", dev->name);
		return TRUE;
	}

	if (!ni_string_empty(cfg->link.lowerdev.name) &&
	    !ni_objectmodel_bind_netdev_ref_index(cfg->name, "gre tunnel",
					&cfg->link.lowerdev, nc, error))
		return FALSE;

	if (ni_system_tunnel_change(nc, dev, cfg) < 0) {
		dbus_set_error(error,
			DBUS_ERROR_FAILED,
			"Unable to change gre properties on interface %s",
			dev->name);
		return FALSE;
	}

	return TRUE;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
void
ni_netdev_discover_client_state(ni_netdev_t *dev)
{
	ni_fsm_state_t state = NI_FSM_STATE_DEVICE_EXISTS;
	ni_client_state_t *cs;

	if (!dev)
		return;

	if (ni_netdev_device_is_up(dev))
		state = NI_FSM_STATE_DEVICE_UP;
	if (ni_netdev_link_is_up(dev))
		state = NI_FSM_STATE_LINK_UP;
	if (ni_netdev_network_is_up(dev))
		state = NI_FSM_STATE_LINK_UP;

	cs = ni_client_state_new(state);

	ni_netdev_set_client_state(dev, cs);
}
Ejemplo n.º 4
0
/*
 * 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;
}
Ejemplo n.º 5
0
/*
 * Initiate a network scan
 */
int
__ni_wireless_do_scan(ni_netdev_t *dev)
{
	ni_wpa_interface_t *wpa_dev;
	ni_wireless_t *wlan;
	ni_wireless_scan_t *scan;
	time_t now;

	wlan = dev->wireless;
	if ((scan = wlan->scan) == NULL) {
		ni_error("%s: no wireless scan handle?!", __func__);
		return -1;
	}

	/* (Re-)arm the scan timer */
	__ni_wireless_scan_timer_arm(scan, dev, scan->interval);

	/* If the device is down, we cannot scan */
	if (!ni_netdev_device_is_up(dev))
		return 0;

	if (ni_rfkill_disabled(NI_RFKILL_TYPE_WIRELESS))
		return -NI_ERROR_RADIO_DISABLED;
	if (!(wpa_dev = ni_wireless_bind_supplicant(dev)))
		return -1;

	wlan->capabilities = wpa_dev->capabilities;

	/* We currently don't have a reasonable way to call back
	 * to a higher level from the depths of the wpa-supplicant
	 * code. Thus we have to result to polling here :-(
	 */
	if (ni_wpa_interface_scan_in_progress(wpa_dev)) {
		__ni_wireless_scan_timer_arm(scan, dev, 1);
		return 0;
	}

	/* Retrieve whatever is there. */
	if (ni_wpa_interface_retrieve_scan(wpa_dev, scan)) {
		ni_netconfig_t *nc = ni_global_state_handle(0);

		ni_debug_wireless("%s: list of networks changed", dev->name);
		__ni_netdev_event(nc, dev, NI_EVENT_LINK_SCAN_UPDATED);
	}

	/* If we haven't seen a scan in a long time, request one. */
	now = time(NULL);
	if (scan->timestamp + scan->interval < now) {
		/* We can do this only if the device is up */
		if (dev->link.ifflags & NI_IFF_DEVICE_UP) {
			if (scan->timestamp)
				ni_debug_wireless("%s: requesting wireless scan (last scan was %u seconds ago)",
						dev->name, (unsigned int) (now - scan->timestamp));
			else
				ni_debug_wireless("%s: requesting wireless scan", dev->name);
			ni_wpa_interface_request_scan(wpa_dev, scan);
		}
	}

	return 0;
}
Ejemplo n.º 6
0
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;
}