From c3798fbf4e70bc19f1da8f12fd6caba94c71f623 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 28 Jul 2020 10:43:33 +0200 Subject: [PATCH] l3cfg: add nm_l3cfg_platform_commit() --- src/nm-l3-config-data.c | 10 ++++++ src/nm-l3-config-data.h | 3 ++ src/nm-l3cfg.c | 68 ++++++++++++++++++++++++++++++++++++++++- src/nm-l3cfg.h | 5 +++ 4 files changed, 85 insertions(+), 1 deletion(-) diff --git a/src/nm-l3-config-data.c b/src/nm-l3-config-data.c index b46e1fe2ad..f86c164bd3 100644 --- a/src/nm-l3-config-data.c +++ b/src/nm-l3-config-data.c @@ -1035,6 +1035,16 @@ nm_l3_config_data_set_llmnr (NML3ConfigData *self, return TRUE; } +NMIPRouteTableSyncMode +nm_l3_config_data_get_route_table_sync (const NML3ConfigData *self, + int addr_family) +{ + nm_assert (_NM_IS_L3_CONFIG_DATA (self, TRUE)); + nm_assert_addr_family (addr_family); + + return self->route_table_sync_x[NM_IS_IPv4 (addr_family)]; +} + gboolean nm_l3_config_data_set_route_table_sync (NML3ConfigData *self, int addr_family, diff --git a/src/nm-l3-config-data.h b/src/nm-l3-config-data.h index 127f73e0d5..856b55fa79 100644 --- a/src/nm-l3-config-data.h +++ b/src/nm-l3-config-data.h @@ -301,6 +301,9 @@ gboolean nm_l3_config_data_set_mdns (NML3ConfigData *self, gboolean nm_l3_config_data_set_llmnr (NML3ConfigData *self, NMSettingConnectionLlmnr llmnr); +NMIPRouteTableSyncMode nm_l3_config_data_get_route_table_sync (const NML3ConfigData *self, + int addr_family); + gboolean nm_l3_config_data_set_route_table_sync (NML3ConfigData *self, int addr_family, NMIPRouteTableSyncMode route_table_sync); diff --git a/src/nm-l3cfg.c b/src/nm-l3cfg.c index 3709ff7dbc..46b1c0f821 100644 --- a/src/nm-l3cfg.c +++ b/src/nm-l3cfg.c @@ -533,7 +533,6 @@ _l3cfg_combine_config (GArray *l3_config_datas, return nm_l3_config_data_seal (l3cfg); } -_nm_unused static gboolean _l3cfg_update_combined_config (NML3Cfg *self, const NML3ConfigData **out_old /* transfer reference */) @@ -556,6 +555,8 @@ _l3cfg_update_combined_config (NML3Cfg *self, if (nm_l3_config_data_equal (l3cfg, self->priv.p->combined_l3cfg)) return FALSE; + _LOGT ("desired IP configuration changed"); + l3cfg_old = g_steal_pointer (&self->priv.p->combined_l3cfg); self->priv.p->combined_l3cfg = nm_l3_config_data_seal (g_steal_pointer (&l3cfg)); NM_SET_OUT (out_old, nm_l3_config_data_ref (self->priv.p->combined_l3cfg)); @@ -564,6 +565,71 @@ _l3cfg_update_combined_config (NML3Cfg *self, /*****************************************************************************/ +gboolean +nm_l3cfg_platform_commit (NML3Cfg *self, + int addr_family) +{ + gs_unref_ptrarray GPtrArray *addresses = NULL; + gs_unref_ptrarray GPtrArray *routes = NULL; + gs_unref_ptrarray GPtrArray *routes_prune = NULL; + gs_unref_ptrarray GPtrArray *routes_temporary_not_available = NULL; + NMIPRouteTableSyncMode route_table_sync = NM_IP_ROUTE_TABLE_SYNC_MODE_NONE; + gboolean success = TRUE; + int IS_IPv4; + + g_return_val_if_fail (NM_IS_L3CFG (self), FALSE); + + if (addr_family == AF_UNSPEC) { + if (!nm_l3cfg_platform_commit (self, AF_INET)) + success = FALSE; + if (!nm_l3cfg_platform_commit (self, AF_INET6)) + success = FALSE; + return success; + } + + _l3cfg_update_combined_config (self, NULL); + + IS_IPv4 = NM_IS_IPv4 (addr_family); + + _LOGT ("committing IPv%c configuration...", nm_utils_addr_family_to_char (addr_family)); + + if (self->priv.p->combined_l3cfg) { + addresses = nm_dedup_multi_objs_to_ptr_array_head (nm_l3_config_data_lookup_objs (self->priv.p->combined_l3cfg, + NMP_OBJECT_TYPE_IP_ADDRESS (IS_IPv4)), + NULL, NULL); + + routes = nm_dedup_multi_objs_to_ptr_array_head (nm_l3_config_data_lookup_objs (self->priv.p->combined_l3cfg, + NMP_OBJECT_TYPE_IP_ROUTE (IS_IPv4)), + NULL, NULL); + + route_table_sync = nm_l3_config_data_get_route_table_sync (self->priv.p->combined_l3cfg, addr_family); + } + + if (route_table_sync == NM_IP_ROUTE_TABLE_SYNC_MODE_NONE) + route_table_sync = NM_IP_ROUTE_TABLE_SYNC_MODE_ALL; + + routes_prune = nm_platform_ip_route_get_prune_list (self->priv.platform, + addr_family, + self->priv.ifindex, + route_table_sync); + + nm_platform_ip4_address_sync (self->priv.platform, + self->priv.ifindex, + addresses); + + if (!nm_platform_ip_route_sync (self->priv.platform, + addr_family, + self->priv.ifindex, + routes, + routes_prune, + &routes_temporary_not_available)) + success = FALSE; + + return success; +} + +/*****************************************************************************/ + static void set_property (GObject *object, guint prop_id, diff --git a/src/nm-l3cfg.h b/src/nm-l3cfg.h index 0c2b9c814a..7d77c50596 100644 --- a/src/nm-l3cfg.h +++ b/src/nm-l3cfg.h @@ -114,4 +114,9 @@ void nm_l3cfg_remove_config_all (NML3Cfg *self, gconstpointer tag, gboolean only_dirty); +/*****************************************************************************/ + +gboolean nm_l3cfg_platform_commit (NML3Cfg *self, + int addr_family); + #endif /* __NM_L3CFG_H__ */