diff --git a/.clang-format b/.clang-format index 13c9899c60..8538f3dfe8 100644 --- a/.clang-format +++ b/.clang-format @@ -105,9 +105,11 @@ ForEachMacros: ['c_list_for_each', 'nm_ip_config_iter_ip_route_for_each', 'nm_json_array_foreach', 'nm_json_object_foreach', + 'nm_l3_config_data_iter_ip_address_for_each', 'nm_l3_config_data_iter_ip4_address_for_each', - 'nm_l3_config_data_iter_ip4_route_for_each', 'nm_l3_config_data_iter_ip6_address_for_each', + 'nm_l3_config_data_iter_ip_route_for_each', + 'nm_l3_config_data_iter_ip4_route_for_each', 'nm_l3_config_data_iter_ip6_route_for_each', 'nm_l3_config_data_iter_obj_for_each', 'nm_manager_for_each_active_connection', diff --git a/src/core/NetworkManagerUtils.h b/src/core/NetworkManagerUtils.h index 405f90de46..1c86387c06 100644 --- a/src/core/NetworkManagerUtils.h +++ b/src/core/NetworkManagerUtils.h @@ -197,18 +197,20 @@ nm_dhcp_lease_get_options(NMDhcpLease *lease) return (GHashTable *) lease; } -static inline void +static inline NMDhcpLease * nm_dhcp_lease_ref(NMDhcpLease *lease) { if (lease) g_hash_table_ref((GHashTable *) lease); + return lease; } -static inline void +static inline NMDhcpLease * nm_dhcp_lease_unref(NMDhcpLease *lease) { if (lease) g_hash_table_unref((GHashTable *) lease); + return NULL; } static inline const char * diff --git a/src/core/devices/nm-device-private.h b/src/core/devices/nm-device-private.h index fadc299e10..eb37b14ffb 100644 --- a/src/core/devices/nm-device-private.h +++ b/src/core/devices/nm-device-private.h @@ -109,8 +109,6 @@ nm_device_activate_ip6_state_done(NMDevice *self) return nm_device_activate_get_ip_state(self, AF_INET6) == NM_DEVICE_IP_STATE_DONE; } -void nm_device_set_dhcp_anycast_address(NMDevice *device, const char *addr); - gboolean nm_device_dhcp4_renew(NMDevice *device, gboolean release); gboolean nm_device_dhcp6_renew(NMDevice *device, gboolean release); diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index ca1b56b2ad..1e677a9bc9 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -499,9 +499,6 @@ typedef struct _NMDevicePrivate { NMDeviceStageState stage1_sriov_state : 3; - /* Generic DHCP stuff */ - char *dhcp_anycast_address; - char *current_stable_id; /* Proxy Configuration */ @@ -8901,6 +8898,21 @@ ensure_con_ip_config(NMDevice *self, int addr_family) /*****************************************************************************/ +static const char * +_device_get_dhcp_anycast_address(NMDevice *self) +{ + NMDeviceClass *klass; + + nm_assert(NM_IS_DEVICE(self)); + + klass = NM_DEVICE_GET_CLASS(self); + + if (klass->get_dhcp_anycast_address) + return klass->get_dhcp_anycast_address(self); + + return NULL; +} + static void dhcp4_cleanup(NMDevice *self, CleanupType cleanup_type, gboolean release) { @@ -9469,7 +9481,7 @@ dhcp4_start(NMDevice *self) _prop_get_connection_mud_url(self, s_con, &mud_url_free), client_id, _prop_get_ipvx_dhcp_timeout(self, AF_INET), - priv->dhcp_anycast_address, + _device_get_dhcp_anycast_address(self), NULL, vendor_class_identifier, reject_servers, @@ -9922,7 +9934,7 @@ dhcp6_start_with_link_ready(NMDevice *self, NMConnection *connection) iaid, iaid_explicit, _prop_get_ipvx_dhcp_timeout(self, AF_INET6), - priv->dhcp_anycast_address, + _device_get_dhcp_anycast_address(self), nm_setting_ip6_config_get_ip6_privacy(NM_SETTING_IP6_CONFIG(s_ip6)), priv->dhcp6.needed_prefixes, &error); @@ -15075,20 +15087,6 @@ nm_device_set_unmanaged_by_quitting(NMDevice *self) /*****************************************************************************/ -void -nm_device_set_dhcp_anycast_address(NMDevice *self, const char *addr) -{ - NMDevicePrivate *priv; - - g_return_if_fail(NM_IS_DEVICE(self)); - g_return_if_fail(!addr || nm_utils_hwaddr_valid(addr, ETH_ALEN)); - - priv = NM_DEVICE_GET_PRIVATE(self); - - g_free(priv->dhcp_anycast_address); - priv->dhcp_anycast_address = g_strdup(addr); -} - void nm_device_reapply_settings_immediately(NMDevice *self) { @@ -18448,7 +18446,6 @@ finalize(GObject *object) g_free(priv->driver_version); g_free(priv->firmware_version); g_free(priv->type_desc); - g_free(priv->dhcp_anycast_address); g_free(priv->current_stable_id); g_hash_table_unref(priv->ip6_saved_properties); diff --git a/src/core/devices/nm-device.h b/src/core/devices/nm-device.h index ea03f4b91e..53211c6f2f 100644 --- a/src/core/devices/nm-device.h +++ b/src/core/devices/nm-device.h @@ -412,6 +412,8 @@ typedef struct _NMDeviceClass { gboolean (*set_platform_mtu)(NMDevice *self, guint32 mtu); + const char *(*get_dhcp_anycast_address)(NMDevice *self); + } NMDeviceClass; GType nm_device_get_type(void); diff --git a/src/core/devices/wifi/nm-device-olpc-mesh.c b/src/core/devices/wifi/nm-device-olpc-mesh.c index 3d977db26c..040350d58a 100644 --- a/src/core/devices/wifi/nm-device-olpc-mesh.c +++ b/src/core/devices/wifi/nm-device-olpc-mesh.c @@ -122,6 +122,17 @@ complete_connection(NMDevice * device, /*****************************************************************************/ +static const char * +get_dhcp_anycast_address(NMDevice *device) +{ + NMSettingOlpcMesh *s_mesh; + + s_mesh = nm_device_get_applied_setting(device, NM_TYPE_SETTING_OLPC_MESH); + return s_mesh ? nm_setting_olpc_mesh_get_dhcp_anycast_address(s_mesh) : NULL; +} + +/*****************************************************************************/ + static NMActStageReturn act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason) { @@ -178,7 +189,6 @@ act_stage2_config(NMDevice *device, NMDeviceStateReason *out_failure_reason) NMDeviceOlpcMesh * self = NM_DEVICE_OLPC_MESH(device); NMSettingOlpcMesh *s_mesh; GBytes * ssid; - const char * anycast_addr; gboolean success; s_mesh = nm_device_get_applied_setting(device, NM_TYPE_SETTING_OLPC_MESH); @@ -197,9 +207,6 @@ act_stage2_config(NMDevice *device, NMDeviceStateReason *out_failure_reason) return NM_ACT_STAGE_RETURN_FAILURE; } - anycast_addr = nm_setting_olpc_mesh_get_dhcp_anycast_address(s_mesh); - nm_device_set_dhcp_anycast_address(device, anycast_addr); - if (!_mesh_set_channel(self, nm_setting_olpc_mesh_get_channel(s_mesh))) { _LOGW(LOGD_WIFI, "Unable to set the mesh channel"); return NM_ACT_STAGE_RETURN_FAILURE; @@ -527,6 +534,7 @@ nm_device_olpc_mesh_class_init(NMDeviceOlpcMeshClass *klass) device_class->act_stage2_config = act_stage2_config; device_class->state_changed = state_changed; device_class->get_dhcp_timeout_for_device = get_dhcp_timeout_for_device; + device_class->get_dhcp_anycast_address = get_dhcp_anycast_address; obj_properties[PROP_COMPANION] = g_param_spec_string(NM_DEVICE_OLPC_MESH_COMPANION, "", diff --git a/src/core/dhcp/nm-dhcp-client.c b/src/core/dhcp/nm-dhcp-client.c index da99cbb644..5d85500d8d 100644 --- a/src/core/dhcp/nm-dhcp-client.c +++ b/src/core/dhcp/nm-dhcp-client.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "libnm-glib-aux/nm-dedup-multi.h" #include "libnm-glib-aux/nm-random-utils.h" @@ -33,6 +34,7 @@ static guint signals[LAST_SIGNAL] = {0}; NM_GOBJECT_PROPERTIES_DEFINE(NMDhcpClient, PROP_ADDR_FAMILY, + PROP_ANYCAST_ADDRESS, PROP_FLAGS, PROP_HWADDR, PROP_BROADCAST_HWADDR, @@ -61,6 +63,7 @@ typedef struct _NMDhcpClientPrivate { char * hostname; const char ** reject_servers; char * mud_url; + char * anycast_address; GBytes * vendor_class_identifier; pid_t pid; guint timeout_id; @@ -280,6 +283,14 @@ nm_dhcp_client_set_client_id_bin(NMDhcpClient *self, _set_client_id(self, b, TRUE); } +const char * +nm_dhcp_client_get_anycast_address(NMDhcpClient *self) +{ + g_return_val_if_fail(NM_IS_DHCP_CLIENT(self), NULL); + + return NM_DHCP_CLIENT_GET_PRIVATE(self)->anycast_address; +} + const char * nm_dhcp_client_get_hostname(NMDhcpClient *self) { @@ -574,7 +585,6 @@ nm_dhcp_client_stop_watch_child(NMDhcpClient *self, pid_t pid) gboolean nm_dhcp_client_start_ip4(NMDhcpClient *self, GBytes * client_id, - const char * dhcp_anycast_addr, const char * last_ip4_address, GError ** error) { @@ -594,10 +604,7 @@ nm_dhcp_client_start_ip4(NMDhcpClient *self, nm_dhcp_client_set_client_id(self, client_id); - return NM_DHCP_CLIENT_GET_CLASS(self)->ip4_start(self, - dhcp_anycast_addr, - last_ip4_address, - error); + return NM_DHCP_CLIENT_GET_CLASS(self)->ip4_start(self, last_ip4_address, error); } gboolean @@ -634,7 +641,6 @@ gboolean nm_dhcp_client_start_ip6(NMDhcpClient * self, GBytes * client_id, gboolean enforce_duid, - const char * dhcp_anycast_addr, const struct in6_addr * ll_addr, NMSettingIP6ConfigPrivacy privacy, guint needed_prefixes, @@ -663,8 +669,11 @@ nm_dhcp_client_start_ip6(NMDhcpClient * self, else _LOGI("activation: beginning transaction (timeout in %u seconds)", (guint) priv->timeout); - return NM_DHCP_CLIENT_GET_CLASS(self) - ->ip6_start(self, dhcp_anycast_addr, ll_addr, privacy, needed_prefixes, error); + return NM_DHCP_CLIENT_GET_CLASS(self)->ip6_start(self, + ll_addr, + privacy, + needed_prefixes, + error); } void @@ -1073,6 +1082,10 @@ set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *ps /* construct-only */ priv->hwaddr = g_value_dup_boxed(value); break; + case PROP_ANYCAST_ADDRESS: + /* construct-only */ + priv->anycast_address = g_value_dup_string(value); + break; case PROP_BROADCAST_HWADDR: /* construct-only */ priv->bcast_hwaddr = g_value_dup_boxed(value); @@ -1162,6 +1175,8 @@ constructed(GObject *object) nm_assert(!NM_FLAGS_ANY(priv->client_flags, NM_DHCP_CLIENT_FLAGS_REQUEST_BROADCAST)); } + nm_assert(!priv->anycast_address || nm_utils_hwaddr_valid(priv->anycast_address, ETH_ALEN)); + G_OBJECT_CLASS(nm_dhcp_client_parent_class)->constructed(object); } #endif @@ -1185,6 +1200,7 @@ dispose(GObject *object) nm_clear_g_free(&priv->iface); nm_clear_g_free(&priv->hostname); nm_clear_g_free(&priv->uuid); + nm_clear_g_free(&priv->anycast_address); nm_clear_g_free(&priv->mud_url); nm_clear_g_free(&priv->reject_servers); nm_clear_pointer(&priv->client_id, g_bytes_unref); @@ -1259,6 +1275,13 @@ nm_dhcp_client_class_init(NMDhcpClientClass *client_class) AF_UNSPEC, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_ANYCAST_ADDRESS] = + g_param_spec_string(NM_DHCP_CLIENT_ANYCAST_ADDRESS, + "", + "", + NULL, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + obj_properties[PROP_UUID] = g_param_spec_string(NM_DHCP_CLIENT_UUID, "", diff --git a/src/core/dhcp/nm-dhcp-client.h b/src/core/dhcp/nm-dhcp-client.h index e61e01de3b..a509b43401 100644 --- a/src/core/dhcp/nm-dhcp-client.h +++ b/src/core/dhcp/nm-dhcp-client.h @@ -25,6 +25,7 @@ (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DHCP_CLIENT, NMDhcpClientClass)) #define NM_DHCP_CLIENT_ADDR_FAMILY "addr-family" +#define NM_DHCP_CLIENT_ANYCAST_ADDRESS "anycast-address" #define NM_DHCP_CLIENT_FLAGS "flags" #define NM_DHCP_CLIENT_HWADDR "hwaddr" #define NM_DHCP_CLIENT_BROADCAST_HWADDR "broadcast-hwaddr" @@ -82,17 +83,13 @@ typedef enum _nm_packed { typedef struct { GObjectClass parent; - gboolean (*ip4_start)(NMDhcpClient *self, - const char * anycast_addr, - const char * last_ip4_address, - GError ** error); + gboolean (*ip4_start)(NMDhcpClient *self, const char *last_ip4_address, GError **error); gboolean (*accept)(NMDhcpClient *self, GError **error); gboolean (*decline)(NMDhcpClient *self, const char *error_message, GError **error); gboolean (*ip6_start)(NMDhcpClient * self, - const char * anycast_addr, const struct in6_addr * ll_addr, NMSettingIP6ConfigPrivacy privacy, guint needed_prefixes, @@ -132,6 +129,8 @@ GBytes *nm_dhcp_client_get_hw_addr(NMDhcpClient *self); GBytes *nm_dhcp_client_get_broadcast_hw_addr(NMDhcpClient *self); +const char *nm_dhcp_client_get_anycast_address(NMDhcpClient *self); + guint32 nm_dhcp_client_get_route_table(NMDhcpClient *self); void nm_dhcp_client_set_route_table(NMDhcpClient *self, guint32 route_table); @@ -160,14 +159,12 @@ GBytes *nm_dhcp_client_get_vendor_class_identifier(NMDhcpClient *self); gboolean nm_dhcp_client_start_ip4(NMDhcpClient *self, GBytes * client_id, - const char * dhcp_anycast_addr, const char * last_ip4_address, GError ** error); gboolean nm_dhcp_client_start_ip6(NMDhcpClient * self, GBytes * client_id, gboolean enforce_duid, - const char * dhcp_anycast_addr, const struct in6_addr * ll_addr, NMSettingIP6ConfigPrivacy privacy, guint needed_prefixes, diff --git a/src/core/dhcp/nm-dhcp-dhclient-utils.c b/src/core/dhcp/nm-dhcp-dhclient-utils.c index 83de1c156d..4284a852a5 100644 --- a/src/core/dhcp/nm-dhcp-dhclient-utils.c +++ b/src/core/dhcp/nm-dhcp-dhclient-utils.c @@ -291,7 +291,7 @@ char * nm_dhcp_dhclient_create_config(const char * interface, int addr_family, GBytes * client_id, - const char * anycast_addr, + const char * anycast_address, const char * hostname, guint32 timeout, gboolean use_fqdn, @@ -308,7 +308,8 @@ nm_dhcp_dhclient_create_config(const char * interface, gboolean reset_reqlist = FALSE; int i; - g_return_val_if_fail(!anycast_addr || nm_utils_hwaddr_valid(anycast_addr, ETH_ALEN), NULL); + g_return_val_if_fail(!anycast_address || nm_utils_hwaddr_valid(anycast_address, ETH_ALEN), + NULL); g_return_val_if_fail(NM_IN_SET(addr_family, AF_INET, AF_INET6), NULL); g_return_val_if_fail(!reject_servers || addr_family == AF_INET, NULL); nm_assert(!out_new_client_id || !*out_new_client_id); @@ -508,14 +509,14 @@ nm_dhcp_dhclient_create_config(const char * interface, g_string_append_c(new_contents, '\n'); - if (anycast_addr) { + if (anycast_address) { g_string_append_printf(new_contents, "interface \"%s\" {\n" " initial-interval 1; \n" " anycast-mac ethernet %s;\n" "}\n", interface, - anycast_addr); + anycast_address); } return g_string_free(g_steal_pointer(&new_contents), FALSE); diff --git a/src/core/dhcp/nm-dhcp-dhclient.c b/src/core/dhcp/nm-dhcp-dhclient.c index 06a8c938cb..4a11250f9b 100644 --- a/src/core/dhcp/nm-dhcp-dhclient.c +++ b/src/core/dhcp/nm-dhcp-dhclient.c @@ -151,7 +151,7 @@ merge_dhclient_config(NMDhcpDhclient * self, const char * iface, const char * conf_file, GBytes * client_id, - const char * anycast_addr, + const char * anycast_address, const char * hostname, guint32 timeout, gboolean use_fqdn, @@ -180,7 +180,7 @@ merge_dhclient_config(NMDhcpDhclient * self, new = nm_dhcp_dhclient_create_config(iface, addr_family, client_id, - anycast_addr, + anycast_address, hostname, timeout, use_fqdn, @@ -280,7 +280,7 @@ create_dhclient_config(NMDhcpDhclient * self, const char * iface, const char * uuid, GBytes * client_id, - const char * dhcp_anycast_addr, + const char * anycast_address, const char * hostname, guint32 timeout, gboolean use_fqdn, @@ -312,7 +312,7 @@ create_dhclient_config(NMDhcpDhclient * self, iface, new, client_id, - dhcp_anycast_addr, + anycast_address, hostname, timeout, use_fqdn, @@ -514,10 +514,7 @@ dhclient_start(NMDhcpClient *client, } static gboolean -ip4_start(NMDhcpClient *client, - const char * dhcp_anycast_addr, - const char * last_ip4_address, - GError ** error) +ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error) { NMDhcpDhclient * self = NM_DHCP_DHCLIENT(client); NMDhcpDhclientPrivate *priv = NM_DHCP_DHCLIENT_GET_PRIVATE(self); @@ -532,7 +529,7 @@ ip4_start(NMDhcpClient *client, nm_dhcp_client_get_iface(client), nm_dhcp_client_get_uuid(client), client_id, - dhcp_anycast_addr, + nm_dhcp_client_get_anycast_address(client), nm_dhcp_client_get_hostname(client), nm_dhcp_client_get_timeout(client), NM_FLAGS_HAS(nm_dhcp_client_get_client_flags(client), NM_DHCP_CLIENT_FLAGS_USE_FQDN), @@ -556,7 +553,6 @@ ip4_start(NMDhcpClient *client, static gboolean ip6_start(NMDhcpClient * client, - const char * dhcp_anycast_addr, const struct in6_addr * ll_addr, NMSettingIP6ConfigPrivacy privacy, guint needed_prefixes, @@ -573,7 +569,7 @@ ip6_start(NMDhcpClient * client, nm_dhcp_client_get_iface(client), nm_dhcp_client_get_uuid(client), NULL, - dhcp_anycast_addr, + nm_dhcp_client_get_anycast_address(client), nm_dhcp_client_get_hostname(client), nm_dhcp_client_get_timeout(client), TRUE, diff --git a/src/core/dhcp/nm-dhcp-dhcpcanon.c b/src/core/dhcp/nm-dhcp-dhcpcanon.c index 3504a04825..f3a52ea959 100644 --- a/src/core/dhcp/nm-dhcp-dhcpcanon.c +++ b/src/core/dhcp/nm-dhcp-dhcpcanon.c @@ -161,10 +161,7 @@ dhcpcanon_start(NMDhcpClient *client, } static gboolean -ip4_start(NMDhcpClient *client, - const char * dhcp_anycast_addr, - const char * last_ip4_address, - GError ** error) +ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error) { return dhcpcanon_start(client, NULL, NULL, FALSE, NULL, 0, error); } diff --git a/src/core/dhcp/nm-dhcp-dhcpcd.c b/src/core/dhcp/nm-dhcp-dhcpcd.c index 64187b8eb3..605fb84df4 100644 --- a/src/core/dhcp/nm-dhcp-dhcpcd.c +++ b/src/core/dhcp/nm-dhcp-dhcpcd.c @@ -65,10 +65,7 @@ nm_dhcp_dhcpcd_get_path(void) } static gboolean -ip4_start(NMDhcpClient *client, - const char * dhcp_anycast_addr, - const char * last_ip4_address, - GError ** error) +ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error) { NMDhcpDhcpcd * self = NM_DHCP_DHCPCD(client); gs_unref_ptrarray GPtrArray *argv = NULL; diff --git a/src/core/dhcp/nm-dhcp-manager.c b/src/core/dhcp/nm-dhcp-manager.c index 2a59571cf3..44b8ede2c0 100644 --- a/src/core/dhcp/nm-dhcp-manager.c +++ b/src/core/dhcp/nm-dhcp-manager.c @@ -214,7 +214,7 @@ client_start(NMDhcpManager * self, gboolean iaid_explicit, guint32 timeout, NMDhcpClientFlags client_flags, - const char * dhcp_anycast_addr, + const char * anycast_address, const char * hostname, NMDhcpHostnameFlags hostname_flags, const char * mud_url, @@ -337,6 +337,8 @@ client_start(NMDhcpManager * self, reject_servers, NM_DHCP_CLIENT_FLAGS, (guint) client_flags, + NM_DHCP_CLIENT_ANYCAST_ADDRESS, + anycast_address, NULL); nm_assert(client && c_list_is_empty(&client->dhcp_client_lst)); c_list_link_tail(&priv->dhcp_client_lst_head, &client->dhcp_client_lst); @@ -372,16 +374,11 @@ client_start(NMDhcpManager * self, */ if (addr_family == AF_INET) { - success = nm_dhcp_client_start_ip4(client, - dhcp_client_id, - dhcp_anycast_addr, - last_ip4_address, - error); + success = nm_dhcp_client_start_ip4(client, dhcp_client_id, last_ip4_address, error); } else { success = nm_dhcp_client_start_ip6(client, dhcp_client_id, enforce_duid, - dhcp_anycast_addr, ipv6_ll_addr, privacy, needed_prefixes, @@ -415,7 +412,7 @@ nm_dhcp_manager_start_ip4(NMDhcpManager * self, const char * mud_url, GBytes * dhcp_client_id, guint32 timeout, - const char * dhcp_anycast_addr, + const char * anycast_address, const char * last_ip_address, GBytes * vendor_class_identifier, const char *const * reject_servers, @@ -475,7 +472,7 @@ nm_dhcp_manager_start_ip4(NMDhcpManager * self, FALSE, timeout, client_flags | (use_fqdn ? NM_DHCP_CLIENT_FLAGS_USE_FQDN : NM_DHCP_CLIENT_FLAGS_NONE), - dhcp_anycast_addr, + anycast_address, hostname, hostname_flags, mud_url, @@ -507,7 +504,7 @@ nm_dhcp_manager_start_ip6(NMDhcpManager * self, guint32 iaid, gboolean iaid_explicit, guint32 timeout, - const char * dhcp_anycast_addr, + const char * anycast_address, NMSettingIP6ConfigPrivacy privacy, guint needed_prefixes, GError ** error) @@ -542,7 +539,7 @@ nm_dhcp_manager_start_ip6(NMDhcpManager * self, iaid_explicit, timeout, client_flags | NM_DHCP_CLIENT_FLAGS_USE_FQDN, - dhcp_anycast_addr, + anycast_address, hostname, hostname_flags, mud_url, diff --git a/src/core/dhcp/nm-dhcp-manager.h b/src/core/dhcp/nm-dhcp-manager.h index 8f6c62afec..ce160437a5 100644 --- a/src/core/dhcp/nm-dhcp-manager.h +++ b/src/core/dhcp/nm-dhcp-manager.h @@ -49,7 +49,7 @@ NMDhcpClient *nm_dhcp_manager_start_ip4(NMDhcpManager * manager, const char * mud_url, GBytes * dhcp_client_id, guint32 timeout, - const char * dhcp_anycast_addr, + const char * anycast_address, const char * last_ip_address, GBytes * vendor_class_identifier, const char *const * reject_servers, @@ -73,7 +73,7 @@ NMDhcpClient *nm_dhcp_manager_start_ip6(NMDhcpManager * manager, guint32 iaid, gboolean iaid_explicit, guint32 timeout, - const char * dhcp_anycast_addr, + const char * anycast_address, NMSettingIP6ConfigPrivacy privacy, guint needed_prefixes, GError ** error); diff --git a/src/core/dhcp/nm-dhcp-nettools.c b/src/core/dhcp/nm-dhcp-nettools.c index ac1179de85..176dfc425f 100644 --- a/src/core/dhcp/nm-dhcp-nettools.c +++ b/src/core/dhcp/nm-dhcp-nettools.c @@ -874,7 +874,7 @@ dhcp4_event_cb(int fd, GIOCondition condition, gpointer user_data) } static gboolean -nettools_create(NMDhcpNettools *self, const char *dhcp_anycast_addr, GError **error) +nettools_create(NMDhcpNettools *self, GError **error) { NMDhcpNettoolsPrivate *priv = NM_DHCP_NETTOOLS_GET_PRIVATE(self); nm_auto(n_dhcp4_client_config_freep) NDhcp4ClientConfig *config = NULL; @@ -893,6 +893,8 @@ nettools_create(NMDhcpNettools *self, const char *dhcp_anycast_addr, GError **er g_return_val_if_fail(!priv->client, FALSE); + /* TODO: honor nm_dhcp_client_get_anycast_address() */ + hwaddr = nm_dhcp_client_get_hw_addr(NM_DHCP_CLIENT(self)); if (!hwaddr || !(hwaddr_arr = g_bytes_get_data(hwaddr, &hwaddr_len)) || (arp_type = nm_utils_arp_type_detect_from_hwaddrlen(hwaddr_len)) < 0) { @@ -1035,10 +1037,7 @@ fqdn_flags_to_wire(NMDhcpHostnameFlags flags) } static gboolean -ip4_start(NMDhcpClient *client, - const char * dhcp_anycast_addr, - const char * last_ip4_address, - GError ** error) +ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error) { nm_auto(n_dhcp4_client_probe_config_freep) NDhcp4ClientProbeConfig *config = NULL; NMDhcpNettools * self = NM_DHCP_NETTOOLS(client); @@ -1052,7 +1051,7 @@ ip4_start(NMDhcpClient *client, g_return_val_if_fail(!priv->probe, FALSE); - if (!nettools_create(self, dhcp_anycast_addr, error)) + if (!nettools_create(self, error)) return FALSE; r = n_dhcp4_client_probe_config_new(&config); diff --git a/src/core/dhcp/nm-dhcp-systemd.c b/src/core/dhcp/nm-dhcp-systemd.c index 5b34e7b47a..e863892585 100644 --- a/src/core/dhcp/nm-dhcp-systemd.c +++ b/src/core/dhcp/nm-dhcp-systemd.c @@ -543,10 +543,7 @@ dhcp_event_cb(sd_dhcp_client *client, int event, gpointer user_data) } static gboolean -ip4_start(NMDhcpClient *client, - const char * dhcp_anycast_addr, - const char * last_ip4_address, - GError ** error) +ip4_start(NMDhcpClient *client, const char *last_ip4_address, GError **error) { nm_auto(sd_dhcp_client_unrefp) sd_dhcp_client *sd_client = NULL; NMDhcpSystemd * self = NM_DHCP_SYSTEMD(client); @@ -572,6 +569,8 @@ ip4_start(NMDhcpClient *client, g_return_val_if_fail(!priv->client4, FALSE); g_return_val_if_fail(!priv->client6, FALSE); + /* TODO: honor nm_dhcp_client_get_anycast_address() */ + r = sd_dhcp_client_new(&sd_client, FALSE); if (r < 0) { nm_utils_error_set_errno(error, r, "failed to create dhcp-client: %s"); @@ -912,7 +911,6 @@ dhcp6_event_cb(sd_dhcp6_client *client, int event, gpointer user_data) static gboolean ip6_start(NMDhcpClient * client, - const char * dhcp_anycast_addr, const struct in6_addr * ll_addr, NMSettingIP6ConfigPrivacy privacy, guint needed_prefixes, @@ -931,6 +929,8 @@ ip6_start(NMDhcpClient * client, g_return_val_if_fail(!priv->client4, FALSE); g_return_val_if_fail(!priv->client6, FALSE); + /* TODO: honor nm_dhcp_client_get_anycast_address() */ + if (!(duid = nm_dhcp_client_get_client_id(client)) || !(duid_arr = g_bytes_get_data(duid, &duid_len)) || duid_len < 2) { nm_utils_error_set_literal(error, NM_UTILS_ERROR_UNKNOWN, "missing DUID"); diff --git a/src/core/dns/nm-dns-manager.c b/src/core/dns/nm-dns-manager.c index 60a34b8eb9..a4bf61ae1c 100644 --- a/src/core/dns/nm-dns-manager.c +++ b/src/core/dns/nm-dns-manager.c @@ -87,9 +87,6 @@ typedef struct { CList ip_config_lst_head; GVariant *config_variant; - NMDnsConfigIPData *best_ip_config_4; - NMDnsConfigIPData *best_ip_config_6; - bool ip_config_lst_need_sort : 1; bool configs_lst_need_sort : 1; @@ -1851,7 +1848,6 @@ nm_dns_manager_set_ip_config(NMDnsManager * self, NMDnsConfigIPData * ip_data; NMDnsConfigData * data; int ifindex; - NMDnsConfigIPData ** p_best; g_return_val_if_fail(NM_IS_DNS_MANAGER(self), FALSE); g_return_val_if_fail(NM_IS_IP_CONFIG(ip_config), FALSE); @@ -1870,10 +1866,6 @@ nm_dns_manager_set_ip_config(NMDnsManager * self, if (ip_config_type == NM_DNS_IP_CONFIG_TYPE_REMOVED) { if (!ip_data) return FALSE; - if (priv->best_ip_config_4 == ip_data) - priv->best_ip_config_4 = NULL; - if (priv->best_ip_config_6 == ip_data) - priv->best_ip_config_6 = NULL; /* deleting a config doesn't invalidate the configs' sort order. */ _dns_config_ip_data_free(ip_data); if (c_list_is_empty(&data->data_lst_head)) @@ -1906,20 +1898,6 @@ nm_dns_manager_set_ip_config(NMDnsManager * self, priv->ip_config_lst_need_sort = TRUE; - p_best = NM_IS_IP4_CONFIG(ip_config) ? &priv->best_ip_config_4 : &priv->best_ip_config_6; - - if (ip_config_type == NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE) { - /* Only one best-device per IP version is allowed */ - if (*p_best != ip_data) { - if (*p_best) - (*p_best)->ip_config_type = NM_DNS_IP_CONFIG_TYPE_DEFAULT; - *p_best = ip_data; - } - } else { - if (*p_best == ip_data) - *p_best = NULL; - } - changed: if (!priv->updates_queue) { gs_free_error GError *error = NULL; @@ -2584,9 +2562,6 @@ dispose(GObject *object) g_clear_object(&priv->sd_resolve_plugin); _clear_plugin(self); - priv->best_ip_config_4 = NULL; - priv->best_ip_config_6 = NULL; - c_list_for_each_entry_safe (ip_data, ip_data_safe, &priv->ip_config_lst_head, ip_config_lst) _dns_config_ip_data_free(ip_data); diff --git a/src/core/nm-l3-config-data.c b/src/core/nm-l3-config-data.c index b6b391d850..a298fd90dc 100644 --- a/src/core/nm-l3-config-data.c +++ b/src/core/nm-l3-config-data.c @@ -796,8 +796,8 @@ nm_l3_config_data_lookup_route(const NML3ConfigData * self, int addr_family, const NMPlatformIPRoute *needle) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); - NMPObject obj_stack; + const int IS_IPv4 = NM_IS_IPv4(addr_family); + NMPObject obj_stack; nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); nm_assert_addr_family(addr_family); @@ -895,7 +895,7 @@ nmtst_l3_config_data_get_obj_at(const NML3ConfigData *self, NMPObjectType obj_ty gboolean nm_l3_config_data_has_routes_with_type_local(const NML3ConfigData *self, int addr_family) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int IS_IPv4 = NM_IS_IPv4(addr_family); NML3ConfigData * self_mutable; NMDedupMultiIter iter; const NMPObject *obj; @@ -1230,7 +1230,7 @@ nm_l3_config_data_add_route_full(NML3ConfigData * self, const NMPObject ** out_obj_new, gboolean * out_changed_best_default_route) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int IS_IPv4 = NM_IS_IPv4(addr_family); nm_auto_nmpobj const NMPObject *obj_old = NULL; const NMPObject * obj_new_2; gboolean changed = FALSE; @@ -1364,6 +1364,14 @@ nm_l3_config_data_add_wins(NML3ConfigData *self, in_addr_t wins) return _garray_inaddr_add(&self->wins, AF_INET, &wins); } +const in_addr_t * +nm_l3_config_data_get_nis_servers(const NML3ConfigData *self, guint *out_len) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + return _garray_inaddr_get(self->nis_servers, out_len); +} + gboolean nm_l3_config_data_add_nis_server(NML3ConfigData *self, in_addr_t nis_server) { @@ -1372,6 +1380,14 @@ nm_l3_config_data_add_nis_server(NML3ConfigData *self, in_addr_t nis_server) return _garray_inaddr_add(&self->nis_servers, AF_INET, &nis_server); } +const char * +nm_l3_config_data_get_nis_domain(const NML3ConfigData *self) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + return self->nis_domain; +} + gboolean nm_l3_config_data_set_nis_domain(NML3ConfigData *self, const char *nis_domain) { @@ -1452,10 +1468,57 @@ nm_l3_config_data_add_dns_option(NML3ConfigData *self, int addr_family, const ch return TRUE; } +const char *const * +nm_l3_config_data_get_dns_options(const NML3ConfigData *self, int addr_family, guint *out_len) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + nm_assert_addr_family(addr_family); + nm_assert(out_len); + + return nm_strv_ptrarray_get_unsafe(self->dns_options_x[NM_IS_IPv4(addr_family)], out_len); +} + +gboolean +nm_l3_config_data_get_dns_priority(const NML3ConfigData *self, int addr_family, int *out_prio) +{ + switch (addr_family) { + case AF_UNSPEC: + if (NM_FLAGS_ANY(self->flags, NM_L3_CONFIG_DAT_FLAGS_HAS_DNS_PRIORITY_4)) { + if (NM_FLAGS_ANY(self->flags, NM_L3_CONFIG_DAT_FLAGS_HAS_DNS_PRIORITY_6)) { + NM_SET_OUT(out_prio, MIN(self->dns_priority_4, self->dns_priority_6)); + return TRUE; + } + NM_SET_OUT(out_prio, self->dns_priority_4); + return TRUE; + } + if (NM_FLAGS_ANY(self->flags, NM_L3_CONFIG_DAT_FLAGS_HAS_DNS_PRIORITY_6)) { + NM_SET_OUT(out_prio, self->dns_priority_6); + return TRUE; + } + break; + case AF_INET: + if (NM_FLAGS_ANY(self->flags, NM_L3_CONFIG_DAT_FLAGS_HAS_DNS_PRIORITY_4)) { + NM_SET_OUT(out_prio, self->dns_priority_4); + return TRUE; + } + break; + case AF_INET6: + if (NM_FLAGS_ANY(self->flags, NM_L3_CONFIG_DAT_FLAGS_HAS_DNS_PRIORITY_6)) { + NM_SET_OUT(out_prio, self->dns_priority_6); + return TRUE; + } + break; + default: + nm_assert_not_reached(); + } + NM_SET_OUT(out_prio, 0); + return FALSE; +} + gboolean nm_l3_config_data_set_dns_priority(NML3ConfigData *self, int addr_family, int dns_priority) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int IS_IPv4 = NM_IS_IPv4(addr_family); const NML3ConfigDatFlags has_dns_priority_flag = NM_L3_CONFIG_DAT_FLAGS_HAS_DNS_PRIORITY(IS_IPv4); @@ -1471,6 +1534,14 @@ nm_l3_config_data_set_dns_priority(NML3ConfigData *self, int addr_family, int dn return TRUE; } +NMSettingConnectionMdns +nm_l3_config_data_get_mdns(const NML3ConfigData *self) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + return self->mdns; +} + gboolean nm_l3_config_data_set_mdns(NML3ConfigData *self, NMSettingConnectionMdns mdns) { @@ -1483,6 +1554,14 @@ nm_l3_config_data_set_mdns(NML3ConfigData *self, NMSettingConnectionMdns mdns) return TRUE; } +NMSettingConnectionLlmnr +nm_l3_config_data_get_llmnr(const NML3ConfigData *self) +{ + nm_assert(_NM_IS_L3_CONFIG_DATA(self, TRUE)); + + return self->llmnr; +} + gboolean nm_l3_config_data_set_llmnr(NML3ConfigData *self, NMSettingConnectionLlmnr llmnr) { @@ -1509,7 +1588,7 @@ nm_l3_config_data_set_route_table_sync(NML3ConfigData * self, int addr_family, NMIPRouteTableSyncMode route_table_sync) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int IS_IPv4 = NM_IS_IPv4(addr_family); nm_assert(_NM_IS_L3_CONFIG_DATA(self, FALSE)); nm_assert_addr_family(addr_family); @@ -1780,13 +1859,16 @@ _dedup_multi_index_cmp(const NML3ConfigData *a, const NML3ConfigData *b, NMPObje } int -nm_l3_config_data_cmp(const NML3ConfigData *a, const NML3ConfigData *b) +nm_l3_config_data_cmp_full(const NML3ConfigData *a, + const NML3ConfigData *b, + NML3ConfigCmpFlags cmp_flags) { int IS_IPv4; NM_CMP_SELF(a, b); - NM_CMP_DIRECT(a->ifindex, b->ifindex); + if (!NM_FLAGS_HAS(cmp_flags, NM_L3_CONFIG_CMP_FLAGS_IGNORE_IFINDEX)) + NM_CMP_DIRECT(a->ifindex, b->ifindex); NM_CMP_DIRECT(a->flags, b->flags); @@ -1863,7 +1945,7 @@ _data_get_direct_route_for_host(const NML3ConfigData *self, gconstpointer host, guint32 route_table) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int IS_IPv4 = NM_IS_IPv4(addr_family); const NMPObject * best_route_obj = NULL; const NMPlatformIPXRoute *best_route = NULL; const NMPObject * item_obj; @@ -1998,7 +2080,7 @@ nm_l3_config_data_add_dependent_routes(NML3ConfigData *self, guint32 route_metric, gboolean is_vrf) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int IS_IPv4 = NM_IS_IPv4(addr_family); gs_unref_ptrarray GPtrArray *extra_onlink_routes = NULL; const NMPObject * my_addr_obj; const NMPObject * my_route_obj; @@ -2209,7 +2291,7 @@ _init_from_connection_ip(NML3ConfigData *self, guint32 route_table, guint32 route_metric) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int IS_IPv4 = NM_IS_IPv4(addr_family); NMSettingIPConfig *s_ip; guint naddresses; guint nroutes; @@ -2433,7 +2515,7 @@ _init_from_platform(NML3ConfigData * self, NMPlatform * platform, NMSettingIP6ConfigPrivacy ipv6_privacy_rfc4941) { - const gboolean IS_IPv4 = NM_IS_IPv4(addr_family); + const int IS_IPv4 = NM_IS_IPv4(addr_family); const NMDedupMultiHeadEntry *head_entry; const NMPObject * plobj = NULL; NMDedupMultiIter iter; @@ -2534,6 +2616,9 @@ nm_l3_config_data_merge(NML3ConfigData * self, 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) + || nm_utils_is_power_of_two(merge_flags)); + for (IS_IPv4 = 1; IS_IPv4 >= 0; IS_IPv4--) { const int addr_family = IS_IPv4 ? AF_INET : AF_INET6; const NML3ConfigDatFlags has_dns_priority_flag = @@ -2588,28 +2673,31 @@ nm_l3_config_data_merge(NML3ConfigData * self, } \ G_STMT_END - if (r_src->table_any) { - _ensure_r(); - r.rx.table_any = FALSE; - r.rx.table_coerced = default_route_table_x[IS_IPv4]; - } - - if (r_src->metric_any) { - _ensure_r(); - r.rx.metric_any = FALSE; - r.rx.metric = nm_add_clamped_u32(r.rx.metric, default_route_metric_x[IS_IPv4]); - } - - if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT(r_src)) { - if (NM_FLAGS_HAS(merge_flags, NM_L3_CONFIG_MERGE_FLAGS_NO_DEFAULT_ROUTES) - && !NM_FLAGS_HAS(src->flags, - NM_L3_CONFIG_DAT_FLAGS_IGNORE_MERGE_NO_DEFAULT_ROUTES)) - continue; - if (default_route_penalty_x && default_route_penalty_x[IS_IPv4] > 0) { + if (!NM_FLAGS_HAS(merge_flags, NM_L3_CONFIG_MERGE_FLAGS_CLONE)) { + if (r_src->table_any) { _ensure_r(); + r.rx.table_any = FALSE; + r.rx.table_coerced = default_route_table_x[IS_IPv4]; + } + + if (r_src->metric_any) { + _ensure_r(); + r.rx.metric_any = FALSE; r.rx.metric = - nm_utils_ip_route_metric_penalize(r.rx.metric, - default_route_penalty_x[IS_IPv4]); + nm_add_clamped_u32(r.rx.metric, default_route_metric_x[IS_IPv4]); + } + + if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT(r_src)) { + if (NM_FLAGS_HAS(merge_flags, NM_L3_CONFIG_MERGE_FLAGS_NO_DEFAULT_ROUTES) + && !NM_FLAGS_HAS(src->flags, + NM_L3_CONFIG_DAT_FLAGS_IGNORE_MERGE_NO_DEFAULT_ROUTES)) + continue; + if (default_route_penalty_x && default_route_penalty_x[IS_IPv4] > 0) { + _ensure_r(); + r.rx.metric = + nm_utils_ip_route_metric_penalize(r.rx.metric, + default_route_penalty_x[IS_IPv4]); + } } } @@ -2689,8 +2777,16 @@ nm_l3_config_data_merge(NML3ConfigData * self, if (self->ip6_mtu == 0u) self->ip6_mtu = src->ip6_mtu; - /* self->source does not get merged. */ - /* self->dhcp_lease_x does not get merged. */ + if (NM_FLAGS_HAS(merge_flags, NM_L3_CONFIG_MERGE_FLAGS_CLONE)) { + _nm_unused nm_auto_unref_dhcplease NMDhcpLease *dhcp_lease_6 = + g_steal_pointer(&self->dhcp_lease_x[0]); + _nm_unused nm_auto_unref_dhcplease NMDhcpLease *dhcp_lease_4 = + g_steal_pointer(&self->dhcp_lease_x[1]); + + self->source = src->source; + self->dhcp_lease_x[0] = nm_dhcp_lease_ref(self->dhcp_lease_x[0]); + self->dhcp_lease_x[1] = nm_dhcp_lease_ref(self->dhcp_lease_x[1]); + } } NML3ConfigData * @@ -2707,6 +2803,17 @@ nm_l3_config_data_new_clone(const NML3ConfigData *src, int ifindex) ifindex = src->ifindex; self = nm_l3_config_data_new(src->multi_idx, ifindex); - nm_l3_config_data_merge(self, src, NM_L3_CONFIG_MERGE_FLAGS_NONE, NULL, NULL, NULL, NULL, NULL); + nm_l3_config_data_merge(self, + src, + NM_L3_CONFIG_MERGE_FLAGS_CLONE, + NULL, + NULL, + NULL, + NULL, + NULL); + + nm_assert(nm_l3_config_data_cmp_full(src, self, NM_L3_CONFIG_CMP_FLAGS_IGNORE_IFINDEX) == 0); + nm_assert(nm_l3_config_data_get_ifindex(self) == ifindex); + return self; } diff --git a/src/core/nm-l3-config-data.h b/src/core/nm-l3-config-data.h index 229851c588..c8a47064f5 100644 --- a/src/core/nm-l3-config-data.h +++ b/src/core/nm-l3-config-data.h @@ -60,6 +60,8 @@ typedef enum { * Note that if the respective NML3ConfigData has NM_L3_CONFIG_DAT_FLAGS_IGNORE_MERGE_NO_DEFAULT_ROUTES * set, this flag gets ignored during merge. * @NM_L3_CONFIG_MERGE_FLAGS_NO_DNS: don't merge DNS information + * @NM_L3_CONFIG_MERGE_FLAGS_CLONE: clone is also implemented via "merge". + * In that case, it takes all settings. */ typedef enum _nm_packed { NM_L3_CONFIG_MERGE_FLAGS_NONE = 0, @@ -67,6 +69,7 @@ typedef enum _nm_packed { NM_L3_CONFIG_MERGE_FLAGS_NO_ROUTES = (1LL << 1), NM_L3_CONFIG_MERGE_FLAGS_NO_DEFAULT_ROUTES = (1LL << 2), NM_L3_CONFIG_MERGE_FLAGS_NO_DNS = (1LL << 3), + NM_L3_CONFIG_MERGE_FLAGS_CLONE = (1LL << 4), } NML3ConfigMergeFlags; /*****************************************************************************/ @@ -191,7 +194,20 @@ NMDedupMultiIndex *nm_l3_config_data_get_multi_idx(const NML3ConfigData *self); /*****************************************************************************/ -int nm_l3_config_data_cmp(const NML3ConfigData *a, const NML3ConfigData *b); +typedef enum { + NM_L3_CONFIG_CMP_FLAGS_NONE, + NM_L3_CONFIG_CMP_FLAGS_IGNORE_IFINDEX = (1LL << 0), +} NML3ConfigCmpFlags; + +int nm_l3_config_data_cmp_full(const NML3ConfigData *a, + const NML3ConfigData *b, + NML3ConfigCmpFlags cmp_flags); + +static inline int +nm_l3_config_data_cmp(const NML3ConfigData *a, const NML3ConfigData *b) +{ + return nm_l3_config_data_cmp_full(a, b, NM_L3_CONFIG_CMP_FLAGS_NONE); +} static inline gboolean nm_l3_config_data_equal(const NML3ConfigData *a, const NML3ConfigData *b) @@ -236,6 +252,11 @@ nm_l3_config_data_lookup_routes(const NML3ConfigData *self, int addr_family) for (nm_dedup_multi_iter_init((iter), nm_l3_config_data_lookup_objs((self), (type))); \ nm_platform_dedup_multi_iter_next_obj((iter), (obj), (type));) +#define nm_l3_config_data_iter_ip_address_for_each(iter, self, addr_family, address) \ + for (nm_dedup_multi_iter_init((iter), \ + nm_l3_config_data_lookup_addresses((self), (addr_family))); \ + nm_platform_dedup_multi_iter_next_ip_address((iter), (address));) + #define nm_l3_config_data_iter_ip4_address_for_each(iter, self, address) \ for (nm_dedup_multi_iter_init((iter), nm_l3_config_data_lookup_addresses((self), AF_INET)); \ nm_platform_dedup_multi_iter_next_ip4_address((iter), (address));) @@ -244,6 +265,10 @@ nm_l3_config_data_lookup_routes(const NML3ConfigData *self, int addr_family) for (nm_dedup_multi_iter_init((iter), nm_l3_config_data_lookup_addresses((self), AF_INET6)); \ nm_platform_dedup_multi_iter_next_ip6_address((iter), (address));) +#define nm_l3_config_data_iter_ip_route_for_each(iter, self, addr_family, route) \ + for (nm_dedup_multi_iter_init((iter), nm_l3_config_data_lookup_routes((self), (addr_family))); \ + nm_platform_dedup_multi_iter_next_ip_route((iter), (route));) + #define nm_l3_config_data_iter_ip4_route_for_each(iter, self, route) \ for (nm_dedup_multi_iter_init((iter), nm_l3_config_data_lookup_routes((self), AF_INET)); \ nm_platform_dedup_multi_iter_next_ip4_route((iter), (route));) @@ -409,8 +434,12 @@ nm_l3_config_data_add_route_6(NML3ConfigData *self, const NMPlatformIP6Route *rt const NMPObject *nm_l3_config_data_get_best_default_route(const NML3ConfigData *self, int addr_family); +NMSettingConnectionMdns nm_l3_config_data_get_mdns(const NML3ConfigData *self); + gboolean nm_l3_config_data_set_mdns(NML3ConfigData *self, NMSettingConnectionMdns mdns); +NMSettingConnectionLlmnr nm_l3_config_data_get_llmnr(const 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, @@ -445,13 +474,17 @@ gboolean nm_l3_config_data_add_nameserver(NML3ConfigData * gboolean nm_l3_config_data_clear_nameservers(NML3ConfigData *self, int addr_family); +const in_addr_t *nm_l3_config_data_get_nis_servers(const NML3ConfigData *self, guint *out_len); + gboolean nm_l3_config_data_add_nis_server(NML3ConfigData *self, in_addr_t nis_server); +const char *nm_l3_config_data_get_nis_domain(const NML3ConfigData *self); + +gboolean nm_l3_config_data_set_nis_domain(NML3ConfigData *self, const char *nis_domain); + const char *const * nm_l3_config_data_get_domains(const NML3ConfigData *self, int addr_family, guint *out_len); -gboolean nm_l3_config_data_set_nis_domain(NML3ConfigData *self, const char *nis_domain); - gboolean nm_l3_config_data_add_domain(NML3ConfigData *self, int addr_family, const char *domain); const char *const * @@ -464,6 +497,12 @@ gboolean nm_l3_config_data_add_search(NML3ConfigData *self, int addr_family, con gboolean nm_l3_config_data_add_dns_option(NML3ConfigData *self, int addr_family, const char *dns_option); +const char *const * +nm_l3_config_data_get_dns_options(const NML3ConfigData *self, int addr_family, guint *out_len); + +gboolean +nm_l3_config_data_get_dns_priority(const NML3ConfigData *self, int addr_family, int *out_prio); + gboolean nm_l3_config_data_set_dns_priority(NML3ConfigData *self, int addr_family, int dns_priority); diff --git a/src/core/nm-l3cfg.h b/src/core/nm-l3cfg.h index a477d6c3d1..f31bca6de2 100644 --- a/src/core/nm-l3cfg.h +++ b/src/core/nm-l3cfg.h @@ -173,6 +173,8 @@ struct _NMDedupMultiIndex *nm_netns_get_multi_idx(NMNetns *self); static inline struct _NMDedupMultiIndex * nm_l3cfg_get_multi_idx(const NML3Cfg *self) { + g_return_val_if_fail(NM_IS_L3CFG(self), NULL); + return nm_netns_get_multi_idx(self->priv.netns); } @@ -181,7 +183,7 @@ nm_l3cfg_get_multi_idx(const NML3Cfg *self) static inline int nm_l3cfg_get_ifindex(const NML3Cfg *self) { - nm_assert(NM_IS_L3CFG(self)); + g_return_val_if_fail(NM_IS_L3CFG(self), 0); return self->priv.ifindex; } diff --git a/src/libnm-core-impl/nm-setting-olpc-mesh.c b/src/libnm-core-impl/nm-setting-olpc-mesh.c index 04e24ffc36..0d58de6907 100644 --- a/src/libnm-core-impl/nm-setting-olpc-mesh.c +++ b/src/libnm-core-impl/nm-setting-olpc-mesh.c @@ -254,6 +254,8 @@ nm_setting_olpc_mesh_class_init(NMSettingOlpcMeshClass *klass) * Anycast DHCP MAC address used when requesting an IP address via DHCP. * The specific anycast address used determines which DHCP server class * answers the request. + * + * This is currently only implemented by dhclient DHCP plugin. **/ obj_properties[PROP_DHCP_ANYCAST_ADDRESS] = g_param_spec_string(NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS, diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 7bd3845a56..202bfd40bf 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -290,6 +290,14 @@ nm_ip4_addr_is_localhost(in_addr_t addr4) return (addr4 & htonl(0xFF000000u)) == htonl(0x7F000000u); } +static inline gconstpointer +nm_ip_addr_from_packed_array(int addr_family, gconstpointer ipaddr_arr, gsize idx) +{ + return NM_IS_IPv4(addr_family) + ? ((gconstpointer) & (((const struct in_addr *) ipaddr_arr)[idx])) + : ((gconstpointer) & (((const struct in6_addr *) ipaddr_arr)[idx])); +} + /*****************************************************************************/ struct ether_addr; diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index 1a6e698be5..81eb9a3a33 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -2,7 +2,7 @@ #define DESCRIBE_DOC_NM_SETTING_6LOWPAN_PARENT N_("If given, specifies the parent interface name or parent connection UUID from which this 6LowPAN interface should be created.") #define DESCRIBE_DOC_NM_SETTING_OLPC_MESH_CHANNEL N_("Channel on which the mesh network to join is located.") -#define DESCRIBE_DOC_NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS N_("Anycast DHCP MAC address used when requesting an IP address via DHCP. The specific anycast address used determines which DHCP server class answers the request.") +#define DESCRIBE_DOC_NM_SETTING_OLPC_MESH_DHCP_ANYCAST_ADDRESS N_("Anycast DHCP MAC address used when requesting an IP address via DHCP. The specific anycast address used determines which DHCP server class answers the request. This is currently only implemented by dhclient DHCP plugin.") #define DESCRIBE_DOC_NM_SETTING_OLPC_MESH_SSID N_("SSID of the mesh network to join.") #define DESCRIBE_DOC_NM_SETTING_WIRELESS_AP_ISOLATION N_("Configures AP isolation, which prevents communication between wireless devices connected to this AP. This property can be set to a value different from NM_TERNARY_DEFAULT (-1) only when the interface is configured in AP mode. If set to NM_TERNARY_TRUE (1), devices are not able to communicate with each other. This increases security because it protects devices against attacks from other clients in the network. At the same time, it prevents devices to access resources on the same wireless networks as file shares, printers, etc. If set to NM_TERNARY_FALSE (0), devices can talk to each other. When set to NM_TERNARY_DEFAULT (-1), the global default is used; in case the global default is unspecified it is assumed to be NM_TERNARY_FALSE (0).") #define DESCRIBE_DOC_NM_SETTING_WIRELESS_BAND N_("802.11 frequency band of the network. One of \"a\" for 5GHz 802.11a or \"bg\" for 2.4GHz 802.11. This will lock associations to the Wi-Fi network to the specific band, i.e. if \"a\" is specified, the device will not associate with the same network in the 2.4GHz band even if the network's settings are compatible. This setting depends on specific driver capability and may not work with all drivers.") diff --git a/src/nmcli/generate-docs-nm-settings-nmcli.xml.in b/src/nmcli/generate-docs-nm-settings-nmcli.xml.in index 3438d7bf2a..a250c5f403 100644 --- a/src/nmcli/generate-docs-nm-settings-nmcli.xml.in +++ b/src/nmcli/generate-docs-nm-settings-nmcli.xml.in @@ -14,7 +14,7 @@ description="Channel on which the mesh network to join is located." /> + description="Anycast DHCP MAC address used when requesting an IP address via DHCP. The specific anycast address used determines which DHCP server class answers the request. This is currently only implemented by dhclient DHCP plugin." />