vpn-connection: add @fallback_device argument to nm_vpn_connection_get_ip_iface()

and nm_vpn_connection_get_ip_ifindex(). For VPN types that have no own
IP interface, we often want instead lookup the IP interface from the
parent device.

(cherry picked from commit 18501d7b68)
This commit is contained in:
Thomas Haller 2016-05-27 12:42:06 +02:00
parent 01f6a6af7e
commit b7b3163f39
4 changed files with 61 additions and 29 deletions

View file

@ -727,16 +727,8 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self,
if (device)
ip_ifindex = nm_device_get_ip_ifindex (device);
else {
ip_ifindex = nm_vpn_connection_get_ip_ifindex (vpn);
if (ip_ifindex <= 0) {
NMDevice *parent = nm_active_connection_get_device (NM_ACTIVE_CONNECTION (vpn));
if (parent)
ip_ifindex = nm_device_get_ip_ifindex (parent);
}
}
else
ip_ifindex = nm_vpn_connection_get_ip_ifindex (vpn, TRUE);
entries = vtable->get_entries (priv);
entry = _entry_find_by_source (entries, source, &entry_idx);
@ -818,7 +810,7 @@ _ipx_update_default_route (const VTableIP *vtable, NMDefaultRouteManager *self,
}
}
}
if (nm_vpn_connection_get_ip_ifindex (vpn) > 0)
if (nm_vpn_connection_get_ip_ifindex (vpn, FALSE) > 0)
synced = TRUE;
else {
/* a VPN connection without tunnel device cannot have a non-synced, missing default route.
@ -1149,7 +1141,7 @@ _ipx_get_best_config (const VTableIP *vtable,
if (out_ac)
*out_ac = NM_ACTIVE_CONNECTION (vpn);
if (out_ip_iface)
*out_ip_iface = nm_vpn_connection_get_ip_iface (vpn);
*out_ip_iface = nm_vpn_connection_get_ip_iface (vpn, FALSE);
} else {
NMDevice *device = entry->source.device;
NMActRequest *req;

View file

@ -1442,7 +1442,7 @@ vpn_connection_activated (NMPolicy *self, NMVpnConnection *vpn)
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
ip_iface = nm_vpn_connection_get_ip_iface (vpn);
ip_iface = nm_vpn_connection_get_ip_iface (vpn, FALSE);
/* Add the VPN connection's IP configs from DNS */

View file

@ -1338,7 +1338,6 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict)
const char *str;
GVariant *v;
gboolean b;
int ifindex;
g_return_if_fail (dict && g_variant_is_of_type (dict, G_VARIANT_TYPE_VARDICT));
@ -1366,13 +1365,7 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict)
priv->has_ip6 = FALSE;
}
if (priv->ip_ifindex > 0) {
ifindex = priv->ip_ifindex;
} else {
NMDevice *parent_dev = nm_active_connection_get_device (NM_ACTIVE_CONNECTION (self));
ifindex = nm_device_get_ip_ifindex (parent_dev);
}
config = nm_ip4_config_new (ifindex);
config = nm_ip4_config_new (nm_vpn_connection_get_ip_ifindex (self, TRUE));
nm_ip4_config_set_dns_priority (config, NM_DNS_PRIORITY_DEFAULT_VPN);
memset (&address, 0, sizeof (address));
@ -2093,20 +2086,67 @@ nm_vpn_connection_get_ip6_config (NMVpnConnection *self)
return NM_VPN_CONNECTION_GET_PRIVATE (self)->ip6_config;
}
const char *
nm_vpn_connection_get_ip_iface (NMVpnConnection *self)
static int
_get_ip_iface_for_device (NMVpnConnection *self, const char **out_iface)
{
NMDevice *parent_dev;
int ifindex;
const char *iface;
nm_assert (NM_IS_VPN_CONNECTION (self));
/* the ifindex and the ifname in this case should come together.
* They either must be both set, or none. */
parent_dev = nm_active_connection_get_device (NM_ACTIVE_CONNECTION (self));
if (!parent_dev)
goto none;
ifindex = nm_device_get_ip_ifindex (parent_dev);
if (ifindex <= 0)
goto none;
iface = nm_device_get_ip_iface (parent_dev);
if (!iface)
goto none;
NM_SET_OUT (out_iface, iface);
return ifindex;
none:
NM_SET_OUT (out_iface, NULL);
return 0;
}
const char *
nm_vpn_connection_get_ip_iface (NMVpnConnection *self, gboolean fallback_device)
{
NMVpnConnectionPrivate *priv;
const char *iface;
g_return_val_if_fail (NM_IS_VPN_CONNECTION (self), NULL);
return NM_VPN_CONNECTION_GET_PRIVATE (self)->ip_iface;
priv = NM_VPN_CONNECTION_GET_PRIVATE (self);
if (priv->ip_iface || !fallback_device)
return priv->ip_iface;
_get_ip_iface_for_device (self, &iface);
return iface;
}
int
nm_vpn_connection_get_ip_ifindex (NMVpnConnection *self)
nm_vpn_connection_get_ip_ifindex (NMVpnConnection *self, gboolean fallback_device)
{
g_return_val_if_fail (NM_IS_VPN_CONNECTION (self), -1);
NMVpnConnectionPrivate *priv;
return NM_VPN_CONNECTION_GET_PRIVATE (self)->ip_ifindex;
g_return_val_if_fail (NM_IS_VPN_CONNECTION (self), 0);
priv = NM_VPN_CONNECTION_GET_PRIVATE (self);
if (priv->ip_ifindex > 0)
return priv->ip_ifindex;
if (!fallback_device)
return 0;
return _get_ip_iface_for_device (self, NULL);
}
guint32

View file

@ -91,8 +91,8 @@ void nm_vpn_connection_disconnect (NMVpnConnection *self,
NMIP4Config * nm_vpn_connection_get_ip4_config (NMVpnConnection *self);
NMIP6Config * nm_vpn_connection_get_ip6_config (NMVpnConnection *self);
const char * nm_vpn_connection_get_ip_iface (NMVpnConnection *self);
int nm_vpn_connection_get_ip_ifindex (NMVpnConnection *self);
const char * nm_vpn_connection_get_ip_iface (NMVpnConnection *self, gboolean fallback_device);
int nm_vpn_connection_get_ip_ifindex (NMVpnConnection *self, gboolean fallback_device);
guint32 nm_vpn_connection_get_ip4_internal_gateway (NMVpnConnection *self);
struct in6_addr * nm_vpn_connection_get_ip6_internal_gateway (NMVpnConnection *self);