about summary refs log tree commit diff
path: root/libnm-core/nm-setting-vlan.c
diff options
context:
space:
mode:
authorSebastien Bacher <seb128@ubuntu.com>2019-05-10 15:07:08 +0200
committerSebastien Bacher <seb128@ubuntu.com>2019-05-22 13:41:30 +0200
commitd57a1dd26f8e9859252b0983c2d2ec3b95eb5714 (patch)
tree46f1146e87af8cc7b58b751f7e575bd0abb2f59d /libnm-core/nm-setting-vlan.c
parentad9ed8bfb963266b4eea524131845f406cfc55d7 (diff)
parent85563b7fc7ec2cd21e38debb9b28db342e2e8e7c (diff)
Import Debian changes 1.18.0-1ubuntu1
network-manager (1.18.0-1ubuntu1) eoan; urgency=medium

  * Update to 1.18, merge on Debian, new version includes nwe support for
    policy routing rules and for VLAN filtering for Linux bridge.
  * Remaining Ubuntu changes
    - Use systemd-resolved instead of dnsmasq
    - debian/control:
      + Depend on isc-dhcp-client instead of recommends
      + Recommend network-manager-pptp
      + Suggest avahi-autoipd for IPv4LL support
    - debian/rules, debian/network-manager.postinst:
      + Don't restart NetworkManager on upgrade but recommend restarting
        the computer
    - debian/rules, debian/network-manager.postinst:
      + Don't install sysvinit scripts or migrate from sysvinit
    - debian/network-manager.postinst:
      + Don't add the netdev group.
      + drop in an empty override file for NetworkManager to manage all
        devices for upgrade from any version, as long as there is no
        netplan configuration yet.
    - debian/default-wifi-powersave-on.conf, debian/rules:
      + Install a config file to enable WiFi powersave
    - Enable build tests
    - Add autopkgtests
    - debian/source_network-manager.py, debian/network-manager.install,
      debian/network-manager.links: Add apport hook
    - Add network-manager-config-connectivity-ubuntu package
    - NetworkManager.conf: disable MAC randomization feature. There is no
      easy way for desktop users to disable this feature yet. And there are
      reports that it doesn't work well with some systems.
    - Update Vcs links to point to Ubuntu branch
    - Add patches. See patch descriptions for more details:
      + Provide-access-to-some-of-NM-s-interfaces-to-whoopsie.patch
      + Update-dnsmasq-parameters.patch
      + Disable-general-with-expect.patch
      + libnm-Check-self-still-NMManager-or-not.patch
      + dns-manager-don-t-merge-split-DNS-search-domains.patch (but disabled)
      + Read-system-connections-from-run.patch
    - debian/tests/urfkill-integration - don't stop/start network manager
    - Revert "Add Conflicts to network-manager-dev against deprecated libraries"
      This reverts commit b4acc5e03e2b821e1cccc69529bb70826c741942.  We're still
      building libnm-glib for now, so these packages have a use in Ubuntu.
  * Removed delta, not needed anymore
    - debian/network-manager.maintscript
      + Remove /etc/dbus-1/system.d/nm-ofono.conf
Diffstat (limited to 'libnm-core/nm-setting-vlan.c')
-rw-r--r--libnm-core/nm-setting-vlan.c122
1 files changed, 60 insertions, 62 deletions
diff --git a/libnm-core/nm-setting-vlan.c b/libnm-core/nm-setting-vlan.c
index 5b8a49d4..8a220ad8 100644
--- a/libnm-core/nm-setting-vlan.c
+++ b/libnm-core/nm-setting-vlan.c
@@ -25,6 +25,7 @@
 
 #include <stdlib.h>
 
+#include "nm-libnm-core-intern/nm-libnm-core-utils.h"
 #include "nm-utils.h"
 #include "nm-core-types-internal.h"
 #include "nm-setting-connection.h"
@@ -106,48 +107,33 @@ nm_setting_vlan_get_flags (NMSettingVlan *setting)
 	return NM_SETTING_VLAN_GET_PRIVATE (setting)->flags;
 }
 
-static guint32
-get_max_prio (NMVlanPriorityMap map, gboolean from)
+static NMVlanQosMapping *
+priority_map_new (guint32 from, guint32 to)
 {
-	if (map == NM_VLAN_INGRESS_MAP)
-		return from ? MAX_8021P_PRIO : MAX_SKB_PRIO;
-	else if (map == NM_VLAN_EGRESS_MAP)
-		return from ? MAX_SKB_PRIO : MAX_8021P_PRIO;
-	g_assert_not_reached ();
+	NMVlanQosMapping *mapping;
+
+	mapping = g_new (NMVlanQosMapping, 1);
+	*mapping = (NMVlanQosMapping) {
+		.from = from,
+		.to   = to,
+	};
+	return mapping;
 }
 
 static NMVlanQosMapping *
 priority_map_new_from_str (NMVlanPriorityMap map, const char *str)
 {
-	NMVlanQosMapping *p = NULL;
-	char **t = NULL;
-	guint32 len;
-	guint64 from, to;
+	guint32 from, to;
 
-	g_return_val_if_fail (str && str[0], NULL);
-
-	t = g_strsplit (str, ":", 0);
-	len = g_strv_length (t);
-	if (len == 2) {
-		from = g_ascii_strtoull (t[0], NULL, 10);
-		to = g_ascii_strtoull (t[1], NULL, 10);
-
-		if ((from <= get_max_prio (map, TRUE)) && (to <= get_max_prio (map, FALSE))) {
-			G_STATIC_ASSERT (sizeof (*p) == sizeof (p->from) + sizeof (p->to));
-			p = g_malloc (sizeof (NMVlanQosMapping));
-			p->from = from;
-			p->to = to;
-		}
-	}
-
-	g_strfreev (t);
-	return p;
+	if (!nm_utils_vlan_priority_map_parse_str (map, str, FALSE, &from, &to, NULL))
+		return NULL;
+	return priority_map_new (from, to);
 }
 
 static void
 priority_map_free (NMVlanQosMapping *map)
 {
-	g_return_if_fail (map != NULL);
+	nm_assert (map);
 	g_free (map);
 }
 
@@ -158,7 +144,7 @@ get_map (NMSettingVlan *self, NMVlanPriorityMap map)
 		return NM_SETTING_VLAN_GET_PRIVATE (self)->ingress_priority_map;
 	else if (map == NM_VLAN_EGRESS_MAP)
 		return NM_SETTING_VLAN_GET_PRIVATE (self)->egress_priority_map;
-	g_assert_not_reached ();
+	nm_assert_not_reached ();
 	return NULL;
 }
 
@@ -207,7 +193,7 @@ set_map (NMSettingVlan *self, NMVlanPriorityMap map, GSList *list)
 		NM_SETTING_VLAN_GET_PRIVATE (self)->egress_priority_map = list;
 		_notify (self, PROP_EGRESS_PRIORITY_MAP);
 	} else
-		g_assert_not_reached ();
+		nm_assert_not_reached ();
 }
 
 static gboolean
@@ -489,6 +475,36 @@ nm_setting_vlan_remove_priority (NMSettingVlan *setting,
 	set_map (setting, map, g_slist_delete_link (list, item));
 }
 
+static gboolean
+priority_map_remove_by_value (NMSettingVlan *setting,
+                              NMVlanPriorityMap map,
+                              guint32 from,
+                              guint32 to,
+                              gboolean wildcard_to)
+{
+	GSList *list = NULL, *iter = NULL;
+	NMVlanQosMapping *item;
+
+	nm_assert (NM_IS_SETTING_VLAN (setting));
+	nm_assert (NM_IN_SET (map, NM_VLAN_INGRESS_MAP, NM_VLAN_EGRESS_MAP));
+
+	list = get_map (setting, map);
+	for (iter = list; iter; iter = g_slist_next (iter)) {
+		item = iter->data;
+
+		if (item->from != from)
+			continue;
+		if (   !wildcard_to
+		    && item->to != to)
+			continue;
+
+		priority_map_free ((NMVlanQosMapping *) (iter->data));
+		set_map (setting, map, g_slist_delete_link (list, iter));
+		return TRUE;
+	}
+	return FALSE;
+}
+
 /**
  * nm_setting_vlan_remove_priority_by_value:
  * @setting: the #NMSettingVlan
@@ -508,22 +524,10 @@ nm_setting_vlan_remove_priority_by_value (NMSettingVlan *setting,
                                           guint32 from,
                                           guint32 to)
 {
-	GSList *list = NULL, *iter = NULL;
-	NMVlanQosMapping *item;
-
 	g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), FALSE);
 	g_return_val_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP, FALSE);
 
-	list = get_map (setting, map);
-	for (iter = list; iter; iter = g_slist_next (iter)) {
-		item = iter->data;
-		if (item->from == from && item->to == to) {
-			priority_map_free ((NMVlanQosMapping *) (iter->data));
-			set_map (setting, map, g_slist_delete_link (list, iter));
-			return TRUE;
-		}
-	}
-	return FALSE;
+	return priority_map_remove_by_value (setting, map, from, to, FALSE);
 }
 
 /**
@@ -543,19 +547,15 @@ nm_setting_vlan_remove_priority_str_by_value (NMSettingVlan *setting,
                                               NMVlanPriorityMap map,
                                               const char *str)
 {
-	NMVlanQosMapping *item;
-	gboolean found;
+	gboolean is_wildcard_to;
+	guint32 from, to;
 
 	g_return_val_if_fail (NM_IS_SETTING_VLAN (setting), FALSE);
 	g_return_val_if_fail (map == NM_VLAN_INGRESS_MAP || map == NM_VLAN_EGRESS_MAP, FALSE);
 
-	item = priority_map_new_from_str (map, str);
-	if (!item)
+	if (!nm_utils_vlan_priority_map_parse_str (map, str, TRUE, &from, &to, &is_wildcard_to))
 		return FALSE;
-
-	found = nm_setting_vlan_remove_priority_by_value (setting, map, item->from, item->to);
-	g_free (item);
-	return found;
+	return priority_map_remove_by_value (setting, map, from, to, is_wildcard_to);
 }
 
 /**
@@ -703,18 +703,16 @@ static GSList *
 priority_strv_to_maplist (NMVlanPriorityMap map, char **strv)
 {
 	GSList *list = NULL;
-	int i;
+	gsize i;
 
 	for (i = 0; strv && strv[i]; i++) {
-		NMVlanQosMapping *item;
+		guint32 from, to;
 
-		item = priority_map_new_from_str (map, strv[i]);
-		if (item) {
-			if (!check_replace_duplicate_priority (list, item->from, item->to))
-				list = g_slist_prepend (list, item);
-			else
-				g_free (item);
-		}
+		if (!nm_utils_vlan_priority_map_parse_str (map, strv[i], FALSE, &from, &to, NULL))
+			continue;
+		if (check_replace_duplicate_priority (list, from, to))
+			continue;
+		list = g_slist_prepend (list, priority_map_new (from, to));
 	}
 	return g_slist_sort (list, prio_map_compare);
 }