about summary refs log tree commit diff
path: root/src/core/nm-l3-config-data.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/nm-l3-config-data.c')
-rw-r--r--src/core/nm-l3-config-data.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c
index 226ccd00..03593ea2 100644
--- a/src/core/nm-l3-config-data.c
+++ b/src/core/nm-l3-config-data.c
@@ -1094,8 +1094,22 @@ _l3_config_data_add_obj(NMDedupMultiIndex      *multi_idx,
                         NMP_OBJECT_TYPE_IP4_ROUTE,
                         NMP_OBJECT_TYPE_IP6_ADDRESS,
                         NMP_OBJECT_TYPE_IP6_ROUTE));
+    nm_assert((!!obj_new) != (!!pl_new));
+
+    if (NM_IN_SET(idx_type->obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)) {
+        const NMPlatformIPRoute *r;
+
+        r = obj_new ? NMP_OBJECT_CAST_IP_ROUTE(obj_new) : (NMPlatformIPRoute *) pl_new;
+
+        if (nm_platform_route_type_is_nodev(nm_platform_route_type_uncoerce(r->type_coerced))) {
+            /* such routes don't have a device/next-hop. We track them without ifindex. */
+            ifindex = 0;
+        }
+    }
+
     /* we go through extra lengths to accept a full obj_new object. That one,
-     * can be reused by increasing the ref-count. */
+     * can be reused by increasing the ref-count. We thus accept any ifindex, and
+     * set it here. */
     if (!obj_new) {
         nm_assert(pl_new);
         obj_new = nmp_object_stackinit(&obj_new_stackinit, idx_type->obj_type, pl_new);
@@ -2995,12 +3009,12 @@ nm_l3_config_data_merge(NML3ConfigData       *self,
                         NML3ConfigMergeHookAddObj hook_add_obj,
                         gpointer                  hook_user_data)
 {
-    static const guint32 x_default_route_table_x[2]   = {RT_TABLE_MAIN, RT_TABLE_MAIN};
     static const guint32 x_default_route_metric_x[2]  = {NM_PLATFORM_ROUTE_METRIC_DEFAULT_IP6,
                                                         NM_PLATFORM_ROUTE_METRIC_DEFAULT_IP4};
     static const guint32 x_default_route_penalty_x[2] = {0, 0};
     static const int     x_default_dns_priority_x[2]  = {NM_DNS_PRIORITY_DEFAULT_NORMAL,
                                                     NM_DNS_PRIORITY_DEFAULT_NORMAL};
+    guint32              default_route_table_coerced_x[2];
     NMDedupMultiIter     iter;
     const NMPObject     *obj;
     int                  IS_IPv4;
@@ -3008,8 +3022,16 @@ nm_l3_config_data_merge(NML3ConfigData       *self,
     nm_assert(_NM_IS_L3_CONFIG_DATA(self, FALSE));
     nm_assert(_NM_IS_L3_CONFIG_DATA(src, TRUE));
 
-    if (!default_route_table_x)
-        default_route_table_x = x_default_route_table_x;
+    if (default_route_table_x) {
+        default_route_table_coerced_x[0] = nm_platform_route_table_coerce(default_route_table_x[0]);
+        default_route_table_coerced_x[1] = nm_platform_route_table_coerce(default_route_table_x[1]);
+    } else {
+        default_route_table_coerced_x[0] = nm_platform_route_table_coerce(RT_TABLE_MAIN);
+        default_route_table_coerced_x[1] = nm_platform_route_table_coerce(RT_TABLE_MAIN);
+    }
+    nm_assert(nm_platform_route_table_uncoerce(default_route_table_coerced_x[0], FALSE) != 0);
+    nm_assert(nm_platform_route_table_uncoerce(default_route_table_coerced_x[1], FALSE) != 0);
+
     if (!default_route_metric_x)
         default_route_metric_x = x_default_route_metric_x;
     if (!default_route_penalty_x)
@@ -3017,8 +3039,6 @@ nm_l3_config_data_merge(NML3ConfigData       *self,
     if (!default_dns_priority_x)
         default_dns_priority_x = x_default_dns_priority_x;
 
-    nm_assert(default_route_table_x[0] != 0);
-    nm_assert(default_route_table_x[1] != 0);
     nm_assert(default_route_metric_x[0] != 0); /* IPv6 route metric cannot be zero. */
 
     nm_assert(!NM_FLAGS_HAS(merge_flags, NM_L3_CONFIG_MERGE_FLAGS_CLONE)
@@ -3145,7 +3165,7 @@ nm_l3_config_data_merge(NML3ConfigData       *self,
                     if (r_src->table_any) {
                         _ensure_r();
                         r.rx.table_any     = FALSE;
-                        r.rx.table_coerced = default_route_table_x[IS_IPv4];
+                        r.rx.table_coerced = default_route_table_coerced_x[IS_IPv4];
                     }
 
                     if (r_src->metric_any) {