static gboolean device_entry_parse (NmtDeviceEntry *deventry, const char *text, char **interface_name, char **mac_address) { NmtDeviceEntryPrivate *priv = NMT_DEVICE_ENTRY_GET_PRIVATE (deventry); guint8 buf[NM_UTILS_HWADDR_LEN_MAX]; char **words; int len; *interface_name = *mac_address = NULL; if (!*text) return TRUE; if (priv->hardware_type == G_TYPE_NONE && !priv->device_filter) { if (nm_utils_iface_valid_name (text)) { *interface_name = g_strdup (text); return TRUE; } else return FALSE; } words = g_strsplit (text, " ", -1); if (g_strv_length (words) > 2) { g_strfreev (words); return FALSE; } if (words[1]) { len = strlen (words[1]); if (len < 3 || words[1][0] != '(' || words[1][len - 1] != ')') goto fail; memmove (words[1], words[1] + 1, len - 2); words[1][len - 2] = '\0'; } len = nm_utils_hwaddr_len (priv->arptype); if ( nm_utils_hwaddr_aton (words[0], buf, len) && (!words[1] || nm_utils_iface_valid_name (words[1]))) { *mac_address = words[0]; *interface_name = NULL; g_free (words); return TRUE; } else if ( nm_utils_iface_valid_name (words[0]) && (!words[1] || nm_utils_hwaddr_aton (words[1], buf, len))) { *interface_name = words[0]; *mac_address = NULL; g_free (words); return TRUE; } fail: g_strfreev (words); return FALSE; }
static void set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { NMDeviceBtPrivate *priv = NM_DEVICE_BT_GET_PRIVATE (object); switch (prop_id) { case PROP_HW_ADDRESS: /* Construct only */ priv->bdaddr = g_ascii_strup (g_value_get_string (value), -1); if (!nm_utils_hwaddr_aton (priv->bdaddr, ARPHRD_ETHER, &priv->hw_addr)) nm_log_err (LOGD_HW, "Failed to convert BT address '%s'", priv->bdaddr); break; case PROP_BT_NAME: /* Construct only */ priv->name = g_value_dup_string (value); break; case PROP_BT_CAPABILITIES: /* Construct only */ priv->capabilities = g_value_get_uint (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static gboolean connection_compatible (NMDevice *device, NMConnection *connection, GError **error) { NMSettingConnection *s_con; NMSettingInfiniband *s_infiniband; const char *ctype, *hwaddr_str; const GByteArray *mac; guint8 *hwaddr, hwaddr_buf[INFINIBAND_ALEN]; s_con = nm_connection_get_setting_connection (connection); g_assert (s_con); ctype = nm_setting_connection_get_connection_type (s_con); if (strcmp (ctype, NM_SETTING_INFINIBAND_SETTING_NAME) != 0) { g_set_error (error, NM_DEVICE_INFINIBAND_ERROR, NM_DEVICE_INFINIBAND_ERROR_NOT_INFINIBAND_CONNECTION, "The connection was not a InfiniBand connection."); return FALSE; } s_infiniband = nm_connection_get_setting_infiniband (connection); if (!s_infiniband) { g_set_error (error, NM_DEVICE_INFINIBAND_ERROR, NM_DEVICE_INFINIBAND_ERROR_INVALID_INFINIBAND_CONNECTION, "The connection was not a valid InfiniBand connection."); return FALSE; } hwaddr_str = nm_device_infiniband_get_hw_address (NM_DEVICE_INFINIBAND (device)); if (hwaddr_str) { hwaddr = nm_utils_hwaddr_aton (hwaddr_str, ARPHRD_INFINIBAND, hwaddr_buf); if (!hwaddr) { g_set_error (error, NM_DEVICE_INFINIBAND_ERROR, NM_DEVICE_INFINIBAND_ERROR_INVALID_DEVICE_MAC, "Invalid device MAC address."); return FALSE; } mac = nm_setting_infiniband_get_mac_address (s_infiniband); /* We only match against the last 8 bytes */ if (mac && hwaddr && memcmp (mac->data + INFINIBAND_ALEN - 8, hwaddr + INFINIBAND_ALEN - 8, 8)) { g_set_error (error, NM_DEVICE_INFINIBAND_ERROR, NM_DEVICE_INFINIBAND_ERROR_MAC_MISMATCH, "The MACs of the device and the connection didn't match."); return FALSE; } } return NM_DEVICE_CLASS (nm_device_infiniband_parent_class)->connection_compatible (device, connection, error); }
static gboolean validate (CEPage *page, NMConnection *connection, GError **error) { CEPageInfiniband *self = CE_PAGE_INFINIBAND (page); CEPageInfinibandPrivate *priv = CE_PAGE_INFINIBAND_GET_PRIVATE (self); GtkWidget *entry; char buf[INFINIBAND_ALEN]; const char *hwaddr; entry = gtk_bin_get_child (GTK_BIN (priv->device_mac)); hwaddr = gtk_entry_get_text (GTK_ENTRY (entry)); if (hwaddr && *hwaddr && !nm_utils_hwaddr_aton (hwaddr, ARPHRD_INFINIBAND, buf)) return FALSE; ui_to_setting (self); return nm_setting_verify (NM_SETTING (priv->setting), NULL, error); }
static gboolean create_and_realize (NMDevice *device, NMConnection *connection, NMDevice *parent, const NMPlatformLink **out_plink, GError **error) { NMSettingBridge *s_bridge; const char *iface = nm_device_get_iface (device); const char *hwaddr; guint8 mac_address[NM_UTILS_HWADDR_LEN_MAX]; NMPlatformError plerr; g_assert (iface); s_bridge = nm_connection_get_setting_bridge (connection); g_assert (s_bridge); hwaddr = nm_setting_bridge_get_mac_address (s_bridge); if (hwaddr) { if (!nm_utils_hwaddr_aton (hwaddr, mac_address, ETH_ALEN)) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED, "Invalid hardware address '%s'", hwaddr); return FALSE; } } plerr = nm_platform_link_bridge_add (NM_PLATFORM_GET, iface, hwaddr ? mac_address : NULL, hwaddr ? ETH_ALEN : 0, out_plink); if (plerr != NM_PLATFORM_ERROR_SUCCESS) { g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_CREATION_FAILED, "Failed to create bridge interface '%s' for '%s': %s", iface, nm_connection_get_id (connection), nm_platform_error_to_string (plerr)); return FALSE; } return TRUE; }
gboolean nmp_utils_ethtool_set_wake_on_lan (const char *ifname, NMSettingWiredWakeOnLan wol, const char *wol_password) { struct ethtool_wolinfo wol_info = { }; if (wol == NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE) return TRUE; nm_log_dbg (LOGD_PLATFORM, "setting Wake-on-LAN options 0x%x, password '%s'", (unsigned int) wol, wol_password); wol_info.cmd = ETHTOOL_SWOL; wol_info.wolopts = 0; if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_PHY)) wol_info.wolopts |= WAKE_PHY; if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST)) wol_info.wolopts |= WAKE_UCAST; if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST)) wol_info.wolopts |= WAKE_MCAST; if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST)) wol_info.wolopts |= WAKE_BCAST; if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_ARP)) wol_info.wolopts |= WAKE_ARP; if (NM_FLAGS_HAS (wol, NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC)) wol_info.wolopts |= WAKE_MAGIC; if (wol_password) { if (!nm_utils_hwaddr_aton (wol_password, wol_info.sopass, ETH_ALEN)) { nm_log_dbg (LOGD_PLATFORM, "couldn't parse Wake-on-LAN password '%s'", wol_password); return FALSE; } wol_info.wolopts |= WAKE_MAGICSECURE; } return ethtool_get (ifname, &wol_info); }
/** * nm_setting_wireless_remove_mac_blacklist_item_by_value: * @setting: the #NMSettingWireless * @mac: the MAC address string (hex-digits-and-colons notation) to remove from * the blacklist * * Removes the MAC address @mac from the blacklist. * * Returns: %TRUE if the MAC address was found and removed; %FALSE if it was not. * * Since: 0.9.10 **/ gboolean nm_setting_wireless_remove_mac_blacklist_item_by_value (NMSettingWireless *setting, const char *mac) { NMSettingWirelessPrivate *priv; GSList *iter; guint8 buf[32]; g_return_val_if_fail (NM_IS_SETTING_WIRELESS (setting), FALSE); g_return_val_if_fail (mac != NULL, FALSE); if (!nm_utils_hwaddr_aton (mac, ARPHRD_ETHER, buf)) return FALSE; priv = NM_SETTING_WIRELESS_GET_PRIVATE (setting); for (iter = priv->mac_address_blacklist; iter; iter = g_slist_next (iter)) { if (!strcasecmp (mac, (char *) iter->data)) { priv->mac_address_blacklist = g_slist_delete_link (priv->mac_address_blacklist, iter); g_object_notify (G_OBJECT (setting), NM_SETTING_WIRELESS_MAC_ADDRESS_BLACKLIST); return TRUE; } } return FALSE; }
/** * nm_setting_wired_add_mac_blacklist_item: * @setting: the #NMSettingWired * @mac: the MAC address string (hex-digits-and-colons notation) to blacklist * * Adds a new MAC address to the #NMSettingWired:mac-address-blacklist property. * * Returns: %TRUE if the MAC address was added; %FALSE if the MAC address * is invalid or was already present * * Since: 0.9.10 **/ gboolean nm_setting_wired_add_mac_blacklist_item (NMSettingWired *setting, const char *mac) { NMSettingWiredPrivate *priv; GSList *iter; guint8 buf[32]; g_return_val_if_fail (NM_IS_SETTING_WIRED (setting), FALSE); g_return_val_if_fail (mac != NULL, FALSE); if (!nm_utils_hwaddr_aton (mac, ARPHRD_ETHER, buf)) return FALSE; priv = NM_SETTING_WIRED_GET_PRIVATE (setting); for (iter = priv->mac_address_blacklist; iter; iter = g_slist_next (iter)) { if (!strcasecmp (mac, (char *) iter->data)) return FALSE; } priv->mac_address_blacklist = g_slist_append (priv->mac_address_blacklist, g_ascii_strup (mac, -1)); return TRUE; }