mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-05 11:10:31 +01:00
core: tweak nm_system_add_ip4_vpn_gateway_route() a bit
Rather than having it pull the gateway out of the VPN's NMIP4Config, just have the vpn-manager tell it the gateway directly.
This commit is contained in:
parent
2b222c66fa
commit
04c1ad3b69
3 changed files with 24 additions and 20 deletions
|
|
@ -349,14 +349,15 @@ add_ip4_addresses (NMIP4Config *config, int ifindex)
|
|||
}
|
||||
|
||||
struct rtnl_route *
|
||||
nm_system_add_ip4_vpn_gateway_route (NMDevice *parent_device, NMIP4Config *vpn_config)
|
||||
nm_system_add_ip4_vpn_gateway_route (NMDevice *parent_device, guint32 vpn_gw)
|
||||
{
|
||||
NMIP4Config *parent_config;
|
||||
guint32 parent_gw = 0, parent_prefix = 0, vpn_gw = 0, i;
|
||||
guint32 parent_gw = 0, parent_prefix = 0, i;
|
||||
NMIP4Address *tmp;
|
||||
struct rtnl_route *route = NULL;
|
||||
|
||||
g_return_val_if_fail (NM_IS_DEVICE (parent_device), NULL);
|
||||
g_return_val_if_fail (vpn_gw != 0, NULL);
|
||||
|
||||
/* Set up a route to the VPN gateway's public IP address through the default
|
||||
* network device if the VPN gateway is on a different subnet.
|
||||
|
|
@ -374,15 +375,7 @@ nm_system_add_ip4_vpn_gateway_route (NMDevice *parent_device, NMIP4Config *vpn_c
|
|||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < nm_ip4_config_get_num_addresses (vpn_config); i++) {
|
||||
tmp = nm_ip4_config_get_address (vpn_config, i);
|
||||
if (nm_ip4_address_get_gateway (tmp)) {
|
||||
vpn_gw = nm_ip4_address_get_gateway (tmp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!parent_gw || !vpn_gw)
|
||||
if (!parent_gw)
|
||||
return NULL;
|
||||
|
||||
/* If the VPN gateway is in the same subnet as one of the parent device's
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@ gboolean nm_system_replace_default_ip4_route_vpn (int ifindex,
|
|||
int parent_ifindex,
|
||||
guint32 parent_mss);
|
||||
|
||||
struct rtnl_route *nm_system_add_ip4_vpn_gateway_route (NMDevice *parent_device, NMIP4Config *vpn_config);
|
||||
struct rtnl_route *nm_system_add_ip4_vpn_gateway_route (NMDevice *parent_device,
|
||||
guint32 vpn_gw);
|
||||
|
||||
|
||||
gboolean nm_system_iface_flush_addresses (int ifindex, int family);
|
||||
|
|
|
|||
|
|
@ -85,6 +85,7 @@ typedef struct {
|
|||
guint ipconfig_timeout;
|
||||
NMIP4Config *ip4_config;
|
||||
guint32 ip4_internal_gw;
|
||||
guint32 ip4_external_gw;
|
||||
char *ip_iface;
|
||||
int ip_ifindex;
|
||||
char *banner;
|
||||
|
|
@ -230,11 +231,16 @@ device_ip4_config_changed (NMDevice *device,
|
|||
|| !nm_device_get_ip4_config (device))
|
||||
return;
|
||||
|
||||
if (priv->gw_route)
|
||||
if (priv->gw_route) {
|
||||
rtnl_route_put (priv->gw_route);
|
||||
priv->gw_route = NULL;
|
||||
}
|
||||
|
||||
/* Re-add the VPN gateway route */
|
||||
priv->gw_route = nm_system_add_ip4_vpn_gateway_route (priv->parent_dev, priv->ip4_config);
|
||||
if (priv->ip4_external_gw) {
|
||||
priv->gw_route = nm_system_add_ip4_vpn_gateway_route (priv->parent_dev,
|
||||
priv->ip4_external_gw);
|
||||
}
|
||||
}
|
||||
|
||||
NMVPNConnection *
|
||||
|
|
@ -459,7 +465,6 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
|
|||
NMIP4Config *config;
|
||||
GValue *val;
|
||||
int i;
|
||||
guint32 vpn_ext_gw = 0;
|
||||
|
||||
nm_log_info (LOGD_VPN, "VPN connection '%s' (IP Config Get) reply received.",
|
||||
nm_vpn_connection_get_name (connection));
|
||||
|
|
@ -495,9 +500,10 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
|
|||
/* External world-visible address of the VPN server */
|
||||
val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY);
|
||||
if (val) {
|
||||
priv->ip4_external_gw = g_value_get_uint (val);
|
||||
nm_ip4_address_set_gateway (addr, g_value_get_uint (val));
|
||||
vpn_ext_gw = g_value_get_uint (val);
|
||||
}
|
||||
} else
|
||||
priv->ip4_external_gw = 0;
|
||||
|
||||
val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS);
|
||||
if (val)
|
||||
|
|
@ -576,8 +582,8 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
|
|||
* the VPN server, we want to use the NM created route instead of
|
||||
* whatever the server provides.
|
||||
*/
|
||||
if ( vpn_ext_gw
|
||||
&& nm_ip4_route_get_dest (route) == vpn_ext_gw
|
||||
if ( priv->ip4_external_gw
|
||||
&& nm_ip4_route_get_dest (route) == priv->ip4_external_gw
|
||||
&& nm_ip4_route_get_prefix (route) == 32)
|
||||
continue;
|
||||
|
||||
|
|
@ -604,7 +610,11 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
|
|||
NMDnsManager *dns_mgr;
|
||||
|
||||
/* Add any explicit route to the VPN gateway through the parent device */
|
||||
priv->gw_route = nm_system_add_ip4_vpn_gateway_route (priv->parent_dev, config);
|
||||
if (priv->ip4_external_gw) {
|
||||
priv->gw_route = nm_system_add_ip4_vpn_gateway_route (priv->parent_dev,
|
||||
priv->ip4_external_gw);
|
||||
} else
|
||||
priv->gw_route = NULL;
|
||||
|
||||
/* Add the VPN to DNS */
|
||||
dns_mgr = nm_dns_manager_get (NULL);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue