xref: /dragonfly/contrib/dhcpcd/src/ipv6nd.h (revision 54175cef)
18d36e1dfSRoy Marples /* SPDX-License-Identifier: BSD-2-Clause */
27827cba2SAaron LI /*
37827cba2SAaron LI  * dhcpcd - IPv6 ND handling
480aa9461SRoy Marples  * Copyright (c) 2006-2023 Roy Marples <roy@marples.name>
57827cba2SAaron LI  * All rights reserved
67827cba2SAaron LI 
77827cba2SAaron LI  * Redistribution and use in source and binary forms, with or without
87827cba2SAaron LI  * modification, are permitted provided that the following conditions
97827cba2SAaron LI  * are met:
107827cba2SAaron LI  * 1. Redistributions of source code must retain the above copyright
117827cba2SAaron LI  *    notice, this list of conditions and the following disclaimer.
127827cba2SAaron LI  * 2. Redistributions in binary form must reproduce the above copyright
137827cba2SAaron LI  *    notice, this list of conditions and the following disclaimer in the
147827cba2SAaron LI  *    documentation and/or other materials provided with the distribution.
157827cba2SAaron LI  *
167827cba2SAaron LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
177827cba2SAaron LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
187827cba2SAaron LI  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
197827cba2SAaron LI  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
207827cba2SAaron LI  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
217827cba2SAaron LI  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
227827cba2SAaron LI  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
237827cba2SAaron LI  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
247827cba2SAaron LI  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257827cba2SAaron LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267827cba2SAaron LI  * SUCH DAMAGE.
277827cba2SAaron LI  */
287827cba2SAaron LI 
297827cba2SAaron LI #ifndef IPV6ND_H
307827cba2SAaron LI #define IPV6ND_H
317827cba2SAaron LI 
328d36e1dfSRoy Marples #ifdef INET6
338d36e1dfSRoy Marples 
347827cba2SAaron LI #include <time.h>
357827cba2SAaron LI 
367827cba2SAaron LI #include "config.h"
377827cba2SAaron LI #include "dhcpcd.h"
387827cba2SAaron LI #include "ipv6.h"
397827cba2SAaron LI 
40*54175cefSRoy Marples /* rfc4191 */
41*54175cefSRoy Marples struct routeinfo {
42*54175cefSRoy Marples 	TAILQ_ENTRY(routeinfo) next;
43*54175cefSRoy Marples 	struct in6_addr prefix;
44*54175cefSRoy Marples 	uint8_t prefix_len;
45*54175cefSRoy Marples 	uint32_t lifetime;
46*54175cefSRoy Marples 	uint8_t flags;
47*54175cefSRoy Marples 	struct timespec acquired;
48*54175cefSRoy Marples 	char sprefix[INET6_ADDRSTRLEN];
49*54175cefSRoy Marples };
50*54175cefSRoy Marples 
51*54175cefSRoy Marples TAILQ_HEAD(routeinfohead, routeinfo);
52*54175cefSRoy Marples 
53*54175cefSRoy Marples 
547827cba2SAaron LI struct ra {
557827cba2SAaron LI 	TAILQ_ENTRY(ra) next;
567827cba2SAaron LI 	struct interface *iface;
577827cba2SAaron LI 	struct in6_addr from;
587827cba2SAaron LI 	char sfrom[INET6_ADDRSTRLEN];
597827cba2SAaron LI 	uint8_t *data;
607827cba2SAaron LI 	size_t data_len;
617827cba2SAaron LI 	struct timespec acquired;
62*54175cefSRoy Marples 	uint8_t flags;
637827cba2SAaron LI 	uint32_t lifetime;
647827cba2SAaron LI 	uint32_t reachable;
657827cba2SAaron LI 	uint32_t retrans;
667827cba2SAaron LI 	uint32_t mtu;
67b9ccd228SRoy Marples 	uint8_t hoplimit;
687827cba2SAaron LI 	struct ipv6_addrhead addrs;
69*54175cefSRoy Marples 	struct routeinfohead rinfos;
708d36e1dfSRoy Marples 	bool hasdns;
718d36e1dfSRoy Marples 	bool expired;
726e63cc1fSRoy Marples 	bool willexpire;
736e63cc1fSRoy Marples 	bool doexpire;
748d36e1dfSRoy Marples 	bool isreachable;
757827cba2SAaron LI };
767827cba2SAaron LI 
777827cba2SAaron LI TAILQ_HEAD(ra_head, ra);
787827cba2SAaron LI 
797827cba2SAaron LI struct rs_state {
807827cba2SAaron LI 	struct nd_router_solicit *rs;
817827cba2SAaron LI 	size_t rslen;
827827cba2SAaron LI 	int rsprobes;
838d36e1dfSRoy Marples 	uint32_t retrans;
848d36e1dfSRoy Marples #ifdef __sun
858d36e1dfSRoy Marples 	int nd_fd;
868d36e1dfSRoy Marples #endif
877827cba2SAaron LI };
887827cba2SAaron LI 
897827cba2SAaron LI #define	RS_STATE(a) ((struct rs_state *)(ifp)->if_data[IF_DATA_IPV6ND])
908d36e1dfSRoy Marples #define	RS_CSTATE(a) ((const struct rs_state *)(ifp)->if_data[IF_DATA_IPV6ND])
917827cba2SAaron LI #define	RS_STATE_RUNNING(a) (ipv6nd_hasra((a)) && ipv6nd_dadcompleted((a)))
927827cba2SAaron LI 
937827cba2SAaron LI #ifndef MAX_RTR_SOLICITATION_DELAY
947827cba2SAaron LI #define	MAX_RTR_SOLICITATION_DELAY	1	/* seconds */
957827cba2SAaron LI #define	MAX_UNICAST_SOLICIT		3	/* 3 transmissions */
967827cba2SAaron LI #define	RTR_SOLICITATION_INTERVAL	4	/* seconds */
977827cba2SAaron LI #define	MAX_RTR_SOLICITATIONS		3	/* times */
988d36e1dfSRoy Marples #define	MAX_NEIGHBOR_ADVERTISEMENT	3	/* 3 transmissions */
99b9ccd228SRoy Marples 
100b9ccd228SRoy Marples #ifndef IPV6_DEFHLIM
101b9ccd228SRoy Marples #define	IPV6_DEFHLIM			64
102b9ccd228SRoy Marples #endif
1037827cba2SAaron LI #endif
1047827cba2SAaron LI 
1057827cba2SAaron LI /* On carrier up, expire known routers after RTR_CARRIER_EXPIRE seconds. */
1067827cba2SAaron LI #define RTR_CARRIER_EXPIRE		\
1077827cba2SAaron LI     (MAX_RTR_SOLICITATION_DELAY +	\
1087827cba2SAaron LI     (MAX_RTR_SOLICITATIONS + 1) *	\
1097827cba2SAaron LI     RTR_SOLICITATION_INTERVAL)
1107827cba2SAaron LI 
1117827cba2SAaron LI #define	MAX_REACHABLE_TIME		3600000	/* milliseconds */
1127827cba2SAaron LI #define	REACHABLE_TIME			30000	/* milliseconds */
1137827cba2SAaron LI #define	RETRANS_TIMER			1000	/* milliseconds */
1147827cba2SAaron LI #define	DELAY_FIRST_PROBE_TIME		5	/* seconds */
1157827cba2SAaron LI 
11680aa9461SRoy Marples #define	MIN_EXTENDED_VLTIME		7200	/* seconds */
11780aa9461SRoy Marples 
118d4fb1e02SRoy Marples int ipv6nd_open(bool);
1196e63cc1fSRoy Marples #ifdef __sun
120d4fb1e02SRoy Marples int ipv6nd_openif(struct interface *);
1216e63cc1fSRoy Marples #endif
1226e63cc1fSRoy Marples void ipv6nd_recvmsg(struct dhcpcd_ctx *, struct msghdr *);
123*54175cefSRoy Marples int ipv6nd_rtpref(uint8_t);
1247827cba2SAaron LI void ipv6nd_printoptions(const struct dhcpcd_ctx *,
1257827cba2SAaron LI     const struct dhcp_opt *, size_t);
1267827cba2SAaron LI void ipv6nd_startrs(struct interface *);
1278d36e1dfSRoy Marples ssize_t ipv6nd_env(FILE *, const struct interface *);
1287827cba2SAaron LI const struct ipv6_addr *ipv6nd_iffindaddr(const struct interface *ifp,
1297827cba2SAaron LI     const struct in6_addr *addr, unsigned int flags);
1307827cba2SAaron LI struct ipv6_addr *ipv6nd_findaddr(struct dhcpcd_ctx *,
1317827cba2SAaron LI     const struct in6_addr *, unsigned int);
1326e63cc1fSRoy Marples struct ipv6_addr *ipv6nd_iffindprefix(struct interface *,
1336e63cc1fSRoy Marples     const struct in6_addr *, uint8_t);
1347827cba2SAaron LI ssize_t ipv6nd_free(struct interface *);
1357827cba2SAaron LI void ipv6nd_expirera(void *arg);
1368d36e1dfSRoy Marples bool ipv6nd_hasralifetime(const struct interface *, bool);
1378d36e1dfSRoy Marples #define	ipv6nd_hasra(i)		ipv6nd_hasralifetime((i), false)
1386e63cc1fSRoy Marples bool ipv6nd_hasradhcp(const struct interface *, bool);
1397827cba2SAaron LI void ipv6nd_handleifa(int, struct ipv6_addr *, pid_t);
1407827cba2SAaron LI int ipv6nd_dadcompleted(const struct interface *);
1418d36e1dfSRoy Marples void ipv6nd_advertise(struct ipv6_addr *);
1428d36e1dfSRoy Marples void ipv6nd_startexpire(struct interface *);
1437827cba2SAaron LI void ipv6nd_drop(struct interface *);
1448d36e1dfSRoy Marples void ipv6nd_neighbour(struct dhcpcd_ctx *, struct in6_addr *, bool);
1458d36e1dfSRoy Marples #endif /* INET6 */
1467827cba2SAaron LI 
1478d36e1dfSRoy Marples #endif /* IPV6ND_H */
148