Commit graph

71 commits

Author SHA1 Message Date
Pavel Šimerda
e88aa72e6a ip6: rename defgw to gateway
This was suggested by Dan Winship but it didn't get to commit
8a059b1 by mistake.
2012-06-26 23:50:19 -05:00
Pavel Šimerda
64bac49934 ip6: remove duplicate dhcp_opts from CallbackInfo
It is now included in NMIP6Device instance already included
in CallbackInfo.
2012-06-26 23:50:19 -05:00
Pavel Šimerda
c0048e7b40 ip6: implement router solicitation and use it to for RDNSS/DNSSL (bgo #753482)
This commit includes Dan Winship's implementation of IPv6
router solicitation. It also uses it as a last resort
for RDNSS and DNSSL lifetime expiry. While using RS to prevent
lifetime expiry may be deprecated and removed in the future,
the RS implementation is useful in other places too.

It can be also viewed as a last resort if commit e1cfdd5 gets
reverted/modified or if it does not work under some weird
circumstances.

It also includes improvements by cyphermox and me.
2012-06-15 10:43:01 -05:00
Pavel Šimerda
c0d2ad5807 ip6: pad RDNSS and DNSSL lifetimes to a minimum lifetime value (rh #753482)
RFC 6106 says, section 5.1 says:

  In order to provide fixed hosts
  with stable DNS service and allow mobile hosts to
  prefer local RDNSSes to remote RDNSSes, the value of
  Lifetime SHOULD be bounded as
  MaxRtrAdvInterval <= Lifetime <= 2*MaxRtrAdvInterval

I have reported and repeatedly confirmed that values in this interval
trigger frequent RDNSS expiration on unreliable links such as 802.11
wifi. Wireless links *do* have packet loss and actually have a *much*
worse multicast packet loss than unicast. And regular router
advertisements are sent as multicast packets (in multicast frames).

In case of RDNSS expiration, NetworkManager tears down the whole
connection. That of course affects IPv4 networking as well as IPv6.
In a typical wireless network with radvd serving RDNSS it leads to
dropping network connection every ~10 minutes.

This commit improves the previous hack in 0b8ee13 by enforcing a minimum
lifetime of two hours (7200 seconds), which is four times the maximum
allowed value for MaxRtrAdvInterval (see below). We could use
AdvDefaultLifetime instead (as suggested by tore_ on IRC) but it doesn't
seem to be accessible through netlink.

RFC 4861 Neighbor Discovery for IP version 6 (IPv6):

  MaxRtrAdvInterval

  The maximum time allowed between sending
  unsolicited multicast Router Advertisements from
  the interface, in seconds.  MUST be no less than 4
  seconds and no greater than 1800 seconds.

This solution is not recommended by any RFC (and is in fact against
RFC 6106) but it's the easiest hack to fix the problem until IETF
takes action.

My original posting to IETF can be found here:

http://www.ietf.org/mail-archive/web/ipv6/current/msg15816.html
2012-06-15 10:35:04 -05:00
Pavel Šimerda
8a059b1496 ip6: add default gateway to NMIP6Config (bgo #676317)
Bug #676317 describes the following error:

  NetworkManager[30151]: <error> [1337348764.559121] [nm-system.c:1121]
  nm_system_replace_default_ip6_route(): (eth1): failed to set IPv6 default
  route: -7

The above error is caused by NetworkManager assuming default gateways
belong to addresses but failing to setup default gateways for addresses
learned through DHCPv6.

This commit doesn't fix the fundamental issue but can be viewed as an ugly
workaround that gets IPv6 connection up and running. It doesn't fix
the fundamental flaw of binding gateways to IP addresses. They are
configured separately in IPv6 and NM should use lifetimes and allow
default gateway reconfiguration.
2012-05-31 15:37:49 -05:00
Jiří Klimeš
de47d95112 ip6: fix crash in nl_addr2str in libnl1
libnl1 doesn't check the first argument and crashes on NULL.
I got NULL gateway out of rtnl_route_get_gateway() for link local and
multicast routes (fe80::/64, ff00::/8).
2012-05-24 14:48:50 +02:00
Pavel Šimerda
0a85eefd8c ip6: fix address cache and route cache synchronization
There is are global caches of IPv6 addresses and routes. Only
managed devices are synchronized later. We *may* move
to per-device caches in the future but for now we should
keep the caches up to date.
2012-05-23 12:25:59 -05:00
Pavel Šimerda
175b7cbb67 ip6: improved logging of address and route changes
Introduce logging of individual address and route changes. Rename
process_addr() and process_route() to process_address_change() and
process_route_change() so that it is clear that we react to both
addition and deletion.
2012-05-23 12:25:59 -05:00
Pavel Šimerda
cc738330aa ip6: log ip configuration state changes
Every state change should go through device_set_state(). This
static function provides state change logging. Function
state_to_string is moved up so that we can use it.
2012-05-23 12:25:59 -05:00
Pavel Šimerda
be2f17790e ip6: split nm_ip6_device_sync_from_netlink
Split nm_ip6_device_sync_from_netlink into multiple functions.
It will now call the smaller functions and may disappear entirely
in the future.

To share state between these (and possible future) functions,
move local variables found_linklocal, found_other and dhcp_opts
to NMIP6Device as has_linklocal and has_nonlinklocal and dhcp_opts.
2012-05-23 12:25:59 -05:00
Pavel Šimerda
dcd392630a ip6: removed process_prefix() and config_changed variable
The kernel appears to always add a default route pointing to the router
that sent the RA, regardless of the contents of the RA:

ndisc_router_discovery() calls rt6_add_dflt_router() which calls
ip6_route_add() which calls __ip6_ins_rt() which calls fib6_add() which
calls fib6_add_rt2node(), which calls inet6_rt_notify(RTM_NEWROUTE, rt,
info)

So skip listening for RTM_NEWPREFIX and just rely on NEWROUTE instead.

The config_changed lost its meaning because RTM_NEWPREFIX was the only
case where it was FALSE.
2012-05-23 10:36:50 -05:00
Dan Williams
a9c3fe021a ip6: print out prefix in some debug messages 2012-03-05 10:28:17 -06:00
Jiří Klimeš
785b6fb807 utils: more flexible reading of /proc/sys/net
- changes nm_utils_get_proc_sys_net_value() to allow all values, not just 0,1
- adds nm_utils_get_proc_sys_net_value_with_bounds() for limiting valid values
2012-02-27 16:27:44 +01:00
Colin Walters
74ec56d956 build: fix srcdir != builddir for new generated headers 2012-02-22 16:27:28 -06:00
Dan Winship
839eab5564 Use glib-mkenums to generate enum types
Rather than generating enum classes by hand (and complaining in each
file that "this should really be standard"), use glib-mkenums.

Unfortunately, we need a very new version of glib-mkenums in order to
deal with NM's naming conventions and to fix a few other bugs, so just
import that into the source tree temporarily.

Also, to simplify the use of glib-mkenums, import Makefile.glib from
https://bugzilla.gnome.org/654395.

To avoid having to run glib-mkenums for every subdirectory of src/,
add a new "generated" directory, and put the generated enums files
there.

Finally, use Makefile.glib for marshallers too, and generate separate
ones for libnm-glib and NetworkManager.
2012-02-15 11:42:15 -05:00
Colin Walters
dab7dfaf35 build: fix srcdir != builddir
nm-version.h is in ${top_builddir}/include.
2012-01-09 14:20:36 -06:00
Dan Williams
fc7941032f ip6: ensure IPv6 failures take precedence over success
The RDNSS and DNSSL failure cases wouldn't clear out the idle
handler of a previous success (if that success hadn't fired yet);
it seems pointless to signal success and then immediately fail.
Second, it would cause a dangling GSource if the device was
removed or NM quit at the right time.
2011-12-01 16:11:04 -06:00
Dan Williams
88faa0e0ca trivial: fix misspelling 2011-11-09 21:36:52 -06:00
Dan Williams
314d0968e1 ip6: print RA flags description
Helps debugging:

'S' = RS_SENT
'R' = RA_RCVD
'O' = OTHERCONF
'M' = MANAGED
2011-11-09 21:36:52 -06:00
Dan Williams
2c5d9fe86b ip6: subscribe to route group so we get RTM_NEWROUTE/RTM_DELROUTE (lp:886410)
Found by Michael Mol; need to subscribe to the group otherwise
we won't get the messages.
2011-11-04 20:10:00 -05:00
Dan Williams
6e92c1b606 core: fix leaked return value of nm_netlink_index_to_iface()
This function now returns allocated strings, so we need to make
sure we free them.
2011-10-18 15:28:26 -05:00
Tore Anderson
453f676b2d ip6: accept RAs when forwarding
This patch makes NM set the "accept_ra" sysctl to 1 rather than 2. This
causes the kernel to process RAs even if it configured to forward IPv6
traffic on the interface in question.

IPv6 forwarding would likely be enabled on a host running virtualised
operating systems with virtualised network adapters, for example. This
should not prevent NM from successfully activating IPv6 on a
NM-controlled interface configured with IPv6 mode Auto.
2011-10-03 15:49:15 -05:00
Thomas Graf
1134eee1e6 ip6: Perform sanity check before processing prefix messages
Verifies that the provided message consists of at least the prefix header.
2011-09-13 00:08:30 -05:00
Thomas Graf
3f3a63084c ip6: Perform sanity checks before processing nduseropt messages
Verifies that the provided message consists of the nduseropt header
followed by an array of options as specified in the header.
2011-09-13 00:08:30 -05:00
Thomas Graf
205c4c52d8 ip6: Perform sanity check before processing NEWLINK messages
Verifies that provided message consists of at least the link message
header. nlmsg_parse() does this so it needs to be called prior to
accessing the message contents.
2011-09-13 00:08:30 -05:00
Thomas Graf
c297cb8f70 ip6: fix leak in process_addr()
rtnladdr is leaked if nm_ip6_manager_get_device() returns NULL.
2011-09-13 00:08:30 -05:00
Thomas Graf
cc2c2baee6 ip6: fix leak in process_route()
rtnlroute is leaked if nm_ip6_manager_get_device returns NULL
2011-09-13 00:08:30 -05:00
Dan Williams
b562839df8 core: misc style fixes to libnl compat code 2011-07-30 15:47:39 -05:00
Alfredo Matos
a6c6556831 core: add libnl-2 support with libnl-1 compatibility 2011-07-30 15:47:26 -05:00
Martin Jansa
a23f3da669 core: use libnl CFLAGS and LIBS consistently
This patch is used in OpenEmbedded [1] since commit 154bd72b [2][3].

[1] http://www.openembedded.org/
[2] http://cgit.openembedded.org/cgit.cgi/openembedded/log/recipes/networkmanager/networkmanager/0001-respect-libnl-flags-also-in-backends-ip6-manager.patch
[3] http://cgit.openembedded.org/cgit.cgi/openembedded/commit/?id=154bd72b1ca859afcae5ed4fe99ed611a13a475c

Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
2011-05-19 15:31:02 -05:00
Dan Williams
5ca747316e ip6: remove useless include 2011-04-05 10:04:57 -05:00
Dan Williams
801beb4b4d ip6: prevent overflows in RDNSS and DNSSL timeout calculations (rh #689291) 2011-04-05 09:58:49 -05:00
Dan Williams
4045a91ab9 ip6: add some comments 2011-04-05 09:58:01 -05:00
Dan Williams
48441ea636 ip6: don't try to process invalid RA nameservers 2011-04-05 09:57:43 -05:00
Dan Williams
fdc2d5ee4f ip6: fix possible use of uninitialized memory 2011-04-05 09:54:52 -05:00
Dan Williams
4ea8fb6d99 trivial: fix format type of ip6 manager logging messages 2011-03-21 13:33:43 -05:00
Dan Williams
d815cb9f33 logging: fix format string/argument disagreement
Now that the logging fixes make format checking actually work, fix
the issues it brings up.
2011-03-19 12:44:14 -05:00
Dan Williams
bf854ebaca ip6: fail activation if addrconf fails to start
Like if the IP interface doesn't have an ifindex yet.  Previously
the connection would just go merrily along and wait for IPv6 to
complete even though it had already failed.  Happens if you try
to do IPv6 on mobile broadband connections, which we'll add support
for later.
2011-02-25 11:28:08 -06:00
Pierre Ossman
83bc663914 ip6: support for DNS Search List option (bgo #637077)
RFC6101 adds the DNS Search List option to router advertisements. This
allows stateless configuration of suffixes to try when doing DNS lookups.
Make sure we catch these when provided by the kernel and reconfigure
things appropriately.

NOTE: this commit depends on a kernel patch:

http://marc.info/?l=linux-netdev&m=129216173321352&w=2
2010-12-15 17:44:20 -06:00
Pierre Ossman
4e8cb2f193 ip6: restructure RDNSS code to be RFC compliant (bgo #637075)
RFC5006/RFC6106 specifies fairly clearly how to handle multiple RDDNS options.
Unfortunately the previous code didn't deal with this and hence would
misbehave in all but the simplest setups. The new code should be fully
compliant with the following exceptions:

- Router lifetime not respected
- No "sufficient number" management.
- DHCPv6 servers might not be prioritised over RDDNS ones.
2010-12-15 17:37:14 -06:00
Pierre Ossman
8229107589 ip6: rdnss structure needs to be packed (bgo #637075)
The code assumes this structure is packed, so let's make sure it actually is.
2010-12-15 17:30:35 -06:00
Dan Williams
9b2b809aae core: rename NMNamedManager -> NMDnsManager 2010-09-07 22:08:18 -05:00
Dan Williams
0b8ee13ee0 ip6: pad RDNSS server expiry slightly to avoid hiccups (rh #590202)
Pad the DNS server expiry somewhat to give a bit of slack in cases
where one RA gets lost or something (which can happen on unreliable
links like wifi where certain types of frames are not retransmitted).
2010-05-14 09:48:46 -07:00
Dan Williams
3e68d33583 ip6: only honor kernel-provided RA flags if an RA was received (rh #588560)
The kernel apparently caches the value and will send Managed/Other flags
in the newlink message even if the router is no longer reachable and
and RA hasn't been received for a while.  So we need to make sure we
check for IF_RA_RCVD before paying attention to Managed/Other.
2010-05-10 15:19:03 -07:00
Dan Williams
46c5a48ff2 ip6: use IN6_ARE_ADDR_EQUAL not memcmp 2010-05-04 12:45:36 -07:00
Dan Williams
7926b3ca95 ip6: turn RA acceptance off when RAs shouldn't be used (rh #588163)
Make sure we don't inadvertenly let the kernel assign an RA address
when connections that don't allow RA are used.
2010-05-03 03:42:43 -07:00
Dan Williams
10d6bc8d2e ip6: fail if the RA-provided address disappears or RDNSS expires 2010-05-03 03:02:57 -07:00
Dan Williams
c21416e956 ip6: don't prematurely remove RDNSS nameservers (rh #588192) 2010-05-03 02:48:18 -07:00
Dan Williams
670de9b5fb ip6: tune RDNSS parsing logging 2010-05-03 02:42:48 -07:00
Dan Williams
5ca72c78a0 ip6: avoid autoconf routes where dest == gateway
These return errors when we try to add them via netlink (both internal
code and using /sbin/ip) so we'll ignore them for now.
2010-05-02 00:44:44 -07:00