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

Reply via email to