Mercurial > hg > dhcpcd
annotate src/ipv6nd.c @ 5535:a0d828e25482 draft
Add --noconfigure option
With this set dhcpcd will not configure anything on the host.
The expectation is that a 3rd party script will instead.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Wed, 04 Nov 2020 14:18:48 +0000 |
| parents | 6a2da5651841 |
| children | e65d193a1960 |
| rev | line source |
|---|---|
|
4548
c7df03794de3
Add SPDX identifiers to all dhcpcd source files.
Yegor Yefremov <yegorslists@googlemail.com>
parents:
4534
diff
changeset
|
1 /* SPDX-License-Identifier: BSD-2-Clause */ |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2 /* |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
3 * dhcpcd - IPv6 ND handling |
| 4922 | 4 * Copyright (c) 2006-2020 Roy Marples <roy@marples.name> |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
5 * All rights reserved |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
6 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
7 * Redistribution and use in source and binary forms, with or without |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
8 * modification, are permitted provided that the following conditions |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
9 * are met: |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
10 * 1. Redistributions of source code must retain the above copyright |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
11 * notice, this list of conditions and the following disclaimer. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
12 * 2. Redistributions in binary form must reproduce the above copyright |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
13 * notice, this list of conditions and the following disclaimer in the |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
14 * documentation and/or other materials provided with the distribution. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
15 * |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
26 * SUCH DAMAGE. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
27 */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
28 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
29 #include <sys/ioctl.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
30 #include <sys/param.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
31 #include <sys/socket.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
32 #include <net/if.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
33 #include <net/route.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
34 #include <netinet/in.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
35 #include <netinet/ip6.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
36 #include <netinet/icmp6.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
37 |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
38 #include <assert.h> |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
39 #include <errno.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
40 #include <fcntl.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
41 #include <stddef.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
42 #include <stdlib.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
43 #include <string.h> |
|
5065
641e15827969
Be pedantic and move syslog.h into the right place
Roy Marples <roy@marples.name>
parents:
5064
diff
changeset
|
44 #include <syslog.h> |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
45 #include <unistd.h> |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
46 |
|
5038
1e35e845790a
eloop: define eloop queue numbers in common.h
Roy Marples <roy@marples.name>
parents:
4990
diff
changeset
|
47 #define ELOOP_QUEUE ELOOP_IPV6ND |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
48 #include "common.h" |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
49 #include "dhcpcd.h" |
|
4349
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
50 #include "dhcp-common.h" |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
51 #include "dhcp6.h" |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
52 #include "eloop.h" |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
53 #include "if.h" |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
54 #include "ipv6.h" |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
55 #include "ipv6nd.h" |
| 4010 | 56 #include "logerr.h" |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
57 #include "privsep.h" |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
58 #include "route.h" |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
59 #include "script.h" |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
60 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
61 /* Debugging Router Solicitations is a lot of spam, so disable it */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
62 //#define DEBUG_RS |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
63 |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
64 #ifndef ND_RA_FLAG_HOME_AGENT |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
65 #define ND_RA_FLAG_HOME_AGENT 0x20 /* Home Agent flag in RA */ |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
66 #endif |
|
5363
e161ef164608
inet6: Report RA Proxy flag if set
Roy Marples <roy@marples.name>
parents:
5362
diff
changeset
|
67 #ifndef ND_RA_FLAG_PROXY |
|
e161ef164608
inet6: Report RA Proxy flag if set
Roy Marples <roy@marples.name>
parents:
5362
diff
changeset
|
68 #define ND_RA_FLAG_PROXY 0x04 /* Proxy */ |
|
e161ef164608
inet6: Report RA Proxy flag if set
Roy Marples <roy@marples.name>
parents:
5362
diff
changeset
|
69 #endif |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
70 #ifndef ND_OPT_PI_FLAG_ROUTER |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
71 #define ND_OPT_PI_FLAG_ROUTER 0x20 /* Router flag in PI */ |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
72 #endif |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
73 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
74 #ifndef ND_OPT_RDNSS |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
75 #define ND_OPT_RDNSS 25 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
76 struct nd_opt_rdnss { /* RDNSS option RFC 6106 */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
77 uint8_t nd_opt_rdnss_type; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
78 uint8_t nd_opt_rdnss_len; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
79 uint16_t nd_opt_rdnss_reserved; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
80 uint32_t nd_opt_rdnss_lifetime; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
81 /* followed by list of IP prefixes */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
82 }; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
83 __CTASSERT(sizeof(struct nd_opt_rdnss) == 8); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
84 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
85 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
86 #ifndef ND_OPT_DNSSL |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
87 #define ND_OPT_DNSSL 31 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
88 struct nd_opt_dnssl { /* DNSSL option RFC 6106 */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
89 uint8_t nd_opt_dnssl_type; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
90 uint8_t nd_opt_dnssl_len; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
91 uint16_t nd_opt_dnssl_reserved; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
92 uint32_t nd_opt_dnssl_lifetime; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
93 /* followed by list of DNS servers */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
94 }; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
95 __CTASSERT(sizeof(struct nd_opt_rdnss) == 8); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
96 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
97 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
98 /* Impossible options, so we can easily add extras */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
99 #define _ND_OPT_PREFIX_ADDR 255 + 1 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
100 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
101 /* Minimal IPv6 MTU */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
102 #ifndef IPV6_MMTU |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
103 #define IPV6_MMTU 1280 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
104 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
105 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
106 #ifndef ND_RA_FLAG_RTPREF_HIGH |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
107 #define ND_RA_FLAG_RTPREF_MASK 0x18 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
108 #define ND_RA_FLAG_RTPREF_HIGH 0x08 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
109 #define ND_RA_FLAG_RTPREF_MEDIUM 0x00 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
110 #define ND_RA_FLAG_RTPREF_LOW 0x18 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
111 #define ND_RA_FLAG_RTPREF_RSV 0x10 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
112 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
113 |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
114 #define EXPIRED_MAX 5 /* Remember 5 expired routers to avoid |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
115 logspam. */ |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
116 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
117 #define MIN_RANDOM_FACTOR 500 /* millisecs */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
118 #define MAX_RANDOM_FACTOR 1500 /* millisecs */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
119 #define MIN_RANDOM_FACTOR_U MIN_RANDOM_FACTOR * 1000 /* usecs */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
120 #define MAX_RANDOM_FACTOR_U MAX_RANDOM_FACTOR * 1000 /* usecs */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
121 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
122 #if BYTE_ORDER == BIG_ENDIAN |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
123 #define IPV6_ADDR_INT32_ONE 1 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
124 #define IPV6_ADDR_INT16_MLL 0xff02 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
125 #elif BYTE_ORDER == LITTLE_ENDIAN |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
126 #define IPV6_ADDR_INT32_ONE 0x01000000 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
127 #define IPV6_ADDR_INT16_MLL 0x02ff |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
128 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
129 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
130 /* Debugging Neighbor Solicitations is a lot of spam, so disable it */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
131 //#define DEBUG_NS |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
132 // |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
133 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
134 static void ipv6nd_handledata(void *); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
135 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
136 /* |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
137 * Android ships buggy ICMP6 filter headers. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
138 * Supply our own until they fix their shit. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
139 * References: |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
140 * https://android-review.googlesource.com/#/c/58438/ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
141 * http://code.google.com/p/android/issues/original?id=32621&seq=24 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
142 */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
143 #ifdef __ANDROID__ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
144 #undef ICMP6_FILTER_WILLPASS |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
145 #undef ICMP6_FILTER_WILLBLOCK |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
146 #undef ICMP6_FILTER_SETPASS |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
147 #undef ICMP6_FILTER_SETBLOCK |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
148 #undef ICMP6_FILTER_SETPASSALL |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
149 #undef ICMP6_FILTER_SETBLOCKALL |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
150 #define ICMP6_FILTER_WILLPASS(type, filterp) \ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
151 ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) == 0) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
152 #define ICMP6_FILTER_WILLBLOCK(type, filterp) \ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
153 ((((filterp)->icmp6_filt[(type) >> 5]) & (1 << ((type) & 31))) != 0) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
154 #define ICMP6_FILTER_SETPASS(type, filterp) \ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
155 ((((filterp)->icmp6_filt[(type) >> 5]) &= ~(1 << ((type) & 31)))) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
156 #define ICMP6_FILTER_SETBLOCK(type, filterp) \ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
157 ((((filterp)->icmp6_filt[(type) >> 5]) |= (1 << ((type) & 31)))) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
158 #define ICMP6_FILTER_SETPASSALL(filterp) \ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
159 memset(filterp, 0, sizeof(struct icmp6_filter)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
160 #define ICMP6_FILTER_SETBLOCKALL(filterp) \ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
161 memset(filterp, 0xff, sizeof(struct icmp6_filter)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
162 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
163 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
164 /* Support older systems with different defines */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
165 #if !defined(IPV6_RECVHOPLIMIT) && defined(IPV6_HOPLIMIT) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
166 #define IPV6_RECVHOPLIMIT IPV6_HOPLIMIT |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
167 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
168 #if !defined(IPV6_RECVPKTINFO) && defined(IPV6_PKTINFO) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
169 #define IPV6_RECVPKTINFO IPV6_PKTINFO |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
170 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
171 |
|
4140
57e2a4bfb9b7
ipv6nd_freedrop is no longer public.
Roy Marples <roy@marples.name>
parents:
4123
diff
changeset
|
172 /* Handy defines */ |
|
57e2a4bfb9b7
ipv6nd_freedrop is no longer public.
Roy Marples <roy@marples.name>
parents:
4123
diff
changeset
|
173 #define ipv6nd_free_ra(ra) ipv6nd_freedrop_ra((ra), 0) |
|
57e2a4bfb9b7
ipv6nd_freedrop is no longer public.
Roy Marples <roy@marples.name>
parents:
4123
diff
changeset
|
174 #define ipv6nd_drop_ra(ra) ipv6nd_freedrop_ra((ra), 1) |
|
57e2a4bfb9b7
ipv6nd_freedrop is no longer public.
Roy Marples <roy@marples.name>
parents:
4123
diff
changeset
|
175 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
176 void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
177 ipv6nd_printoptions(const struct dhcpcd_ctx *ctx, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
178 const struct dhcp_opt *opts, size_t opts_len) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
179 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
180 size_t i, j; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
181 const struct dhcp_opt *opt, *opt2; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
182 int cols; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
183 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
184 for (i = 0, opt = ctx->nd_opts; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
185 i < ctx->nd_opts_len; i++, opt++) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
186 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
187 for (j = 0, opt2 = opts; j < opts_len; j++, opt2++) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
188 if (opt2->option == opt->option) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
189 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
190 if (j == opts_len) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
191 cols = printf("%03d %s", opt->option, opt->var); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
192 dhcp_print_option_encoding(opt, cols); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
193 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
194 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
195 for (i = 0, opt = opts; i < opts_len; i++, opt++) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
196 cols = printf("%03d %s", opt->option, opt->var); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
197 dhcp_print_option_encoding(opt, cols); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
198 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
199 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
200 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
201 int |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
202 ipv6nd_open(bool recv) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
203 { |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
204 int fd, on; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
205 struct icmp6_filter filt; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
206 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
207 fd = xsocket(PF_INET6, SOCK_RAW | SOCK_CXNB, IPPROTO_ICMPV6); |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
208 if (fd == -1) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
209 return -1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
210 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
211 ICMP6_FILTER_SETBLOCKALL(&filt); |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
212 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
213 /* RFC4861 4.1 */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
214 on = 255; |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
215 if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
216 &on, sizeof(on)) == -1) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
217 goto eexit; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
218 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
219 if (recv) { |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
220 on = 1; |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
221 if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
222 &on, sizeof(on)) == -1) |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
223 goto eexit; |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
224 |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
225 on = 1; |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
226 if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
227 &on, sizeof(on)) == -1) |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
228 goto eexit; |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
229 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
230 ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filt); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
231 |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
232 #ifdef SO_RERROR |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
233 on = 1; |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
234 if (setsockopt(fd, SOL_SOCKET, SO_RERROR, |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
235 &on, sizeof(on)) == -1) |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
236 goto eexit; |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
237 #endif |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
238 } |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
239 |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
240 if (setsockopt(fd, IPPROTO_ICMPV6, ICMP6_FILTER, |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
241 &filt, sizeof(filt)) == -1) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
242 goto eexit; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
243 |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
244 return fd; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
245 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
246 eexit: |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
247 close(fd); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
248 return -1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
249 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
250 |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
251 #ifdef __sun |
|
4841
bace61b4b4ff
Solaris: Fix non PRIVSEP compile
Roy Marples <roy@marples.name>
parents:
4840
diff
changeset
|
252 int |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
253 ipv6nd_openif(struct interface *ifp) |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
254 { |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
255 int fd; |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
256 struct ipv6_mreq mreq = { |
|
4486
ecc12563d4ad
sun: Simplify initialisation of the multicast destination
Roy Marples <roy@marples.name>
parents:
4484
diff
changeset
|
257 .ipv6mr_multiaddr = IN6ADDR_LINKLOCAL_ALLNODES_INIT, |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
258 .ipv6mr_interface = ifp->index |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
259 }; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
260 struct rs_state *state = RS_STATE(ifp); |
|
4474
5038198ddbae
sun: Bind IPv6ND socket to interface.
Roy Marples <roy@marples.name>
parents:
4473
diff
changeset
|
261 uint_t ifindex = ifp->index; |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
262 |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
263 if (state->nd_fd != -1) |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
264 return state->nd_fd; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
265 |
| 5276 | 266 fd = ipv6nd_open(true); |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
267 if (fd == -1) |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
268 return -1; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
269 |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
270 if (setsockopt(fd, IPPROTO_IPV6, IPV6_BOUND_IF, |
|
4474
5038198ddbae
sun: Bind IPv6ND socket to interface.
Roy Marples <roy@marples.name>
parents:
4473
diff
changeset
|
271 &ifindex, sizeof(ifindex)) == -1) |
|
5038198ddbae
sun: Bind IPv6ND socket to interface.
Roy Marples <roy@marples.name>
parents:
4473
diff
changeset
|
272 { |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
273 close(fd); |
|
4474
5038198ddbae
sun: Bind IPv6ND socket to interface.
Roy Marples <roy@marples.name>
parents:
4473
diff
changeset
|
274 return -1; |
|
5038198ddbae
sun: Bind IPv6ND socket to interface.
Roy Marples <roy@marples.name>
parents:
4473
diff
changeset
|
275 } |
|
5038198ddbae
sun: Bind IPv6ND socket to interface.
Roy Marples <roy@marples.name>
parents:
4473
diff
changeset
|
276 |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
277 if (setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
278 &mreq, sizeof(mreq)) == -1) |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
279 { |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
280 close(fd); |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
281 return -1; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
282 } |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
283 |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
284 state->nd_fd = fd; |
|
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
285 eloop_event_add(ifp->ctx->eloop, fd, ipv6nd_handledata, ifp); |
|
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
286 return fd; |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
287 } |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
288 #endif |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
289 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
290 static int |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
291 ipv6nd_makersprobe(struct interface *ifp) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
292 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
293 struct rs_state *state; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
294 struct nd_router_solicit *rs; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
295 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
296 state = RS_STATE(ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
297 free(state->rs); |
|
4076
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
298 state->rslen = sizeof(*rs); |
|
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
299 if (ifp->hwlen != 0) |
|
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
300 state->rslen += (size_t)ROUNDUP8(ifp->hwlen + 2); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
301 state->rs = calloc(1, state->rslen); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
302 if (state->rs == NULL) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
303 return -1; |
| 4114 | 304 rs = state->rs; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
305 rs->nd_rs_type = ND_ROUTER_SOLICIT; |
| 4114 | 306 //rs->nd_rs_code = 0; |
| 307 //rs->nd_rs_cksum = 0; | |
| 308 //rs->nd_rs_reserved = 0; | |
|
4076
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
309 |
|
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
310 if (ifp->hwlen != 0) { |
|
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
311 struct nd_opt_hdr *nd; |
|
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
312 |
| 4114 | 313 nd = (struct nd_opt_hdr *)(state->rs + 1); |
|
4076
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
314 nd->nd_opt_type = ND_OPT_SOURCE_LINKADDR; |
|
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
315 nd->nd_opt_len = (uint8_t)((ROUNDUP8(ifp->hwlen + 2)) >> 3); |
|
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
316 memcpy(nd + 1, ifp->hwaddr, ifp->hwlen); |
|
9433864aa014
Hardware Address validation
Roy Marples <roy@marples.name>
parents:
4024
diff
changeset
|
317 } |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
318 return 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
319 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
320 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
321 static void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
322 ipv6nd_sendrsprobe(void *arg) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
323 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
324 struct interface *ifp = arg; |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
325 struct rs_state *state = RS_STATE(ifp); |
|
4476
60b8905c878e
IPv6ND: Use generic initialisers rather than inet_pton
Roy Marples <roy@marples.name>
parents:
4474
diff
changeset
|
326 struct sockaddr_in6 dst = { |
|
60b8905c878e
IPv6ND: Use generic initialisers rather than inet_pton
Roy Marples <roy@marples.name>
parents:
4474
diff
changeset
|
327 .sin6_family = AF_INET6, |
|
60b8905c878e
IPv6ND: Use generic initialisers rather than inet_pton
Roy Marples <roy@marples.name>
parents:
4474
diff
changeset
|
328 .sin6_addr = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT, |
|
60b8905c878e
IPv6ND: Use generic initialisers rather than inet_pton
Roy Marples <roy@marples.name>
parents:
4474
diff
changeset
|
329 .sin6_scope_id = ifp->index, |
|
60b8905c878e
IPv6ND: Use generic initialisers rather than inet_pton
Roy Marples <roy@marples.name>
parents:
4474
diff
changeset
|
330 }; |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
331 struct iovec iov = { .iov_base = state->rs, .iov_len = state->rslen }; |
| 5172 | 332 union { |
| 333 struct cmsghdr hdr; | |
| 334 uint8_t buf[CMSG_SPACE(sizeof(struct in6_pktinfo))]; | |
| 335 } cmsgbuf = { .buf = { 0 } }; | |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
336 struct msghdr msg = { |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
337 .msg_name = &dst, .msg_namelen = sizeof(dst), |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
338 .msg_iov = &iov, .msg_iovlen = 1, |
| 5172 | 339 .msg_control = cmsgbuf.buf, .msg_controllen = sizeof(cmsgbuf.buf), |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
340 }; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
341 struct cmsghdr *cm; |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
342 struct in6_pktinfo pi = { .ipi6_ifindex = ifp->index }; |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
343 int s; |
| 5276 | 344 #ifndef __sun |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
345 struct dhcpcd_ctx *ctx = ifp->ctx; |
| 5276 | 346 #endif |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
347 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
348 if (ipv6_linklocal(ifp) == NULL) { |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
349 logdebugx("%s: delaying Router Solicitation for LL address", |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
350 ifp->name); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
351 ipv6_addlinklocalcallback(ifp, ipv6nd_sendrsprobe, ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
352 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
353 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
354 |
| 4192 | 355 #ifdef HAVE_SA_LEN |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
356 dst.sin6_len = sizeof(dst); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
357 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
358 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
359 /* Set the outbound interface */ |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
360 cm = CMSG_FIRSTHDR(&msg); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
361 if (cm == NULL) /* unlikely */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
362 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
363 cm->cmsg_level = IPPROTO_IPV6; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
364 cm->cmsg_type = IPV6_PKTINFO; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
365 cm->cmsg_len = CMSG_LEN(sizeof(pi)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
366 memcpy(CMSG_DATA(cm), &pi, sizeof(pi)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
367 |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
368 logdebugx("%s: sending Router Solicitation", ifp->name); |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
369 #ifdef PRIVSEP |
|
4869
5bad3606b951
privsep: prefer IN_PRIVSEP macros
Roy Marples <roy@marples.name>
parents:
4856
diff
changeset
|
370 if (IN_PRIVSEP(ifp->ctx)) { |
|
4842
efc22a0dde81
Solaris: start privsep support
Roy Marples <roy@marples.name>
parents:
4841
diff
changeset
|
371 if (ps_inet_sendnd(ifp, &msg) == -1) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
372 logerr(__func__); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
373 goto sent; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
374 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
375 #endif |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
376 #ifdef __sun |
|
5278
ffa72e19fcb8
Solaris: Fix sending RS probes
Roy Marples <roy@marples.name>
parents:
5276
diff
changeset
|
377 if (state->nd_fd == -1) { |
|
ffa72e19fcb8
Solaris: Fix sending RS probes
Roy Marples <roy@marples.name>
parents:
5276
diff
changeset
|
378 if (ipv6nd_openif(ifp) == -1) { |
|
ffa72e19fcb8
Solaris: Fix sending RS probes
Roy Marples <roy@marples.name>
parents:
5276
diff
changeset
|
379 logerr(__func__); |
|
ffa72e19fcb8
Solaris: Fix sending RS probes
Roy Marples <roy@marples.name>
parents:
5276
diff
changeset
|
380 return; |
|
ffa72e19fcb8
Solaris: Fix sending RS probes
Roy Marples <roy@marples.name>
parents:
5276
diff
changeset
|
381 } |
|
ffa72e19fcb8
Solaris: Fix sending RS probes
Roy Marples <roy@marples.name>
parents:
5276
diff
changeset
|
382 } |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
383 s = state->nd_fd; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
384 #else |
|
5231
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
385 if (ctx->nd_fd == -1) { |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
386 ctx->nd_fd = ipv6nd_open(true); |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
387 if (ctx->nd_fd == -1) { |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
388 logerr(__func__); |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
389 return; |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
390 } |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
391 eloop_event_add(ctx->eloop, ctx->nd_fd, ipv6nd_handledata, ctx); |
|
a2c342295221
privsep: Enable Capsicum for all processes.
Roy Marples <roy@marples.name>
parents:
5204
diff
changeset
|
392 } |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
393 s = ifp->ctx->nd_fd; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
394 #endif |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
395 if (sendmsg(s, &msg, 0) == -1) { |
| 4010 | 396 logerr(__func__); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
397 /* Allow IPv6ND to continue .... at most a few errors |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
398 * would be logged. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
399 * Generally the error is ENOBUFS when struggling to |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
400 * associate with an access point. */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
401 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
402 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
403 #ifdef PRIVSEP |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
404 sent: |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
405 #endif |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
406 if (state->rsprobes++ < MAX_RTR_SOLICITATIONS) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
407 eloop_timeout_add_sec(ifp->ctx->eloop, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
408 RTR_SOLICITATION_INTERVAL, ipv6nd_sendrsprobe, ifp); |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
409 else |
| 4010 | 410 logwarnx("%s: no IPv6 Routers available", ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
411 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
412 |
|
4588
6aced73a8438
Remove ND6 Advertisement from SMALL builds.
Roy Marples <roy@marples.name>
parents:
4564
diff
changeset
|
413 #ifdef ND6_ADVERTISE |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
414 static void |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
415 ipv6nd_sendadvertisement(void *arg) |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
416 { |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
417 struct ipv6_addr *ia = arg; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
418 struct interface *ifp = ia->iface; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
419 struct dhcpcd_ctx *ctx = ifp->ctx; |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
420 struct sockaddr_in6 dst = { |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
421 .sin6_family = AF_INET6, |
|
4476
60b8905c878e
IPv6ND: Use generic initialisers rather than inet_pton
Roy Marples <roy@marples.name>
parents:
4474
diff
changeset
|
422 .sin6_addr = IN6ADDR_LINKLOCAL_ALLNODES_INIT, |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
423 .sin6_scope_id = ifp->index, |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
424 }; |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
425 struct iovec iov = { .iov_base = ia->na, .iov_len = ia->na_len }; |
| 5172 | 426 union { |
| 427 struct cmsghdr hdr; | |
| 428 uint8_t buf[CMSG_SPACE(sizeof(struct in6_pktinfo))]; | |
| 429 } cmsgbuf = { .buf = { 0 } }; | |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
430 struct msghdr msg = { |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
431 .msg_name = &dst, .msg_namelen = sizeof(dst), |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
432 .msg_iov = &iov, .msg_iovlen = 1, |
| 5172 | 433 .msg_control = cmsgbuf.buf, .msg_controllen = sizeof(cmsgbuf.buf), |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
434 }; |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
435 struct cmsghdr *cm; |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
436 struct in6_pktinfo pi = { .ipi6_ifindex = ifp->index }; |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
437 const struct rs_state *state = RS_CSTATE(ifp); |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
438 int s; |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
439 |
|
5499
6a2da5651841
dhcpcd: Simplify the link handling even more
Roy Marples <roy@marples.name>
parents:
5497
diff
changeset
|
440 if (state == NULL || !if_is_link_up(ifp)) |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
441 goto freeit; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
442 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
443 #ifdef SIN6_LEN |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
444 dst.sin6_len = sizeof(dst); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
445 #endif |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
446 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
447 /* Set the outbound interface. */ |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
448 cm = CMSG_FIRSTHDR(&msg); |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
449 assert(cm != NULL); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
450 cm->cmsg_level = IPPROTO_IPV6; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
451 cm->cmsg_type = IPV6_PKTINFO; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
452 cm->cmsg_len = CMSG_LEN(sizeof(pi)); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
453 memcpy(CMSG_DATA(cm), &pi, sizeof(pi)); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
454 logdebugx("%s: sending NA for %s", ifp->name, ia->saddr); |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
455 |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
456 #ifdef PRIVSEP |
|
4869
5bad3606b951
privsep: prefer IN_PRIVSEP macros
Roy Marples <roy@marples.name>
parents:
4856
diff
changeset
|
457 if (IN_PRIVSEP(ifp->ctx)) { |
|
4842
efc22a0dde81
Solaris: start privsep support
Roy Marples <roy@marples.name>
parents:
4841
diff
changeset
|
458 if (ps_inet_sendnd(ifp, &msg) == -1) |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
459 logerr(__func__); |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
460 goto sent; |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
461 } |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
462 #endif |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
463 #ifdef __sun |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
464 s = state->nd_fd; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
465 #else |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
466 s = ctx->nd_fd; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
467 #endif |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
468 if (sendmsg(s, &msg, 0) == -1) |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
469 logerr(__func__); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
470 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
471 #ifdef PRIVSEP |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
472 sent: |
|
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
473 #endif |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
474 if (++ia->na_count < MAX_NEIGHBOR_ADVERTISEMENT) { |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
475 eloop_timeout_add_sec(ctx->eloop, |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
476 state->retrans / 1000, ipv6nd_sendadvertisement, ia); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
477 return; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
478 } |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
479 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
480 freeit: |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
481 free(ia->na); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
482 ia->na = NULL; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
483 ia->na_count = 0; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
484 } |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
485 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
486 void |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
487 ipv6nd_advertise(struct ipv6_addr *ia) |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
488 { |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
489 struct dhcpcd_ctx *ctx; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
490 struct interface *ifp; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
491 struct ipv6_state *state; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
492 struct ipv6_addr *iap, *iaf; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
493 struct nd_neighbor_advert *na; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
494 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
495 if (IN6_IS_ADDR_MULTICAST(&ia->addr)) |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
496 return; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
497 |
|
4686
4e051b494520
Solaris: Sending NA now seems to work!
Roy Marples <roy@marples.name>
parents:
4669
diff
changeset
|
498 #ifdef __sun |
|
4e051b494520
Solaris: Sending NA now seems to work!
Roy Marples <roy@marples.name>
parents:
4669
diff
changeset
|
499 if (!(ia->flags & IPV6_AF_AUTOCONF) && ia->flags & IPV6_AF_RAPFX) |
|
4e051b494520
Solaris: Sending NA now seems to work!
Roy Marples <roy@marples.name>
parents:
4669
diff
changeset
|
500 return; |
|
4e051b494520
Solaris: Sending NA now seems to work!
Roy Marples <roy@marples.name>
parents:
4669
diff
changeset
|
501 #endif |
|
4e051b494520
Solaris: Sending NA now seems to work!
Roy Marples <roy@marples.name>
parents:
4669
diff
changeset
|
502 |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
503 ctx = ia->iface->ctx; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
504 /* Find the most preferred address to advertise. */ |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
505 iaf = NULL; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
506 TAILQ_FOREACH(ifp, ctx->ifaces, next) { |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
507 state = IPV6_STATE(ifp); |
|
5499
6a2da5651841
dhcpcd: Simplify the link handling even more
Roy Marples <roy@marples.name>
parents:
5497
diff
changeset
|
508 if (state == NULL || !if_is_link_up(ifp)) |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
509 continue; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
510 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
511 TAILQ_FOREACH(iap, &state->addrs, next) { |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
512 if (!IN6_ARE_ADDR_EQUAL(&iap->addr, &ia->addr)) |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
513 continue; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
514 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
515 /* Cancel any current advertisement. */ |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
516 eloop_timeout_delete(ctx->eloop, |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
517 ipv6nd_sendadvertisement, iap); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
518 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
519 /* Don't advertise what we can't use. */ |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
520 if (iap->prefix_vltime == 0 || |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
521 iap->addr_flags & IN6_IFF_NOTUSEABLE) |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
522 continue; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
523 |
|
4393
c75918907654
ipv6nd: Don't sort interfaces when picking best address
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
524 if (iaf == NULL || |
|
c75918907654
ipv6nd: Don't sort interfaces when picking best address
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
525 iaf->iface->metric > iap->iface->metric) |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
526 iaf = iap; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
527 } |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
528 } |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
529 if (iaf == NULL) |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
530 return; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
531 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
532 /* Make the packet. */ |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
533 ifp = iaf->iface; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
534 iaf->na_len = sizeof(*na); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
535 if (ifp->hwlen != 0) |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
536 iaf->na_len += (size_t)ROUNDUP8(ifp->hwlen + 2); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
537 na = calloc(1, iaf->na_len); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
538 if (na == NULL) { |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
539 logerr(__func__); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
540 return; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
541 } |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
542 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
543 na->nd_na_type = ND_NEIGHBOR_ADVERT; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
544 na->nd_na_flags_reserved = ND_NA_FLAG_OVERRIDE; |
|
5258
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5231
diff
changeset
|
545 #if defined(PRIVSEP) && (defined(__linux__) || defined(HAVE_PLEDGE)) |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5231
diff
changeset
|
546 if (IN_PRIVSEP(ctx)) { |
|
5413
bb929420bc5d
Linux: IP6 forwaring only applies to "all" interface
Roy Marples <roy@marples.name>
parents:
5372
diff
changeset
|
547 if (ps_root_ip6forwarding(ctx, ifp->name) != 0) |
|
5258
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5231
diff
changeset
|
548 na->nd_na_flags_reserved |= ND_NA_FLAG_ROUTER; |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5231
diff
changeset
|
549 } else |
|
f29e384aa13e
privsep: Allow Linux to work without needing any mounts
Roy Marples <roy@marples.name>
parents:
5231
diff
changeset
|
550 #endif |
|
5413
bb929420bc5d
Linux: IP6 forwaring only applies to "all" interface
Roy Marples <roy@marples.name>
parents:
5372
diff
changeset
|
551 if (ip6_forwarding(ifp->name) != 0) |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
552 na->nd_na_flags_reserved |= ND_NA_FLAG_ROUTER; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
553 na->nd_na_target = ia->addr; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
554 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
555 if (ifp->hwlen != 0) { |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
556 struct nd_opt_hdr *opt; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
557 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
558 opt = (struct nd_opt_hdr *)(na + 1); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
559 opt->nd_opt_type = ND_OPT_TARGET_LINKADDR; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
560 opt->nd_opt_len = (uint8_t)((ROUNDUP8(ifp->hwlen + 2)) >> 3); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
561 memcpy(opt + 1, ifp->hwaddr, ifp->hwlen); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
562 } |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
563 |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
564 iaf->na_count = 0; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
565 free(iaf->na); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
566 iaf->na = na; |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
567 eloop_timeout_delete(ctx->eloop, ipv6nd_sendadvertisement, iaf); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
568 ipv6nd_sendadvertisement(iaf); |
|
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
569 } |
|
4604
1224950f9862
BSD: Warn when kernel does not support sending ND6 advertisements
Roy Marples <roy@marples.name>
parents:
4603
diff
changeset
|
570 #elif !defined(SMALL) |
|
1224950f9862
BSD: Warn when kernel does not support sending ND6 advertisements
Roy Marples <roy@marples.name>
parents:
4603
diff
changeset
|
571 #warning kernel does not support userland sending ND6 advertisements |
|
4588
6aced73a8438
Remove ND6 Advertisement from SMALL builds.
Roy Marples <roy@marples.name>
parents:
4564
diff
changeset
|
572 #endif /* ND6_ADVERTISE */ |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
573 |
|
4534
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
574 static void |
|
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
575 ipv6nd_expire(void *arg) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
576 { |
|
4534
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
577 struct interface *ifp = arg; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
578 struct ra *rap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
579 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
580 if (ifp->ctx->ra_routers == NULL) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
581 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
582 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
583 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
584 if (rap->iface == ifp && rap->willexpire) |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
585 rap->doexpire = true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
586 } |
|
4534
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
587 ipv6nd_expirera(ifp); |
|
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
588 } |
|
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
589 |
|
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
590 void |
|
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
591 ipv6nd_startexpire(struct interface *ifp) |
|
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
592 { |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
593 struct ra *rap; |
|
4534
003dc9907bba
RA: expire whole RA on carrier up
Roy Marples <roy@marples.name>
parents:
4532
diff
changeset
|
594 |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
595 if (ifp->ctx->ra_routers == NULL) |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
596 return; |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
597 |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
598 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
599 if (rap->iface == ifp) |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
600 rap->willexpire = true; |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
601 } |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
602 eloop_q_timeout_add_sec(ifp->ctx->eloop, ELOOP_IPV6RA_EXPIRE, |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
603 RTR_CARRIER_EXPIRE, ipv6nd_expire, ifp); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
604 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
605 |
|
5130
d34c808ae81e
Linux: Note router preference when adding routes
Roy Marples <roy@marples.name>
parents:
5109
diff
changeset
|
606 int |
|
4812
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
607 ipv6nd_rtpref(struct ra *rap) |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
608 { |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
609 |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
610 switch (rap->flags & ND_RA_FLAG_RTPREF_MASK) { |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
611 case ND_RA_FLAG_RTPREF_HIGH: |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
612 return RTPREF_HIGH; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
613 case ND_RA_FLAG_RTPREF_MEDIUM: |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
614 case ND_RA_FLAG_RTPREF_RSV: |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
615 return RTPREF_MEDIUM; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
616 case ND_RA_FLAG_RTPREF_LOW: |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
617 return RTPREF_LOW; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
618 default: |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
619 logerrx("%s: impossible RA flag %x", __func__, rap->flags); |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
620 return RTPREF_INVALID; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
621 } |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
622 /* NOTREACHED */ |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
623 } |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
624 |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
625 static void |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
626 ipv6nd_sortrouters(struct dhcpcd_ctx *ctx) |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
627 { |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
628 struct ra_head sorted_routers = TAILQ_HEAD_INITIALIZER(sorted_routers); |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
629 struct ra *ra1, *ra2; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
630 |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
631 while ((ra1 = TAILQ_FIRST(ctx->ra_routers)) != NULL) { |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
632 TAILQ_REMOVE(ctx->ra_routers, ra1, next); |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
633 TAILQ_FOREACH(ra2, &sorted_routers, next) { |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
634 if (ra1->iface->metric > ra2->iface->metric) |
|
4812
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
635 continue; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
636 if (ra1->expired && !ra2->expired) |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
637 continue; |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
638 if (ra1->willexpire && !ra2->willexpire) |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
639 continue; |
|
4812
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
640 if (ra1->lifetime == 0 && ra2->lifetime != 0) |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
641 continue; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
642 if (!ra1->isreachable && ra2->reachable) |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
643 continue; |
|
5085
c56d345a7b0d
RA: Prefer older routers at the preference
Roy Marples <roy@marples.name>
parents:
5083
diff
changeset
|
644 if (ipv6nd_rtpref(ra1) <= ipv6nd_rtpref(ra2)) |
|
4812
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
645 continue; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
646 /* All things being equal, prefer older routers. */ |
|
4929
597274e21b1a
inet6: Don't compare router dates when sorting
Roy Marples <roy@marples.name>
parents:
4924
diff
changeset
|
647 /* We don't need to check time, becase newer |
|
597274e21b1a
inet6: Don't compare router dates when sorting
Roy Marples <roy@marples.name>
parents:
4924
diff
changeset
|
648 * routers are always added to the tail and then |
|
597274e21b1a
inet6: Don't compare router dates when sorting
Roy Marples <roy@marples.name>
parents:
4924
diff
changeset
|
649 * sorted. */ |
|
4812
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
650 TAILQ_INSERT_BEFORE(ra2, ra1, next); |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
651 break; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
652 } |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
653 if (ra2 == NULL) |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
654 TAILQ_INSERT_TAIL(&sorted_routers, ra1, next); |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
655 } |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
656 |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
657 TAILQ_CONCAT(ctx->ra_routers, &sorted_routers, next); |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
658 } |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
659 |
|
4813
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
660 static void |
|
5179
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
661 ipv6nd_applyra(struct interface *ifp) |
|
4813
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
662 { |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
663 struct ra *rap; |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
664 struct rs_state *state = RS_STATE(ifp); |
|
5179
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
665 struct ra defra = { |
|
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
666 .iface = ifp, |
|
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
667 .hoplimit = IPV6_DEFHLIM , |
|
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
668 .reachable = REACHABLE_TIME, |
|
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
669 .retrans = RETRANS_TIMER, |
|
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
670 }; |
|
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
671 |
|
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
672 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
5181
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
673 if (rap->iface == ifp) |
|
4813
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
674 break; |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
675 } |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
676 |
|
5179
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
677 /* If we have no Router Advertisement, then set default values. */ |
|
5181
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
678 if (rap == NULL || rap->expired || rap->willexpire) |
|
5179
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
679 rap = &defra; |
|
4813
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
680 |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
681 state->retrans = rap->retrans; |
|
4916
7513775ead91
inet6: Adjust prior so that we don't support old kernels
Roy Marples <roy@marples.name>
parents:
4872
diff
changeset
|
682 if (if_applyra(rap) == -1 && errno != ENOENT) |
|
4813
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
683 logerr(__func__); |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
684 } |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
685 |
|
4669
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
686 /* |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
687 * Neighbour reachability. |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
688 * |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
689 * RFC 4681 6.2.5 says when a node is no longer a router it MUST |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
690 * send a RA with a zero lifetime. |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
691 * All OS's I know of set the NA router flag if they are a router |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
692 * or not and disregard that they are actively advertising or |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
693 * shutting down. If the interface is disabled, it cant't send a NA at all. |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
694 * |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
695 * As such we CANNOT rely on the NA Router flag and MUST use |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
696 * unreachability or receive a RA with a lifetime of zero to remove |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
697 * the node as a default router. |
|
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
698 */ |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
699 void |
|
4669
ec9d26e0de41
inet6: Stop reacting to kernel neighbour messages about a router
Roy Marples <roy@marples.name>
parents:
4667
diff
changeset
|
700 ipv6nd_neighbour(struct dhcpcd_ctx *ctx, struct in6_addr *addr, bool reachable) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
701 { |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
702 struct ra *rap, *rapr; |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
703 |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
704 if (ctx->ra_routers == NULL) |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
705 return; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
706 |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
707 TAILQ_FOREACH(rap, ctx->ra_routers, next) { |
|
4667
7cf17538b8b7
inet6: Stop listening to NA messages
Roy Marples <roy@marples.name>
parents:
4648
diff
changeset
|
708 if (IN6_ARE_ADDR_EQUAL(&rap->from, addr)) |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
709 break; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
710 } |
|
4667
7cf17538b8b7
inet6: Stop listening to NA messages
Roy Marples <roy@marples.name>
parents:
4648
diff
changeset
|
711 |
| 4872 | 712 if (rap == NULL || rap->expired || rap->isreachable == reachable) |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
713 return; |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
714 |
|
4812
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
715 rap->isreachable = reachable; |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
716 loginfox("%s: %s is %s", rap->iface->name, rap->sfrom, |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
717 reachable ? "reachable again" : "unreachable"); |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
718 |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
719 /* See if we can install a reachable default router. */ |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
720 ipv6nd_sortrouters(ctx); |
|
5179
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
721 ipv6nd_applyra(rap->iface); |
|
4812
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
722 rt_build(ctx, AF_INET6); |
|
4667
7cf17538b8b7
inet6: Stop listening to NA messages
Roy Marples <roy@marples.name>
parents:
4648
diff
changeset
|
723 |
|
4820
646c8e73cc8a
IPv6ND: If a router is reachable again, don't solicit another.
Roy Marples <roy@marples.name>
parents:
4819
diff
changeset
|
724 if (reachable) |
|
646c8e73cc8a
IPv6ND: If a router is reachable again, don't solicit another.
Roy Marples <roy@marples.name>
parents:
4819
diff
changeset
|
725 return; |
|
646c8e73cc8a
IPv6ND: If a router is reachable again, don't solicit another.
Roy Marples <roy@marples.name>
parents:
4819
diff
changeset
|
726 |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
727 /* If we have no reachable default routers, try and solicit one. */ |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
728 TAILQ_FOREACH(rapr, ctx->ra_routers, next) { |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
729 if (rap == rapr || rap->iface != rapr->iface) |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
730 continue; |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
731 if (rapr->isreachable && !rapr->expired && rapr->lifetime) |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
732 break; |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
733 } |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
734 |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
735 if (rapr == NULL) |
|
4647
82fa5c0d9714
inet6: Just solicit when a router is unreachable
Roy Marples <roy@marples.name>
parents:
4646
diff
changeset
|
736 ipv6nd_startrs(rap->iface); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
737 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
738 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
739 const struct ipv6_addr * |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
740 ipv6nd_iffindaddr(const struct interface *ifp, const struct in6_addr *addr, |
|
4123
441ac8d90316
Promote IPv6 dhcpcd address flags to unsignned int to allow expansion.
Roy Marples <roy@marples.name>
parents:
4116
diff
changeset
|
741 unsigned int flags) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
742 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
743 struct ra *rap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
744 struct ipv6_addr *ap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
745 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
746 if (ifp->ctx->ra_routers == NULL) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
747 return NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
748 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
749 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
750 if (rap->iface != ifp) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
751 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
752 TAILQ_FOREACH(ap, &rap->addrs, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
753 if (ipv6_findaddrmatch(ap, addr, flags)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
754 return ap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
755 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
756 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
757 return NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
758 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
759 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
760 struct ipv6_addr * |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
761 ipv6nd_findaddr(struct dhcpcd_ctx *ctx, const struct in6_addr *addr, |
|
4123
441ac8d90316
Promote IPv6 dhcpcd address flags to unsignned int to allow expansion.
Roy Marples <roy@marples.name>
parents:
4116
diff
changeset
|
762 unsigned int flags) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
763 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
764 struct ra *rap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
765 struct ipv6_addr *ap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
766 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
767 if (ctx->ra_routers == NULL) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
768 return NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
769 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
770 TAILQ_FOREACH(rap, ctx->ra_routers, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
771 TAILQ_FOREACH(ap, &rap->addrs, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
772 if (ipv6_findaddrmatch(ap, addr, flags)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
773 return ap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
774 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
775 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
776 return NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
777 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
778 |
|
5105
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
779 static struct ipv6_addr * |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
780 ipv6nd_rapfindprefix(struct ra *rap, |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
781 const struct in6_addr *pfx, uint8_t pfxlen) |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
782 { |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
783 struct ipv6_addr *ia; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
784 |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
785 TAILQ_FOREACH(ia, &rap->addrs, next) { |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
786 if (ia->prefix_vltime == 0) |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
787 continue; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
788 if (ia->prefix_len == pfxlen && |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
789 IN6_ARE_ADDR_EQUAL(&ia->prefix, pfx)) |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
790 break; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
791 } |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
792 return ia; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
793 } |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
794 |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
795 struct ipv6_addr * |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
796 ipv6nd_iffindprefix(struct interface *ifp, |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
797 const struct in6_addr *pfx, uint8_t pfxlen) |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
798 { |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
799 struct ra *rap; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
800 struct ipv6_addr *ia; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
801 |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
802 ia = NULL; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
803 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
804 if (rap->iface != ifp) |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
805 continue; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
806 ia = ipv6nd_rapfindprefix(rap, pfx, pfxlen); |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
807 if (ia != NULL) |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
808 break; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
809 } |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
810 return ia; |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
811 } |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
812 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
813 static void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
814 ipv6nd_removefreedrop_ra(struct ra *rap, int remove_ra, int drop_ra) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
815 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
816 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
817 eloop_timeout_delete(rap->iface->ctx->eloop, NULL, rap->iface); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
818 eloop_timeout_delete(rap->iface->ctx->eloop, NULL, rap); |
|
4141
45e849031aec
Ensure that all RA's are actually dropped when dropping an interface.
Roy Marples <roy@marples.name>
parents:
4140
diff
changeset
|
819 if (remove_ra) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
820 TAILQ_REMOVE(rap->iface->ctx->ra_routers, rap, next); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
821 ipv6_freedrop_addrs(&rap->addrs, drop_ra, NULL); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
822 free(rap->data); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
823 free(rap); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
824 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
825 |
|
4140
57e2a4bfb9b7
ipv6nd_freedrop is no longer public.
Roy Marples <roy@marples.name>
parents:
4123
diff
changeset
|
826 static void |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
827 ipv6nd_freedrop_ra(struct ra *rap, int drop) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
828 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
829 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
830 ipv6nd_removefreedrop_ra(rap, 1, drop); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
831 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
832 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
833 ssize_t |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
834 ipv6nd_free(struct interface *ifp) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
835 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
836 struct rs_state *state; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
837 struct ra *rap, *ran; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
838 struct dhcpcd_ctx *ctx; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
839 ssize_t n; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
840 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
841 state = RS_STATE(ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
842 if (state == NULL) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
843 return 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
844 |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
845 ctx = ifp->ctx; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
846 #ifdef __sun |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
847 eloop_event_delete(ctx->eloop, state->nd_fd); |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
848 close(state->nd_fd); |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
849 #endif |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
850 free(state->rs); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
851 free(state); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
852 ifp->if_data[IF_DATA_IPV6ND] = NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
853 n = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
854 TAILQ_FOREACH_SAFE(rap, ifp->ctx->ra_routers, next, ran) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
855 if (rap->iface == ifp) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
856 ipv6nd_free_ra(rap); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
857 n++; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
858 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
859 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
860 |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
861 #ifndef __sun |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
862 /* If we don't have any more IPv6 enabled interfaces, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
863 * close the global socket and release resources */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
864 TAILQ_FOREACH(ifp, ctx->ifaces, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
865 if (RS_STATE(ifp)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
866 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
867 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
868 if (ifp == NULL) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
869 if (ctx->nd_fd != -1) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
870 eloop_event_delete(ctx->eloop, ctx->nd_fd); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
871 close(ctx->nd_fd); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
872 ctx->nd_fd = -1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
873 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
874 } |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
875 #endif |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
876 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
877 return n; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
878 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
879 |
|
4856
a0a073f9c5ef
dhcpcd: Rework daemonisation
Roy Marples <roy@marples.name>
parents:
4842
diff
changeset
|
880 static void |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
881 ipv6nd_scriptrun(struct ra *rap) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
882 { |
|
4856
a0a073f9c5ef
dhcpcd: Rework daemonisation
Roy Marples <roy@marples.name>
parents:
4842
diff
changeset
|
883 int hasdns, hasaddress; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
884 struct ipv6_addr *ap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
885 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
886 hasaddress = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
887 /* If all addresses have completed DAD run the script */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
888 TAILQ_FOREACH(ap, &rap->addrs, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
889 if ((ap->flags & (IPV6_AF_AUTOCONF | IPV6_AF_ADDED)) == |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
890 (IPV6_AF_AUTOCONF | IPV6_AF_ADDED)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
891 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
892 hasaddress = 1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
893 if (!(ap->flags & IPV6_AF_DADCOMPLETED) && |
|
3960
42a6a3d1596e
Remove custom logger and output all diagnostics via syslog(3).
Roy Marples <roy@marples.name>
parents:
3932
diff
changeset
|
894 ipv6_iffindaddr(ap->iface, &ap->addr, |
|
42a6a3d1596e
Remove custom logger and output all diagnostics via syslog(3).
Roy Marples <roy@marples.name>
parents:
3932
diff
changeset
|
895 IN6_IFF_TENTATIVE)) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
896 ap->flags |= IPV6_AF_DADCOMPLETED; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
897 if ((ap->flags & IPV6_AF_DADCOMPLETED) == 0) { |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
898 logdebugx("%s: waiting for Router Advertisement" |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
899 " DAD to complete", |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
900 rap->iface->name); |
|
4856
a0a073f9c5ef
dhcpcd: Rework daemonisation
Roy Marples <roy@marples.name>
parents:
4842
diff
changeset
|
901 return; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
902 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
903 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
904 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
905 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
906 /* If we don't require RDNSS then set hasdns = 1 so we fork */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
907 if (!(rap->iface->options->options & DHCPCD_IPV6RA_REQRDNSS)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
908 hasdns = 1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
909 else { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
910 hasdns = rap->hasdns; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
911 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
912 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
913 script_runreason(rap->iface, "ROUTERADVERT"); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
914 if (hasdns && (hasaddress || |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
915 !(rap->flags & (ND_RA_FLAG_MANAGED | ND_RA_FLAG_OTHER)))) |
|
4856
a0a073f9c5ef
dhcpcd: Rework daemonisation
Roy Marples <roy@marples.name>
parents:
4842
diff
changeset
|
916 dhcpcd_daemonise(rap->iface->ctx); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
917 #if 0 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
918 else if (options & DHCPCD_DAEMONISE && |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
919 !(options & DHCPCD_DAEMONISED) && new_data) |
| 4010 | 920 logwarnx("%s: did not fork due to an absent" |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
921 " RDNSS option in the RA", |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
922 ifp->name); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
923 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
924 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
925 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
926 static void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
927 ipv6nd_addaddr(void *arg) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
928 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
929 struct ipv6_addr *ap = arg; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
930 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
931 ipv6_addaddr(ap, NULL); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
932 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
933 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
934 int |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
935 ipv6nd_dadcompleted(const struct interface *ifp) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
936 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
937 const struct ra *rap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
938 const struct ipv6_addr *ap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
939 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
940 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
941 if (rap->iface != ifp) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
942 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
943 TAILQ_FOREACH(ap, &rap->addrs, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
944 if (ap->flags & IPV6_AF_AUTOCONF && |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
945 ap->flags & IPV6_AF_ADDED && |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
946 !(ap->flags & IPV6_AF_DADCOMPLETED)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
947 return 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
948 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
949 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
950 return 1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
951 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
952 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
953 static void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
954 ipv6nd_dadcallback(void *arg) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
955 { |
| 4116 | 956 struct ipv6_addr *ia = arg, *rapap; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
957 struct interface *ifp; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
958 struct ra *rap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
959 int wascompleted, found; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
960 char buf[INET6_ADDRSTRLEN]; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
961 const char *p; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
962 int dadcounter; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
963 |
| 4116 | 964 ifp = ia->iface; |
| 965 wascompleted = (ia->flags & IPV6_AF_DADCOMPLETED); | |
| 966 ia->flags |= IPV6_AF_DADCOMPLETED; | |
|
5171
5943646f9dd3
DHCP6: Implement DECLINE support for duplicated addresses
Roy Marples <roy@marples.name>
parents:
5160
diff
changeset
|
967 if (ia->addr_flags & IN6_IFF_DUPLICATED) { |
| 4116 | 968 ia->dadcounter++; |
| 969 logwarnx("%s: DAD detected %s", ifp->name, ia->saddr); | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
970 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
971 /* Try and make another stable private address. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
972 * Because ap->dadcounter is always increamented, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
973 * a different address is generated. */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
974 /* XXX Cache DAD counter per prefix/id/ssid? */ |
|
4982
661857d82a40
inet6: Check if we can try a new address on DAD failure.
Roy Marples <roy@marples.name>
parents:
4981
diff
changeset
|
975 if (ifp->options->options & DHCPCD_SLAACPRIVATE && |
|
661857d82a40
inet6: Check if we can try a new address on DAD failure.
Roy Marples <roy@marples.name>
parents:
4981
diff
changeset
|
976 IA6_CANAUTOCONF(ia)) |
|
661857d82a40
inet6: Check if we can try a new address on DAD failure.
Roy Marples <roy@marples.name>
parents:
4981
diff
changeset
|
977 { |
|
4934
64d2e5e77cc3
inet6: Use milliseconds rather than timespec for calcuating delays
Roy Marples <roy@marples.name>
parents:
4929
diff
changeset
|
978 unsigned int delay; |
|
64d2e5e77cc3
inet6: Use milliseconds rather than timespec for calcuating delays
Roy Marples <roy@marples.name>
parents:
4929
diff
changeset
|
979 |
| 4116 | 980 if (ia->dadcounter >= IDGEN_RETRIES) { |
| 4010 | 981 logerrx("%s: unable to obtain a" |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
982 " stable private address", |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
983 ifp->name); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
984 goto try_script; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
985 } |
|
4024
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
986 loginfox("%s: deleting address %s", |
| 4116 | 987 ifp->name, ia->saddr); |
| 988 if (if_address6(RTM_DELADDR, ia) == -1 && | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
989 errno != EADDRNOTAVAIL && errno != ENXIO) |
| 4010 | 990 logerr(__func__); |
| 4116 | 991 dadcounter = ia->dadcounter; |
| 992 if (ipv6_makestableprivate(&ia->addr, | |
| 993 &ia->prefix, ia->prefix_len, | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
994 ifp, &dadcounter) == -1) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
995 { |
| 4010 | 996 logerr("ipv6_makestableprivate"); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
997 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
998 } |
| 4116 | 999 ia->dadcounter = dadcounter; |
| 1000 ia->flags &= ~(IPV6_AF_ADDED | IPV6_AF_DADCOMPLETED); | |
| 1001 ia->flags |= IPV6_AF_NEW; | |
| 1002 p = inet_ntop(AF_INET6, &ia->addr, buf, sizeof(buf)); | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1003 if (p) |
| 4116 | 1004 snprintf(ia->saddr, |
| 1005 sizeof(ia->saddr), | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1006 "%s/%d", |
| 4116 | 1007 p, ia->prefix_len); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1008 else |
| 4116 | 1009 ia->saddr[0] = '\0'; |
|
4934
64d2e5e77cc3
inet6: Use milliseconds rather than timespec for calcuating delays
Roy Marples <roy@marples.name>
parents:
4929
diff
changeset
|
1010 delay = arc4random_uniform(IDGEN_DELAY * MSEC_PER_SEC); |
|
64d2e5e77cc3
inet6: Use milliseconds rather than timespec for calcuating delays
Roy Marples <roy@marples.name>
parents:
4929
diff
changeset
|
1011 eloop_timeout_add_msec(ifp->ctx->eloop, delay, |
| 4116 | 1012 ipv6nd_addaddr, ia); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1013 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1014 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1015 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1016 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1017 try_script: |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1018 if (!wascompleted) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1019 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1020 if (rap->iface != ifp) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1021 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1022 wascompleted = 1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1023 found = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1024 TAILQ_FOREACH(rapap, &rap->addrs, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1025 if (rapap->flags & IPV6_AF_AUTOCONF && |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1026 rapap->flags & IPV6_AF_ADDED && |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1027 (rapap->flags & IPV6_AF_DADCOMPLETED) == 0) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1028 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1029 wascompleted = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1030 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1031 } |
| 4116 | 1032 if (rapap == ia) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1033 found = 1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1034 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1035 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1036 if (wascompleted && found) { |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
1037 logdebugx("%s: Router Advertisement DAD " |
| 4010 | 1038 "completed", |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1039 rap->iface->name); |
|
4856
a0a073f9c5ef
dhcpcd: Rework daemonisation
Roy Marples <roy@marples.name>
parents:
4842
diff
changeset
|
1040 ipv6nd_scriptrun(rap); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1041 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1042 } |
|
4588
6aced73a8438
Remove ND6 Advertisement from SMALL builds.
Roy Marples <roy@marples.name>
parents:
4564
diff
changeset
|
1043 #ifdef ND6_ADVERTISE |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
1044 ipv6nd_advertise(ia); |
|
4588
6aced73a8438
Remove ND6 Advertisement from SMALL builds.
Roy Marples <roy@marples.name>
parents:
4564
diff
changeset
|
1045 #endif |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1046 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1047 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1048 |
|
5107
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1049 static struct ipv6_addr * |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1050 ipv6nd_findmarkstale(struct ra *rap, struct ipv6_addr *ia, bool mark) |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1051 { |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1052 struct dhcpcd_ctx *ctx = ia->iface->ctx; |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1053 struct ra *rap2; |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1054 struct ipv6_addr *ia2; |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1055 |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1056 TAILQ_FOREACH(rap2, ctx->ra_routers, next) { |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1057 if (rap2 == rap || |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1058 rap2->iface != rap->iface || |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1059 rap2->expired) |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1060 continue; |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1061 TAILQ_FOREACH(ia2, &rap2->addrs, next) { |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1062 if (!IN6_ARE_ADDR_EQUAL(&ia->prefix, &ia2->prefix)) |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1063 continue; |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1064 if (!(ia2->flags & IPV6_AF_STALE)) |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1065 return ia2; |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1066 if (mark) |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1067 ia2->prefix_pltime = 0; |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1068 } |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1069 } |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1070 return NULL; |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1071 } |
|
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1072 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1073 #ifndef DHCP6 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1074 /* If DHCPv6 is compiled out, supply a shim to provide an error message |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1075 * if IPv6RA requests DHCPv6. */ |
|
4349
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1076 enum DH6S { |
|
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1077 DH6S_REQUEST, |
|
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1078 DH6S_INFORM, |
|
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1079 }; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1080 static int |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1081 dhcp6_start(__unused struct interface *ifp, __unused enum DH6S init_state) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1082 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1083 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1084 errno = ENOTSUP; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1085 return -1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1086 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1087 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1088 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1089 static void |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1090 ipv6nd_handlera(struct dhcpcd_ctx *ctx, |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1091 const struct sockaddr_in6 *from, const char *sfrom, |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1092 struct interface *ifp, struct icmp6_hdr *icp, size_t len, int hoplimit) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1093 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1094 size_t i, olen; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1095 struct nd_router_advert *nd_ra; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1096 struct nd_opt_hdr ndo; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1097 struct nd_opt_prefix_info pi; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1098 struct nd_opt_mtu mtu; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1099 struct nd_opt_rdnss rdnss; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1100 uint8_t *p; |
|
5107
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1101 struct ra *rap; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1102 struct in6_addr pi_prefix; |
|
5107
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1103 struct ipv6_addr *ia; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1104 struct dhcp_opt *dho; |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1105 bool new_rap, new_data, has_address; |
|
4268
bd01addbb40f
ipv6nd: warn if router lifetime is set to zero
Roy Marples <roy@marples.name>
parents:
4267
diff
changeset
|
1106 uint32_t old_lifetime; |
|
4819
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1107 int ifmtu; |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
5044
diff
changeset
|
1108 int loglevel; |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1109 unsigned int flags; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1110 #ifdef IPV6_MANAGETEMPADDR |
| 5082 | 1111 bool new_ia; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1112 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1113 |
| 5322 | 1114 if (ifp == NULL || RS_STATE(ifp) == NULL) { |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1115 #ifdef DEBUG_RS |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1116 logdebugx("RA for unexpected interface from %s", sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1117 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1118 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1119 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1120 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1121 if (len < sizeof(struct nd_router_advert)) { |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1122 logerrx("IPv6 RA packet too short from %s", sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1123 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1124 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1125 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1126 /* RFC 4861 7.1.2 */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1127 if (hoplimit != 255) { |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1128 logerrx("invalid hoplimit(%d) in RA from %s", hoplimit, sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1129 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1130 } |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1131 if (!IN6_IS_ADDR_LINKLOCAL(&from->sin6_addr)) { |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1132 logerrx("RA from non local address %s", sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1133 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1134 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1135 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1136 if (!(ifp->options->options & DHCPCD_IPV6RS)) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1137 #ifdef DEBUG_RS |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1138 logerrx("%s: unexpected RA from %s", ifp->name, sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1139 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1140 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1141 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1142 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1143 /* We could receive a RA before we sent a RS*/ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1144 if (ipv6_linklocal(ifp) == NULL) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1145 #ifdef DEBUG_RS |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
1146 logdebugx("%s: received RA from %s (no link-local)", |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1147 ifp->name, sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1148 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1149 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1150 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1151 |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1152 if (ipv6_iffindaddr(ifp, &from->sin6_addr, IN6_IFF_TENTATIVE)) { |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
1153 logdebugx("%s: ignoring RA from ourself %s", |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1154 ifp->name, sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1155 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1156 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1157 |
|
5181
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1158 #ifdef NOCARRIER_PRESERVE_IP |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1159 /* |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1160 * Because we preserve RA's and expire them quickly after |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1161 * carrier up, it's important to reset the kernels notion of |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1162 * reachable timers back to default values before applying |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1163 * new RA values. |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1164 */ |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1165 TAILQ_FOREACH(rap, ctx->ra_routers, next) { |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1166 if (ifp == rap->iface) |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1167 break; |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1168 } |
| 5346 | 1169 if (rap != NULL && rap->willexpire) |
|
5181
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1170 ipv6nd_applyra(ifp); |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1171 #endif |
|
6788ac9191a7
inet6: Set default ND timers before a RA arrives after preservation
Roy Marples <roy@marples.name>
parents:
5180
diff
changeset
|
1172 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1173 TAILQ_FOREACH(rap, ctx->ra_routers, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1174 if (ifp == rap->iface && |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1175 IN6_ARE_ADDR_EQUAL(&rap->from, &from->sin6_addr)) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1176 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1177 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1178 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1179 nd_ra = (struct nd_router_advert *)icp; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1180 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1181 /* We don't want to spam the log with the fact we got an RA every |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1182 * 30 seconds or so, so only spam the log if it's different. */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1183 if (rap == NULL || (rap->data_len != len || |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1184 memcmp(rap->data, (unsigned char *)icp, rap->data_len) != 0)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1185 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1186 if (rap) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1187 free(rap->data); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1188 rap->data_len = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1189 } |
| 4269 | 1190 new_data = true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1191 } else |
| 4269 | 1192 new_data = false; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1193 if (rap == NULL) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1194 rap = calloc(1, sizeof(*rap)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1195 if (rap == NULL) { |
| 4010 | 1196 logerr(__func__); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1197 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1198 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1199 rap->iface = ifp; |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1200 rap->from = from->sin6_addr; |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1201 strlcpy(rap->sfrom, sfrom, sizeof(rap->sfrom)); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1202 TAILQ_INIT(&rap->addrs); |
| 4269 | 1203 new_rap = true; |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1204 rap->isreachable = true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1205 } else |
| 4269 | 1206 new_rap = false; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1207 if (rap->data_len == 0) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1208 rap->data = malloc(len); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1209 if (rap->data == NULL) { |
| 4010 | 1210 logerr(__func__); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1211 if (new_rap) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1212 free(rap); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1213 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1214 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1215 memcpy(rap->data, icp, len); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1216 rap->data_len = len; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1217 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1218 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1219 /* We could change the debug level based on new_data, but some |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1220 * routers like to decrease the advertised valid and preferred times |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1221 * in accordance with the own prefix times which would result in too |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1222 * much needless log spam. */ |
|
5044
f51d310db3b7
inet6: Swap between DISCOVER and INFORM better
Roy Marples <roy@marples.name>
parents:
5040
diff
changeset
|
1223 if (rap->willexpire) |
|
f51d310db3b7
inet6: Swap between DISCOVER and INFORM better
Roy Marples <roy@marples.name>
parents:
5040
diff
changeset
|
1224 new_data = true; |
|
5150
85569e7510f2
inet6: Only log RA's when they are from a new server
Roy Marples <roy@marples.name>
parents:
5130
diff
changeset
|
1225 loglevel = new_rap || rap->willexpire || !rap->isreachable ? |
| 5484 | 1226 LOG_INFO : LOG_DEBUG; |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
5044
diff
changeset
|
1227 logmessage(loglevel, "%s: Router Advertisement from %s", |
|
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
5044
diff
changeset
|
1228 ifp->name, rap->sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1229 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1230 clock_gettime(CLOCK_MONOTONIC, &rap->acquired); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1231 rap->flags = nd_ra->nd_ra_flags_reserved; |
|
4268
bd01addbb40f
ipv6nd: warn if router lifetime is set to zero
Roy Marples <roy@marples.name>
parents:
4267
diff
changeset
|
1232 old_lifetime = rap->lifetime; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1233 rap->lifetime = ntohs(nd_ra->nd_ra_router_lifetime); |
|
4268
bd01addbb40f
ipv6nd: warn if router lifetime is set to zero
Roy Marples <roy@marples.name>
parents:
4267
diff
changeset
|
1234 if (!new_rap && rap->lifetime == 0 && old_lifetime != 0) |
|
bd01addbb40f
ipv6nd: warn if router lifetime is set to zero
Roy Marples <roy@marples.name>
parents:
4267
diff
changeset
|
1235 logwarnx("%s: %s: no longer a default router", |
|
bd01addbb40f
ipv6nd: warn if router lifetime is set to zero
Roy Marples <roy@marples.name>
parents:
4267
diff
changeset
|
1236 ifp->name, rap->sfrom); |
|
4813
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1237 if (nd_ra->nd_ra_curhoplimit != 0) |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1238 rap->hoplimit = nd_ra->nd_ra_curhoplimit; |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1239 else |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1240 rap->hoplimit = IPV6_DEFHLIM; |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1241 if (nd_ra->nd_ra_reachable != 0) { |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1242 rap->reachable = ntohl(nd_ra->nd_ra_reachable); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1243 if (rap->reachable > MAX_REACHABLE_TIME) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1244 rap->reachable = 0; |
|
4813
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1245 } else |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1246 rap->reachable = REACHABLE_TIME; |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1247 if (nd_ra->nd_ra_retransmit != 0) |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1248 rap->retrans = ntohl(nd_ra->nd_ra_retransmit); |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1249 else |
|
ef33eb73e97d
INET6: Apply hoplimit, reachable and retrans timer values from RA.
Roy Marples <roy@marples.name>
parents:
4812
diff
changeset
|
1250 rap->retrans = RETRANS_TIMER; |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1251 rap->expired = rap->willexpire = rap->doexpire = false; |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1252 rap->hasdns = false; |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1253 rap->isreachable = true; |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1254 has_address = false; |
|
4822
8ea5c8980467
RA: Set mtu to zero and then pull in the MTU option if any
Roy Marples <roy@marples.name>
parents:
4820
diff
changeset
|
1255 rap->mtu = 0; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1256 |
| 4237 | 1257 #ifdef IPV6_AF_TEMPORARY |
|
4235
27bad70c0d9c
link: detect buffer overflow / desync and relearn interface state
Roy Marples <roy@marples.name>
parents:
4234
diff
changeset
|
1258 ipv6_markaddrsstale(ifp, IPV6_AF_TEMPORARY); |
| 4237 | 1259 #endif |
| 5082 | 1260 TAILQ_FOREACH(ia, &rap->addrs, next) { |
| 1261 ia->flags |= IPV6_AF_STALE; | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1262 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1263 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1264 len -= sizeof(struct nd_router_advert); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1265 p = ((uint8_t *)icp) + sizeof(struct nd_router_advert); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1266 for (; len > 0; p += olen, len -= olen) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1267 if (len < sizeof(ndo)) { |
| 4010 | 1268 logerrx("%s: short option", ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1269 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1270 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1271 memcpy(&ndo, p, sizeof(ndo)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1272 olen = (size_t)ndo.nd_opt_len * 8; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1273 if (olen == 0) { |
| 4010 | 1274 logerrx("%s: zero length option", ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1275 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1276 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1277 if (olen > len) { |
| 4010 | 1278 logerrx("%s: option length exceeds message", |
|
3960
42a6a3d1596e
Remove custom logger and output all diagnostics via syslog(3).
Roy Marples <roy@marples.name>
parents:
3932
diff
changeset
|
1279 ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1280 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1281 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1282 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1283 if (has_option_mask(ifp->options->rejectmasknd, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1284 ndo.nd_opt_type)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1285 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1286 for (i = 0, dho = ctx->nd_opts; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1287 i < ctx->nd_opts_len; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1288 i++, dho++) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1289 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1290 if (dho->option == ndo.nd_opt_type) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1291 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1292 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1293 if (dho != NULL) |
| 4010 | 1294 logwarnx("%s: reject RA (option %s) from %s", |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1295 ifp->name, dho->var, rap->sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1296 else |
| 4010 | 1297 logwarnx("%s: reject RA (option %d) from %s", |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1298 ifp->name, ndo.nd_opt_type, rap->sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1299 if (new_rap) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1300 ipv6nd_removefreedrop_ra(rap, 0, 0); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1301 else |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1302 ipv6nd_free_ra(rap); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1303 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1304 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1305 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1306 if (has_option_mask(ifp->options->nomasknd, ndo.nd_opt_type)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1307 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1308 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1309 switch (ndo.nd_opt_type) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1310 case ND_OPT_PREFIX_INFORMATION: |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
5044
diff
changeset
|
1311 loglevel = new_data ? LOG_ERR : LOG_DEBUG; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1312 if (ndo.nd_opt_len != 4) { |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1313 logmessage(loglevel, |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1314 "%s: invalid option len for prefix", |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1315 ifp->name); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1316 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1317 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1318 memcpy(&pi, p, sizeof(pi)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1319 if (pi.nd_opt_pi_prefix_len > 128) { |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1320 logmessage(loglevel, "%s: invalid prefix len", |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1321 ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1322 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1323 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1324 /* nd_opt_pi_prefix is not aligned. */ |
|
3960
42a6a3d1596e
Remove custom logger and output all diagnostics via syslog(3).
Roy Marples <roy@marples.name>
parents:
3932
diff
changeset
|
1325 memcpy(&pi_prefix, &pi.nd_opt_pi_prefix, |
|
42a6a3d1596e
Remove custom logger and output all diagnostics via syslog(3).
Roy Marples <roy@marples.name>
parents:
3932
diff
changeset
|
1326 sizeof(pi_prefix)); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1327 if (IN6_IS_ADDR_MULTICAST(&pi_prefix) || |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1328 IN6_IS_ADDR_LINKLOCAL(&pi_prefix)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1329 { |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1330 logmessage(loglevel, "%s: invalid prefix in RA", |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1331 ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1332 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1333 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1334 if (ntohl(pi.nd_opt_pi_preferred_time) > |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1335 ntohl(pi.nd_opt_pi_valid_time)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1336 { |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1337 logmessage(loglevel, "%s: pltime > vltime", |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1338 ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1339 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1340 } |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1341 |
|
5372
a64688cee252
inet6: No flags on the prefix means the prefix is via the router
Roy Marples <roy@marples.name>
parents:
5363
diff
changeset
|
1342 flags = IPV6_AF_RAPFX; |
|
a64688cee252
inet6: No flags on the prefix means the prefix is via the router
Roy Marples <roy@marples.name>
parents:
5363
diff
changeset
|
1343 /* If no flags are set, that means the prefix is |
|
a64688cee252
inet6: No flags on the prefix means the prefix is via the router
Roy Marples <roy@marples.name>
parents:
5363
diff
changeset
|
1344 * available via the router. */ |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1345 if (pi.nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_ONLINK) |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1346 flags |= IPV6_AF_ONLINK; |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1347 if (pi.nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_AUTO && |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1348 rap->iface->options->options & |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1349 DHCPCD_IPV6RA_AUTOCONF) |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1350 flags |= IPV6_AF_AUTOCONF; |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1351 if (pi.nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_ROUTER) |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1352 flags |= IPV6_AF_ROUTER; |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1353 |
|
5105
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
1354 ia = ipv6nd_rapfindprefix(rap, |
|
88e25390d763
ND: If a secondary router adds the same prefix, use it's address
Roy Marples <roy@marples.name>
parents:
5104
diff
changeset
|
1355 &pi_prefix, pi.nd_opt_pi_prefix_len); |
| 5082 | 1356 if (ia == NULL) { |
| 1357 ia = ipv6_newaddr(rap->iface, | |
|
5372
a64688cee252
inet6: No flags on the prefix means the prefix is via the router
Roy Marples <roy@marples.name>
parents:
5363
diff
changeset
|
1358 &pi_prefix, pi.nd_opt_pi_prefix_len, flags); |
| 5082 | 1359 if (ia == NULL) |
|
4090
62f8388ea690
Make ipv6_newaddr() more flexable so it's the sole source of
Roy Marples <roy@marples.name>
parents:
4076
diff
changeset
|
1360 break; |
| 5082 | 1361 ia->prefix = pi_prefix; |
|
4336
881356480905
ip6: Install not on link routes with a gateway of the router
Roy Marples <roy@marples.name>
parents:
4335
diff
changeset
|
1362 if (flags & IPV6_AF_AUTOCONF) |
| 5082 | 1363 ia->dadcallback = ipv6nd_dadcallback; |
| 1364 ia->created = ia->acquired = rap->acquired; | |
| 1365 TAILQ_INSERT_TAIL(&rap->addrs, ia, next); | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1366 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1367 #ifdef IPV6_MANAGETEMPADDR |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1368 /* New address to dhcpcd RA handling. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1369 * If the address already exists and a valid |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1370 * temporary address also exists then |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1371 * extend the existing one rather than |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1372 * create a new one */ |
|
4336
881356480905
ip6: Install not on link routes with a gateway of the router
Roy Marples <roy@marples.name>
parents:
4335
diff
changeset
|
1373 if (flags & IPV6_AF_AUTOCONF && |
| 5082 | 1374 ipv6_iffindaddr(ifp, &ia->addr, |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1375 IN6_IFF_NOTUSEABLE) && |
| 5082 | 1376 ipv6_settemptime(ia, 0)) |
| 1377 new_ia = false; | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1378 else |
| 5082 | 1379 new_ia = true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1380 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1381 } else { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1382 #ifdef IPV6_MANAGETEMPADDR |
| 5082 | 1383 new_ia = false; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1384 #endif |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1385 ia->flags |= flags; |
| 5082 | 1386 ia->flags &= ~IPV6_AF_STALE; |
| 1387 ia->acquired = rap->acquired; | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1388 } |
| 5082 | 1389 ia->prefix_vltime = |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1390 ntohl(pi.nd_opt_pi_valid_time); |
| 5082 | 1391 ia->prefix_pltime = |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1392 ntohl(pi.nd_opt_pi_preferred_time); |
| 5082 | 1393 if (ia->prefix_vltime != 0 && |
| 1394 ia->flags & IPV6_AF_AUTOCONF) | |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1395 has_address = true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1396 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1397 #ifdef IPV6_MANAGETEMPADDR |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1398 /* RFC4941 Section 3.3.3 */ |
| 5082 | 1399 if (ia->flags & IPV6_AF_AUTOCONF && |
|
5153
8248b3a04908
inet6: Add 'temporary' directive to the slaac option
Roy Marples <roy@marples.name>
parents:
5150
diff
changeset
|
1400 ia->iface->options->options & DHCPCD_SLAACTEMP && |
| 5082 | 1401 IA6_CANAUTOCONF(ia)) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1402 { |
| 5082 | 1403 if (!new_ia) { |
| 1404 if (ipv6_settemptime(ia, 1) == NULL) | |
| 1405 new_ia = true; | |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1406 } |
| 5082 | 1407 if (new_ia && ia->prefix_pltime) { |
| 1408 if (ipv6_createtempaddr(ia, | |
| 1409 &ia->acquired) == NULL) | |
| 4010 | 1410 logerr("ipv6_createtempaddr"); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1411 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1412 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1413 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1414 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1415 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1416 case ND_OPT_MTU: |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1417 if (len < sizeof(mtu)) { |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
5044
diff
changeset
|
1418 logmessage(loglevel, "%s: short MTU option", ifp->name); |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1419 break; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1420 } |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1421 memcpy(&mtu, p, sizeof(mtu)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1422 mtu.nd_opt_mtu_mtu = ntohl(mtu.nd_opt_mtu_mtu); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1423 if (mtu.nd_opt_mtu_mtu < IPV6_MMTU) { |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
5044
diff
changeset
|
1424 logmessage(loglevel, "%s: invalid MTU %d", |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1425 ifp->name, mtu.nd_opt_mtu_mtu); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1426 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1427 } |
|
4819
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1428 ifmtu = if_getmtu(ifp); |
|
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1429 if (ifmtu == -1) |
|
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1430 logerr("if_getmtu"); |
|
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1431 else if (mtu.nd_opt_mtu_mtu > (uint32_t)ifmtu) { |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
5044
diff
changeset
|
1432 logmessage(loglevel, "%s: advertised MTU %d" |
|
4819
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1433 " is greater than link MTU %d", |
|
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1434 ifp->name, mtu.nd_opt_mtu_mtu, ifmtu); |
|
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1435 rap->mtu = (uint32_t)ifmtu; |
|
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1436 } else |
|
20f0d2d242a1
RA: Warn if advertised MTU is greater than link MTU
Roy Marples <roy@marples.name>
parents:
4813
diff
changeset
|
1437 rap->mtu = mtu.nd_opt_mtu_mtu; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1438 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1439 case ND_OPT_RDNSS: |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1440 if (len < sizeof(rdnss)) { |
|
5064
7721231839f5
logerr: Use macros to call log functions
Sergey Nikiforov <Sergey.Nikiforov@kaspersky.com>
parents:
5044
diff
changeset
|
1441 logmessage(loglevel, "%s: short RDNSS option", ifp->name); |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1442 break; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1443 } |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1444 memcpy(&rdnss, p, sizeof(rdnss)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1445 if (rdnss.nd_opt_rdnss_lifetime && |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1446 rdnss.nd_opt_rdnss_len > 1) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1447 rap->hasdns = 1; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1448 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1449 default: |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1450 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1451 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1452 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1453 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1454 for (i = 0, dho = ctx->nd_opts; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1455 i < ctx->nd_opts_len; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1456 i++, dho++) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1457 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1458 if (has_option_mask(ifp->options->requiremasknd, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1459 dho->option)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1460 { |
| 4010 | 1461 logwarnx("%s: reject RA (no option %s) from %s", |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1462 ifp->name, dho->var, rap->sfrom); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1463 if (new_rap) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1464 ipv6nd_removefreedrop_ra(rap, 0, 0); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1465 else |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1466 ipv6nd_free_ra(rap); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1467 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1468 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1469 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1470 |
|
5083
705e8e8d8f60
IPv6ND: Mark stale addresses/prefixes with a pltime of zero.
Roy Marples <roy@marples.name>
parents:
5082
diff
changeset
|
1471 TAILQ_FOREACH(ia, &rap->addrs, next) { |
|
705e8e8d8f60
IPv6ND: Mark stale addresses/prefixes with a pltime of zero.
Roy Marples <roy@marples.name>
parents:
5082
diff
changeset
|
1472 if (!(ia->flags & IPV6_AF_STALE) || ia->prefix_pltime == 0) |
|
705e8e8d8f60
IPv6ND: Mark stale addresses/prefixes with a pltime of zero.
Roy Marples <roy@marples.name>
parents:
5082
diff
changeset
|
1473 continue; |
|
5107
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1474 if (ipv6nd_findmarkstale(rap, ia, false) != NULL) |
|
5104
2804763cefbd
ND: Only deprecate prefixes when all stale
Roy Marples <roy@marples.name>
parents:
5096
diff
changeset
|
1475 continue; |
|
5107
a3da4f12835f
ND: Improve stale detection for >1 router
Roy Marples <roy@marples.name>
parents:
5106
diff
changeset
|
1476 ipv6nd_findmarkstale(rap, ia, true); |
|
5083
705e8e8d8f60
IPv6ND: Mark stale addresses/prefixes with a pltime of zero.
Roy Marples <roy@marples.name>
parents:
5082
diff
changeset
|
1477 logdebugx("%s: %s: became stale", ifp->name, ia->saddr); |
|
5109
a7b7abb6211c
Note that setting pltime to zero for stale addresses isn't RFC compliant
Roy Marples <roy@marples.name>
parents:
5107
diff
changeset
|
1478 /* Technically this violates RFC 4861 6.3.4, |
|
a7b7abb6211c
Note that setting pltime to zero for stale addresses isn't RFC compliant
Roy Marples <roy@marples.name>
parents:
5107
diff
changeset
|
1479 * but we need a mechanism to tell the kernel to |
|
a7b7abb6211c
Note that setting pltime to zero for stale addresses isn't RFC compliant
Roy Marples <roy@marples.name>
parents:
5107
diff
changeset
|
1480 * try and prefer other addresses. */ |
|
5083
705e8e8d8f60
IPv6ND: Mark stale addresses/prefixes with a pltime of zero.
Roy Marples <roy@marples.name>
parents:
5082
diff
changeset
|
1481 ia->prefix_pltime = 0; |
|
705e8e8d8f60
IPv6ND: Mark stale addresses/prefixes with a pltime of zero.
Roy Marples <roy@marples.name>
parents:
5082
diff
changeset
|
1482 } |
|
705e8e8d8f60
IPv6ND: Mark stale addresses/prefixes with a pltime of zero.
Roy Marples <roy@marples.name>
parents:
5082
diff
changeset
|
1483 |
|
4702
b2b39cc615ad
inet6: Fix default route not being installed
Roy Marples <roy@marples.name>
parents:
4686
diff
changeset
|
1484 if (new_data && !has_address && rap->lifetime && !ipv6_anyglobal(ifp)) |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1485 logwarnx("%s: no global addresses for default route", |
|
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1486 ifp->name); |
|
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1487 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1488 if (new_rap) |
|
4812
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
1489 TAILQ_INSERT_TAIL(ctx->ra_routers, rap, next); |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
1490 if (new_data) |
|
2d85b6abdb3b
INET6: Sort routers when reachability changes
Roy Marples <roy@marples.name>
parents:
4789
diff
changeset
|
1491 ipv6nd_sortrouters(ifp->ctx); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1492 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1493 if (ifp->ctx->options & DHCPCD_TEST) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1494 script_runreason(ifp, "TEST"); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1495 goto handle_flag; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1496 } |
| 5535 | 1497 |
| 1498 if (!(ifp->options->options & DHCPCD_CONFIGURE)) | |
| 1499 goto run; | |
| 1500 | |
|
5179
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
1501 ipv6nd_applyra(ifp); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1502 ipv6_addaddrs(&rap->addrs); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1503 #ifdef IPV6_MANAGETEMPADDR |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1504 ipv6_addtempaddrs(ifp, &rap->acquired); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1505 #endif |
| 5535 | 1506 rt_build(ifp->ctx, AF_INET6); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1507 |
| 5535 | 1508 run: |
|
4856
a0a073f9c5ef
dhcpcd: Rework daemonisation
Roy Marples <roy@marples.name>
parents:
4842
diff
changeset
|
1509 ipv6nd_scriptrun(rap); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1510 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1511 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1512 eloop_timeout_delete(ifp->ctx->eloop, NULL, rap); /* reachable timer */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1513 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1514 handle_flag: |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1515 if (!(ifp->options->options & DHCPCD_DHCP6)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1516 goto nodhcp6; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1517 /* Only log a DHCPv6 start error if compiled in or debugging is enabled. */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1518 #ifdef DHCP6 |
| 4010 | 1519 #define LOG_DHCP6 logerr |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1520 #else |
| 4010 | 1521 #define LOG_DHCP6 logdebug |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1522 #endif |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1523 if (rap->flags & ND_RA_FLAG_MANAGED) { |
|
4183
115cbfa711e2
DHCPv6: confirm lease on carrier up
Roy Marples <roy@marples.name>
parents:
4182
diff
changeset
|
1524 if (new_data && dhcp6_start(ifp, DH6S_REQUEST) == -1) |
| 4010 | 1525 LOG_DHCP6("dhcp6_start: %s", ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1526 } else if (rap->flags & ND_RA_FLAG_OTHER) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1527 if (new_data && dhcp6_start(ifp, DH6S_INFORM) == -1) |
| 4010 | 1528 LOG_DHCP6("dhcp6_start: %s", ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1529 } else { |
|
4349
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1530 #ifdef DHCP6 |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1531 if (new_data) |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
1532 logdebugx("%s: No DHCPv6 instruction in RA", ifp->name); |
|
4349
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1533 #endif |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1534 nodhcp6: |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1535 if (ifp->ctx->options & DHCPCD_TEST) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1536 eloop_exit(ifp->ctx->eloop, EXIT_SUCCESS); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1537 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1538 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1539 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1540 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1541 /* Expire should be called last as the rap object could be destroyed */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1542 ipv6nd_expirera(ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1543 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1544 |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1545 bool |
|
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1546 ipv6nd_hasralifetime(const struct interface *ifp, bool lifetime) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1547 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1548 const struct ra *rap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1549 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1550 if (ifp->ctx->ra_routers) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1551 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1552 if (rap->iface == ifp && |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1553 !rap->expired && |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1554 (!lifetime ||rap->lifetime)) |
|
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1555 return true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1556 } |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1557 return false; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1558 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1559 |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1560 bool |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1561 ipv6nd_hasradhcp(const struct interface *ifp, bool managed) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1562 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1563 const struct ra *rap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1564 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1565 if (ifp->ctx->ra_routers) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1566 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1567 if (rap->iface == ifp && |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1568 !rap->expired && !rap->willexpire && |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1569 ((managed && rap->flags & ND_RA_FLAG_MANAGED) || |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1570 (!managed && rap->flags & ND_RA_FLAG_OTHER))) |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1571 return true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1572 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1573 } |
|
4648
16b119f7fc39
inet6: Don't install a default route if no global address
Roy Marples <roy@marples.name>
parents:
4647
diff
changeset
|
1574 return false; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1575 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1576 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1577 static const uint8_t * |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1578 ipv6nd_getoption(struct dhcpcd_ctx *ctx, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1579 size_t *os, unsigned int *code, size_t *len, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1580 const uint8_t *od, size_t ol, struct dhcp_opt **oopt) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1581 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1582 struct nd_opt_hdr ndo; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1583 size_t i; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1584 struct dhcp_opt *opt; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1585 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1586 if (od) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1587 *os = sizeof(ndo); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1588 if (ol < *os) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1589 errno = EINVAL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1590 return NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1591 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1592 memcpy(&ndo, od, sizeof(ndo)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1593 i = (size_t)(ndo.nd_opt_len * 8); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1594 if (i > ol) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1595 errno = EINVAL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1596 return NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1597 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1598 *len = i; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1599 *code = ndo.nd_opt_type; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1600 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1601 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1602 for (i = 0, opt = ctx->nd_opts; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1603 i < ctx->nd_opts_len; i++, opt++) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1604 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1605 if (opt->option == *code) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1606 *oopt = opt; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1607 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1608 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1609 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1610 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1611 if (od) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1612 return od + sizeof(ndo); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1613 return NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1614 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1615 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1616 ssize_t |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1617 ipv6nd_env(FILE *fp, const struct interface *ifp) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1618 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1619 size_t i, j, n, len, olen; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1620 struct ra *rap; |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1621 char ndprefix[32]; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1622 struct dhcp_opt *opt; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1623 uint8_t *p; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1624 struct nd_opt_hdr ndo; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1625 struct ipv6_addr *ia; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1626 struct timespec now; |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1627 int pref; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1628 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1629 clock_gettime(CLOCK_MONOTONIC, &now); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1630 i = n = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1631 TAILQ_FOREACH(rap, ifp->ctx->ra_routers, next) { |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1632 if (rap->iface != ifp || rap->expired) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1633 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1634 i++; |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1635 snprintf(ndprefix, sizeof(ndprefix), "nd%zu", i); |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1636 if (efprintf(fp, "%s_from=%s", ndprefix, rap->sfrom) == -1) |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1637 return -1; |
|
4564
622983991bf6
Cast time_t to long long to satisfy printf.
Roy Marples <roy@marples.name>
parents:
4549
diff
changeset
|
1638 if (efprintf(fp, "%s_acquired=%lld", ndprefix, |
|
622983991bf6
Cast time_t to long long to satisfy printf.
Roy Marples <roy@marples.name>
parents:
4549
diff
changeset
|
1639 (long long)rap->acquired.tv_sec) == -1) |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1640 return -1; |
|
4564
622983991bf6
Cast time_t to long long to satisfy printf.
Roy Marples <roy@marples.name>
parents:
4549
diff
changeset
|
1641 if (efprintf(fp, "%s_now=%lld", ndprefix, |
|
622983991bf6
Cast time_t to long long to satisfy printf.
Roy Marples <roy@marples.name>
parents:
4549
diff
changeset
|
1642 (long long)now.tv_sec) == -1) |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1643 return -1; |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1644 if (efprintf(fp, "%s_hoplimit=%u", ndprefix, rap->hoplimit) == -1) |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1645 return -1; |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1646 pref = ipv6nd_rtpref(rap); |
|
5363
e161ef164608
inet6: Report RA Proxy flag if set
Roy Marples <roy@marples.name>
parents:
5362
diff
changeset
|
1647 if (efprintf(fp, "%s_flags=%s%s%s%s%s", ndprefix, |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1648 rap->flags & ND_RA_FLAG_MANAGED ? "M" : "", |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1649 rap->flags & ND_RA_FLAG_OTHER ? "O" : "", |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1650 rap->flags & ND_RA_FLAG_HOME_AGENT ? "H" : "", |
|
5363
e161ef164608
inet6: Report RA Proxy flag if set
Roy Marples <roy@marples.name>
parents:
5362
diff
changeset
|
1651 pref == RTPREF_HIGH ? "h" : pref == RTPREF_LOW ? "l" : "", |
|
e161ef164608
inet6: Report RA Proxy flag if set
Roy Marples <roy@marples.name>
parents:
5362
diff
changeset
|
1652 rap->flags & ND_RA_FLAG_PROXY ? "P" : "") == -1) |
|
5362
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1653 return -1; |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1654 if (efprintf(fp, "%s_lifetime=%u", ndprefix, rap->lifetime) == -1) |
|
17f0de2ed2aa
inet6: Add support for reporting Mobile IPv6 RA's
Roy Marples <roy@marples.name>
parents:
5346
diff
changeset
|
1655 return -1; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1656 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1657 /* Zero our indexes */ |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1658 for (j = 0, opt = rap->iface->ctx->nd_opts; |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1659 j < rap->iface->ctx->nd_opts_len; |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1660 j++, opt++) |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1661 dhcp_zero_index(opt); |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1662 for (j = 0, opt = rap->iface->options->nd_override; |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1663 j < rap->iface->options->nd_override_len; |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1664 j++, opt++) |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1665 dhcp_zero_index(opt); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1666 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1667 /* Unlike DHCP, ND6 options *may* occur more than once. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1668 * There is also no provision for option concatenation |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1669 * unlike DHCP. */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1670 len = rap->data_len - sizeof(struct nd_router_advert); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1671 for (p = rap->data + sizeof(struct nd_router_advert); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1672 len >= sizeof(ndo); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1673 p += olen, len -= olen) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1674 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1675 memcpy(&ndo, p, sizeof(ndo)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1676 olen = (size_t)(ndo.nd_opt_len * 8); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1677 if (olen > len) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1678 errno = EINVAL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1679 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1680 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1681 if (has_option_mask(rap->iface->options->nomasknd, |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1682 ndo.nd_opt_type)) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1683 continue; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1684 for (j = 0, opt = rap->iface->options->nd_override; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1685 j < rap->iface->options->nd_override_len; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1686 j++, opt++) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1687 if (opt->option == ndo.nd_opt_type) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1688 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1689 if (j == rap->iface->options->nd_override_len) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1690 for (j = 0, opt = rap->iface->ctx->nd_opts; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1691 j < rap->iface->ctx->nd_opts_len; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1692 j++, opt++) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1693 if (opt->option == ndo.nd_opt_type) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1694 break; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1695 if (j == rap->iface->ctx->nd_opts_len) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1696 opt = NULL; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1697 } |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1698 if (opt == NULL) |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1699 continue; |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1700 dhcp_envoption(rap->iface->ctx, fp, |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1701 ndprefix, rap->iface->name, |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1702 opt, ipv6nd_getoption, |
|
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1703 p + sizeof(ndo), olen - sizeof(ndo)); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1704 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1705 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1706 /* We need to output the addresses we actually made |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1707 * from the prefix information options as well. */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1708 j = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1709 TAILQ_FOREACH(ia, &rap->addrs, next) { |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1710 if (!(ia->flags & IPV6_AF_AUTOCONF) || |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1711 #ifdef IPV6_AF_TEMPORARY |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1712 ia->flags & IPV6_AF_TEMPORARY || |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1713 #endif |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1714 !(ia->flags & IPV6_AF_ADDED) || |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1715 ia->prefix_vltime == 0) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1716 continue; |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1717 if (efprintf(fp, "%s_addr%zu=%s", |
|
5096
d6af8586cbaf
script: Start RA addresses from 1, not 0.
Roy Marples <roy@marples.name>
parents:
5085
diff
changeset
|
1718 ndprefix, ++j, ia->saddr) == -1) |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1719 return -1; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1720 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1721 } |
|
4535
f2ddefe6c69e
script: Write variables to a FILE
Roy Marples <roy@marples.name>
parents:
4534
diff
changeset
|
1722 return 1; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1723 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1724 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1725 void |
|
4232
8b92c1844860
Log the pid of the process deleting an assigned address.
Roy Marples <roy@marples.name>
parents:
4231
diff
changeset
|
1726 ipv6nd_handleifa(int cmd, struct ipv6_addr *addr, pid_t pid) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1727 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1728 struct ra *rap; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1729 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1730 /* IPv6 init may not have happened yet if we are learning |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1731 * existing addresses when dhcpcd starts. */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1732 if (addr->iface->ctx->ra_routers == NULL) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1733 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1734 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1735 TAILQ_FOREACH(rap, addr->iface->ctx->ra_routers, next) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1736 if (rap->iface != addr->iface) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1737 continue; |
|
4232
8b92c1844860
Log the pid of the process deleting an assigned address.
Roy Marples <roy@marples.name>
parents:
4231
diff
changeset
|
1738 ipv6_handleifa_addrs(cmd, &rap->addrs, addr, pid); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1739 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1740 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1741 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1742 void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1743 ipv6nd_expirera(void *arg) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1744 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1745 struct interface *ifp; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1746 struct ra *rap, *ran; |
|
4924
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1747 struct timespec now; |
|
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1748 uint32_t elapsed; |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1749 bool expired, valid; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1750 struct ipv6_addr *ia; |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1751 size_t len, olen; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1752 uint8_t *p; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1753 struct nd_opt_hdr ndo; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1754 #if 0 |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1755 struct nd_opt_prefix_info pi; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1756 #endif |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1757 struct nd_opt_dnssl dnssl; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1758 struct nd_opt_rdnss rdnss; |
|
4923
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1759 unsigned int next = 0, ltime; |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1760 size_t nexpired = 0; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1761 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1762 ifp = arg; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1763 clock_gettime(CLOCK_MONOTONIC, &now); |
|
4349
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1764 expired = false; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1765 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1766 TAILQ_FOREACH_SAFE(rap, ifp->ctx->ra_routers, next, ran) { |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1767 if (rap->iface != ifp || rap->expired) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1768 continue; |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1769 valid = false; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1770 if (rap->lifetime) { |
|
4924
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1771 elapsed = (uint32_t)eloop_timespec_diff(&now, |
|
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1772 &rap->acquired, NULL); |
|
5180
0e4f56cb4c03
inet6: Expire ND on the second, not after it
Roy Marples <roy@marples.name>
parents:
5179
diff
changeset
|
1773 if (elapsed >= rap->lifetime || rap->doexpire) { |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1774 if (!rap->expired) { |
| 4010 | 1775 logwarnx("%s: %s: router expired", |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1776 ifp->name, rap->sfrom); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1777 rap->lifetime = 0; |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1778 expired = true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1779 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1780 } else { |
|
4349
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1781 valid = true; |
|
4924
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1782 ltime = rap->lifetime - elapsed; |
|
4923
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1783 if (next == 0 || ltime < next) |
|
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1784 next = ltime; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1785 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1786 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1787 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1788 /* Not every prefix is tied to an address which |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1789 * the kernel can expire, so we need to handle it ourself. |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1790 * Also, some OS don't support address lifetimes (Solaris). */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1791 TAILQ_FOREACH(ia, &rap->addrs, next) { |
|
4231
0dcc72ad719c
ipv6nd: drop DHCPv6 when RA fully expires
Roy Marples <roy@marples.name>
parents:
4197
diff
changeset
|
1792 if (ia->prefix_vltime == 0) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1793 continue; |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1794 if (ia->prefix_vltime == ND6_INFINITE_LIFETIME && |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1795 !rap->doexpire) |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1796 { |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1797 valid = true; |
|
4231
0dcc72ad719c
ipv6nd: drop DHCPv6 when RA fully expires
Roy Marples <roy@marples.name>
parents:
4197
diff
changeset
|
1798 continue; |
|
0dcc72ad719c
ipv6nd: drop DHCPv6 when RA fully expires
Roy Marples <roy@marples.name>
parents:
4197
diff
changeset
|
1799 } |
|
4924
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1800 elapsed = (uint32_t)eloop_timespec_diff(&now, |
|
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1801 &ia->acquired, NULL); |
|
5180
0e4f56cb4c03
inet6: Expire ND on the second, not after it
Roy Marples <roy@marples.name>
parents:
5179
diff
changeset
|
1802 if (elapsed >= ia->prefix_vltime || rap->doexpire) { |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1803 if (ia->flags & IPV6_AF_ADDED) { |
|
4981
0fa3ebf43a1d
inet6: Log expiration of a prefix if autoconf is not set
Roy Marples <roy@marples.name>
parents:
4978
diff
changeset
|
1804 logwarnx("%s: expired %s %s", |
|
0fa3ebf43a1d
inet6: Log expiration of a prefix if autoconf is not set
Roy Marples <roy@marples.name>
parents:
4978
diff
changeset
|
1805 ia->iface->name, |
|
0fa3ebf43a1d
inet6: Log expiration of a prefix if autoconf is not set
Roy Marples <roy@marples.name>
parents:
4978
diff
changeset
|
1806 ia->flags & IPV6_AF_AUTOCONF ? |
|
0fa3ebf43a1d
inet6: Log expiration of a prefix if autoconf is not set
Roy Marples <roy@marples.name>
parents:
4978
diff
changeset
|
1807 "address" : "prefix", |
|
0fa3ebf43a1d
inet6: Log expiration of a prefix if autoconf is not set
Roy Marples <roy@marples.name>
parents:
4978
diff
changeset
|
1808 ia->saddr); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1809 if (if_address6(RTM_DELADDR, ia)== -1 && |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1810 errno != EADDRNOTAVAIL && |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1811 errno != ENXIO) |
| 4010 | 1812 logerr(__func__); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1813 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1814 ia->prefix_vltime = ia->prefix_pltime = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1815 ia->flags &= |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1816 ~(IPV6_AF_ADDED | IPV6_AF_DADCOMPLETED); |
|
4349
f87c2ed9ff46
DHCP6: Remove #defines for functions when DHCP6 is disabled
Roy Marples <roy@marples.name>
parents:
4336
diff
changeset
|
1817 expired = true; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1818 } else { |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1819 valid = true; |
|
4924
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1820 ltime = ia->prefix_vltime - elapsed; |
|
4923
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1821 if (next == 0 || ltime < next) |
|
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1822 next = ltime; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1823 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1824 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1825 |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1826 /* Work out expiry for ND options */ |
|
4924
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1827 elapsed = (uint32_t)eloop_timespec_diff(&now, |
|
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1828 &rap->acquired, NULL); |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1829 len = rap->data_len - sizeof(struct nd_router_advert); |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1830 for (p = rap->data + sizeof(struct nd_router_advert); |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1831 len >= sizeof(ndo); |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1832 p += olen, len -= olen) |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1833 { |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1834 memcpy(&ndo, p, sizeof(ndo)); |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1835 olen = (size_t)(ndo.nd_opt_len * 8); |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1836 if (olen > len) { |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1837 errno = EINVAL; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1838 break; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1839 } |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1840 |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1841 if (has_option_mask(rap->iface->options->nomasknd, |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1842 ndo.nd_opt_type)) |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1843 continue; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1844 |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1845 switch (ndo.nd_opt_type) { |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1846 /* Prefix info is already checked in the above loop. */ |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1847 #if 0 |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1848 case ND_OPT_PREFIX_INFORMATION: |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1849 if (len < sizeof(pi)) |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1850 break; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1851 memcpy(&pi, p, sizeof(pi)); |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1852 ltime = pi.nd_opt_pi_valid_time; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1853 break; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1854 #endif |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1855 case ND_OPT_DNSSL: |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1856 if (len < sizeof(dnssl)) |
|
4539
3d212cac74d3
ND: Ensure that ltime is always set
Roy Marples <roy@marples.name>
parents:
4535
diff
changeset
|
1857 continue; |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1858 memcpy(&dnssl, p, sizeof(dnssl)); |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1859 ltime = dnssl.nd_opt_dnssl_lifetime; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1860 break; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1861 case ND_OPT_RDNSS: |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1862 if (len < sizeof(rdnss)) |
|
4539
3d212cac74d3
ND: Ensure that ltime is always set
Roy Marples <roy@marples.name>
parents:
4535
diff
changeset
|
1863 continue; |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1864 memcpy(&rdnss, p, sizeof(rdnss)); |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1865 ltime = rdnss.nd_opt_rdnss_lifetime; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1866 break; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1867 default: |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1868 continue; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1869 } |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1870 |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1871 if (ltime == 0) |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1872 continue; |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1873 if (rap->doexpire) { |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1874 expired = true; |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1875 continue; |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1876 } |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1877 if (ltime == ND6_INFINITE_LIFETIME) { |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1878 valid = true; |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1879 continue; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1880 } |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1881 |
|
4923
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1882 ltime = ntohl(ltime); |
|
5180
0e4f56cb4c03
inet6: Expire ND on the second, not after it
Roy Marples <roy@marples.name>
parents:
5179
diff
changeset
|
1883 if (elapsed >= ltime) { |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1884 expired = true; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1885 continue; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1886 } |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1887 |
|
4923
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1888 valid = true; |
|
4924
7c1a365b1e2d
eloop: reduce timers rather than calculating expiry
Roy Marples <roy@marples.name>
parents:
4923
diff
changeset
|
1889 ltime -= elapsed; |
|
4923
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1890 if (next == 0 || ltime < next) |
|
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1891 next = ltime; |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1892 } |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1893 |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1894 if (valid) |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1895 continue; |
|
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1896 |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1897 /* Router has expired. Let's not keep a lot of them. */ |
|
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1898 rap->expired = true; |
|
4530
999c0c21711d
RA: expire RDNSS and DNSSL entries
Roy Marples <roy@marples.name>
parents:
4526
diff
changeset
|
1899 if (++nexpired > EXPIRED_MAX) |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1900 ipv6nd_free_ra(rap); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1901 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1902 |
|
4923
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1903 if (next != 0) |
|
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1904 eloop_timeout_add_sec(ifp->ctx->eloop, |
|
4fcca755943e
eloop: Allow for for timeouts greater than time_t and time wrapping
Roy Marples <roy@marples.name>
parents:
4922
diff
changeset
|
1905 next, ipv6nd_expirera, ifp); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1906 if (expired) { |
|
5040
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1907 logwarnx("%s: part of a Router Advertisement expired", |
|
c44b319ae036
inet6: Ensure expired routers are cleared after a carrier loss
Roy Marples <roy@marples.name>
parents:
5038
diff
changeset
|
1908 ifp->name); |
|
5179
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
1909 ipv6nd_sortrouters(ifp->ctx); |
|
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
1910 ipv6nd_applyra(ifp); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1911 rt_build(ifp->ctx, AF_INET6); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1912 script_runreason(ifp, "ROUTERADVERT"); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1913 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1914 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1915 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1916 void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1917 ipv6nd_drop(struct interface *ifp) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1918 { |
|
4141
45e849031aec
Ensure that all RA's are actually dropped when dropping an interface.
Roy Marples <roy@marples.name>
parents:
4140
diff
changeset
|
1919 struct ra *rap, *ran; |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1920 bool expired = false; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1921 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1922 if (ifp->ctx->ra_routers == NULL) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1923 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1924 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1925 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); |
|
4141
45e849031aec
Ensure that all RA's are actually dropped when dropping an interface.
Roy Marples <roy@marples.name>
parents:
4140
diff
changeset
|
1926 TAILQ_FOREACH_SAFE(rap, ifp->ctx->ra_routers, next, ran) { |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1927 if (rap->iface == ifp) { |
|
4646
c83adc0e8b5f
inet6: Only remove default route when router becomes unreachable
Roy Marples <roy@marples.name>
parents:
4604
diff
changeset
|
1928 rap->expired = expired = true; |
|
4141
45e849031aec
Ensure that all RA's are actually dropped when dropping an interface.
Roy Marples <roy@marples.name>
parents:
4140
diff
changeset
|
1929 ipv6nd_drop_ra(rap); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1930 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1931 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1932 if (expired) { |
|
5179
e241904845af
inet6: Apply the best RA which is still valid.
Roy Marples <roy@marples.name>
parents:
5172
diff
changeset
|
1933 ipv6nd_applyra(ifp); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1934 rt_build(ifp->ctx, AF_INET6); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1935 if ((ifp->options->options & DHCPCD_NODROP) != DHCPCD_NODROP) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1936 script_runreason(ifp, "ROUTERADVERT"); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1937 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1938 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1939 |
|
4840
073fcd86db9b
privsep: Add support for priviledge separation
Roy Marples <roy@marples.name>
parents:
4822
diff
changeset
|
1940 void |
|
4787
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1941 ipv6nd_recvmsg(struct dhcpcd_ctx *ctx, struct msghdr *msg) |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1942 { |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1943 struct sockaddr_in6 *from = (struct sockaddr_in6 *)msg->msg_name; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1944 char sfrom[INET6_ADDRSTRLEN]; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1945 int hoplimit = 0; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1946 struct icmp6_hdr *icp; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1947 struct interface *ifp; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1948 size_t len = msg->msg_iov[0].iov_len; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1949 |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1950 inet_ntop(AF_INET6, &from->sin6_addr, sfrom, sizeof(sfrom)); |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1951 if ((size_t)len < sizeof(struct icmp6_hdr)) { |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1952 logerrx("IPv6 ICMP packet too short from %s", sfrom); |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1953 return; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1954 } |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1955 |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1956 ifp = if_findifpfromcmsg(ctx, msg, &hoplimit); |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1957 if (ifp == NULL) { |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1958 logerr(__func__); |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1959 return; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1960 } |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1961 |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1962 /* Don't do anything if the user hasn't configured it. */ |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1963 if (ifp->active != IF_ACTIVE_USER || |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1964 !(ifp->options->options & DHCPCD_IPV6)) |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1965 return; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1966 |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1967 icp = (struct icmp6_hdr *)msg->msg_iov[0].iov_base; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1968 if (icp->icmp6_code == 0) { |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1969 switch(icp->icmp6_type) { |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1970 case ND_ROUTER_ADVERT: |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1971 ipv6nd_handlera(ctx, from, sfrom, |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1972 ifp, icp, (size_t)len, hoplimit); |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1973 return; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1974 } |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1975 } |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1976 |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1977 logerrx("invalid IPv6 type %d or code %d from %s", |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1978 icp->icmp6_type, icp->icmp6_code, sfrom); |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1979 } |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1980 |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
1981 static void |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1982 ipv6nd_handledata(void *arg) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1983 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
1984 struct dhcpcd_ctx *ctx; |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
1985 int fd; |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1986 struct sockaddr_in6 from; |
|
5193
658eb5d94c0b
DHCP: Use correct buffer for receiving UDP
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
1987 union { |
|
658eb5d94c0b
DHCP: Use correct buffer for receiving UDP
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
1988 struct icmp6_hdr hdr; |
|
658eb5d94c0b
DHCP: Use correct buffer for receiving UDP
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
1989 uint8_t buf[64 * 1024]; /* Maximum ICMPv6 size */ |
|
658eb5d94c0b
DHCP: Use correct buffer for receiving UDP
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
1990 } iovbuf; |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1991 struct iovec iov = { |
|
5193
658eb5d94c0b
DHCP: Use correct buffer for receiving UDP
Roy Marples <roy@marples.name>
parents:
5183
diff
changeset
|
1992 .iov_base = iovbuf.buf, .iov_len = sizeof(iovbuf.buf), |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1993 }; |
| 5160 | 1994 union { |
| 1995 struct cmsghdr hdr; | |
| 1996 uint8_t buf[CMSG_SPACE(sizeof(struct in6_pktinfo)) + | |
| 1997 CMSG_SPACE(sizeof(int))]; | |
| 1998 } cmsgbuf = { .buf = { 0 } }; | |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
1999 struct msghdr msg = { |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
2000 .msg_name = &from, .msg_namelen = sizeof(from), |
|
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
2001 .msg_iov = &iov, .msg_iovlen = 1, |
| 5160 | 2002 .msg_control = cmsgbuf.buf, .msg_controllen = sizeof(cmsgbuf.buf), |
|
4371
a7f3d85f54ce
Remove the send/recv structures from dhcpcd context and allocate
Roy Marples <roy@marples.name>
parents:
4355
diff
changeset
|
2003 }; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2004 ssize_t len; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2005 |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2006 #ifdef __sun |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
2007 struct interface *ifp; |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2008 struct rs_state *state; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2009 |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2010 ifp = arg; |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2011 state = RS_STATE(ifp); |
|
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2012 ctx = ifp->ctx; |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
2013 fd = state->nd_fd; |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2014 #else |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2015 ctx = arg; |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
2016 fd = ctx->nd_fd; |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2017 #endif |
|
4788
8d8165824b16
Solaris: Fix prior by receving IP6_PKTINFO
Roy Marples <roy@marples.name>
parents:
4787
diff
changeset
|
2018 len = recvmsg(fd, &msg, 0); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2019 if (len == -1) { |
| 4010 | 2020 logerr(__func__); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2021 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2022 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2023 |
|
4787
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
2024 iov.iov_len = (size_t)len; |
|
d3a3a2ab8ba9
Split *_recv() into *_recv() and *_recvmsg() functions
Roy Marples <roy@marples.name>
parents:
4702
diff
changeset
|
2025 ipv6nd_recvmsg(ctx, &msg); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2026 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2027 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2028 static void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2029 ipv6nd_startrs1(void *arg) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2030 { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2031 struct interface *ifp = arg; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2032 struct rs_state *state; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2033 |
|
4024
0984f93d896e
To be consitent, do the same to loginfo as we just did for logdebug.
Roy Marples <roy@marples.name>
parents:
4023
diff
changeset
|
2034 loginfox("%s: soliciting an IPv6 router", ifp->name); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2035 state = RS_STATE(ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2036 if (state == NULL) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2037 ifp->if_data[IF_DATA_IPV6ND] = calloc(1, sizeof(*state)); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2038 state = RS_STATE(ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2039 if (state == NULL) { |
| 4010 | 2040 logerr(__func__); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2041 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2042 } |
| 4472 | 2043 #ifdef __sun |
|
4471
15b9659186e8
sun: Open an IPv6ND socket per interface
Roy Marples <roy@marples.name>
parents:
4374
diff
changeset
|
2044 state->nd_fd = -1; |
| 4472 | 2045 #endif |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2046 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2047 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2048 /* Always make a new probe as the underlying hardware |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2049 * address could have changed. */ |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2050 ipv6nd_makersprobe(ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2051 if (state->rs == NULL) { |
| 4010 | 2052 logerr(__func__); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2053 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2054 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2055 |
|
4335
d0519e1f2f5f
ip6: Implement IPv6 address sharing
Roy Marples <roy@marples.name>
parents:
4333
diff
changeset
|
2056 state->retrans = RETRANS_TIMER; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2057 state->rsprobes = 0; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2058 ipv6nd_sendrsprobe(ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2059 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2060 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2061 void |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2062 ipv6nd_startrs(struct interface *ifp) |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2063 { |
|
4934
64d2e5e77cc3
inet6: Use milliseconds rather than timespec for calcuating delays
Roy Marples <roy@marples.name>
parents:
4929
diff
changeset
|
2064 unsigned int delay; |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2065 |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2066 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2067 if (!(ifp->options->options & DHCPCD_INITIAL_DELAY)) { |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2068 ipv6nd_startrs1(ifp); |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2069 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2070 } |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2071 |
|
4934
64d2e5e77cc3
inet6: Use milliseconds rather than timespec for calcuating delays
Roy Marples <roy@marples.name>
parents:
4929
diff
changeset
|
2072 delay = arc4random_uniform(MAX_RTR_SOLICITATION_DELAY * MSEC_PER_SEC); |
|
4023
66f9399ba5c6
Add logdebugx, similar to logerrx and logwarnx.
Roy Marples <roy@marples.name>
parents:
4010
diff
changeset
|
2073 logdebugx("%s: delaying IPv6 router solicitation for %0.1f seconds", |
|
4934
64d2e5e77cc3
inet6: Use milliseconds rather than timespec for calcuating delays
Roy Marples <roy@marples.name>
parents:
4929
diff
changeset
|
2074 ifp->name, (float)delay / MSEC_PER_SEC); |
|
64d2e5e77cc3
inet6: Use milliseconds rather than timespec for calcuating delays
Roy Marples <roy@marples.name>
parents:
4929
diff
changeset
|
2075 eloop_timeout_add_msec(ifp->ctx->eloop, delay, ipv6nd_startrs1, ifp); |
|
3932
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2076 return; |
|
e802a4235d75
Move the source files along with dev, crypt and comapt into src dir.
Roy Marples <roy@marples.name>
parents:
diff
changeset
|
2077 } |
