diff options
Diffstat (limited to 'src/core/devices/nm-device.c')
| -rw-r--r-- | src/core/devices/nm-device.c | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c index 516e13df..6c5a9b5a 100644 --- a/src/core/devices/nm-device.c +++ b/src/core/devices/nm-device.c @@ -1462,7 +1462,7 @@ _prop_get_connection_mptcp_flags(NMDevice *self) if (!NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_DISABLED)) { if (!NM_FLAGS_HAS(mptcp_flags, NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL)) { - guint32 v; + gint32 v; /* If enabled, but without "also-without-sysctl", then MPTCP is still * disabled, if the sysctl says so... @@ -10377,31 +10377,34 @@ lldp_setup(NMDevice *self, NMTernary enabled) * as externally added ones. Don't restart NetworkManager if * you care about that. */ -static void -_routing_rules_sync(NMDevice *self, NMTernary set_mode) +void +nm_routing_rules_sync(NMConnection *applied_connection, + NMTernary set_mode, + GPtrArray *(*get_extra_rules)(NMDevice *self), + NMDevice *self, + NMNetns *netns) { - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); - NMPGlobalTracker *global_tracker = nm_netns_get_global_tracker(nm_device_get_netns(self)); - NMDeviceClass *klass = NM_DEVICE_GET_CLASS(self); + NMPGlobalTracker *global_tracker = nm_netns_get_global_tracker(netns); gboolean untrack_only_dirty = FALSE; gboolean keep_deleted_rules; gpointer user_tag_1; gpointer user_tag_2; - /* take two arbitrary user-tag pointers that belong to @self. */ - user_tag_1 = &priv->v4_route_table; - user_tag_2 = &priv->v6_route_table; + if (self) { + user_tag_1 = ((guint32 *) self) + 1; + user_tag_2 = ((guint32 *) self) + 2; + } else { + user_tag_1 = ((guint32 *) applied_connection) + 1; + user_tag_2 = ((guint32 *) applied_connection) + 2; + } if (set_mode == NM_TERNARY_TRUE) { - NMConnection *applied_connection; NMSettingIPConfig *s_ip; guint i, num; int is_ipv4; untrack_only_dirty = TRUE; - applied_connection = nm_device_get_applied_connection(self); - for (is_ipv4 = 0; applied_connection && is_ipv4 < 2; is_ipv4++) { int addr_family = is_ipv4 ? AF_INET : AF_INET6; @@ -10440,10 +10443,10 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) } } - if (klass->get_extra_rules) { + if (get_extra_rules) { gs_unref_ptrarray GPtrArray *extra_rules = NULL; - extra_rules = klass->get_extra_rules(self); + extra_rules = get_extra_rules(self); if (extra_rules) { for (i = 0; i < extra_rules->len; i++) { nmp_global_tracker_track_rule( @@ -10458,7 +10461,7 @@ _routing_rules_sync(NMDevice *self, NMTernary set_mode) } nmp_global_tracker_untrack_all(global_tracker, user_tag_1, !untrack_only_dirty, TRUE); - if (klass->get_extra_rules) + if (get_extra_rules) nmp_global_tracker_untrack_all(global_tracker, user_tag_2, !untrack_only_dirty, TRUE); keep_deleted_rules = FALSE; @@ -10518,8 +10521,8 @@ tc_commit(NMDevice *self) static void activate_stage2_device_config(NMDevice *self) { - NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); - NMDeviceClass *klass; + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); + NMDeviceClass *klass = NM_DEVICE_GET_CLASS(self); NMActStageReturn ret; NMSettingWired *s_wired; gboolean no_firmware = FALSE; @@ -10544,7 +10547,11 @@ activate_stage2_device_config(NMDevice *self) priv->tc_committed = TRUE; } - _routing_rules_sync(self, NM_TERNARY_TRUE); + nm_routing_rules_sync(nm_device_get_applied_connection(self), + NM_TERNARY_TRUE, + klass->get_extra_rules, + self, + nm_device_get_netns(self)); if (!nm_device_managed_type_is_external_or_assume(self)) { if (!nm_device_bring_up_full(self, FALSE, TRUE, &no_firmware)) { @@ -10556,7 +10563,6 @@ activate_stage2_device_config(NMDevice *self) } } - klass = NM_DEVICE_GET_CLASS(self); if (klass->act_stage2_config_also_for_external_or_assume || !nm_device_managed_type_is_external_or_assume(self)) { NMDeviceStateReason failure_reason = NM_DEVICE_STATE_REASON_NONE; @@ -11383,7 +11389,7 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family) /* Take the NML3ConfigData from the previous lease (if any) that was passed to the NMDhcpClient. * This may be the old lease only used during the duration of a reapply until we get the * new lease. */ - previous_lease = nm_dhcp_client_get_lease(priv->ipdhcp_data_x[IS_IPv4].client); + previous_lease = nm_dhcp_client_get_lease(priv->ipdhcp_data_x[IS_IPv4].client, TRUE); if (!priv->ipdhcp_data_x[IS_IPv4].config) { priv->ipdhcp_data_x[IS_IPv4].config = nm_dhcp_config_new(addr_family, previous_lease); @@ -13931,7 +13937,11 @@ check_and_reapply_connection(NMDevice *self, nm_device_activate_schedule_stage3_ip_config(self, FALSE); - _routing_rules_sync(self, NM_TERNARY_TRUE); + nm_routing_rules_sync(nm_device_get_applied_connection(self), + NM_TERNARY_TRUE, + klass->get_extra_rules, + self, + nm_device_get_netns(self)); reactivate_proxy_config(self); @@ -16493,6 +16503,7 @@ static void nm_device_cleanup(NMDevice *self, NMDeviceStateReason reason, CleanupType cleanup_type) { NMDevicePrivate *priv; + NMDeviceClass *klass = NM_DEVICE_GET_CLASS(self); int ifindex; g_return_if_fail(NM_IS_DEVICE(self)); @@ -16517,8 +16528,8 @@ nm_device_cleanup(NMDevice *self, NMDeviceStateReason reason, CleanupType cleanu } /* Call device type-specific deactivation */ - if (NM_DEVICE_GET_CLASS(self)->deactivate) - NM_DEVICE_GET_CLASS(self)->deactivate(self); + if (klass->deactivate) + klass->deactivate(self); ifindex = nm_device_get_ip_ifindex(self); @@ -16540,8 +16551,11 @@ nm_device_cleanup(NMDevice *self, NMDeviceStateReason reason, CleanupType cleanu priv->tc_committed = FALSE; - _routing_rules_sync(self, - cleanup_type == CLEANUP_TYPE_KEEP ? NM_TERNARY_DEFAULT : NM_TERNARY_FALSE); + nm_routing_rules_sync(nm_device_get_applied_connection(self), + cleanup_type == CLEANUP_TYPE_KEEP ? NM_TERNARY_DEFAULT : NM_TERNARY_FALSE, + klass->get_extra_rules, + self, + nm_device_get_netns(self)); if (ifindex > 0) nm_platform_ip4_dev_route_blacklist_set(nm_device_get_platform(self), ifindex, NULL); @@ -16570,7 +16584,7 @@ nm_device_cleanup(NMDevice *self, NMDeviceStateReason reason, CleanupType cleanu /* for other device states (UNAVAILABLE, DISCONNECTED), allow the * device to overwrite the reset behavior, so that Wi-Fi can set * a randomized MAC address used during scanning. */ - NM_DEVICE_GET_CLASS(self)->deactivate_reset_hw_addr(self); + klass->deactivate_reset_hw_addr(self); } } |