2008-11-03 04:13:42 +00:00
|
|
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
2004-11-16 02:41:53 +00:00
|
|
|
/* NetworkManager -- Network link manager
|
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
2008-06-26 18:31:52 +00:00
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2004-11-16 02:41:53 +00:00
|
|
|
*
|
2012-08-02 20:51:23 -05:00
|
|
|
* Copyright (C) 2004 - 2012 Red Hat, Inc.
|
2008-11-03 04:13:42 +00:00
|
|
|
* Copyright (C) 2005 - 2008 Novell, Inc.
|
2004-11-16 02:41:53 +00:00
|
|
|
* Copyright (C) 1996 - 1997 Yoichi Hariguchi <yoichi@fore.com>
|
|
|
|
|
* Copyright (C) January, 1998 Sergei Viznyuk <sv@phystech.com>
|
|
|
|
|
*/
|
|
|
|
|
|
2011-10-18 13:48:48 +02:00
|
|
|
#include <config.h>
|
2004-11-16 02:41:53 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <sys/socket.h>
|
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
#include <netinet/in.h>
|
|
|
|
|
#include <net/route.h>
|
|
|
|
|
#include <arpa/nameser.h>
|
2005-04-15 15:43:42 +00:00
|
|
|
#include <arpa/inet.h>
|
2004-11-16 02:41:53 +00:00
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <syslog.h>
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <resolv.h>
|
|
|
|
|
#include <netdb.h>
|
|
|
|
|
#include <glib.h>
|
2011-09-23 13:46:41 +02:00
|
|
|
#include <linux/if.h>
|
2011-10-18 13:48:48 +02:00
|
|
|
#include <linux/sockios.h>
|
|
|
|
|
#include <linux/if_bonding.h>
|
2012-08-02 20:51:23 -05:00
|
|
|
#include <linux/if_vlan.h>
|
2012-05-23 16:19:26 +02:00
|
|
|
#include <linux/if_bridge.h>
|
2008-03-14 21:11:04 +00:00
|
|
|
|
2010-03-02 15:06:14 -08:00
|
|
|
#include "nm-system.h"
|
2005-12-31 08:21:24 +00:00
|
|
|
#include "nm-device.h"
|
2005-04-06 16:45:48 +00:00
|
|
|
#include "NetworkManagerUtils.h"
|
2005-03-14 Ray Strode <rstrode@redhat.com>
Fourth (probably working) cut at porting to
dbus 0.30 api and new hal. This cut adds
some new logging macros to make debugging
easier.
* dispatcher-daemon/NetworkManagerDispatcher.c:
* info-daemon/NetworkmanagerInfo.c:
* info-daemon/NetworkManagerInfoPassphraseDialog.c:
* info-daemon/NetworkManagerInfoVPN.c:
* src/NetworkManager.c:
* src/NetworkManagerAP.c:
* src/NetworkManagerAPList.c:
* src/NetworkManagerDHCP.c:
* src/NetworkManagerDbus.c:
* src/NetworkManagerDevice.c:
* src/NetworkManagerPolicy.c:
* src/NetworkManagerSystem.c:
* src/NetworkManagerUtils.c:
* src/NetworkManagerWireless.c:
* src/autoip.c:
* src/nm-dbus-nm.c:
* src/backends/NetworkManagerDebian.c:
* src/backends/NetworkManagerGentoo.c:
* src/backends/NetworkManagerRedHat.c:
* src/backends/NetworkManagerSlackware.c:
use new logging macros.
* dispatcher-daemon/NetworkManagerDispatcher.c:
(nmd_dbus_filter): s/dbus_free/g_free/
* info-daemon/Makefile.am: link in utils library.
* info-daemon/NetworkmanagerInfo.c: use new logging
macros.
(nmi_dbus_get_network): don't assume enumerations
are 32-bit.
(nmi_dbus_nmi_message_handler): don't free what
doesn't belong to us.
* libnm_glib/libnm_glib.c:
(libnm_glib_get_nm_status):
(libnm_glib_init): don't free what doesn't
belong to us.
(libnm_glib_dbus): strdup result, so it doesn't get
lost when message is unref'd.
* panel-applet/NMWirelessAppletDbus.c:
(nmwa_dbus_update_devices): s/dbus_free/g_free/
* src/NetworkManager.c:
(nm_monitor_wired_link_state): request initial status
dump of all cards when we start up, instead of relying
on /sys/.../carrier.
(nm_info_handler), (nm_set_up_log_handlers):
log handlers to specify what syslog priorites
the logging macros default to.
* src/NetworkManagerAPList.c:
(nm_ap_list_populate_from_nmi):
s/dbus_free_string_array/g_strfreev/
* src/NetworkManagerDbus.c:
(nm_dbus_get_network_object):
validate d-bus message argument types.
Advance message iterator after reading argument,
prepend instead of append to GSList.
* src/NetworkManagerDevice.c:
(nm_device_probe_wired_link_status):
remove redundant /sys in /sys path. remove wrong
contents == NULL means has carrier assumption.
* src/nm-netlink-monitor.c
(nm_netlink_monitor_request_status): implement
function to ask kernel to dump interface link
status over netlink socket.
* test/*.c: s/dbus_free/g_free/
* utils/nm-utils.h:
(nm_print_backtrace): new macro to print backtrace.
(nm_get_timestamp): new macro to get sub-second precise
unix timestamp.
(nm_info), (nm_debug), (nm_warning), (nm_error):
new logging functions. nm_info just prints,
nm_debug includes timestamp and function,
nm_warning includes function, nm_error includes
backtrace and sigtrap.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@497 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2005-03-15 05:30:15 +00:00
|
|
|
#include "nm-utils.h"
|
2010-04-07 13:10:33 -07:00
|
|
|
#include "nm-logging.h"
|
2010-04-20 17:22:58 -07:00
|
|
|
#include "nm-netlink-monitor.h"
|
2011-07-22 16:12:44 -05:00
|
|
|
#include "nm-netlink-utils.h"
|
2011-07-29 11:38:46 +01:00
|
|
|
#include "nm-netlink-compat.h"
|
2008-04-25 19:22:32 +00:00
|
|
|
|
2005-10-28 03:16:02 +00:00
|
|
|
#include <netlink/route/addr.h>
|
2008-04-25 19:22:32 +00:00
|
|
|
#include <netlink/route/route.h>
|
2005-10-28 03:16:02 +00:00
|
|
|
#include <netlink/netlink.h>
|
|
|
|
|
#include <netlink/utils.h>
|
|
|
|
|
#include <netlink/route/link.h>
|
2011-10-18 13:48:48 +02:00
|
|
|
#include <netlink/route/link/bonding.h>
|
2011-12-21 19:09:22 -06:00
|
|
|
#include <netlink/route/link/vlan.h>
|
2011-10-18 13:48:48 +02:00
|
|
|
|
2012-03-09 12:20:42 -06:00
|
|
|
#if !HAVE_VLAN_FLAG_LOOSE_BINDING
|
|
|
|
|
/* Older kernels don't have this flag */
|
|
|
|
|
#define VLAN_FLAG_LOOSE_BINDING 0x04
|
|
|
|
|
#endif
|
|
|
|
|
|
2011-07-22 14:24:18 -05:00
|
|
|
static void nm_system_device_set_priority (int ifindex,
|
|
|
|
|
NMIP4Config *config,
|
|
|
|
|
int priority);
|
2008-09-30 15:04:10 +00:00
|
|
|
|
2007-03-31 01:21:06 +00:00
|
|
|
static gboolean
|
2008-10-15 17:12:58 +00:00
|
|
|
ip4_dest_in_same_subnet (NMIP4Config *config, guint32 dest, guint32 dest_prefix)
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
{
|
2008-06-06 15:35:45 +00:00
|
|
|
int num;
|
|
|
|
|
int i;
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
|
2008-06-06 15:35:45 +00:00
|
|
|
num = nm_ip4_config_get_num_addresses (config);
|
|
|
|
|
for (i = 0; i < num; i++) {
|
2008-10-29 14:35:25 +00:00
|
|
|
NMIP4Address *addr = nm_ip4_config_get_address (config, i);
|
|
|
|
|
guint32 prefix = nm_ip4_address_get_prefix (addr);
|
|
|
|
|
guint32 address = nm_ip4_address_get_address (addr);
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
|
2008-10-29 14:35:25 +00:00
|
|
|
if (prefix <= dest_prefix) {
|
|
|
|
|
guint32 masked_addr = ntohl(address) >> (32 - prefix);
|
|
|
|
|
guint32 masked_dest = ntohl(dest) >> (32 - prefix);
|
2008-07-28 14:38:34 +00:00
|
|
|
|
|
|
|
|
if (masked_addr == masked_dest)
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
}
|
2007-07-26 15:07:36 +00:00
|
|
|
|
2008-06-06 15:35:45 +00:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
2007-07-26 15:07:36 +00:00
|
|
|
|
2008-11-07 13:57:39 +00:00
|
|
|
static struct rtnl_route *
|
2011-07-22 14:09:16 -05:00
|
|
|
nm_system_device_set_ip4_route (int ifindex,
|
2008-10-15 17:12:58 +00:00
|
|
|
guint32 ip4_dest,
|
|
|
|
|
guint32 ip4_prefix,
|
|
|
|
|
guint32 ip4_gateway,
|
|
|
|
|
guint32 metric,
|
|
|
|
|
int mss)
|
2008-06-06 15:35:45 +00:00
|
|
|
{
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2008-06-06 15:35:45 +00:00
|
|
|
struct rtnl_route *route;
|
2011-07-22 14:09:16 -05:00
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, NULL);
|
2008-06-06 15:35:45 +00:00
|
|
|
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
2008-11-07 13:57:39 +00:00
|
|
|
g_return_val_if_fail (nlh != NULL, NULL);
|
2008-06-06 15:35:45 +00:00
|
|
|
|
2011-07-22 18:08:18 -05:00
|
|
|
route = nm_netlink_route_new (ifindex, AF_INET, mss,
|
|
|
|
|
NMNL_PROP_PRIO, metric,
|
|
|
|
|
NULL);
|
2008-11-07 13:57:39 +00:00
|
|
|
g_return_val_if_fail (route != NULL, NULL);
|
2008-06-06 15:35:45 +00:00
|
|
|
|
|
|
|
|
/* Add the route */
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route4_add (route, &ip4_dest, ip4_prefix, &ip4_gateway, 0);
|
2011-08-05 16:02:44 +01:00
|
|
|
if (err == -NLE_OBJ_NOTFOUND && ip4_gateway) {
|
2008-06-06 15:35:45 +00:00
|
|
|
/* Gateway might be over a bridge; try adding a route to gateway first */
|
|
|
|
|
struct rtnl_route *route2;
|
|
|
|
|
|
2011-07-22 18:08:18 -05:00
|
|
|
route2 = nm_netlink_route_new (ifindex, AF_INET, mss, NULL);
|
2008-06-06 15:35:45 +00:00
|
|
|
if (route2) {
|
|
|
|
|
/* Add route to gateway over bridge */
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route4_add (route2, &ip4_gateway, 32, NULL, 0);
|
2008-06-06 15:35:45 +00:00
|
|
|
if (!err) {
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route4_add (route, &ip4_dest, ip4_prefix, &ip4_gateway, 0);
|
2008-06-06 15:35:45 +00:00
|
|
|
if (err)
|
2011-07-22 16:12:44 -05:00
|
|
|
nm_netlink_route_delete (route2);
|
2008-06-06 15:35:45 +00:00
|
|
|
}
|
|
|
|
|
rtnl_route_put (route2);
|
|
|
|
|
}
|
2007-03-31 01:21:06 +00:00
|
|
|
}
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
|
2008-11-07 13:57:39 +00:00
|
|
|
if (err) {
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
|
2010-04-07 13:10:33 -07:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP4,
|
|
|
|
|
"(%s): failed to set IPv4 route: %s",
|
2011-10-18 15:28:26 -05:00
|
|
|
iface ? iface : "unknown", nl_geterror (err));
|
|
|
|
|
g_free (iface);
|
|
|
|
|
|
2008-11-07 13:57:39 +00:00
|
|
|
rtnl_route_put (route);
|
|
|
|
|
route = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return route;
|
2006-03-29 Robert Love <rml@novell.com>
Patch by Vinay R <rvinay@novell.com> and Robert Love <rml@novell.com>,
to add support for per-route MSS and improve support for per-interface
MTU:
* src/NetworkManagerSystem.c: Modify nm_system_device_set_ip4_route to
optionally take an MSS parameter and set it for the given route.
Remove nm_system_device_set_ip4_route_with_iface. Pass in the
NMIP4Config's stored MSS, if any.
* src/nm-ip4-config.c: Add 'mtu' and 'mss' to NMIP4Config, representing
the interface's MTU and the route's MSS, respectively. Add functions
nm_ip4_config_get_mtu, nm_ip4_config_set_mtu, nm_ip4_config_get_mss,
and nm_ip4_config_set_mss for retrieving and setting the MTU and the
MSS.
* src/nm-ip4-config.h: Add prototypes for nm_ip4_config_get_mtu,
nm_ip4_config_set_mtu, nm_ip4_config_get_mss, and
nm_ip4_config_set_mss.
* src/vpn-manager/nm-vpn-service.c: Modify to receive the MSS from the
VPN daemon.
* src/backends/NetworkManager{Arch,Debian,Gentoo,RedHat,Slackware,SUSE}.c:
Change the retval of nm_system_get_mtu to guint32.
* src/dhcp-manager/nm-dhcp-manager.c: Set the MTU on the new DHCP-given
NMIP4Config to the MTU provided by the system, if any. TODO: If DHCP
servers can specify MTU's, we should set it here if the MTU was not
provided.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1660 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-29 19:26:53 +00:00
|
|
|
}
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
static gboolean
|
2011-07-22 14:09:16 -05:00
|
|
|
sync_addresses (int ifindex,
|
|
|
|
|
int family,
|
|
|
|
|
struct rtnl_addr **addrs,
|
|
|
|
|
int num_addrs)
|
2009-08-22 10:59:49 -04:00
|
|
|
{
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2011-10-18 15:28:26 -05:00
|
|
|
struct nl_cache *addr_cache = NULL;
|
|
|
|
|
struct rtnl_addr *filter_addr = NULL, *match_addr;
|
2009-08-22 10:59:49 -04:00
|
|
|
struct nl_object *match;
|
2010-05-03 02:11:59 -07:00
|
|
|
struct nl_addr *nladdr;
|
2009-08-22 10:59:49 -04:00
|
|
|
int i, err;
|
2010-04-07 13:10:33 -07:00
|
|
|
guint32 log_domain = (family == AF_INET) ? LOGD_IP4 : LOGD_IP6;
|
2010-05-03 02:11:59 -07:00
|
|
|
char buf[INET6_ADDRSTRLEN + 1];
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface = NULL;
|
|
|
|
|
gboolean success = FALSE;
|
2010-04-07 13:10:33 -07:00
|
|
|
|
|
|
|
|
log_domain |= LOGD_DEVICE;
|
2008-03-11 22:21:25 +00:00
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
if (!nlh)
|
|
|
|
|
return FALSE;
|
2008-03-11 22:21:25 +00:00
|
|
|
|
2011-07-30 15:46:33 -05:00
|
|
|
err = rtnl_addr_alloc_cache (nlh, &addr_cache);
|
|
|
|
|
if (err < 0)
|
2009-08-22 10:59:49 -04:00
|
|
|
return FALSE;
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
filter_addr = rtnl_addr_alloc ();
|
2011-10-18 15:28:26 -05:00
|
|
|
if (!filter_addr)
|
|
|
|
|
goto out;
|
|
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
rtnl_addr_set_ifindex (filter_addr, ifindex);
|
|
|
|
|
if (family)
|
|
|
|
|
rtnl_addr_set_family (filter_addr, family);
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
if (!iface)
|
|
|
|
|
goto out;
|
|
|
|
|
|
2010-05-03 02:11:59 -07:00
|
|
|
nm_log_dbg (log_domain, "(%s): syncing addresses (family %d)", iface, family);
|
|
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
/* Walk through the cache, comparing the addresses already on
|
|
|
|
|
* the interface to the addresses in addrs.
|
|
|
|
|
*/
|
|
|
|
|
for (match = nl_cache_get_first (addr_cache); match; match = nl_cache_get_next (match)) {
|
2010-05-03 02:11:59 -07:00
|
|
|
gboolean buf_valid = FALSE;
|
|
|
|
|
match_addr = (struct rtnl_addr *) match;
|
2009-08-22 10:59:49 -04:00
|
|
|
|
|
|
|
|
/* Skip addresses not on our interface */
|
2010-05-03 02:11:59 -07:00
|
|
|
if (!nl_object_match_filter (match, (struct nl_object *) filter_addr))
|
2009-08-22 10:59:49 -04:00
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (addrs) {
|
|
|
|
|
for (i = 0; i < num_addrs; i++) {
|
2010-05-03 02:11:59 -07:00
|
|
|
if (addrs[i] && nl_object_identical (match, (struct nl_object *) addrs[i]))
|
2009-08-22 10:59:49 -04:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (addrs[i]) {
|
|
|
|
|
/* match == addrs[i], so remove it from addrs so we don't
|
|
|
|
|
* try to add it to the interface again below.
|
|
|
|
|
*/
|
|
|
|
|
rtnl_addr_put (addrs[i]);
|
|
|
|
|
addrs[i] = NULL;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-03 02:11:59 -07:00
|
|
|
nladdr = rtnl_addr_get_local (match_addr);
|
|
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
/* Don't delete IPv6 link-local addresses; they don't belong to NM */
|
2010-05-03 02:11:59 -07:00
|
|
|
if (rtnl_addr_get_family (match_addr) == AF_INET6) {
|
|
|
|
|
struct in6_addr *tmp;
|
|
|
|
|
|
|
|
|
|
if (rtnl_addr_get_scope (match_addr) == RT_SCOPE_LINK) {
|
|
|
|
|
nm_log_dbg (log_domain, "(%s): ignoring IPv6 link-local address", iface);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tmp = nl_addr_get_binary_addr (nladdr);
|
|
|
|
|
if (inet_ntop (AF_INET6, tmp, buf, sizeof (buf)))
|
|
|
|
|
buf_valid = TRUE;
|
|
|
|
|
} else if (rtnl_addr_get_family (match_addr) == AF_INET) {
|
|
|
|
|
struct in_addr *tmp;
|
|
|
|
|
|
|
|
|
|
tmp = nl_addr_get_binary_addr (nladdr);
|
|
|
|
|
if (inet_ntop (AF_INET, tmp, buf, sizeof (buf)))
|
|
|
|
|
buf_valid = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (buf_valid) {
|
|
|
|
|
nm_log_dbg (log_domain, "(%s): removing address '%s/%d'",
|
2012-03-05 09:38:38 -06:00
|
|
|
iface, buf, rtnl_addr_get_prefixlen (match_addr));
|
2009-08-22 10:59:49 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Otherwise, match_addr should be removed from the interface. */
|
|
|
|
|
err = rtnl_addr_delete (nlh, match_addr, 0);
|
|
|
|
|
if (err < 0) {
|
2010-04-07 13:10:33 -07:00
|
|
|
nm_log_err (log_domain, "(%s): error %d returned from rtnl_addr_delete(): %s",
|
2011-07-29 11:38:46 +01:00
|
|
|
iface, err, nl_geterror (err));
|
2009-08-22 10:59:49 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Now add the remaining new addresses */
|
|
|
|
|
for (i = 0; i < num_addrs; i++) {
|
2010-05-03 02:11:59 -07:00
|
|
|
struct in6_addr *in6tmp;
|
|
|
|
|
struct in_addr *in4tmp;
|
|
|
|
|
gboolean buf_valid = FALSE;
|
|
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
if (!addrs[i])
|
|
|
|
|
continue;
|
|
|
|
|
|
2010-05-03 02:11:59 -07:00
|
|
|
nladdr = rtnl_addr_get_local (addrs[i]);
|
|
|
|
|
if (rtnl_addr_get_family (addrs[i]) == AF_INET6) {
|
|
|
|
|
in6tmp = nl_addr_get_binary_addr (nladdr);
|
|
|
|
|
if (inet_ntop (AF_INET6, in6tmp, buf, sizeof (buf)))
|
|
|
|
|
buf_valid = TRUE;
|
|
|
|
|
} else if (rtnl_addr_get_family (addrs[i]) == AF_INET) {
|
|
|
|
|
in4tmp = nl_addr_get_binary_addr (nladdr);
|
|
|
|
|
if (inet_ntop (AF_INET, in4tmp, buf, sizeof (buf)))
|
|
|
|
|
buf_valid = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (buf_valid) {
|
|
|
|
|
nm_log_dbg (log_domain, "(%s): adding address '%s/%d'",
|
|
|
|
|
iface, buf, nl_addr_get_prefixlen (nladdr));
|
|
|
|
|
}
|
|
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
err = rtnl_addr_add (nlh, addrs[i], 0);
|
2011-07-29 11:38:46 +01:00
|
|
|
if (err < 0 && (err != -NLE_EXIST)) {
|
2010-04-07 13:10:33 -07:00
|
|
|
nm_log_err (log_domain,
|
|
|
|
|
"(%s): error %d returned from rtnl_addr_add():\n%s",
|
2011-07-29 11:38:46 +01:00
|
|
|
iface, err, nl_geterror (err));
|
2009-08-22 10:59:49 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtnl_addr_put (addrs[i]);
|
2008-03-11 22:21:25 +00:00
|
|
|
}
|
2009-08-22 10:59:49 -04:00
|
|
|
g_free (addrs);
|
2011-10-18 15:28:26 -05:00
|
|
|
success = TRUE;
|
2009-08-22 10:59:49 -04:00
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
out:
|
|
|
|
|
if (filter_addr)
|
|
|
|
|
rtnl_addr_put (filter_addr);
|
|
|
|
|
if (addr_cache)
|
|
|
|
|
nl_cache_free (addr_cache);
|
|
|
|
|
g_free (iface);
|
|
|
|
|
return success;
|
2008-03-11 22:21:25 +00:00
|
|
|
}
|
|
|
|
|
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
static gboolean
|
2011-10-18 15:28:26 -05:00
|
|
|
add_ip4_addresses (NMIP4Config *config, int ifindex)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface;
|
|
|
|
|
int num_addrs, i;
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
guint32 flags = 0;
|
|
|
|
|
gboolean did_gw = FALSE;
|
2009-08-22 10:59:49 -04:00
|
|
|
struct rtnl_addr **addrs;
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
if (!iface)
|
|
|
|
|
return FALSE;
|
2008-03-11 22:21:25 +00:00
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
num_addrs = nm_ip4_config_get_num_addresses (config);
|
|
|
|
|
addrs = g_new0 (struct rtnl_addr *, num_addrs + 1);
|
2008-03-11 22:21:25 +00:00
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
for (i = 0; i < num_addrs; i++) {
|
2008-10-29 14:35:25 +00:00
|
|
|
NMIP4Address *addr;
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
|
|
|
|
|
addr = nm_ip4_config_get_address (config, i);
|
|
|
|
|
g_assert (addr);
|
|
|
|
|
|
|
|
|
|
flags = NM_RTNL_ADDR_DEFAULT;
|
2008-10-29 14:35:25 +00:00
|
|
|
if (nm_ip4_address_get_gateway (addr) && !did_gw) {
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
if (nm_ip4_config_get_ptp_address (config))
|
|
|
|
|
flags |= NM_RTNL_ADDR_PTP_ADDR;
|
|
|
|
|
did_gw = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
addrs[i] = nm_ip4_config_to_rtnl_addr (config, i, flags);
|
|
|
|
|
if (!addrs[i]) {
|
2010-04-07 13:10:33 -07:00
|
|
|
nm_log_warn (LOGD_DEVICE | LOGD_IP4,
|
|
|
|
|
"(%s): couldn't create rtnl address!",
|
2011-10-18 15:28:26 -05:00
|
|
|
iface ? iface : "unknown");
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
continue;
|
|
|
|
|
}
|
2011-10-18 15:28:26 -05:00
|
|
|
rtnl_addr_set_ifindex (addrs[i], ifindex);
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
}
|
2011-10-18 15:28:26 -05:00
|
|
|
g_free (iface);
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
return sync_addresses (ifindex, AF_INET, addrs, num_addrs);
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
}
|
|
|
|
|
|
2008-11-07 13:57:39 +00:00
|
|
|
struct rtnl_route *
|
2012-05-23 10:50:17 -04:00
|
|
|
nm_system_add_ip4_vpn_gateway_route (NMDevice *parent_device, guint32 vpn_gw)
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
{
|
2008-10-15 17:12:58 +00:00
|
|
|
NMIP4Config *parent_config;
|
2012-05-23 10:50:17 -04:00
|
|
|
guint32 parent_gw = 0, parent_prefix = 0, i;
|
2008-10-29 14:35:25 +00:00
|
|
|
NMIP4Address *tmp;
|
2008-11-07 13:57:39 +00:00
|
|
|
struct rtnl_route *route = NULL;
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
|
2008-11-07 13:57:39 +00:00
|
|
|
g_return_val_if_fail (NM_IS_DEVICE (parent_device), NULL);
|
2012-05-23 10:50:17 -04:00
|
|
|
g_return_val_if_fail (vpn_gw != 0, NULL);
|
2007-12-05 17:33:55 +00:00
|
|
|
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
/* Set up a route to the VPN gateway's public IP address through the default
|
2008-10-15 17:12:58 +00:00
|
|
|
* network device if the VPN gateway is on a different subnet.
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
*/
|
2008-10-15 17:12:58 +00:00
|
|
|
|
|
|
|
|
parent_config = nm_device_get_ip4_config (parent_device);
|
2008-11-07 13:57:39 +00:00
|
|
|
g_return_val_if_fail (parent_config != NULL, NULL);
|
2008-10-15 17:12:58 +00:00
|
|
|
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_addresses (parent_config); i++) {
|
|
|
|
|
tmp = nm_ip4_config_get_address (parent_config, i);
|
2008-10-29 14:35:25 +00:00
|
|
|
if (nm_ip4_address_get_gateway (tmp)) {
|
|
|
|
|
parent_gw = nm_ip4_address_get_gateway (tmp);
|
|
|
|
|
parent_prefix = nm_ip4_address_get_prefix (tmp);
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
break;
|
|
|
|
|
}
|
2008-06-02 08:44:48 +00:00
|
|
|
}
|
2007-11-28 22:38:33 +00:00
|
|
|
|
2012-05-23 10:50:17 -04:00
|
|
|
if (!parent_gw)
|
2008-11-07 13:57:39 +00:00
|
|
|
return NULL;
|
2008-10-15 17:12:58 +00:00
|
|
|
|
|
|
|
|
/* If the VPN gateway is in the same subnet as one of the parent device's
|
|
|
|
|
* IP addresses, don't add the host route to it, but a route through the
|
|
|
|
|
* parent device.
|
|
|
|
|
*/
|
|
|
|
|
if (ip4_dest_in_same_subnet (parent_config, vpn_gw, parent_prefix)) {
|
2011-07-22 14:09:16 -05:00
|
|
|
route = nm_system_device_set_ip4_route (nm_device_get_ip_ifindex (parent_device),
|
2008-11-07 13:57:39 +00:00
|
|
|
vpn_gw, 32, 0, 0, nm_ip4_config_get_mss (parent_config));
|
2008-10-15 17:12:58 +00:00
|
|
|
} else {
|
2011-07-22 14:09:16 -05:00
|
|
|
route = nm_system_device_set_ip4_route (nm_device_get_ip_ifindex (parent_device),
|
2008-11-07 13:57:39 +00:00
|
|
|
vpn_gw, 32, parent_gw, 0, nm_ip4_config_get_mss (parent_config));
|
2008-10-15 17:12:58 +00:00
|
|
|
}
|
2008-11-07 13:57:39 +00:00
|
|
|
|
|
|
|
|
return route;
|
2005-04-15 15:43:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
* nm_system_apply_ip4_config
|
2005-04-15 15:43:42 +00:00
|
|
|
*
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
* Set IPv4 configuration of the device from an NMIP4Config object.
|
2005-04-15 15:43:42 +00:00
|
|
|
*
|
|
|
|
|
*/
|
2006-08-07 18:39:26 +00:00
|
|
|
gboolean
|
2011-07-22 14:09:16 -05:00
|
|
|
nm_system_apply_ip4_config (int ifindex,
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
NMIP4Config *config,
|
|
|
|
|
int priority,
|
2008-11-07 13:57:39 +00:00
|
|
|
NMIP4ConfigCompareFlags flags)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2008-05-06 Dan Williams <dcbw@redhat.com>
* src/dhcp-manager/nm-dhcp-manager.c
- (nm_dhcp_manager_get_ip4_config): clean up; update for changes to
NMIP4Config to support multiple IP addresses
* src/NetworkManagerUtils.c
- (nm_utils_merge_ip4_config): update for multiple IP addresses
* src/nm-ip4-config.c
src/nm-ip4-config.h
- Store a list of IPv4 address/netmask/gateway tuples
- (nm_ip4_config_get_gateway, nm_ip4_config_set_gateway,
nm_ip4_config_get_netmask, nm_ip4_config_set_netmask,
nm_ip4_config_get_broadcast, nm_ip4_config_set_broadcast,
nm_ip4_config_set_address): remove
- (nm_ip4_config_take_address, nm_ip4_config_add_address,
nm_ip4_config_replace_address, nm_ip4_config_get_num_addresses):
new functions; handle multiple IPv4 addresses
* src/nm-device.c
src/ppp-manager/nm-ppp-manager.c
src/vpn-manager/nm-vpn-connection.c
src/NetworkManagerPolicy.c
test/nm-tool.c
libnm-glib/libnm-glib-test.c
- update for changes to NMIP4Config for multiple IPv4 addresses
* src/NetworkManagerSystem.c
- (nm_system_device_set_ip4_route): don't add the route if any address
is on the same subnet as the destination
- (check_one_address): ignore the exact match, just match family and
interface index
- (add_ip4_addresses): add all IPv4 addresses in an NMIP4Config to
an interface
- (nm_system_device_set_from_ip4_config): use add_ip4_addresses()
- (nm_system_vpn_device_set_from_ip4_config): use add_ip4_addresses()
* introspection/nm-ip4-config.xml
- Remove 'address', 'gateway', 'netmask', and 'broadcast' properties
- Add 'addresses' property which is an array of (uuu) tuples of
address/netmask/gateway
* libnm-util/nm-setting-ip4-config.c
- (set_property): use ip-address <-> GValue converters from nm-utils.c
* libnm-glib/nm-ip4-config.c
libnm-glib/nm-ip4-config.h
- Handle D-Bus interface changes to support multiple IP addresses
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3637 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-05-06 21:53:22 +00:00
|
|
|
int i;
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2011-07-22 14:09:16 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2005-04-15 15:43:42 +00:00
|
|
|
g_return_val_if_fail (config != NULL, FALSE);
|
|
|
|
|
|
2008-11-07 13:57:39 +00:00
|
|
|
if (flags & NM_IP4_COMPARE_FLAG_ADDRESSES) {
|
2011-10-18 15:28:26 -05:00
|
|
|
if (!add_ip4_addresses (config, ifindex))
|
2008-11-07 13:57:39 +00:00
|
|
|
return FALSE;
|
|
|
|
|
sleep (1);
|
|
|
|
|
}
|
2008-10-15 17:12:58 +00:00
|
|
|
|
2008-11-07 13:57:39 +00:00
|
|
|
if (flags & NM_IP4_COMPARE_FLAG_ROUTES) {
|
|
|
|
|
for (i = 0; i < nm_ip4_config_get_num_routes (config); i++) {
|
|
|
|
|
NMIP4Route *route = nm_ip4_config_get_route (config, i);
|
|
|
|
|
struct rtnl_route *tmp;
|
|
|
|
|
|
|
|
|
|
/* Don't add the route if it's more specific than one of the subnets
|
|
|
|
|
* the device already has an IP address on.
|
|
|
|
|
*/
|
|
|
|
|
if (ip4_dest_in_same_subnet (config,
|
|
|
|
|
nm_ip4_route_get_dest (route),
|
|
|
|
|
nm_ip4_route_get_prefix (route)))
|
|
|
|
|
continue;
|
2008-12-09 20:01:49 +00:00
|
|
|
|
|
|
|
|
/* Don't add the route if it doesn't have a gateway and the connection
|
|
|
|
|
* is never supposed to be the default connection.
|
|
|
|
|
*/
|
|
|
|
|
if ( nm_ip4_config_get_never_default (config)
|
|
|
|
|
&& nm_ip4_route_get_dest (route) == 0)
|
|
|
|
|
continue;
|
2008-11-07 13:57:39 +00:00
|
|
|
|
2011-07-22 14:09:16 -05:00
|
|
|
tmp = nm_system_device_set_ip4_route (ifindex,
|
2008-11-07 13:57:39 +00:00
|
|
|
nm_ip4_route_get_dest (route),
|
|
|
|
|
nm_ip4_route_get_prefix (route),
|
|
|
|
|
nm_ip4_route_get_next_hop (route),
|
|
|
|
|
nm_ip4_route_get_metric (route),
|
|
|
|
|
nm_ip4_config_get_mss (config));
|
|
|
|
|
rtnl_route_put (tmp);
|
|
|
|
|
}
|
2005-05-16 12:57:08 +00:00
|
|
|
}
|
2005-04-15 15:43:42 +00:00
|
|
|
|
2008-11-07 13:57:39 +00:00
|
|
|
if (flags & NM_IP4_COMPARE_FLAG_MTU) {
|
|
|
|
|
if (nm_ip4_config_get_mtu (config))
|
2011-07-22 14:09:16 -05:00
|
|
|
nm_system_iface_set_mtu (ifindex, nm_ip4_config_get_mtu (config));
|
2008-11-07 13:57:39 +00:00
|
|
|
}
|
2005-09-28 14:42:57 +00:00
|
|
|
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
if (priority > 0)
|
2011-07-22 14:24:18 -05:00
|
|
|
nm_system_device_set_priority (ifindex, config, priority);
|
2005-04-15 15:43:42 +00:00
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-10 21:32:20 -05:00
|
|
|
int
|
|
|
|
|
nm_system_set_ip6_route (int ifindex,
|
|
|
|
|
const struct in6_addr *ip6_dest,
|
|
|
|
|
guint32 ip6_prefix,
|
|
|
|
|
const struct in6_addr *ip6_gateway,
|
|
|
|
|
guint32 metric,
|
|
|
|
|
int mss,
|
|
|
|
|
int protocol,
|
|
|
|
|
int table,
|
|
|
|
|
struct rtnl_route **out_route)
|
2009-07-29 12:12:41 -04:00
|
|
|
{
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2009-07-29 12:12:41 -04:00
|
|
|
struct rtnl_route *route;
|
2010-08-10 21:32:20 -05:00
|
|
|
int err = 0;
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2012-05-15 09:44:49 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, -1);
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2010-08-10 21:32:20 -05:00
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
g_return_val_if_fail (nlh != NULL, -1);
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2011-07-22 18:08:18 -05:00
|
|
|
route = nm_netlink_route_new (ifindex, AF_INET6, mss,
|
|
|
|
|
NMNL_PROP_PROT, protocol,
|
|
|
|
|
NMNL_PROP_PRIO, metric,
|
|
|
|
|
NMNL_PROP_TABLE, table,
|
|
|
|
|
NULL);
|
2010-08-10 21:32:20 -05:00
|
|
|
g_return_val_if_fail (route != NULL, -1);
|
2009-07-29 12:12:41 -04:00
|
|
|
|
|
|
|
|
/* Add the route */
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route6_add (route, ip6_dest, ip6_prefix, ip6_gateway, 0);
|
2011-08-05 16:02:44 +01:00
|
|
|
if (err == -NLE_OBJ_NOTFOUND && ip6_gateway) {
|
2009-07-29 12:12:41 -04:00
|
|
|
/* Gateway might be over a bridge; try adding a route to gateway first */
|
|
|
|
|
struct rtnl_route *route2;
|
|
|
|
|
|
2011-07-22 18:08:18 -05:00
|
|
|
route2 = nm_netlink_route_new (ifindex, AF_INET6, mss, NULL);
|
2009-07-29 12:12:41 -04:00
|
|
|
if (route2) {
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route6_add (route, ip6_gateway, 128, NULL, 0);
|
2009-07-29 12:12:41 -04:00
|
|
|
/* Add route to gateway over bridge */
|
|
|
|
|
if (!err) {
|
|
|
|
|
/* Try adding the route again */
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route6_add (route, ip6_dest, ip6_prefix, ip6_gateway, 0);
|
2009-07-29 12:12:41 -04:00
|
|
|
if (err)
|
2011-07-22 16:12:44 -05:00
|
|
|
nm_netlink_route_delete (route2);
|
2009-07-29 12:12:41 -04:00
|
|
|
}
|
|
|
|
|
rtnl_route_put (route2);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-10 21:32:20 -05:00
|
|
|
if (out_route)
|
|
|
|
|
*out_route = route;
|
|
|
|
|
else
|
2009-07-29 12:12:41 -04:00
|
|
|
rtnl_route_put (route);
|
|
|
|
|
|
2010-08-10 21:32:20 -05:00
|
|
|
return err;
|
2009-07-29 12:12:41 -04:00
|
|
|
}
|
|
|
|
|
|
2012-05-23 12:04:17 -04:00
|
|
|
static gboolean
|
|
|
|
|
ip6_dest_in_same_subnet (NMIP6Config *config, const struct in6_addr *dest, guint32 dest_prefix)
|
|
|
|
|
{
|
|
|
|
|
int num;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
num = nm_ip6_config_get_num_addresses (config);
|
|
|
|
|
for (i = 0; i < num; i++) {
|
|
|
|
|
NMIP6Address *addr = nm_ip6_config_get_address (config, i);
|
|
|
|
|
guint32 prefix = nm_ip6_address_get_prefix (addr);
|
|
|
|
|
const struct in6_addr *address = nm_ip6_address_get_address (addr);
|
|
|
|
|
|
|
|
|
|
if (prefix <= dest_prefix) {
|
|
|
|
|
const guint8 *maskbytes = (const guint8 *)address;
|
|
|
|
|
const guint8 *addrbytes = (const guint8 *)dest;
|
|
|
|
|
int nbytes, nbits;
|
|
|
|
|
|
|
|
|
|
/* Copied from g_inet_address_mask_matches() */
|
|
|
|
|
nbytes = prefix / 8;
|
|
|
|
|
if (nbytes != 0 && memcmp (maskbytes, addrbytes, nbytes) != 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
nbits = prefix % 8;
|
|
|
|
|
if (nbits == 0)
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
if (maskbytes[nbytes] == (addrbytes[nbytes] & (0xFF << (8 - nbits))))
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct rtnl_route *
|
|
|
|
|
nm_system_add_ip6_vpn_gateway_route (NMDevice *parent_device,
|
|
|
|
|
const struct in6_addr *vpn_gw)
|
|
|
|
|
{
|
|
|
|
|
NMIP6Config *parent_config;
|
|
|
|
|
const struct in6_addr *parent_gw = NULL;
|
|
|
|
|
guint32 parent_prefix = 0;
|
|
|
|
|
int i, err;
|
|
|
|
|
NMIP6Address *tmp;
|
|
|
|
|
struct rtnl_route *route = NULL;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (NM_IS_DEVICE (parent_device), NULL);
|
|
|
|
|
g_return_val_if_fail (vpn_gw != NULL, NULL);
|
|
|
|
|
|
|
|
|
|
/* This is all just the same as
|
|
|
|
|
* nm_system_add_ip4_vpn_gateway_route(), except with an IPv6
|
|
|
|
|
* address for the VPN gateway.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
parent_config = nm_device_get_ip6_config (parent_device);
|
|
|
|
|
g_return_val_if_fail (parent_config != NULL, NULL);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < nm_ip6_config_get_num_addresses (parent_config); i++) {
|
|
|
|
|
tmp = nm_ip6_config_get_address (parent_config, i);
|
|
|
|
|
if (nm_ip6_address_get_gateway (tmp)) {
|
|
|
|
|
parent_gw = nm_ip6_address_get_gateway (tmp);
|
|
|
|
|
parent_prefix = nm_ip6_address_get_prefix (tmp);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!parent_gw)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if (ip6_dest_in_same_subnet (parent_config, vpn_gw, parent_prefix)) {
|
|
|
|
|
err = nm_system_set_ip6_route (nm_device_get_ip_ifindex (parent_device),
|
|
|
|
|
vpn_gw, 128, NULL, 0,
|
|
|
|
|
nm_ip6_config_get_mss (parent_config),
|
|
|
|
|
RTPROT_UNSPEC, RT_TABLE_UNSPEC,
|
|
|
|
|
&route);
|
|
|
|
|
} else {
|
|
|
|
|
err = nm_system_set_ip6_route (nm_device_get_ip_ifindex (parent_device),
|
|
|
|
|
vpn_gw, 128, parent_gw, 0,
|
|
|
|
|
nm_ip6_config_get_mss (parent_config),
|
|
|
|
|
RTPROT_UNSPEC, RT_TABLE_UNSPEC,
|
|
|
|
|
&route);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (err) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP6,
|
|
|
|
|
"(%s): failed to add IPv6 route to VPN gateway (%d)",
|
|
|
|
|
nm_device_get_iface (parent_device), err);
|
|
|
|
|
}
|
|
|
|
|
return route;
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-29 12:12:41 -04:00
|
|
|
static gboolean
|
2011-10-18 15:28:26 -05:00
|
|
|
add_ip6_addresses (NMIP6Config *config, int ifindex)
|
2009-07-29 12:12:41 -04:00
|
|
|
{
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface;
|
|
|
|
|
int num_addrs, i;
|
2009-08-22 10:59:49 -04:00
|
|
|
struct rtnl_addr **addrs;
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
if (!iface)
|
|
|
|
|
return FALSE;
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
num_addrs = nm_ip6_config_get_num_addresses (config);
|
|
|
|
|
addrs = g_new0 (struct rtnl_addr *, num_addrs + 1);
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
for (i = 0; i < num_addrs; i++) {
|
2009-07-29 12:12:41 -04:00
|
|
|
NMIP6Address *addr;
|
|
|
|
|
|
|
|
|
|
addr = nm_ip6_config_get_address (config, i);
|
|
|
|
|
g_assert (addr);
|
|
|
|
|
|
2009-08-22 10:59:49 -04:00
|
|
|
addrs[i] = nm_ip6_config_to_rtnl_addr (config, i, NM_RTNL_ADDR_DEFAULT);
|
|
|
|
|
if (!addrs[i]) {
|
2010-04-07 13:10:33 -07:00
|
|
|
nm_log_warn (LOGD_DEVICE | LOGD_IP6,
|
|
|
|
|
"(%s): couldn't create rtnl address!",
|
2011-10-18 15:28:26 -05:00
|
|
|
iface ? iface : "unknown");
|
2009-07-29 12:12:41 -04:00
|
|
|
continue;
|
|
|
|
|
}
|
2011-10-18 15:28:26 -05:00
|
|
|
rtnl_addr_set_ifindex (addrs[i], ifindex);
|
2009-07-29 12:12:41 -04:00
|
|
|
}
|
2011-10-18 15:28:26 -05:00
|
|
|
g_free (iface);
|
2009-07-29 12:12:41 -04:00
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
return sync_addresses (ifindex, AF_INET6, addrs, num_addrs);
|
2009-07-29 12:12:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* nm_system_apply_ip6_config
|
|
|
|
|
*
|
|
|
|
|
* Set IPv6 configuration of the device from an NMIP6Config object.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2011-07-22 14:24:18 -05:00
|
|
|
nm_system_apply_ip6_config (int ifindex,
|
2009-07-29 12:12:41 -04:00
|
|
|
NMIP6Config *config,
|
|
|
|
|
int priority,
|
|
|
|
|
NMIP6ConfigCompareFlags flags)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
2011-07-22 14:24:18 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2009-07-29 12:12:41 -04:00
|
|
|
g_return_val_if_fail (config != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
if (flags & NM_IP6_COMPARE_FLAG_ADDRESSES) {
|
2011-10-18 15:28:26 -05:00
|
|
|
if (!add_ip6_addresses (config, ifindex))
|
2009-07-29 12:12:41 -04:00
|
|
|
return FALSE;
|
|
|
|
|
sleep (1); // FIXME?
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (flags & NM_IP6_COMPARE_FLAG_ROUTES) {
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
|
2009-07-29 12:12:41 -04:00
|
|
|
for (i = 0; i < nm_ip6_config_get_num_routes (config); i++) {
|
|
|
|
|
NMIP6Route *route = nm_ip6_config_get_route (config, i);
|
2010-08-10 21:32:20 -05:00
|
|
|
int err;
|
2009-07-29 12:12:41 -04:00
|
|
|
|
|
|
|
|
/* Don't add the route if it doesn't have a gateway and the connection
|
|
|
|
|
* is never supposed to be the default connection.
|
|
|
|
|
*/
|
|
|
|
|
if ( nm_ip6_config_get_never_default (config)
|
2010-08-10 21:32:20 -05:00
|
|
|
&& IN6_IS_ADDR_UNSPECIFIED (nm_ip6_route_get_dest (route)))
|
2009-07-29 12:12:41 -04:00
|
|
|
continue;
|
|
|
|
|
|
2010-08-10 21:32:20 -05:00
|
|
|
err = nm_system_set_ip6_route (ifindex,
|
|
|
|
|
nm_ip6_route_get_dest (route),
|
|
|
|
|
nm_ip6_route_get_prefix (route),
|
|
|
|
|
nm_ip6_route_get_next_hop (route),
|
|
|
|
|
nm_ip6_route_get_metric (route),
|
|
|
|
|
nm_ip6_config_get_mss (config),
|
|
|
|
|
RTPROT_UNSPEC,
|
|
|
|
|
RT_TABLE_UNSPEC,
|
|
|
|
|
NULL);
|
2012-03-22 16:22:48 -05:00
|
|
|
if (err && (err != -NLE_EXIST)) {
|
2010-08-10 21:32:20 -05:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP6,
|
|
|
|
|
"(%s): failed to set IPv6 route: %s",
|
2011-10-18 15:28:26 -05:00
|
|
|
iface ? iface : "unknown",
|
|
|
|
|
nl_geterror (err));
|
2010-08-10 21:32:20 -05:00
|
|
|
}
|
2009-07-29 12:12:41 -04:00
|
|
|
}
|
2011-10-18 15:28:26 -05:00
|
|
|
g_free (iface);
|
2009-07-29 12:12:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// FIXME
|
|
|
|
|
// if (priority > 0)
|
|
|
|
|
// nm_system_device_set_priority (iface, config, priority);
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2011-07-22 13:37:29 -05:00
|
|
|
/**
|
|
|
|
|
* nm_system_iface_set_up:
|
|
|
|
|
* @ifindex: interface index
|
|
|
|
|
* @up: %TRUE to bring interface up, or %FALSE to take it down
|
|
|
|
|
* @no_firmware: on return, %TRUE if the operation may have failed due to
|
|
|
|
|
* missing firmware
|
2005-04-15 15:43:42 +00:00
|
|
|
*
|
2011-07-22 13:37:29 -05:00
|
|
|
* Bring the interface up or take it down.
|
2005-04-15 15:43:42 +00:00
|
|
|
*
|
2011-07-22 13:37:29 -05:00
|
|
|
* Returns: %TRUE on success, %FALSE on failure
|
|
|
|
|
**/
|
2008-08-18 18:29:47 +00:00
|
|
|
gboolean
|
2011-07-22 13:37:29 -05:00
|
|
|
nm_system_iface_set_up (int ifindex,
|
|
|
|
|
gboolean up,
|
|
|
|
|
gboolean *no_firmware)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2008-08-14 16:52:06 +00:00
|
|
|
struct rtnl_link *request = NULL, *old = NULL;
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2005-10-28 03:16:02 +00:00
|
|
|
gboolean success = FALSE;
|
2011-07-29 11:38:46 +01:00
|
|
|
int err;
|
2004-11-16 02:41:53 +00:00
|
|
|
|
2011-07-22 13:37:29 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2008-08-18 18:29:47 +00:00
|
|
|
if (no_firmware)
|
|
|
|
|
g_return_val_if_fail (*no_firmware == FALSE, FALSE);
|
2004-11-16 02:41:53 +00:00
|
|
|
|
2005-10-28 03:16:02 +00:00
|
|
|
if (!(request = rtnl_link_alloc ()))
|
2011-07-22 13:37:29 -05:00
|
|
|
return FALSE;
|
2004-11-16 02:41:53 +00:00
|
|
|
|
2005-12-01 21:42:41 +00:00
|
|
|
if (up)
|
|
|
|
|
rtnl_link_set_flags (request, IFF_UP);
|
|
|
|
|
else
|
|
|
|
|
rtnl_link_unset_flags (request, IFF_UP);
|
|
|
|
|
|
2011-07-22 13:37:29 -05:00
|
|
|
old = nm_netlink_index_to_rtnl_link (ifindex);
|
2007-08-26 15:55:27 +00:00
|
|
|
if (old) {
|
2007-12-07 17:35:24 +00:00
|
|
|
nlh = nm_netlink_get_default_handle ();
|
2008-08-18 18:29:47 +00:00
|
|
|
if (nlh) {
|
2011-07-29 11:38:46 +01:00
|
|
|
err = rtnl_link_change (nlh, old, request, 0);
|
|
|
|
|
if (err == 0) {
|
2008-08-18 18:29:47 +00:00
|
|
|
success = TRUE;
|
2011-07-29 11:38:46 +01:00
|
|
|
} else {
|
|
|
|
|
if ((err == -NLE_OBJ_NOTFOUND) && no_firmware && up)
|
|
|
|
|
*no_firmware = TRUE;
|
|
|
|
|
}
|
2008-08-18 18:29:47 +00:00
|
|
|
}
|
2007-08-26 15:55:27 +00:00
|
|
|
}
|
2004-11-16 02:41:53 +00:00
|
|
|
|
2005-10-28 03:16:02 +00:00
|
|
|
rtnl_link_put (old);
|
|
|
|
|
rtnl_link_put (request);
|
2005-06-19 19:07:47 +00:00
|
|
|
return success;
|
2004-11-16 02:41:53 +00:00
|
|
|
}
|
|
|
|
|
|
2011-10-18 13:48:48 +02:00
|
|
|
guint32
|
|
|
|
|
nm_system_iface_get_flags (int ifindex)
|
2008-04-30 12:54:00 +00:00
|
|
|
{
|
2011-07-22 13:49:49 -05:00
|
|
|
struct rtnl_link *l;
|
|
|
|
|
guint32 flags;
|
2008-04-30 12:54:00 +00:00
|
|
|
|
2011-07-22 13:49:49 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2008-04-30 12:54:00 +00:00
|
|
|
|
2011-07-22 13:49:49 -05:00
|
|
|
l = nm_netlink_index_to_rtnl_link (ifindex);
|
|
|
|
|
if (l == NULL) {
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
|
|
|
|
|
g_warn_if_fail (iface != NULL);
|
|
|
|
|
nm_log_err (LOGD_HW, "(%s): failed to get interface link object",
|
|
|
|
|
iface ? iface : "unknown");
|
|
|
|
|
g_free (iface);
|
2011-07-22 13:49:49 -05:00
|
|
|
return FALSE;
|
2008-04-30 12:54:00 +00:00
|
|
|
}
|
|
|
|
|
|
2011-07-22 13:49:49 -05:00
|
|
|
flags = rtnl_link_get_flags (l);
|
|
|
|
|
rtnl_link_put (l);
|
|
|
|
|
|
2011-10-18 13:48:48 +02:00
|
|
|
return flags;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_system_iface_is_up:
|
|
|
|
|
* @ifindex: interface index
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if the interface is up, %FALSE if it was down or the check
|
|
|
|
|
* failed.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_system_iface_is_up (int ifindex)
|
|
|
|
|
{
|
|
|
|
|
return nm_system_iface_get_flags (ifindex) & IFF_UP;
|
2008-04-30 12:54:00 +00:00
|
|
|
}
|
2004-11-16 02:41:53 +00:00
|
|
|
|
2011-07-22 14:09:16 -05:00
|
|
|
/**
|
|
|
|
|
* nm_system_iface_set_mtu:
|
|
|
|
|
* @ifindex: interface index
|
|
|
|
|
* @mtu: the new MTU
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if the request was successful, %FALSE if it failed
|
|
|
|
|
**/
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
gboolean
|
2011-07-22 14:09:16 -05:00
|
|
|
nm_system_iface_set_mtu (int ifindex, guint32 mtu)
|
2005-04-15 15:43:42 +00:00
|
|
|
{
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
struct rtnl_link *old;
|
|
|
|
|
struct rtnl_link *new;
|
|
|
|
|
gboolean success = FALSE;
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2011-07-22 14:09:16 -05:00
|
|
|
int err;
|
2005-06-19 19:07:47 +00:00
|
|
|
|
2011-07-22 14:09:16 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
g_return_val_if_fail (mtu > 0, FALSE);
|
2005-06-19 19:07:47 +00:00
|
|
|
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
new = rtnl_link_alloc ();
|
|
|
|
|
if (!new)
|
|
|
|
|
return FALSE;
|
2005-06-19 19:07:47 +00:00
|
|
|
|
2011-07-22 14:09:16 -05:00
|
|
|
old = nm_netlink_index_to_rtnl_link (ifindex);
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
if (old) {
|
|
|
|
|
rtnl_link_set_mtu (new, mtu);
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
if (nlh) {
|
2011-07-22 14:09:16 -05:00
|
|
|
err = rtnl_link_change (nlh, old, new, 0);
|
|
|
|
|
if (err == 0)
|
|
|
|
|
success = TRUE;
|
2011-10-18 15:28:26 -05:00
|
|
|
else {
|
|
|
|
|
char *iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
|
|
|
|
|
nm_log_warn (LOGD_HW, "(%s): failed to change interface MTU",
|
|
|
|
|
iface ? iface : "unknown");
|
|
|
|
|
g_free (iface);
|
|
|
|
|
}
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
}
|
|
|
|
|
rtnl_link_put (old);
|
|
|
|
|
}
|
2010-06-22 14:21:25 +02:00
|
|
|
rtnl_link_put (new);
|
2011-07-22 14:09:16 -05:00
|
|
|
|
2010-06-22 14:21:25 +02:00
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
2011-07-22 14:09:16 -05:00
|
|
|
/**
|
|
|
|
|
* nm_system_iface_set_mac:
|
|
|
|
|
* @ifindex: interface index
|
|
|
|
|
* @mac: new MAC address
|
|
|
|
|
*
|
|
|
|
|
* Attempts to change the interface's MAC address to the requested value,
|
|
|
|
|
* ie MAC spoofing or cloning.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if the request succeeded, %FALSE if it failed.
|
|
|
|
|
**/
|
2010-06-22 14:21:25 +02:00
|
|
|
gboolean
|
2011-07-22 14:09:16 -05:00
|
|
|
nm_system_iface_set_mac (int ifindex, const struct ether_addr *mac)
|
2010-06-22 14:21:25 +02:00
|
|
|
{
|
2011-07-22 14:09:16 -05:00
|
|
|
struct rtnl_link *old, *new;
|
2010-06-22 14:21:25 +02:00
|
|
|
gboolean success = FALSE;
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface;
|
2010-06-22 14:21:25 +02:00
|
|
|
struct nl_addr *addr = NULL;
|
2011-07-22 14:09:16 -05:00
|
|
|
int err;
|
2010-06-22 14:21:25 +02:00
|
|
|
|
2011-07-22 14:09:16 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2010-06-22 14:21:25 +02:00
|
|
|
g_return_val_if_fail (mac != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
new = rtnl_link_alloc ();
|
|
|
|
|
if (!new)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
if (!iface)
|
|
|
|
|
goto out;
|
|
|
|
|
|
2011-07-22 14:09:16 -05:00
|
|
|
old = nm_netlink_index_to_rtnl_link (ifindex);
|
2010-06-22 14:21:25 +02:00
|
|
|
if (old) {
|
|
|
|
|
addr = nl_addr_build (AF_LLC, (void *) mac, ETH_ALEN);
|
|
|
|
|
if (!addr) {
|
2011-07-22 14:09:16 -05:00
|
|
|
nm_log_err (LOGD_HW, "(%s): failed to allocate memory for MAC address change", iface);
|
2011-09-09 11:39:09 +02:00
|
|
|
rtnl_link_put (old);
|
|
|
|
|
rtnl_link_put (new);
|
2010-06-22 14:21:25 +02:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
rtnl_link_set_addr (new, addr);
|
2011-09-09 11:39:08 +02:00
|
|
|
nl_addr_put (addr);
|
2010-06-22 14:21:25 +02:00
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
if (nlh) {
|
2011-07-22 14:09:16 -05:00
|
|
|
err = rtnl_link_change (nlh, old, new, 0);
|
|
|
|
|
if (err == 0)
|
|
|
|
|
success = TRUE;
|
|
|
|
|
else
|
|
|
|
|
nm_log_warn (LOGD_HW, "(%s): failed to change interface MAC address", iface);
|
2010-06-22 14:21:25 +02:00
|
|
|
}
|
|
|
|
|
rtnl_link_put (old);
|
|
|
|
|
}
|
2004-11-16 02:41:53 +00:00
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
out:
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
rtnl_link_put (new);
|
2011-10-18 15:28:26 -05:00
|
|
|
g_free (iface);
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
return success;
|
2004-11-16 02:41:53 +00:00
|
|
|
}
|
2007-12-07 17:35:24 +00:00
|
|
|
|
2012-11-20 17:54:04 -06:00
|
|
|
/**
|
|
|
|
|
* nm_system_iface_set_arp:
|
|
|
|
|
* @ifindex: interface index
|
|
|
|
|
* @enable: %TRUE to enable ARP, or %FALSE to disable
|
|
|
|
|
*
|
|
|
|
|
* Sets a flag to indicate that ARP should or should not be used on the
|
|
|
|
|
* interface. Point-to-point or IPv4 /32 interfaces often require that ARP
|
|
|
|
|
* be disabled.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, %FALSE on failure
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_system_iface_set_arp (int ifindex, gboolean enable)
|
|
|
|
|
{
|
|
|
|
|
struct rtnl_link *request = NULL, *old = NULL;
|
|
|
|
|
struct nl_sock *nlh;
|
|
|
|
|
gboolean success = FALSE;
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
if (!(request = rtnl_link_alloc ()))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if (enable)
|
|
|
|
|
rtnl_link_unset_flags (request, IFF_NOARP);
|
|
|
|
|
else
|
|
|
|
|
rtnl_link_set_flags (request, IFF_NOARP);
|
|
|
|
|
|
|
|
|
|
old = nm_netlink_index_to_rtnl_link (ifindex);
|
|
|
|
|
if (old) {
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
if (nlh) {
|
|
|
|
|
err = rtnl_link_change (nlh, old, request, 0);
|
|
|
|
|
if (err == 0)
|
|
|
|
|
success = TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtnl_link_put (old);
|
|
|
|
|
rtnl_link_put (request);
|
|
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
static struct rtnl_route *
|
2011-07-22 14:24:18 -05:00
|
|
|
add_ip4_route_to_gateway (int ifindex, guint32 gw, guint32 mss)
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
{
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
struct rtnl_route *route = NULL;
|
2011-07-22 14:24:18 -05:00
|
|
|
int err;
|
|
|
|
|
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
g_return_val_if_fail (nlh != NULL, NULL);
|
|
|
|
|
|
|
|
|
|
/* Gateway might be over a bridge; try adding a route to gateway first */
|
2011-07-22 18:08:18 -05:00
|
|
|
route = nm_netlink_route_new (ifindex, AF_INET, mss,
|
|
|
|
|
NMNL_PROP_SCOPE, RT_SCOPE_LINK,
|
|
|
|
|
NMNL_PROP_TABLE, RT_TABLE_MAIN,
|
|
|
|
|
NULL);
|
|
|
|
|
g_return_val_if_fail (route != NULL, NULL);
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
|
|
|
|
|
/* Add direct route to the gateway */
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route4_add (route, &gw, 32, NULL, 0);
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
if (err) {
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
|
2010-04-07 13:10:33 -07:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP4,
|
|
|
|
|
"(%s): failed to add IPv4 route to gateway (%d)",
|
2011-10-18 15:28:26 -05:00
|
|
|
iface ? iface : "unknown", err);
|
|
|
|
|
g_free (iface);
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return route;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
rtnl_route_put (route);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2008-10-11 14:26:41 +00:00
|
|
|
static int
|
2011-07-22 14:24:18 -05:00
|
|
|
replace_default_ip4_route (int ifindex, guint32 gw, guint32 mss)
|
2008-04-25 19:30:05 +00:00
|
|
|
{
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
struct rtnl_route *route = NULL;
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2011-07-22 14:24:18 -05:00
|
|
|
int err = -1;
|
2012-02-13 13:06:52 -06:00
|
|
|
guint32 dst = 0;
|
2008-10-11 14:26:41 +00:00
|
|
|
|
2011-07-22 14:24:18 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, -ENODEV);
|
2008-04-25 19:30:05 +00:00
|
|
|
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
2009-02-13 06:58:42 -05:00
|
|
|
g_return_val_if_fail (nlh != NULL, -ENOMEM);
|
2008-04-25 19:30:05 +00:00
|
|
|
|
2011-07-22 18:08:18 -05:00
|
|
|
route = nm_netlink_route_new (ifindex, AF_INET, mss,
|
|
|
|
|
NMNL_PROP_SCOPE, RT_SCOPE_UNIVERSE,
|
|
|
|
|
NMNL_PROP_TABLE, RT_TABLE_MAIN,
|
|
|
|
|
NULL);
|
2009-02-13 06:58:42 -05:00
|
|
|
g_return_val_if_fail (route != NULL, -ENOMEM);
|
2008-04-25 19:30:05 +00:00
|
|
|
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
/* Add the new default route */
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route4_add (route, &dst, 0, &gw, NLM_F_REPLACE);
|
2012-01-16 10:27:21 -06:00
|
|
|
if (err == -NLE_EXIST)
|
|
|
|
|
err = 0;
|
2008-10-11 14:26:41 +00:00
|
|
|
|
|
|
|
|
rtnl_route_put (route);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* nm_system_replace_default_ip4_route_vpn
|
|
|
|
|
*
|
|
|
|
|
* Replace default IPv4 route with one via the current device
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2011-07-22 14:24:18 -05:00
|
|
|
nm_system_replace_default_ip4_route_vpn (int ifindex,
|
2008-10-11 14:26:41 +00:00
|
|
|
guint32 ext_gw,
|
|
|
|
|
guint32 int_gw,
|
|
|
|
|
guint32 mss,
|
2011-07-22 14:24:18 -05:00
|
|
|
int parent_ifindex,
|
2008-10-11 14:26:41 +00:00
|
|
|
guint32 parent_mss)
|
|
|
|
|
{
|
|
|
|
|
struct rtnl_route *gw_route = NULL;
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2008-10-11 14:26:41 +00:00
|
|
|
gboolean success = FALSE;
|
|
|
|
|
int err;
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface;
|
2008-10-11 14:26:41 +00:00
|
|
|
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
g_return_val_if_fail (nlh != NULL, FALSE);
|
|
|
|
|
|
2011-07-22 14:24:18 -05:00
|
|
|
err = replace_default_ip4_route (ifindex, int_gw, mss);
|
2011-10-18 15:28:26 -05:00
|
|
|
if (err == 0)
|
2008-10-15 17:55:14 +00:00
|
|
|
return TRUE;
|
2011-10-18 15:28:26 -05:00
|
|
|
|
|
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
if (!iface)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
if ((err != -NLE_OBJ_NOTFOUND) && (err != -NLE_FAILURE)) {
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_VPN | LOGD_IP4,
|
2010-04-07 13:10:33 -07:00
|
|
|
"(%s): failed to set IPv4 default route: %d",
|
2009-02-13 06:58:42 -05:00
|
|
|
iface, err);
|
2011-10-18 15:28:26 -05:00
|
|
|
goto out;
|
2008-05-22 14:22:31 +00:00
|
|
|
}
|
|
|
|
|
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
/* Try adding a direct route to the gateway first */
|
2011-07-22 14:24:18 -05:00
|
|
|
gw_route = add_ip4_route_to_gateway (parent_ifindex, ext_gw, parent_mss);
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
if (!gw_route)
|
2011-10-18 15:28:26 -05:00
|
|
|
goto out;
|
2008-05-22 14:22:31 +00:00
|
|
|
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
/* Try adding the original route again */
|
2011-07-22 14:24:18 -05:00
|
|
|
err = replace_default_ip4_route (ifindex, int_gw, mss);
|
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
|
|
|
if (err != 0) {
|
2011-07-22 16:12:44 -05:00
|
|
|
nm_netlink_route_delete (gw_route);
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_VPN | LOGD_IP4,
|
2010-04-07 13:10:33 -07:00
|
|
|
"(%s): failed to set IPv4 default route (pass #2): %d",
|
2009-02-13 06:58:42 -05:00
|
|
|
iface, err);
|
2008-10-11 14:26:41 +00:00
|
|
|
} else
|
|
|
|
|
success = TRUE;
|
|
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
out:
|
|
|
|
|
if (gw_route)
|
|
|
|
|
rtnl_route_put (gw_route);
|
|
|
|
|
g_free (iface);
|
2008-10-11 14:26:41 +00:00
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* nm_system_replace_default_ip4_route
|
|
|
|
|
*
|
|
|
|
|
* Replace default IPv4 route with one via the current device
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2011-07-22 14:24:18 -05:00
|
|
|
nm_system_replace_default_ip4_route (int ifindex, guint32 gw, guint32 mss)
|
2008-10-11 14:26:41 +00:00
|
|
|
{
|
|
|
|
|
struct rtnl_route *gw_route = NULL;
|
|
|
|
|
gboolean success = FALSE;
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface;
|
2008-10-11 14:26:41 +00:00
|
|
|
int err;
|
|
|
|
|
|
2011-07-22 14:24:18 -05:00
|
|
|
err = replace_default_ip4_route (ifindex, gw, mss);
|
2011-10-18 15:28:26 -05:00
|
|
|
if (err == 0)
|
2008-10-15 17:57:09 +00:00
|
|
|
return TRUE;
|
2011-10-18 15:28:26 -05:00
|
|
|
|
|
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
if (!iface)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
if (err != -NLE_OBJ_NOTFOUND) {
|
2010-04-07 13:10:33 -07:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP4,
|
|
|
|
|
"(%s): failed to set IPv4 default route: %d",
|
2009-02-13 06:58:42 -05:00
|
|
|
iface, err);
|
2011-10-18 15:28:26 -05:00
|
|
|
goto out;
|
2008-04-25 19:30:05 +00:00
|
|
|
}
|
2008-04-25 19:22:32 +00:00
|
|
|
|
2008-10-11 14:26:41 +00:00
|
|
|
/* Try adding a direct route to the gateway first */
|
2011-07-22 14:24:18 -05:00
|
|
|
gw_route = add_ip4_route_to_gateway (ifindex, gw, mss);
|
2008-10-11 14:26:41 +00:00
|
|
|
if (!gw_route)
|
2011-10-18 15:28:26 -05:00
|
|
|
goto out;
|
2008-05-22 14:22:31 +00:00
|
|
|
|
2008-10-11 14:26:41 +00:00
|
|
|
/* Try adding the original route again */
|
2011-07-22 14:24:18 -05:00
|
|
|
err = replace_default_ip4_route (ifindex, gw, mss);
|
2008-10-11 14:26:41 +00:00
|
|
|
if (err != 0) {
|
2011-07-22 16:12:44 -05:00
|
|
|
nm_netlink_route_delete (gw_route);
|
2010-04-07 13:10:33 -07:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP4,
|
|
|
|
|
"(%s): failed to set IPv4 default route (pass #2): %d",
|
2009-02-13 06:58:42 -05:00
|
|
|
iface, err);
|
2008-10-11 14:26:41 +00:00
|
|
|
} else
|
|
|
|
|
success = TRUE;
|
|
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
out:
|
|
|
|
|
if (gw_route)
|
|
|
|
|
rtnl_route_put (gw_route);
|
|
|
|
|
g_free (iface);
|
2008-10-11 14:26:41 +00:00
|
|
|
return success;
|
2008-04-25 19:22:32 +00:00
|
|
|
}
|
2008-03-07 Dan Williams <dcbw@redhat.com>
First pass of multiple active device support. Expect bugs.
* src/nm-ip4-config.c
src/nm-ip4-config.h
- (nm_ip4_config_get_secondary, nm_ip4_config_set_secondary): remove;
there are better ways to do this in the named manager
* src/nm-device.c
src/nm-device.h
- (nm_device_can_activate): return whether the device can activate a
connection right now; taking into account things like carrier state
and rfkill state
- (nm_device_get_best_auto_connection): renamed from
nm_device_get_best_connection
- (real_act_stage4_get_ip4_config): MTU stuff is now handled in the
device subclasses themselves, so that each device can override the
MTU from it's NMSetting subclass if needed
- (nm_device_set_ip4_config): set MTU when setting up routes and stuff
in NetworkManagerSystem.c, not here
* src/named-manager/nm-named-manager.c
src/named-manager/nm-named-manager.h
- (nm_named_manager_name_owner_changed,
nm_named_manager_dbus_connection_changed): fix for changes to
rewrite_resolv_conf()
- (compute_nameservers): don't need the NMNamedManager at all, remove
from parameter list
- (merge_one_ip4_config): new function; merge ip4 configs together
- (rewrite_resolv_conf): write out resolv.conf from all the stored
ip4 configs; the VPN config takes precedence, then the best
device config, then the rest of the configs
- (get_domain_for_config): take the NMNamedManager as an argument
to check whether the config is the VPN config
- (add_ip4_config_to_named): fixups for removal of the 'secondary'
attribute from ip4 configs
- (add_all_ip4_configs_to_named): add all the configs in priority order
- (remove_ip4_config_from_named): fix for changes to
get_domain_for_config()
- (nm_named_manager_add_ip4_config): assign the config to the right slot
based on its type; callers must pass in the type now
- (get_last_default_domain): remove, unused
- (nm_named_manager_remove_ip4_config): handle config slots correctly
* src/nm-device-802-11-wireless.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): handle MTU override
* src/nm-device-802-3-ethernet.c
- (real_can_activate): new function
- (real_get_best_auto_connection): renamed from real_get_best_connection
- (real_act_stage4_get_ip4_config): new function; handle MTU override
* src/vpn-manager/nm-vpn-connection.c
- (nm_vpn_connection_ip4_config_get): don't need to set the 'secondary'
attribute on the ip4 config
* src/NetworkManagerPolicy.c
- (nm_policy_auto_get_best_device): remove
- (nm_policy_device_change_check): remove
- (update_default_route): new function; set the default route via
the specified device
- (get_device_priority): new function; return the priority number of
a device type WRT which one should have the default route. Order is
(highest to lowest) wired, wireless, GSM, CDMA.
- (update_routing_and_dns): new function; determine which device should
have the default route, then update the routing table and DNS
- (maybe_auto_activate_device): new function; if a device is now
available for activation, find out what connection it would like to
activate and do it
- (schedule_activate_check): new function; if a device can be activated
now, schedule the activation. Each device may have only one
pending activation at a given time.
- (device_state_changed): if activation was canceled, try again,
possibly with another connection; if the device was activated,
update routing and DNS; if the device was deactivated, try again
with another connection
- (device_carrier_changed): if there is no carrier, deactivate the
device; otherwise schedule an activation check for the device
- (wireless_networks_changed): schedule an activation check for the
device
- (device_added): keep track of the signal handler IDs so they can
be removed when the device goes away
- (device_removed): remove any signal handlers that might be attached
to the device; update routing and DNS
- (schedule_activate_all): new function
- (connections_added, connection_added, connection_updated): when
connections change, schedule all devices for an activation check
- (connection_removed): when a device is deactivated because its
connection was removed, schedule another activation check for it
- (nm_policy_destroy): destroy pending activations and disconnect
all device signal handlers
* src/nm-manager.c
- (nm_manager_activate_device): if the device was already actived,
deactivate it
- (deactivate_old_device): remove
- (connection_added_default_handler, impl_manager_activate_device):
don't deactivate other devices when activating this one
* src/backends/NetworkManagerGentoo.c
src/backends/NetworkManagerFrugalware.c
src/backends/NetworkManagerPaldo.c
src/backends/NetworkManagerRedHat.c
src/backends/NetworkManagerSlackware.c
src/backends/NetworkManagerArch.c
src/backends/NetworkManagerSuSE.c
src/backends/NetworkManagerDebian.c
- (nm_system_get_mtu): remove; MTU should be provided through the
distro's system settings service plugin instead
- (nm_system_device_add_default_route_via_device): remove
- (nm_system_device_add_default_route_via_device_with_iface): remove
- (nm_system_device_replace_default_route): new function; call
generic implementation
* src/backends/NetworkManagerGeneric.c
src/backends/NetworkManagerGeneric.h
- (nm_generic_device_add_default_route_via_device,
nm_generic_device_add_default_route_via_device_with_iface): remove
- (nm_generic_device_replace_default_route): replace the default route
with the given route via some gateway
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_device_set_from_ip4_config): let the policy handle updates
to routing and DNS; but set the MTU here
- (nm_system_vpn_device_set_from_ip4_config): set the route with the
ip_iface of the active device; use the standard MTU setting function
- (nm_system_set_mtu): remove
- (nm_system_device_set_mtu): consolidate MTU setting code in one place
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@3391 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-03-07 19:41:32 +00:00
|
|
|
|
2010-04-23 22:11:22 -07:00
|
|
|
static struct rtnl_route *
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
add_ip6_route_to_gateway (int ifindex, const struct in6_addr *gw, int mss)
|
2010-04-23 22:11:22 -07:00
|
|
|
{
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2010-04-23 22:11:22 -07:00
|
|
|
struct rtnl_route *route = NULL;
|
2011-07-22 14:24:18 -05:00
|
|
|
int err;
|
|
|
|
|
|
2010-04-23 22:11:22 -07:00
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
g_return_val_if_fail (nlh != NULL, NULL);
|
|
|
|
|
|
|
|
|
|
/* Gateway might be over a bridge; try adding a route to gateway first */
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
route = nm_netlink_route_new (ifindex, AF_INET6, mss,
|
2011-07-22 18:08:18 -05:00
|
|
|
NMNL_PROP_SCOPE, RT_SCOPE_LINK,
|
|
|
|
|
NMNL_PROP_TABLE, RT_TABLE_MAIN,
|
|
|
|
|
NULL);
|
|
|
|
|
g_return_val_if_fail (route != NULL, NULL);
|
2010-04-23 22:11:22 -07:00
|
|
|
|
|
|
|
|
/* Add direct route to the gateway */
|
2012-02-13 13:06:52 -06:00
|
|
|
err = nm_netlink_route6_add (route, gw, 128, NULL, 0);
|
2010-04-23 22:11:22 -07:00
|
|
|
if (err) {
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
|
2010-04-23 22:11:22 -07:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP6,
|
2011-10-18 15:28:26 -05:00
|
|
|
"(%s): failed to add IPv6 route to gateway (%d)",
|
|
|
|
|
iface ? iface : "unknown", err);
|
|
|
|
|
g_free (iface);
|
|
|
|
|
|
|
|
|
|
rtnl_route_put (route);
|
|
|
|
|
route = NULL;
|
2010-04-23 22:11:22 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return route;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
add_default_ip6_route (int ifindex, const struct in6_addr *gw, int mss)
|
2010-04-23 22:11:22 -07:00
|
|
|
{
|
|
|
|
|
struct rtnl_route *route = NULL;
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2011-07-22 14:24:18 -05:00
|
|
|
int err = -1;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2010-04-23 22:11:22 -07:00
|
|
|
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
g_return_val_if_fail (nlh != NULL, -ENOMEM);
|
|
|
|
|
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
route = nm_netlink_route_new (ifindex, AF_INET6, mss,
|
2011-07-22 18:08:18 -05:00
|
|
|
NMNL_PROP_SCOPE, RT_SCOPE_UNIVERSE,
|
|
|
|
|
NMNL_PROP_TABLE, RT_TABLE_MAIN,
|
2012-04-19 14:27:12 -04:00
|
|
|
NMNL_PROP_PRIO, 1,
|
2011-07-22 18:08:18 -05:00
|
|
|
NULL);
|
2010-04-23 22:11:22 -07:00
|
|
|
g_return_val_if_fail (route != NULL, -ENOMEM);
|
|
|
|
|
|
|
|
|
|
/* Add the new default route */
|
2012-04-19 14:27:12 -04:00
|
|
|
err = nm_netlink_route6_add (route, &in6addr_any, 0, gw, NLM_F_CREATE);
|
|
|
|
|
if (err == -NLE_EXIST)
|
2010-04-26 14:06:58 -07:00
|
|
|
err = 0;
|
2010-04-23 22:11:22 -07:00
|
|
|
|
|
|
|
|
rtnl_route_put (route);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
|
|
|
|
|
2012-04-19 14:27:12 -04:00
|
|
|
static struct rtnl_route *
|
|
|
|
|
find_static_default_routes (struct rtnl_route *route,
|
|
|
|
|
struct nl_addr *dst,
|
|
|
|
|
const char *iface,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
GList **def_routes = user_data;
|
|
|
|
|
|
|
|
|
|
if ( nl_addr_get_prefixlen (dst) == 0
|
|
|
|
|
&& rtnl_route_get_protocol (route) == RTPROT_STATIC) {
|
|
|
|
|
rtnl_route_get (route);
|
|
|
|
|
*def_routes = g_list_prepend (*def_routes, route);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
static int
|
|
|
|
|
replace_default_ip6_route (int ifindex, const struct in6_addr *gw, int mss)
|
2010-04-23 22:11:22 -07:00
|
|
|
{
|
2012-04-19 14:27:12 -04:00
|
|
|
GList *def_routes, *iter;
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
struct rtnl_route *route;
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface;
|
2012-05-23 15:43:33 +02:00
|
|
|
char gw_str[INET6_ADDRSTRLEN + 1];
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
|
|
|
|
|
|
|
|
|
if (nm_logging_level_enabled (LOGL_DEBUG)) {
|
2012-09-26 10:22:21 -04:00
|
|
|
if (gw) {
|
|
|
|
|
memset (gw_str, 0, sizeof (gw_str));
|
|
|
|
|
if (inet_ntop (AF_INET6, gw, gw_str, sizeof (gw_str) - 1))
|
|
|
|
|
nm_log_dbg (LOGD_IP6, "Setting IPv6 default route via %s", gw_str);
|
|
|
|
|
} else {
|
|
|
|
|
nm_log_dbg (LOGD_IP6, "Setting IPv6 default route via %s",
|
|
|
|
|
nm_netlink_index_to_iface (ifindex));
|
|
|
|
|
}
|
2012-05-23 15:43:33 +02:00
|
|
|
}
|
2010-04-23 22:11:22 -07:00
|
|
|
|
2012-04-19 14:27:12 -04:00
|
|
|
/* We can't just use NLM_F_REPLACE here like in the IPv4 case, because
|
|
|
|
|
* the kernel doesn't like it if we replace the default routes it
|
|
|
|
|
* creates. (See rh#785772.) So we delete any non-kernel default routes,
|
|
|
|
|
* and then add a new default route of our own with a lower metric than
|
|
|
|
|
* the kernel ones.
|
|
|
|
|
*/
|
|
|
|
|
def_routes = NULL;
|
|
|
|
|
nm_netlink_foreach_route (ifindex, AF_INET6, RT_SCOPE_UNIVERSE, TRUE,
|
|
|
|
|
find_static_default_routes, &def_routes);
|
|
|
|
|
for (iter = def_routes; iter; iter = iter->next) {
|
|
|
|
|
route = iter->data;
|
|
|
|
|
if (!nm_netlink_route_delete (route)) {
|
|
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP6,
|
|
|
|
|
"(%s): failed to delete existing IPv6 default route",
|
|
|
|
|
iface);
|
|
|
|
|
g_free (iface);
|
|
|
|
|
}
|
|
|
|
|
rtnl_route_put (route);
|
|
|
|
|
}
|
|
|
|
|
g_list_free (def_routes);
|
|
|
|
|
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
return add_default_ip6_route (ifindex, gw, mss);
|
|
|
|
|
}
|
2011-10-18 15:28:26 -05:00
|
|
|
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
/*
|
|
|
|
|
* nm_system_replace_default_ip6_route
|
|
|
|
|
*
|
|
|
|
|
* Replace default IPv6 route with one via the given gateway
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_system_replace_default_ip6_route (int ifindex, const struct in6_addr *gw)
|
|
|
|
|
{
|
|
|
|
|
struct rtnl_route *gw_route = NULL;
|
|
|
|
|
gboolean success = FALSE;
|
|
|
|
|
char *iface;
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
err = replace_default_ip6_route (ifindex, gw, 0);
|
|
|
|
|
if (err == 0 || err == -NLE_EXIST)
|
2012-01-16 10:27:21 -06:00
|
|
|
return TRUE;
|
|
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
if (!iface)
|
|
|
|
|
goto out;
|
|
|
|
|
|
2011-08-05 16:02:44 +01:00
|
|
|
if (err != -NLE_OBJ_NOTFOUND) {
|
2010-04-23 22:11:22 -07:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP6,
|
|
|
|
|
"(%s): failed to set IPv6 default route: %d",
|
|
|
|
|
iface, err);
|
2011-10-18 15:28:26 -05:00
|
|
|
goto out;
|
2010-04-23 22:11:22 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Try adding a direct route to the gateway first */
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
gw_route = add_ip6_route_to_gateway (ifindex, gw, 0);
|
2010-04-23 22:11:22 -07:00
|
|
|
if (!gw_route)
|
2011-10-18 15:28:26 -05:00
|
|
|
goto out;
|
2010-04-23 22:11:22 -07:00
|
|
|
|
|
|
|
|
/* Try adding the original route again */
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
err = replace_default_ip6_route (ifindex, gw, 0);
|
2010-04-23 22:11:22 -07:00
|
|
|
if (err != 0) {
|
2011-07-22 16:12:44 -05:00
|
|
|
nm_netlink_route_delete (gw_route);
|
2010-04-23 22:11:22 -07:00
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_IP6,
|
|
|
|
|
"(%s): failed to set IPv6 default route (pass #2): %d",
|
|
|
|
|
iface, err);
|
|
|
|
|
} else
|
|
|
|
|
success = TRUE;
|
|
|
|
|
|
2011-10-18 15:28:26 -05:00
|
|
|
out:
|
|
|
|
|
if (gw_route)
|
|
|
|
|
rtnl_route_put (gw_route);
|
|
|
|
|
g_free (iface);
|
2010-04-23 22:11:22 -07:00
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
vpn: support IPv6 over VPNs
Add new API to allow passing both IPv4 and IPv6 configuration
information from VPN plugins to the backend.
Now instead of a single Ip4Config, a plugin has Config, Ip4Config, and
Ip6Config. "Config" contains information which is neither IPv4 nor
IPv6 specific, and also indicates which of Ip4Config and Ip6Config are
present. Ip4Config now only contains the IPv4-specific bits of
configuration.
There is backward compatibility in both directions: if the daemon is
new and the VPN plugin is old, then NM will notice that the plugin
emitted the Ip4Config signal without having emitted the Config signal
first, and so will assume that it is IPv4-only, and that the generic
bits of configuration have been included with the Ip4Config. If the
daemon is old and the plugin is new, then NMVPNPlugin will copy the
values from the generic config into the IPv4 config as well. (In fact,
NMVPNPlugin *always* does this, because it's harmless, and it's easier
than actually checking the daemon version.)
Currently the VPN is still configured all-at-once, after both IPv4 and
IPv6 information has been received, but the APIs allow for the
possibility of configuring them one at a time in the future.
2012-05-04 15:50:07 -04:00
|
|
|
gboolean
|
|
|
|
|
nm_system_replace_default_ip6_route_vpn (int ifindex,
|
|
|
|
|
const struct in6_addr *ext_gw,
|
|
|
|
|
const struct in6_addr *int_gw,
|
|
|
|
|
guint32 mss,
|
|
|
|
|
int parent_ifindex,
|
|
|
|
|
guint32 parent_mss)
|
|
|
|
|
{
|
|
|
|
|
struct rtnl_route *gw_route = NULL;
|
|
|
|
|
struct nl_sock *nlh;
|
|
|
|
|
gboolean success = FALSE;
|
|
|
|
|
int err;
|
|
|
|
|
char *iface;
|
|
|
|
|
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
g_return_val_if_fail (nlh != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
err = replace_default_ip6_route (ifindex, int_gw, mss);
|
|
|
|
|
if (err == 0)
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
if (!iface)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
if ((err != -NLE_OBJ_NOTFOUND) && (err != -NLE_FAILURE)) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_VPN | LOGD_IP6,
|
|
|
|
|
"(%s): failed to set IPv6 default route: %d",
|
|
|
|
|
iface, err);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Try adding a direct route to the gateway first */
|
|
|
|
|
gw_route = add_ip6_route_to_gateway (parent_ifindex, ext_gw, parent_mss);
|
|
|
|
|
if (!gw_route)
|
|
|
|
|
goto out;
|
|
|
|
|
|
|
|
|
|
/* Try adding the original route again */
|
|
|
|
|
err = replace_default_ip6_route (ifindex, int_gw, mss);
|
|
|
|
|
if (err != 0) {
|
|
|
|
|
nm_netlink_route_delete (gw_route);
|
|
|
|
|
nm_log_err (LOGD_DEVICE | LOGD_VPN | LOGD_IP6,
|
|
|
|
|
"(%s): failed to set IPv6 default route (pass #2): %d",
|
|
|
|
|
iface, err);
|
|
|
|
|
} else
|
|
|
|
|
success = TRUE;
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
if (gw_route)
|
|
|
|
|
rtnl_route_put (gw_route);
|
|
|
|
|
g_free (iface);
|
|
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
2008-05-28 21:49:34 +00:00
|
|
|
/*
|
2011-07-22 13:37:29 -05:00
|
|
|
* nm_system_iface_flush_addresses
|
2008-05-28 21:49:34 +00:00
|
|
|
*
|
|
|
|
|
* Flush all network addresses associated with a network device
|
|
|
|
|
*
|
|
|
|
|
*/
|
2011-07-22 13:37:29 -05:00
|
|
|
gboolean
|
|
|
|
|
nm_system_iface_flush_addresses (int ifindex, int family)
|
2008-05-28 21:49:34 +00:00
|
|
|
{
|
2011-07-22 13:37:29 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2011-07-22 14:09:16 -05:00
|
|
|
return sync_addresses (ifindex, family, NULL, 0);
|
2008-05-28 21:49:34 +00:00
|
|
|
}
|
|
|
|
|
|
2008-09-30 15:04:10 +00:00
|
|
|
|
2011-07-22 17:08:53 -05:00
|
|
|
static struct rtnl_route *
|
|
|
|
|
delete_one_route (struct rtnl_route *route,
|
|
|
|
|
struct nl_addr *dst,
|
|
|
|
|
const char *iface,
|
|
|
|
|
gpointer user_data)
|
2008-05-28 21:49:34 +00:00
|
|
|
{
|
2011-07-22 17:08:53 -05:00
|
|
|
guint32 log_level = GPOINTER_TO_UINT (user_data);
|
2010-08-10 21:32:20 -05:00
|
|
|
|
|
|
|
|
nm_log_dbg (log_level, " deleting route");
|
2011-07-22 16:12:44 -05:00
|
|
|
if (!nm_netlink_route_delete (route))
|
2011-07-22 17:08:53 -05:00
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): failed to delete route", iface);
|
|
|
|
|
|
|
|
|
|
return NULL;
|
2008-05-28 21:49:34 +00:00
|
|
|
}
|
|
|
|
|
|
2011-07-22 13:37:29 -05:00
|
|
|
/**
|
|
|
|
|
* nm_system_iface_flush_routes:
|
|
|
|
|
* @ifindex: interface index
|
|
|
|
|
* @family: address family, i.e. AF_INET, AF_INET6, or AF_UNSPEC
|
|
|
|
|
*
|
|
|
|
|
* Flush all network addresses associated with a network device.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, %FALSE on failure
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_system_iface_flush_routes (int ifindex, int family)
|
2008-05-28 21:49:34 +00:00
|
|
|
{
|
2010-08-10 21:32:20 -05:00
|
|
|
guint32 log_level = LOGD_IP4 | LOGD_IP6;
|
|
|
|
|
const char *sf = "UNSPEC";
|
2011-10-18 15:28:26 -05:00
|
|
|
char *iface;
|
2008-05-28 21:49:34 +00:00
|
|
|
|
2011-07-22 13:37:29 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0, FALSE);
|
2008-05-28 21:49:34 +00:00
|
|
|
|
2011-07-22 13:37:29 -05:00
|
|
|
iface = nm_netlink_index_to_iface (ifindex);
|
2011-07-22 14:09:16 -05:00
|
|
|
g_return_val_if_fail (iface != NULL, FALSE);
|
2010-05-04 20:23:09 -07:00
|
|
|
|
2010-08-10 21:32:20 -05:00
|
|
|
if (family == AF_INET) {
|
|
|
|
|
log_level = LOGD_IP4;
|
|
|
|
|
sf = "INET";
|
|
|
|
|
} else if (family == AF_INET6) {
|
|
|
|
|
log_level = LOGD_IP6;
|
|
|
|
|
sf = "INET6";
|
|
|
|
|
}
|
|
|
|
|
nm_log_dbg (log_level, "(%s): flushing routes ifindex %d family %s (%d)",
|
|
|
|
|
iface, ifindex, sf, family);
|
|
|
|
|
|
2011-07-22 17:08:53 -05:00
|
|
|
/* We don't want to flush IPv6 link-local routes that may exist on the
|
|
|
|
|
* the interface since the LL address and routes should normally stay
|
|
|
|
|
* assigned all the time.
|
|
|
|
|
*/
|
|
|
|
|
nm_netlink_foreach_route (ifindex, family, RT_SCOPE_UNIVERSE, TRUE, delete_one_route, GUINT_TO_POINTER (log_level));
|
2011-10-18 15:28:26 -05:00
|
|
|
|
|
|
|
|
g_free (iface);
|
2011-07-22 13:37:29 -05:00
|
|
|
return TRUE;
|
2009-07-29 12:12:41 -04:00
|
|
|
}
|
|
|
|
|
|
2011-07-22 17:08:53 -05:00
|
|
|
static struct rtnl_route *
|
|
|
|
|
find_route (struct rtnl_route *route,
|
|
|
|
|
struct nl_addr *dst,
|
|
|
|
|
const char *iface,
|
|
|
|
|
gpointer user_data)
|
2008-09-30 15:04:10 +00:00
|
|
|
{
|
2011-07-22 17:08:53 -05:00
|
|
|
NMIP4Config *config = user_data;
|
2008-09-30 15:04:10 +00:00
|
|
|
struct in_addr *dst_addr;
|
|
|
|
|
int num;
|
|
|
|
|
int i;
|
|
|
|
|
|
2011-07-22 17:08:53 -05:00
|
|
|
if (dst && (nl_addr_get_family (dst) != AF_INET))
|
|
|
|
|
return NULL;
|
2008-09-30 15:04:10 +00:00
|
|
|
|
2011-07-22 17:08:53 -05:00
|
|
|
/* Find the first route that handles a subnet of at least one of the
|
|
|
|
|
* device's IPv4 addresses.
|
|
|
|
|
*/
|
2008-09-30 15:04:10 +00:00
|
|
|
dst_addr = nl_addr_get_binary_addr (dst);
|
2011-07-22 17:08:53 -05:00
|
|
|
num = nm_ip4_config_get_num_addresses (config);
|
2008-09-30 15:04:10 +00:00
|
|
|
for (i = 0; i < num; i++) {
|
2011-07-22 17:08:53 -05:00
|
|
|
NMIP4Address *addr = nm_ip4_config_get_address (config, i);
|
2008-10-29 14:35:25 +00:00
|
|
|
guint32 prefix = nm_ip4_address_get_prefix (addr);
|
|
|
|
|
guint32 address = nm_ip4_address_get_address (addr);
|
2008-09-30 15:04:10 +00:00
|
|
|
|
2011-07-22 17:08:53 -05:00
|
|
|
if ( prefix == nl_addr_get_prefixlen (dst)
|
|
|
|
|
&& (address & nm_utils_ip4_prefix_to_netmask (prefix)) == dst_addr->s_addr)
|
|
|
|
|
return route;
|
2008-09-30 15:04:10 +00:00
|
|
|
}
|
2011-07-22 17:08:53 -05:00
|
|
|
return NULL;
|
2008-09-30 15:04:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2011-07-22 14:24:18 -05:00
|
|
|
nm_system_device_set_priority (int ifindex,
|
|
|
|
|
NMIP4Config *config,
|
|
|
|
|
int priority)
|
2008-09-30 15:04:10 +00:00
|
|
|
{
|
2011-07-29 11:38:46 +01:00
|
|
|
struct nl_sock *nlh;
|
2011-07-22 17:08:53 -05:00
|
|
|
struct rtnl_route *found;
|
2008-09-30 15:04:10 +00:00
|
|
|
|
2011-07-22 17:08:53 -05:00
|
|
|
found = nm_netlink_foreach_route (ifindex, AF_INET, RT_SCOPE_LINK, FALSE, find_route, config);
|
|
|
|
|
if (found) {
|
2011-07-22 16:12:44 -05:00
|
|
|
nlh = nm_netlink_get_default_handle ();
|
2011-07-22 17:08:53 -05:00
|
|
|
nm_netlink_route_delete (found);
|
2011-07-29 11:38:46 +01:00
|
|
|
rtnl_route_set_priority (found, priority);
|
2011-07-22 17:08:53 -05:00
|
|
|
rtnl_route_add (nlh, found, 0);
|
|
|
|
|
rtnl_route_put (found);
|
2008-09-30 15:04:10 +00:00
|
|
|
}
|
2008-05-28 21:49:34 +00:00
|
|
|
}
|
2011-10-18 13:48:44 +02:00
|
|
|
|
2012-03-20 11:16:01 -04:00
|
|
|
static const struct {
|
|
|
|
|
const char *option;
|
|
|
|
|
const char *default_value;
|
|
|
|
|
} bonding_defaults[] = {
|
|
|
|
|
{ "mode", "balance-rr" },
|
|
|
|
|
{ "arp_interval", "0" },
|
|
|
|
|
{ "miimon", "0" },
|
|
|
|
|
|
|
|
|
|
{ "ad_select", "stable" },
|
|
|
|
|
{ "arp_validate", "none" },
|
|
|
|
|
{ "downdelay", "0" },
|
|
|
|
|
{ "fail_over_mac", "none" },
|
|
|
|
|
{ "lacp_rate", "slow" },
|
|
|
|
|
{ "min_links", "0" },
|
|
|
|
|
{ "num_grat_arp", "1" },
|
|
|
|
|
{ "num_unsol_na", "1" },
|
|
|
|
|
{ "primary", "" },
|
|
|
|
|
{ "primary_reselect", "always" },
|
|
|
|
|
{ "resend_igmp", "1" },
|
|
|
|
|
{ "updelay", "0" },
|
|
|
|
|
{ "use_carrier", "1" },
|
|
|
|
|
{ "xmit_hash_policy", "layer2" },
|
|
|
|
|
{ NULL, NULL }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
remove_bonding_entries (const char *iface, const char *path)
|
2011-11-09 11:22:40 +01:00
|
|
|
{
|
2012-03-20 11:16:01 -04:00
|
|
|
char cmd[20];
|
|
|
|
|
char *value, **entries;
|
2011-11-09 11:22:40 +01:00
|
|
|
gboolean ret;
|
2012-03-20 11:16:01 -04:00
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if (!g_file_get_contents (path, &value, NULL, NULL))
|
|
|
|
|
return;
|
2011-11-09 11:22:40 +01:00
|
|
|
|
2012-03-20 11:16:01 -04:00
|
|
|
entries = g_strsplit (value, " ", -1);
|
|
|
|
|
for (i = 0; entries[i]; i++) {
|
|
|
|
|
snprintf (cmd, sizeof (cmd), "-%s", g_strstrip (entries[i]));
|
|
|
|
|
ret = nm_utils_do_sysctl (path, cmd);
|
|
|
|
|
if (!ret) {
|
|
|
|
|
nm_log_warn (LOGD_HW, "(%s): failed to remove entry '%s' from '%s'",
|
|
|
|
|
iface, entries[i], path);
|
|
|
|
|
}
|
2012-02-29 12:39:11 -06:00
|
|
|
}
|
2012-03-20 11:16:01 -04:00
|
|
|
g_strfreev (entries);
|
|
|
|
|
}
|
2011-11-09 11:22:40 +01:00
|
|
|
|
2012-03-20 11:16:01 -04:00
|
|
|
static gboolean
|
|
|
|
|
option_valid_for_nm_setting (const char *option, const char **valid_opts)
|
|
|
|
|
{
|
|
|
|
|
while (*valid_opts) {
|
|
|
|
|
if (strcmp (option, *valid_opts) == 0)
|
|
|
|
|
return TRUE;
|
|
|
|
|
valid_opts++;
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
2011-11-09 11:22:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gboolean
|
2012-02-29 12:39:11 -06:00
|
|
|
nm_system_apply_bonding_config (const char *iface, NMSettingBond *s_bond)
|
2011-11-09 11:22:40 +01:00
|
|
|
{
|
2012-03-20 11:16:01 -04:00
|
|
|
const char **valid_opts;
|
|
|
|
|
const char *option, *value;
|
|
|
|
|
char path[FILENAME_MAX];
|
|
|
|
|
char *current, *space;
|
|
|
|
|
gboolean ret;
|
|
|
|
|
int i;
|
2011-11-09 11:22:40 +01:00
|
|
|
|
2012-02-29 12:39:11 -06:00
|
|
|
g_return_val_if_fail (iface != NULL, FALSE);
|
2011-11-09 11:22:40 +01:00
|
|
|
|
2012-03-20 11:16:01 -04:00
|
|
|
/* Remove old slaves and arp_ip_targets */
|
|
|
|
|
snprintf (path, sizeof (path), "/sys/class/net/%s/bonding/arp_ip_target", iface);
|
|
|
|
|
remove_bonding_entries (iface, path);
|
|
|
|
|
snprintf (path, sizeof (path), "/sys/class/net/%s/bonding/slaves", iface);
|
|
|
|
|
remove_bonding_entries (iface, path);
|
|
|
|
|
|
|
|
|
|
/* Apply config/defaults */
|
|
|
|
|
valid_opts = nm_setting_bond_get_valid_options (s_bond);
|
|
|
|
|
for (i = 0; bonding_defaults[i].option; i++) {
|
|
|
|
|
option = bonding_defaults[i].option;
|
|
|
|
|
if (option_valid_for_nm_setting (option, valid_opts))
|
|
|
|
|
value = nm_setting_bond_get_option_by_name (s_bond, option);
|
|
|
|
|
else
|
|
|
|
|
value = NULL;
|
|
|
|
|
if (!value)
|
|
|
|
|
value = bonding_defaults[i].default_value;
|
|
|
|
|
|
|
|
|
|
snprintf (path, sizeof (path), "/sys/class/net/%s/bonding/%s", iface, option);
|
|
|
|
|
if (g_file_get_contents (path, ¤t, NULL, NULL)) {
|
|
|
|
|
g_strstrip (current);
|
|
|
|
|
space = strchr (current, ' ');
|
|
|
|
|
if (space)
|
|
|
|
|
*space = '\0';
|
|
|
|
|
if (strcmp (current, value) != 0) {
|
|
|
|
|
ret = nm_utils_do_sysctl (path, value);
|
|
|
|
|
if (!ret) {
|
|
|
|
|
nm_log_warn (LOGD_HW, "(%s): failed to set bonding attribute "
|
|
|
|
|
"'%s' to '%s'", iface, option, value);
|
|
|
|
|
}
|
|
|
|
|
}
|
2012-02-29 12:39:11 -06:00
|
|
|
}
|
2012-03-20 11:16:01 -04:00
|
|
|
}
|
2012-02-14 14:05:19 +01:00
|
|
|
|
2012-03-20 11:16:01 -04:00
|
|
|
/* Handle arp_ip_target */
|
|
|
|
|
value = nm_setting_bond_get_option_by_name (s_bond, "arp_ip_target");
|
|
|
|
|
if (value) {
|
|
|
|
|
char **addresses, cmd[20];
|
|
|
|
|
|
|
|
|
|
snprintf (path, sizeof (path), "/sys/class/net/%s/bonding/arp_ip_target", iface);
|
|
|
|
|
addresses = g_strsplit (value, ",", -1);
|
|
|
|
|
for (i = 0; addresses[i]; i++) {
|
|
|
|
|
snprintf (cmd, sizeof (cmd), "+%s", g_strstrip (addresses[i]));
|
|
|
|
|
ret = nm_utils_do_sysctl (path, cmd);
|
|
|
|
|
if (!ret) {
|
|
|
|
|
nm_log_warn (LOGD_HW, "(%s): failed to add arp_ip_target '%s'",
|
|
|
|
|
iface, addresses[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
g_strfreev (addresses);
|
2012-02-14 14:05:19 +01:00
|
|
|
}
|
2011-11-09 11:22:40 +01:00
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-18 13:48:44 +02:00
|
|
|
/**
|
|
|
|
|
* nm_system_add_bonding_master:
|
2012-02-10 13:25:39 -06:00
|
|
|
* @iface: the interface name for the new bond master
|
2011-10-18 13:48:44 +02:00
|
|
|
*
|
|
|
|
|
* Adds a virtual bonding device if it does not exist yet.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, %FALSE on failure
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2012-02-10 13:25:39 -06:00
|
|
|
nm_system_add_bonding_master (const char *iface)
|
2011-10-18 13:48:44 +02:00
|
|
|
{
|
|
|
|
|
struct nl_sock *sock;
|
|
|
|
|
int err;
|
|
|
|
|
|
2012-02-10 13:25:39 -06:00
|
|
|
g_return_val_if_fail (iface != NULL, FALSE);
|
|
|
|
|
|
2011-10-18 13:48:44 +02:00
|
|
|
sock = nm_netlink_get_default_handle ();
|
|
|
|
|
|
|
|
|
|
/* Existing bonding devices with matching name will be reused */
|
2012-02-10 13:25:39 -06:00
|
|
|
err = rtnl_link_bond_add (sock, iface, NULL);
|
2011-10-18 13:48:44 +02:00
|
|
|
if (err < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): error %d returned from "
|
|
|
|
|
"rtnl_link_bond_add(): %s",
|
2012-02-10 13:25:39 -06:00
|
|
|
iface, err, nl_geterror (err));
|
2011-10-18 13:48:44 +02:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2011-10-18 13:48:45 +02:00
|
|
|
|
2011-10-18 13:48:48 +02:00
|
|
|
static gboolean
|
2012-11-14 14:24:34 -06:00
|
|
|
nm_system_bond_compat_enslave (const char *master_iface, const char *slave_iface)
|
2011-10-18 13:48:48 +02:00
|
|
|
{
|
|
|
|
|
struct ifreq ifr;
|
|
|
|
|
int fd;
|
|
|
|
|
gboolean ret = FALSE;
|
|
|
|
|
|
|
|
|
|
memset (&ifr, 0, sizeof (ifr));
|
|
|
|
|
|
|
|
|
|
fd = socket (PF_INET, SOCK_DGRAM, 0);
|
|
|
|
|
if (fd < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2012-02-28 18:35:30 -06:00
|
|
|
strncpy (ifr.ifr_name, master_iface, IFNAMSIZ);
|
|
|
|
|
strncpy (ifr.ifr_slave, slave_iface, IFNAMSIZ);
|
2011-10-18 13:48:48 +02:00
|
|
|
|
|
|
|
|
if (ioctl (fd, SIOCBONDENSLAVE, &ifr) < 0 &&
|
|
|
|
|
ioctl (fd, BOND_ENSLAVE_OLD, &ifr) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): error enslaving %s: %d (%s)",
|
2012-02-28 18:35:30 -06:00
|
|
|
master_iface, slave_iface, errno, strerror (errno));
|
|
|
|
|
} else
|
|
|
|
|
ret = TRUE;
|
2011-10-18 13:48:48 +02:00
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2012-11-14 14:24:34 -06:00
|
|
|
* nm_system_bond_enslave:
|
2012-02-28 18:35:30 -06:00
|
|
|
* @master_ifindex: master device interface index
|
|
|
|
|
* @master_iface: master device interface name
|
|
|
|
|
* @slave_ifindex: slave device interface index
|
|
|
|
|
* @slave_iface: slave device interface name
|
2011-10-18 13:48:48 +02:00
|
|
|
*
|
|
|
|
|
* Enslaves the 'slave' to 'master. This function targets implementing a
|
|
|
|
|
* generic interface to attaching all kinds of slaves to masters. Currently
|
|
|
|
|
* only bonding is properly supported due to the backwards compatibility
|
|
|
|
|
* function being bonding specific.
|
|
|
|
|
*
|
2012-02-28 18:35:30 -06:00
|
|
|
* The slave device needs to be down as a prerequisite.
|
2011-10-18 13:48:48 +02:00
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, or %FALSE
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2012-11-14 14:24:34 -06:00
|
|
|
nm_system_bond_enslave (gint master_ifindex,
|
|
|
|
|
const char *master_iface,
|
|
|
|
|
gint slave_ifindex,
|
|
|
|
|
const char *slave_iface)
|
2011-10-18 13:48:48 +02:00
|
|
|
{
|
|
|
|
|
struct nl_sock *sock;
|
2012-02-28 18:35:30 -06:00
|
|
|
int err;
|
2011-10-18 13:48:48 +02:00
|
|
|
|
2012-05-15 09:44:49 -05:00
|
|
|
g_return_val_if_fail (master_ifindex > 0, FALSE);
|
2012-02-28 18:35:30 -06:00
|
|
|
g_return_val_if_fail (master_iface != NULL, FALSE);
|
2012-05-15 09:44:49 -05:00
|
|
|
g_return_val_if_fail (slave_ifindex > 0, FALSE);
|
2012-02-28 18:35:30 -06:00
|
|
|
g_return_val_if_fail (slave_iface != NULL, FALSE);
|
2011-10-18 13:48:48 +02:00
|
|
|
|
|
|
|
|
sock = nm_netlink_get_default_handle ();
|
|
|
|
|
|
|
|
|
|
if (!(nm_system_iface_get_flags (master_ifindex) & IFF_MASTER)) {
|
2012-02-28 18:35:30 -06:00
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): interface is not a master", master_iface);
|
2011-10-18 13:48:48 +02:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_assert (!nm_system_iface_is_up (slave_ifindex));
|
|
|
|
|
|
|
|
|
|
if (nm_system_iface_get_flags (slave_ifindex) & IFF_SLAVE) {
|
2013-01-21 11:32:40 -06:00
|
|
|
struct rtnl_link *link;
|
|
|
|
|
int existing_master = -1;
|
|
|
|
|
|
|
|
|
|
/* Get the ifindex of the existing master device */
|
|
|
|
|
link = nm_netlink_index_to_rtnl_link (slave_ifindex);
|
|
|
|
|
g_warn_if_fail (link != NULL);
|
|
|
|
|
if (link) {
|
|
|
|
|
existing_master = rtnl_link_get_master (link);
|
|
|
|
|
rtnl_link_put (link);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (existing_master > 0) {
|
|
|
|
|
/* Fail if the device is already a slave of a different master */
|
|
|
|
|
if (existing_master != master_ifindex) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): already a slave of a different master",
|
|
|
|
|
slave_iface);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nm_log_dbg (LOGD_DEVICE, "(%s): %s is already enslaved",
|
|
|
|
|
master_iface, slave_iface);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
2011-10-18 13:48:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = rtnl_link_bond_enslave_ifindex (sock, master_ifindex, slave_ifindex);
|
|
|
|
|
if (err == -NLE_OPNOTSUPP)
|
2012-11-14 14:24:34 -06:00
|
|
|
return nm_system_bond_compat_enslave (master_iface, slave_iface);
|
2011-10-18 13:48:48 +02:00
|
|
|
|
|
|
|
|
if (err < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): error enslaving %s: %d (%s)",
|
2012-02-28 18:35:30 -06:00
|
|
|
master_iface, slave_iface, err, nl_geterror (err));
|
2011-10-18 13:48:48 +02:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
2012-11-14 14:24:34 -06:00
|
|
|
nm_system_bond_compat_release (const char *master_iface, const char *slave_iface)
|
2011-10-18 13:48:48 +02:00
|
|
|
{
|
|
|
|
|
struct ifreq ifr;
|
|
|
|
|
int fd;
|
|
|
|
|
gboolean ret = FALSE;
|
|
|
|
|
|
|
|
|
|
memset (&ifr, 0, sizeof (ifr));
|
|
|
|
|
|
|
|
|
|
fd = socket (PF_INET, SOCK_DGRAM, 0);
|
|
|
|
|
if (fd < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2012-02-28 18:35:30 -06:00
|
|
|
strncpy (ifr.ifr_name, master_iface, IFNAMSIZ);
|
|
|
|
|
strncpy (ifr.ifr_slave, slave_iface, IFNAMSIZ);
|
2011-10-18 13:48:48 +02:00
|
|
|
|
|
|
|
|
if (ioctl (fd, SIOCBONDRELEASE, &ifr) < 0 &&
|
|
|
|
|
ioctl (fd, BOND_RELEASE_OLD, &ifr) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): error releasing slave %s: %d (%s)",
|
2012-02-28 18:35:30 -06:00
|
|
|
master_iface, slave_iface, errno, strerror (errno));
|
|
|
|
|
} else
|
|
|
|
|
ret = TRUE;
|
2011-10-18 13:48:48 +02:00
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2012-11-14 14:24:34 -06:00
|
|
|
* nm_system_bond_release:
|
2012-02-28 18:35:30 -06:00
|
|
|
* @master_ifindex: master device interface index
|
|
|
|
|
* @master_iface: master device interface name
|
|
|
|
|
* @slave_ifindex: slave device interface index
|
|
|
|
|
* @slave_iface: slave device interface name
|
2011-10-18 13:48:48 +02:00
|
|
|
*
|
|
|
|
|
* Releases the 'slave' which is attached to 'master. This function targets
|
|
|
|
|
* implementing a generic interface to releasing all kinds of slaves. Currently
|
|
|
|
|
* only bonding is properly supported due to the backwards compatibility
|
|
|
|
|
* function being bonding specific.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, or %FALSE
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2012-11-14 14:24:34 -06:00
|
|
|
nm_system_bond_release (gint master_ifindex,
|
|
|
|
|
const char *master_iface,
|
|
|
|
|
gint slave_ifindex,
|
|
|
|
|
const char *slave_iface)
|
2011-10-18 13:48:48 +02:00
|
|
|
{
|
|
|
|
|
struct nl_sock *sock;
|
2012-02-28 18:35:30 -06:00
|
|
|
int err;
|
2011-10-18 13:48:48 +02:00
|
|
|
|
2012-05-15 09:44:49 -05:00
|
|
|
g_return_val_if_fail (master_ifindex > 0, FALSE);
|
2012-02-28 18:35:30 -06:00
|
|
|
g_return_val_if_fail (master_iface != NULL, FALSE);
|
2012-05-15 09:44:49 -05:00
|
|
|
g_return_val_if_fail (slave_ifindex > 0, FALSE);
|
2012-02-28 18:35:30 -06:00
|
|
|
g_return_val_if_fail (slave_iface != NULL, FALSE);
|
2011-10-18 13:48:48 +02:00
|
|
|
|
|
|
|
|
sock = nm_netlink_get_default_handle ();
|
|
|
|
|
|
|
|
|
|
/* Only release if this is actually a slave */
|
|
|
|
|
if (!(nm_system_iface_get_flags (slave_ifindex) & IFF_SLAVE))
|
2012-02-28 18:35:30 -06:00
|
|
|
return TRUE;
|
2011-10-18 13:48:48 +02:00
|
|
|
|
|
|
|
|
err = rtnl_link_bond_release_ifindex (sock, slave_ifindex);
|
|
|
|
|
if (err == -NLE_OPNOTSUPP)
|
2012-11-14 14:24:34 -06:00
|
|
|
return nm_system_bond_compat_release (master_iface, slave_iface);
|
2012-02-28 18:35:30 -06:00
|
|
|
else if (err < 0) {
|
2011-10-18 13:48:48 +02:00
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): error releasing slave %s: %d (%s)",
|
2012-02-28 18:35:30 -06:00
|
|
|
master_iface, slave_iface, err, nl_geterror (err));
|
2011-10-18 13:48:48 +02:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2012-08-02 20:51:23 -05:00
|
|
|
/**
|
2013-01-17 14:44:01 -06:00
|
|
|
* nm_system_compat_get_iface_type:
|
2012-08-02 20:51:23 -05:00
|
|
|
* @ifindex: interface index
|
|
|
|
|
* @name: name of interface
|
|
|
|
|
*
|
|
|
|
|
* Lookup the type of an interface. At least one of @ifindex or @name must
|
|
|
|
|
* be provided.
|
|
|
|
|
*
|
|
|
|
|
* Returns: Interface type (NM_IFACE_TYPE_*) or NM_IFACE_TYPE_UNSPEC.
|
|
|
|
|
**/
|
|
|
|
|
static int
|
|
|
|
|
nm_system_compat_get_iface_type (int ifindex, const char *name)
|
|
|
|
|
{
|
|
|
|
|
int res = NM_IFACE_TYPE_UNSPEC;
|
2013-01-17 14:44:01 -06:00
|
|
|
char *ifname = NULL, *path = NULL;
|
2012-08-02 20:51:23 -05:00
|
|
|
struct vlan_ioctl_args ifv;
|
|
|
|
|
struct ifreq ifr;
|
|
|
|
|
struct ifbond ifb;
|
2013-01-17 14:44:01 -06:00
|
|
|
struct stat st;
|
2012-08-02 20:51:23 -05:00
|
|
|
int fd;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (ifindex > 0 || name, NM_IFACE_TYPE_UNSPEC);
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!name) {
|
|
|
|
|
g_assert (ifindex > 0);
|
|
|
|
|
ifname = nm_netlink_index_to_iface (ifindex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check VLAN */
|
|
|
|
|
memset (&ifv, 0, sizeof (ifv));
|
|
|
|
|
ifv.cmd = GET_VLAN_VID_CMD;
|
|
|
|
|
strncpy (ifv.device1, ifname ? ifname : name, sizeof (ifv.device1) - 1);
|
|
|
|
|
if (ioctl (fd, SIOCGIFVLAN, &ifv) == 0) {
|
|
|
|
|
res = NM_IFACE_TYPE_VLAN;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* and bond */
|
|
|
|
|
memset (&ifr, 0, sizeof (ifr));
|
|
|
|
|
strncpy (ifr.ifr_name, ifname ? ifname : name, sizeof (ifr.ifr_name) - 1);
|
|
|
|
|
memset (&ifb, 0, sizeof (ifb));
|
|
|
|
|
ifr.ifr_data = (caddr_t) &ifb;
|
|
|
|
|
if (ioctl (fd, SIOCBONDINFOQUERY, &ifr) == 0) {
|
|
|
|
|
res = NM_IFACE_TYPE_BOND;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-17 14:44:01 -06:00
|
|
|
/* and bridge */
|
|
|
|
|
path = g_strdup_printf ("/sys/class/net/%s/bridge", ifname ? ifname : name);
|
|
|
|
|
if ((stat (path, &st) == 0) && S_ISDIR (st.st_mode)) {
|
|
|
|
|
res = NM_IFACE_TYPE_BRIDGE;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2012-08-02 20:51:23 -05:00
|
|
|
out:
|
2013-01-17 14:44:01 -06:00
|
|
|
g_free (path);
|
2012-08-02 20:51:23 -05:00
|
|
|
close (fd);
|
|
|
|
|
g_free (ifname);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-18 13:48:45 +02:00
|
|
|
/**
|
2011-11-09 11:22:39 +01:00
|
|
|
* nm_system_get_iface_type:
|
2012-02-08 16:19:06 -06:00
|
|
|
* @ifindex: interface index
|
2011-11-09 11:22:39 +01:00
|
|
|
* @name: name of interface
|
2011-10-18 13:48:45 +02:00
|
|
|
*
|
2012-02-08 16:19:06 -06:00
|
|
|
* Lookup the type of an interface. At least one of @ifindex or @name must
|
|
|
|
|
* be provided.
|
2011-10-18 13:48:45 +02:00
|
|
|
*
|
2011-11-09 11:22:39 +01:00
|
|
|
* Returns: Interface type (NM_IFACE_TYPE_*) or NM_IFACE_TYPE_UNSPEC.
|
2011-10-18 13:48:45 +02:00
|
|
|
**/
|
2011-11-09 11:22:39 +01:00
|
|
|
int
|
2012-02-08 16:19:06 -06:00
|
|
|
nm_system_get_iface_type (int ifindex, const char *name)
|
2011-10-18 13:48:45 +02:00
|
|
|
{
|
|
|
|
|
struct rtnl_link *result;
|
|
|
|
|
struct nl_sock *nlh;
|
|
|
|
|
char *type;
|
2011-11-09 11:22:39 +01:00
|
|
|
int res = NM_IFACE_TYPE_UNSPEC;
|
2012-08-02 20:51:23 -05:00
|
|
|
int err;
|
2011-10-18 13:48:45 +02:00
|
|
|
|
2012-05-15 09:44:49 -05:00
|
|
|
g_return_val_if_fail (ifindex > 0 || name, NM_IFACE_TYPE_UNSPEC);
|
2012-02-08 16:19:06 -06:00
|
|
|
|
2011-10-18 13:48:45 +02:00
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
if (!nlh)
|
2011-11-09 11:22:39 +01:00
|
|
|
goto out;
|
2011-10-18 13:48:45 +02:00
|
|
|
|
2012-02-08 16:19:06 -06:00
|
|
|
/* Prefer interface indexes to names */
|
2013-01-14 10:12:33 +01:00
|
|
|
err = rtnl_link_get_kernel (nlh, ifindex, ifindex <= 0 ? name : NULL, &result);
|
2012-08-02 20:51:23 -05:00
|
|
|
if (err < 0) {
|
|
|
|
|
if (err == -NLE_OPNOTSUPP)
|
|
|
|
|
res = nm_system_compat_get_iface_type (ifindex, name);
|
2011-11-09 11:22:39 +01:00
|
|
|
goto out;
|
2012-08-02 20:51:23 -05:00
|
|
|
}
|
2011-10-18 13:48:45 +02:00
|
|
|
|
2011-11-09 11:22:39 +01:00
|
|
|
type = rtnl_link_get_type (result);
|
2011-10-18 13:48:45 +02:00
|
|
|
|
2011-11-09 11:22:39 +01:00
|
|
|
if (!g_strcmp0 (type, "bond"))
|
|
|
|
|
res = NM_IFACE_TYPE_BOND;
|
|
|
|
|
else if (!g_strcmp0 (type, "vlan"))
|
|
|
|
|
res = NM_IFACE_TYPE_VLAN;
|
2012-05-23 16:19:26 +02:00
|
|
|
else if (!g_strcmp0 (type, "bridge"))
|
|
|
|
|
res = NM_IFACE_TYPE_BRIDGE;
|
2011-11-09 11:22:39 +01:00
|
|
|
else if (!g_strcmp0 (type, "dummy"))
|
|
|
|
|
res = NM_IFACE_TYPE_DUMMY;
|
2011-10-18 13:48:45 +02:00
|
|
|
|
2011-11-09 11:22:39 +01:00
|
|
|
rtnl_link_put (result);
|
|
|
|
|
out:
|
|
|
|
|
return res;
|
2011-10-18 13:48:45 +02:00
|
|
|
}
|
|
|
|
|
|
2012-02-05 23:56:15 -06:00
|
|
|
/**
|
|
|
|
|
* nm_system_get_iface_vlan_info:
|
|
|
|
|
* @ifindex: the VLAN interface index
|
2012-03-06 11:02:55 -06:00
|
|
|
* @out_parent_ifindex: on success, the interface index of the parent interface of
|
2012-02-05 23:56:15 -06:00
|
|
|
* @iface
|
|
|
|
|
* @out_vlan_id: on success, the VLAN ID of @iface
|
|
|
|
|
*
|
2012-03-06 11:02:55 -06:00
|
|
|
* Gets the VLAN parent interface name and VLAN ID.
|
2012-02-05 23:56:15 -06:00
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if the interface is a VLAN device and no error occurred;
|
|
|
|
|
* %FALSE if the interface was not a VLAN interface or an error occurred
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_system_get_iface_vlan_info (int ifindex,
|
2012-03-06 11:02:55 -06:00
|
|
|
int *out_parent_ifindex,
|
2012-02-05 23:56:15 -06:00
|
|
|
int *out_vlan_id)
|
|
|
|
|
{
|
|
|
|
|
struct nl_sock *nlh;
|
|
|
|
|
struct rtnl_link *lk;
|
|
|
|
|
struct nl_cache *cache = NULL;
|
|
|
|
|
gboolean success = FALSE;
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
if (nm_system_get_iface_type (ifindex, NULL) != NM_IFACE_TYPE_VLAN)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
if (!nlh)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
2013-01-23 10:18:59 +01:00
|
|
|
ret = rtnl_link_alloc_cache (nlh, AF_UNSPEC, &cache);
|
2012-02-05 23:56:15 -06:00
|
|
|
g_return_val_if_fail (ret == 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (cache != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
lk = rtnl_link_get (cache, ifindex);
|
|
|
|
|
if (lk) {
|
2012-03-06 11:02:55 -06:00
|
|
|
if (out_parent_ifindex)
|
|
|
|
|
*out_parent_ifindex = rtnl_link_get_link (lk);
|
2012-02-05 23:56:15 -06:00
|
|
|
if (out_vlan_id)
|
|
|
|
|
*out_vlan_id = rtnl_link_vlan_get_id (lk);
|
|
|
|
|
|
|
|
|
|
rtnl_link_put (lk);
|
|
|
|
|
success = TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nl_cache_free (cache);
|
|
|
|
|
return success;
|
|
|
|
|
}
|
|
|
|
|
|
2012-02-23 11:11:42 +08:00
|
|
|
static gboolean
|
|
|
|
|
nm_system_iface_compat_set_name (const char *old_name, const char *new_name)
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
struct ifreq ifr;
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset (&ifr, 0, sizeof (struct ifreq));
|
|
|
|
|
strncpy (ifr.ifr_name, old_name, sizeof (ifr.ifr_name));
|
|
|
|
|
strncpy (ifr.ifr_newname, new_name, sizeof (ifr.ifr_newname));
|
|
|
|
|
|
|
|
|
|
if (ioctl (fd, SIOCSIFNAME, &ifr) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "cann't change %s with %s.", old_name, new_name);
|
|
|
|
|
close (fd);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
nm_system_iface_compat_set_vlan_name_type (int name_type)
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
struct vlan_ioctl_args if_request;
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset (&if_request, 0, sizeof (struct vlan_ioctl_args));
|
|
|
|
|
if_request.cmd = SET_VLAN_NAME_TYPE_CMD;
|
|
|
|
|
if_request.u.name_type = name_type;
|
|
|
|
|
|
|
|
|
|
if (ioctl (fd, SIOCSIFVLAN, &if_request) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't set name type.");
|
|
|
|
|
close (fd);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
nm_system_iface_compat_add_vlan_device (const char *master, int vid)
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
struct vlan_ioctl_args if_request;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (master, FALSE);
|
|
|
|
|
g_return_val_if_fail (vid < 4096, FALSE);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* use VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD as default,
|
|
|
|
|
* we will overwrite it with rtnl_link_set_name() later.
|
|
|
|
|
*/
|
|
|
|
|
if (!nm_system_iface_compat_set_vlan_name_type (VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset (&if_request, 0, sizeof (struct vlan_ioctl_args));
|
2012-04-26 09:25:58 -04:00
|
|
|
g_strlcpy (if_request.device1, master, sizeof (if_request.device1));
|
2012-02-23 11:11:42 +08:00
|
|
|
if_request.cmd = ADD_VLAN_CMD;
|
|
|
|
|
if_request.u.VID = vid;
|
|
|
|
|
|
|
|
|
|
if (ioctl (fd, SIOCSIFVLAN, &if_request) < 0) {
|
2012-08-06 13:05:05 -05:00
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't add vlan device %s vid %d: %d.", master, vid, errno);
|
2012-02-23 11:11:42 +08:00
|
|
|
close (fd);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
nm_system_iface_compat_rem_vlan_device (const char *iface)
|
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
struct vlan_ioctl_args if_request;
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset (&if_request, 0, sizeof (struct vlan_ioctl_args));
|
2012-04-26 09:25:58 -04:00
|
|
|
g_strlcpy (if_request.device1, iface, sizeof (if_request.device1));
|
2012-02-23 11:11:42 +08:00
|
|
|
if_request.cmd = DEL_VLAN_CMD;
|
|
|
|
|
|
|
|
|
|
if (ioctl (fd, SIOCSIFVLAN, &if_request) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't rem vlan device %s.", iface);
|
|
|
|
|
close (fd);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
nm_system_iface_compat_add_vlan (NMConnection *connection,
|
2012-08-06 13:05:05 -05:00
|
|
|
const char *iface,
|
|
|
|
|
int master_ifindex)
|
2012-02-23 11:11:42 +08:00
|
|
|
{
|
|
|
|
|
NMSettingVlan *s_vlan;
|
|
|
|
|
int vlan_id;
|
|
|
|
|
guint32 vlan_flags = 0;
|
|
|
|
|
guint32 num, i, from, to;
|
|
|
|
|
int ifindex;
|
|
|
|
|
struct rtnl_link *new_link = NULL;
|
|
|
|
|
char *master = nm_netlink_index_to_iface (master_ifindex);
|
2012-08-06 13:05:05 -05:00
|
|
|
int itype;
|
|
|
|
|
gboolean created = FALSE;
|
2012-02-23 11:11:42 +08:00
|
|
|
|
|
|
|
|
s_vlan = nm_connection_get_setting_vlan (connection);
|
|
|
|
|
g_return_val_if_fail (s_vlan, FALSE);
|
|
|
|
|
|
|
|
|
|
vlan_id = nm_setting_vlan_get_id (s_vlan);
|
|
|
|
|
|
|
|
|
|
if (!iface) {
|
|
|
|
|
iface = nm_connection_get_virtual_iface_name (connection);
|
|
|
|
|
g_return_val_if_fail (iface != NULL, FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
itype = nm_system_get_iface_type (-1, iface);
|
|
|
|
|
if (itype == NM_IFACE_TYPE_UNSPEC) {
|
|
|
|
|
char *name;
|
|
|
|
|
|
|
|
|
|
/* Create the VLAN interface. Use VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD as
|
|
|
|
|
* default and change the name later via nm_system_iface_compat_set_name().
|
|
|
|
|
* The old ioctl-based VLAN kernel API has no ability to directly return
|
|
|
|
|
* the new interface's name or index, so we have to create it with a
|
|
|
|
|
* known name and do the rename dance instead.
|
|
|
|
|
*/
|
|
|
|
|
if (!nm_system_iface_compat_add_vlan_device (master, vlan_id))
|
|
|
|
|
return FALSE;
|
2012-02-23 11:11:42 +08:00
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
/* And rename it to what the connection wants */
|
|
|
|
|
name = nm_utils_new_vlan_name (master, vlan_id);
|
|
|
|
|
if (strcmp (name, iface) != 0) {
|
|
|
|
|
if (!nm_system_iface_compat_set_name (name, iface)) {
|
|
|
|
|
nm_system_iface_compat_rem_vlan_device (name);
|
|
|
|
|
g_free (name);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
g_free (name);
|
|
|
|
|
created = TRUE;
|
|
|
|
|
} else if (itype != NM_IFACE_TYPE_VLAN) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): already exists but is not a VLAN interface.", iface);
|
|
|
|
|
return FALSE;
|
|
|
|
|
} else {
|
|
|
|
|
int tmp_vlan_id = -1, tmp_master_ifindex = -1;
|
2012-02-23 11:11:42 +08:00
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
/* VLAN interface with this name already exists. Be a bit paranoid and
|
|
|
|
|
* double-check the VLAN ID and parent ifindex.
|
|
|
|
|
*/
|
|
|
|
|
ifindex = nm_netlink_iface_to_index (iface);
|
|
|
|
|
if (ifindex <= 0)
|
|
|
|
|
return FALSE;
|
2012-02-23 11:11:42 +08:00
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
if (!nm_system_get_iface_vlan_info (ifindex, &tmp_master_ifindex, &tmp_vlan_id)) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): failed to get VLAN interface info.", iface);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
2012-02-23 11:11:42 +08:00
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
if (tmp_master_ifindex != master_ifindex) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): master ifindex (%d) does match expected (%d).",
|
|
|
|
|
iface, tmp_master_ifindex, master_ifindex);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (tmp_vlan_id != vlan_id) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): VLAN ID %d does match expected ID %d.",
|
|
|
|
|
iface, tmp_vlan_id, vlan_id);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nm_log_dbg (LOGD_DEVICE, "(%s): found existing VLAN interface.", iface);
|
|
|
|
|
}
|
2012-02-23 11:11:42 +08:00
|
|
|
|
|
|
|
|
ifindex = nm_netlink_iface_to_index (iface);
|
|
|
|
|
if (ifindex <= 0)
|
2012-08-06 13:05:05 -05:00
|
|
|
goto error;
|
2012-02-23 11:11:42 +08:00
|
|
|
|
|
|
|
|
new_link = nm_netlink_index_to_rtnl_link (ifindex);
|
|
|
|
|
if (!new_link)
|
2012-08-06 13:05:05 -05:00
|
|
|
goto error;
|
2012-02-23 11:11:42 +08:00
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
/* vconfig set_flag */
|
2012-02-23 11:11:42 +08:00
|
|
|
vlan_flags = nm_setting_vlan_get_flags (s_vlan);
|
2012-08-06 13:05:05 -05:00
|
|
|
if (vlan_flags) {
|
2012-02-23 11:11:42 +08:00
|
|
|
if (rtnl_link_vlan_set_flags (new_link, vlan_flags))
|
2012-08-06 13:05:05 -05:00
|
|
|
goto error_new_link;
|
|
|
|
|
}
|
2012-02-23 11:11:42 +08:00
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
/* vconfig set_ingress_map */
|
2012-02-23 11:11:42 +08:00
|
|
|
num = nm_setting_vlan_get_num_priorities (s_vlan, NM_VLAN_INGRESS_MAP);
|
|
|
|
|
for (i = 0; i < num; i++) {
|
2012-08-06 13:05:05 -05:00
|
|
|
if (nm_setting_vlan_get_priority (s_vlan, NM_VLAN_INGRESS_MAP, i, &from, &to)) {
|
2012-02-23 11:11:42 +08:00
|
|
|
if (rtnl_link_vlan_set_ingress_map (new_link, from, to))
|
2012-08-06 13:05:05 -05:00
|
|
|
goto error_new_link;
|
|
|
|
|
}
|
2012-02-23 11:11:42 +08:00
|
|
|
}
|
|
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
/* vconfig set_egress_map */
|
2012-02-23 11:11:42 +08:00
|
|
|
num = nm_setting_vlan_get_num_priorities (s_vlan, NM_VLAN_EGRESS_MAP);
|
|
|
|
|
for (i = 0; i < num; i++) {
|
2012-08-06 13:05:05 -05:00
|
|
|
if (nm_setting_vlan_get_priority (s_vlan, NM_VLAN_EGRESS_MAP, i, &from, &to)) {
|
2012-02-23 11:11:42 +08:00
|
|
|
if (rtnl_link_vlan_set_egress_map (new_link, from, to))
|
2012-08-06 13:05:05 -05:00
|
|
|
goto error_new_link;
|
|
|
|
|
}
|
2012-02-23 11:11:42 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtnl_link_put (new_link);
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
2012-08-06 13:05:05 -05:00
|
|
|
error_new_link:
|
2012-02-23 11:11:42 +08:00
|
|
|
rtnl_link_put (new_link);
|
2012-08-06 13:05:05 -05:00
|
|
|
/* fall through */
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
if (created)
|
|
|
|
|
nm_system_iface_compat_rem_vlan_device (iface);
|
2012-02-23 11:11:42 +08:00
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2011-12-12 22:20:57 -05:00
|
|
|
/**
|
2011-12-21 19:09:22 -06:00
|
|
|
* nm_system_add_vlan_iface:
|
|
|
|
|
* @connection: the #NMConnection that describes the VLAN interface
|
|
|
|
|
* @iface: the interface name of the new VLAN interface
|
2012-02-22 23:40:18 -06:00
|
|
|
* @parent_ifindex: the interface index of the new VLAN interface's master
|
2011-12-21 19:09:22 -06:00
|
|
|
* interface
|
2011-12-12 22:20:57 -05:00
|
|
|
*
|
2011-12-21 19:09:22 -06:00
|
|
|
* Add a VLAN device named @iface and specified in @connection.
|
2011-12-12 22:20:57 -05:00
|
|
|
*
|
2011-12-21 19:09:22 -06:00
|
|
|
* Returns: %TRUE on success, %FALSE on failure
|
2011-12-12 22:20:57 -05:00
|
|
|
*/
|
|
|
|
|
gboolean
|
2011-12-21 19:09:22 -06:00
|
|
|
nm_system_add_vlan_iface (NMConnection *connection,
|
|
|
|
|
const char *iface,
|
2012-02-22 23:40:18 -06:00
|
|
|
int parent_ifindex)
|
2011-12-12 22:20:57 -05:00
|
|
|
{
|
2011-12-21 19:09:22 -06:00
|
|
|
NMSettingVlan *s_vlan;
|
|
|
|
|
int ret = -1;
|
2011-12-12 22:20:57 -05:00
|
|
|
struct rtnl_link *new_link = NULL;
|
|
|
|
|
struct nl_sock *nlh = NULL;
|
|
|
|
|
guint32 vlan_id = 0;
|
|
|
|
|
guint32 vlan_flags = 0;
|
2011-12-21 19:09:22 -06:00
|
|
|
guint32 num, i, from, to;
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2012-05-15 09:44:49 -05:00
|
|
|
g_return_val_if_fail (parent_ifindex > 0, FALSE);
|
2011-12-12 22:20:57 -05:00
|
|
|
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
g_return_val_if_fail (nlh != NULL, FALSE);
|
|
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
s_vlan = nm_connection_get_setting_vlan (connection);
|
|
|
|
|
g_return_val_if_fail (s_vlan, FALSE);
|
|
|
|
|
|
|
|
|
|
vlan_id = nm_setting_vlan_get_id (s_vlan);
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
if (!iface) {
|
|
|
|
|
iface = nm_connection_get_virtual_iface_name (connection);
|
|
|
|
|
g_return_val_if_fail (iface != NULL, FALSE);
|
|
|
|
|
}
|
2011-12-12 22:20:57 -05:00
|
|
|
|
|
|
|
|
new_link = rtnl_link_alloc ();
|
2011-12-21 19:09:22 -06:00
|
|
|
if (!new_link) {
|
|
|
|
|
g_warn_if_fail (new_link != NULL);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
2011-12-12 22:20:57 -05:00
|
|
|
|
|
|
|
|
ret = rtnl_link_set_type (new_link, "vlan");
|
2012-02-23 11:11:42 +08:00
|
|
|
if (ret == -NLE_OPNOTSUPP) {
|
|
|
|
|
/*
|
|
|
|
|
* There is no linbl3, try ioctl.
|
|
|
|
|
*/
|
|
|
|
|
ret = -1;
|
2012-02-22 23:40:18 -06:00
|
|
|
if (nm_system_iface_compat_add_vlan (connection, iface, parent_ifindex))
|
2012-02-23 11:11:42 +08:00
|
|
|
ret = 0;
|
2011-12-21 19:09:22 -06:00
|
|
|
goto out;
|
2012-02-23 11:11:42 +08:00
|
|
|
}
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2012-02-22 23:40:18 -06:00
|
|
|
rtnl_link_set_link (new_link, parent_ifindex);
|
2011-12-21 19:09:22 -06:00
|
|
|
rtnl_link_set_name (new_link, iface);
|
2011-12-12 22:20:57 -05:00
|
|
|
rtnl_link_vlan_set_id (new_link, vlan_id);
|
|
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
vlan_flags = nm_setting_vlan_get_flags (s_vlan);
|
|
|
|
|
if (vlan_flags) {
|
|
|
|
|
guint kernel_flags = 0;
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
if (vlan_flags & NM_VLAN_FLAG_REORDER_HEADERS)
|
|
|
|
|
kernel_flags |= VLAN_FLAG_REORDER_HDR;
|
|
|
|
|
if (vlan_flags & NM_VLAN_FLAG_GVRP)
|
|
|
|
|
kernel_flags |= VLAN_FLAG_GVRP;
|
|
|
|
|
if (vlan_flags & NM_VLAN_FLAG_LOOSE_BINDING)
|
|
|
|
|
kernel_flags |= VLAN_FLAG_LOOSE_BINDING;
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
rtnl_link_vlan_set_flags (new_link, kernel_flags);
|
|
|
|
|
}
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
num = nm_setting_vlan_get_num_priorities (s_vlan, NM_VLAN_INGRESS_MAP);
|
|
|
|
|
for (i = 0; i < num; i++) {
|
|
|
|
|
if (nm_setting_vlan_get_priority (s_vlan, NM_VLAN_INGRESS_MAP, i, &from, &to))
|
|
|
|
|
rtnl_link_vlan_set_ingress_map (new_link, (int) from, (int) to);
|
|
|
|
|
}
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
num = nm_setting_vlan_get_num_priorities (s_vlan, NM_VLAN_EGRESS_MAP);
|
|
|
|
|
for (i = 0; i < num; i++) {
|
|
|
|
|
if (nm_setting_vlan_get_priority (s_vlan, NM_VLAN_EGRESS_MAP, i, &from, &to))
|
|
|
|
|
rtnl_link_vlan_set_egress_map (new_link, (int) from, (int) to);
|
|
|
|
|
}
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
ret = rtnl_link_add (nlh, new_link, NLM_F_CREATE);
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
out:
|
|
|
|
|
if (new_link)
|
|
|
|
|
rtnl_link_put (new_link);
|
|
|
|
|
return (ret == 0);
|
2011-12-12 22:20:57 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2011-12-21 19:09:22 -06:00
|
|
|
* nm_system_del_vlan_iface:
|
|
|
|
|
* @iface: the interface name
|
2011-12-12 22:20:57 -05:00
|
|
|
*
|
2011-12-21 19:09:22 -06:00
|
|
|
* Delete a VLAN interface specified by @iface.
|
2011-12-12 22:20:57 -05:00
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, or %FALSE
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
2011-12-21 19:09:22 -06:00
|
|
|
nm_system_del_vlan_iface (const char *iface)
|
2011-12-12 22:20:57 -05:00
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
struct nl_sock *nlh = NULL;
|
|
|
|
|
struct nl_cache *cache = NULL;
|
|
|
|
|
struct rtnl_link *new_link = NULL;
|
2011-12-21 19:09:22 -06:00
|
|
|
int itype;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (iface != NULL, FALSE);
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
itype = nm_system_get_iface_type (-1, iface);
|
|
|
|
|
g_return_val_if_fail (itype == NM_IFACE_TYPE_VLAN, FALSE);
|
2011-12-12 22:20:57 -05:00
|
|
|
|
|
|
|
|
nlh = nm_netlink_get_default_handle ();
|
|
|
|
|
g_return_val_if_fail (nlh != NULL, FALSE);
|
|
|
|
|
|
2013-01-23 10:18:59 +01:00
|
|
|
ret = rtnl_link_alloc_cache (nlh, AF_UNSPEC, &cache);
|
2011-12-12 22:20:57 -05:00
|
|
|
g_return_val_if_fail (ret == 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (cache != NULL, FALSE);
|
|
|
|
|
|
2011-12-21 19:09:22 -06:00
|
|
|
new_link = rtnl_link_get_by_name (cache, iface);
|
|
|
|
|
if (new_link) {
|
|
|
|
|
ret = rtnl_link_delete (nlh, new_link);
|
2012-02-23 11:11:42 +08:00
|
|
|
if (ret == -NLE_OPNOTSUPP) {
|
|
|
|
|
/*
|
|
|
|
|
* There is no linbl3, try ioctl.
|
|
|
|
|
*/
|
|
|
|
|
ret = -1;
|
|
|
|
|
if (nm_system_iface_compat_rem_vlan_device (iface))
|
|
|
|
|
ret = 0;
|
|
|
|
|
}
|
2011-12-21 19:09:22 -06:00
|
|
|
}
|
2011-12-12 22:20:57 -05:00
|
|
|
|
2012-02-23 11:11:42 +08:00
|
|
|
rtnl_link_put (new_link);
|
2011-12-12 22:20:57 -05:00
|
|
|
nl_cache_free (cache);
|
2011-12-21 19:09:22 -06:00
|
|
|
return (ret == 0) ? TRUE : FALSE;
|
2011-12-12 22:20:57 -05:00
|
|
|
}
|
2012-05-23 16:19:26 +02:00
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
_bridge_create_compat (const char *iface)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0, fd;
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_LOCAL, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return -EBADF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ioctl (fd, SIOCBRADDBR, iface) < 0)
|
|
|
|
|
ret = -errno;
|
|
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_system_create_bridge:
|
|
|
|
|
* @iface: Name bridging device to create
|
core: only manage those bridges created by NetworkManager (rh #905035)
Until we handle bridges non-destructively, only manage bridges
created by NM. When quitting write out a file listing all
bridges created by NM and a timestamp, and when starting read
that file and if the timestamp is within 30 minutes, manage
any bridge that was listed in that file. This scheme, while
not foolproof (eg, if NM crashes), should ensure that NM can
recognize bridges it created if it's restarted. The file
is stored in /run or /var/run, which is cleaned each restart,
ensuring that the state does not persist across reboots.
If an automatic or user-initiated activation request for
a bridge NM does not manage is received, that request is
denied. Only if the bridge interface does not yet exist, or
was present in the managed bridges file, will an
NMDeviceBridge be created and activation be possible.
2013-02-01 18:03:11 -06:00
|
|
|
* @out_exists: on return, %TRUE if the bridge already exists
|
2012-05-23 16:19:26 +02:00
|
|
|
*
|
|
|
|
|
* Creates a new bridging device in the kernel. If a bridging device with
|
core: only manage those bridges created by NetworkManager (rh #905035)
Until we handle bridges non-destructively, only manage bridges
created by NM. When quitting write out a file listing all
bridges created by NM and a timestamp, and when starting read
that file and if the timestamp is within 30 minutes, manage
any bridge that was listed in that file. This scheme, while
not foolproof (eg, if NM crashes), should ensure that NM can
recognize bridges it created if it's restarted. The file
is stored in /run or /var/run, which is cleaned each restart,
ensuring that the state does not persist across reboots.
If an automatic or user-initiated activation request for
a bridge NM does not manage is received, that request is
denied. Only if the bridge interface does not yet exist, or
was present in the managed bridges file, will an
NMDeviceBridge be created and activation be possible.
2013-02-01 18:03:11 -06:00
|
|
|
* the specified name already exists, it is reused and no error is returned,
|
|
|
|
|
* but @out_exists is set to %TRUE.
|
2012-05-23 16:19:26 +02:00
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, %FALSE on error.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
core: only manage those bridges created by NetworkManager (rh #905035)
Until we handle bridges non-destructively, only manage bridges
created by NM. When quitting write out a file listing all
bridges created by NM and a timestamp, and when starting read
that file and if the timestamp is within 30 minutes, manage
any bridge that was listed in that file. This scheme, while
not foolproof (eg, if NM crashes), should ensure that NM can
recognize bridges it created if it's restarted. The file
is stored in /run or /var/run, which is cleaned each restart,
ensuring that the state does not persist across reboots.
If an automatic or user-initiated activation request for
a bridge NM does not manage is received, that request is
denied. Only if the bridge interface does not yet exist, or
was present in the managed bridges file, will an
NMDeviceBridge be created and activation be possible.
2013-02-01 18:03:11 -06:00
|
|
|
nm_system_create_bridge (const char *iface, gboolean *out_exists)
|
2012-05-23 16:19:26 +02:00
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
/* FIXME: use netlink */
|
|
|
|
|
err = _bridge_create_compat (iface);
|
|
|
|
|
if (err < 0 && err != -EEXIST) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): error while adding bridge: %s",
|
|
|
|
|
iface, strerror (-err));
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
core: only manage those bridges created by NetworkManager (rh #905035)
Until we handle bridges non-destructively, only manage bridges
created by NM. When quitting write out a file listing all
bridges created by NM and a timestamp, and when starting read
that file and if the timestamp is within 30 minutes, manage
any bridge that was listed in that file. This scheme, while
not foolproof (eg, if NM crashes), should ensure that NM can
recognize bridges it created if it's restarted. The file
is stored in /run or /var/run, which is cleaned each restart,
ensuring that the state does not persist across reboots.
If an automatic or user-initiated activation request for
a bridge NM does not manage is received, that request is
denied. Only if the bridge interface does not yet exist, or
was present in the managed bridges file, will an
NMDeviceBridge be created and activation be possible.
2013-02-01 18:03:11 -06:00
|
|
|
if (out_exists && err == -EEXIST)
|
|
|
|
|
*out_exists = TRUE;
|
2012-05-23 16:19:26 +02:00
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
_bridge_del_compat (const char *iface)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0, fd;
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_LOCAL, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return -EBADF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ioctl (fd, SIOCBRDELBR, iface) < 0)
|
|
|
|
|
ret = -errno;
|
|
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_system_del_bridge:
|
|
|
|
|
* @iface: Name of bridging device to delete
|
|
|
|
|
*
|
|
|
|
|
* Deletes the specified bridging device in the kernel.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, %FALSE on error.
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_system_del_bridge (const char *iface)
|
|
|
|
|
{
|
|
|
|
|
int err;
|
|
|
|
|
|
|
|
|
|
/* FIXME: use netlink */
|
|
|
|
|
err = _bridge_del_compat (iface);
|
|
|
|
|
if (err < 0 && err != -ENXIO) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): error while deleting bridge: %s ",
|
|
|
|
|
iface, strerror (-err));
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
_bridge_attach_compat (int master_ifindex,
|
|
|
|
|
const char *master_iface,
|
|
|
|
|
int slave_ifindex,
|
|
|
|
|
const char *slave_iface)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0, fd;
|
|
|
|
|
struct ifreq ifr;
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_LOCAL, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return -EBADF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset (&ifr, 0, sizeof (ifr));
|
|
|
|
|
strncpy (ifr.ifr_name, master_iface, IFNAMSIZ);
|
|
|
|
|
ifr.ifr_ifindex = slave_ifindex;
|
|
|
|
|
if (ioctl (fd, SIOCBRADDIF, &ifr) < 0)
|
|
|
|
|
ret = -errno;
|
|
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
_bridge_detach_compat (int master_ifindex,
|
|
|
|
|
const char *master_iface,
|
|
|
|
|
int slave_ifindex,
|
|
|
|
|
const char *slave_iface)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0, fd;
|
|
|
|
|
struct ifreq ifr;
|
|
|
|
|
|
|
|
|
|
if ((fd = socket (AF_LOCAL, SOCK_STREAM, 0)) < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "couldn't open control socket.");
|
|
|
|
|
return -EBADF;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset (&ifr, 0, sizeof(ifr));
|
|
|
|
|
strncpy (ifr.ifr_name, master_iface, IFNAMSIZ);
|
|
|
|
|
ifr.ifr_ifindex = slave_ifindex;
|
|
|
|
|
if (ioctl (fd, SIOCBRDELIF, &ifr) < 0)
|
|
|
|
|
ret = -errno;
|
|
|
|
|
|
|
|
|
|
close (fd);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_system_bridge_attach:
|
|
|
|
|
* @master_ifindex: master device interface index
|
|
|
|
|
* @master_iface: master device interface name
|
|
|
|
|
* @slave_ifindex: slave device interface index
|
|
|
|
|
* @slave_iface: slave device interface name
|
|
|
|
|
*
|
|
|
|
|
* Attaches interface 'slave' to bridge 'master'
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, or %FALSE
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_system_bridge_attach (int master_ifindex,
|
|
|
|
|
const char *master_iface,
|
|
|
|
|
int slave_ifindex,
|
|
|
|
|
const char *slave_iface)
|
|
|
|
|
{
|
|
|
|
|
char *mif = NULL, *sif = NULL;
|
|
|
|
|
int err = -1;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (master_ifindex >= 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (slave_ifindex >= 0, FALSE);
|
|
|
|
|
|
|
|
|
|
if (!master_iface) {
|
|
|
|
|
mif = nm_netlink_index_to_iface (master_ifindex);
|
|
|
|
|
if (mif == NULL) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "interface name lookup failed for index %d", master_ifindex);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!slave_ifindex) {
|
|
|
|
|
sif = nm_netlink_index_to_iface (slave_ifindex);
|
|
|
|
|
if (sif == NULL) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "interface name lookup failed for index %d", slave_ifindex);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* FIXME: long term plan is to use netlink for this */
|
|
|
|
|
err = _bridge_attach_compat (master_ifindex,
|
|
|
|
|
mif ? mif : master_iface,
|
|
|
|
|
slave_ifindex,
|
|
|
|
|
sif ? sif : slave_iface);
|
2013-01-28 10:53:16 -06:00
|
|
|
if (err < 0) {
|
|
|
|
|
if (err == -EBUSY) {
|
|
|
|
|
/* Interface already attached to the given bridge */
|
|
|
|
|
err = 0;
|
|
|
|
|
} else {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): failed to attach slave %s: %s",
|
|
|
|
|
master_iface, slave_iface, strerror (-err));
|
|
|
|
|
}
|
2012-05-23 16:19:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
g_free (sif);
|
|
|
|
|
g_free (mif);
|
|
|
|
|
return err == 0 ? TRUE : FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* nm_system_bridge_detach:
|
|
|
|
|
* @master_ifindex: master device interface index
|
|
|
|
|
* @master_iface: master device interface name
|
|
|
|
|
* @slave_ifindex: slave device interface index
|
|
|
|
|
* @slave_iface: slave device interface name
|
|
|
|
|
*
|
|
|
|
|
* Detaches the interface 'slave' from the bridge 'master'.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE on success, or %FALSE
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
nm_system_bridge_detach (int master_ifindex,
|
|
|
|
|
const char *master_iface,
|
|
|
|
|
int slave_ifindex,
|
|
|
|
|
const char *slave_iface)
|
|
|
|
|
{
|
|
|
|
|
char *mif = NULL, *sif = NULL;
|
|
|
|
|
int err = -1;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (master_ifindex >= 0, FALSE);
|
|
|
|
|
g_return_val_if_fail (slave_ifindex >= 0, FALSE);
|
|
|
|
|
|
|
|
|
|
if (!master_iface) {
|
|
|
|
|
mif = nm_netlink_index_to_iface (master_ifindex);
|
|
|
|
|
if (mif == NULL) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "interface name lookup failed for index %d", master_ifindex);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!slave_ifindex) {
|
|
|
|
|
sif = nm_netlink_index_to_iface (slave_ifindex);
|
|
|
|
|
if (sif == NULL) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "interface name lookup failed for index %d", slave_ifindex);
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* FIXME: long term plan is to use netlink for this */
|
|
|
|
|
err = _bridge_detach_compat (master_ifindex,
|
|
|
|
|
mif ? mif : master_iface,
|
|
|
|
|
slave_ifindex,
|
|
|
|
|
sif ? sif : slave_iface);
|
|
|
|
|
/* Kernel doesn't return an error detaching an already-detached interface */
|
|
|
|
|
if (err < 0) {
|
|
|
|
|
nm_log_err (LOGD_DEVICE, "(%s): failed to detach slave %s: %s",
|
|
|
|
|
master_iface, slave_iface, strerror (-err));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
g_free (mif);
|
|
|
|
|
g_free (sif);
|
|
|
|
|
return err == 0 ? TRUE : FALSE;
|
|
|
|
|
}
|