A vlan device is like a virtual ethernet device. So we reuse NMDeviceEthernet insead of creating another NMDeviceVlan, and we add some special handling to detect vlan connections.
V2: 1 delete NMDeviceVlan, just use NMDeviceEthernet Signed-off-by: Weiping Pan <w...@redhat.com> --- src/nm-device-ethernet.c | 34 +++++++++++++++++++++++++++++++--- src/nm-device-ethernet.h | 1 + src/nm-udev-manager.c | 4 +++- src/settings/nm-settings.c | 9 +++++++++ 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/nm-device-ethernet.c b/src/nm-device-ethernet.c index b64a1da..0dd3992 100644 --- a/src/nm-device-ethernet.c +++ b/src/nm-device-ethernet.c @@ -56,6 +56,7 @@ #include "nm-setting-8021x.h" #include "nm-setting-pppoe.h" #include "nm-setting-bond.h" +#include "nm-setting-vlan.h" #include "ppp-manager/nm-ppp-manager.h" #include "nm-logging.h" #include "nm-properties-changed-signal.h" @@ -616,6 +617,22 @@ nm_device_bond_connection_matches (NMDevice *device, NMConnection *connection) return FALSE; } +gboolean +nm_device_vlan_connection_matches (NMDevice *device, NMConnection *connection) +{ + NMSettingVlan *s_vlan; + const char *devname; + + devname = nm_device_get_iface (device); + g_assert(devname); + + s_vlan = nm_connection_get_setting_vlan (connection); + if (s_vlan && !strcmp (devname, nm_setting_vlan_get_interface_name (s_vlan))) + return TRUE; + + return FALSE; +} + /* Returns speed in Mb/s */ static guint32 nm_device_ethernet_get_speed (NMDeviceEthernet *self) @@ -915,6 +932,13 @@ real_get_best_auto_connection (NMDevice *dev, continue; } + if (!strcmp (connection_type, NM_SETTING_VLAN_SETTING_NAME)) { + if (nm_device_vlan_connection_matches (dev, connection)) + return connection; + + continue; + } + if (!strcmp (connection_type, NM_SETTING_PPPOE_SETTING_NAME)) is_pppoe = TRUE; @@ -1650,7 +1674,7 @@ real_check_connection_compatible (NMDevice *device, NMSettingConnection *s_con; NMSettingWired *s_wired; const char *connection_type; - gboolean is_pppoe = FALSE, is_bond = FALSE; + gboolean is_pppoe = FALSE, is_bond = FALSE, is_vlan = FALSE; const GByteArray *mac; gboolean try_mac = TRUE; const GSList *mac_blacklist, *mac_blacklist_iter; @@ -1661,10 +1685,11 @@ real_check_connection_compatible (NMDevice *device, connection_type = nm_setting_connection_get_connection_type (s_con); if ( strcmp (connection_type, NM_SETTING_WIRED_SETTING_NAME) && strcmp (connection_type, NM_SETTING_BOND_SETTING_NAME) + && strcmp (connection_type, NM_SETTING_VLAN_SETTING_NAME) && strcmp (connection_type, NM_SETTING_PPPOE_SETTING_NAME)) { g_set_error (error, NM_ETHERNET_ERROR, NM_ETHERNET_ERROR_CONNECTION_NOT_WIRED, - "The connection was not a wired, bond, or PPPoE connection."); + "The connection was not a wired, bond, vlan, or PPPoE connection."); return FALSE; } @@ -1674,9 +1699,12 @@ real_check_connection_compatible (NMDevice *device, if (!strcmp (connection_type, NM_SETTING_BOND_SETTING_NAME)) is_bond = TRUE; + if (!strcmp (connection_type, NM_SETTING_VLAN_SETTING_NAME)) + is_vlan = TRUE; + s_wired = (NMSettingWired *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED); /* Wired setting is optional for PPPoE */ - if (!is_pppoe && !s_wired && !is_bond) { + if (!is_pppoe && !s_wired && !is_bond && !is_vlan) { g_set_error (error, NM_ETHERNET_ERROR, NM_ETHERNET_ERROR_CONNECTION_INVALID, "The connection was not a valid wired connection."); diff --git a/src/nm-device-ethernet.h b/src/nm-device-ethernet.h index c7adbf8..9fe6765 100644 --- a/src/nm-device-ethernet.h +++ b/src/nm-device-ethernet.h @@ -64,6 +64,7 @@ void nm_device_ethernet_get_address (NMDeviceEthernet *dev, struct ether_addr *addr); gboolean nm_device_bond_connection_matches (NMDevice *device, NMConnection *connection); +gboolean nm_device_vlan_connection_matches (NMDevice *device, NMConnection *connection); G_END_DECLS diff --git a/src/nm-udev-manager.c b/src/nm-udev-manager.c index ede39bb..c66bb9a 100644 --- a/src/nm-udev-manager.c +++ b/src/nm-udev-manager.c @@ -437,11 +437,13 @@ device_creator (NMUdevManager *manager, if (type) { if (g_strcmp0 (type, "bond") == 0) driver = "bonding"; + else if (g_strcmp0 (type, "vlan") == 0) + driver = "8021q"; g_free (type); } else if (g_str_has_prefix (ifname, "easytether")) { driver = "easytether"; } - + if (!driver) { nm_log_warn (LOGD_HW, "%s: couldn't determine device driver; ignoring...", path); goto out; diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 7cf930a..9aa131e 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -53,6 +53,7 @@ #include <nm-setting-wireless.h> #include <nm-setting-wireless-security.h> #include <nm-setting-bond.h> +#include <nm-setting-vlan.h> #include "../nm-device-ethernet.h" #include "nm-dbus-glib-types.h" @@ -1203,6 +1204,14 @@ have_connection_for_device (NMSettings *self, GByteArray *mac, NMDevice *device) continue; } + if (!strcmp (ctype, NM_SETTING_VLAN_SETTING_NAME)) { + if (nm_device_vlan_connection_matches (device, connection)) { + ret = TRUE; + break; + } else + continue; + } + if ( strcmp (ctype, NM_SETTING_WIRED_SETTING_NAME) && strcmp (ctype, NM_SETTING_PPPOE_SETTING_NAME)) continue; -- 1.7.4.4 _______________________________________________ networkmanager-list mailing list networkmanager-list@gnome.org http://mail.gnome.org/mailman/listinfo/networkmanager-list