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; }
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; }
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); }
/* * 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; }
/* * 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; }
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; }